toga-ai 1.0.714 → 1.0.715

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.
@@ -7,8 +7,8 @@
7
7
  | [AdvancedSelect (virtualized single/multi select)](features/advanced-select.md) | `AdvancedSelect<T>` is a **fully controlled, virtualized** single/multi select built from scratch (not react-select) on **`@tanstack/react-virtual`**, for large | toga-blox/src/components/AdvancedSelect/AdvancedSelect.tsx, toga-blox/src/components/AdvancedSelect/AdvancedSelect.types.ts, toga-blox/src/components/AdvancedSelect/AdvancedSelect.module.css |
8
8
  | [API client (axios wrapper, auth, table-data fetchers)](features/api-client.md) | `src/api/` is a thin **axios** wrapper that standardizes the **2.0 API envelope**, manages auth (Bearer + refresh), serializes complex query options, and provid | toga-blox/src/reactQuery/queryHelpers.ts, toga-blox/src/api/index.ts, toga-blox/src/api/axiosInstance.ts, toga-blox/src/api/apiFunctions.ts, toga-blox/src/api/auth.ts, toga-blox/src/api/genericApi.ts, toga-blox/src/api/types.ts, toga-blox/src/api/tableData |
9
9
  | [BaseInput (react-hook-form field factory)](features/base-input.md) | `BaseInput` is a **form-field factory** driven by react-hook-form. | toga-blox/src/components/BaseInput/BaseInput.tsx, toga-blox/src/components/BaseInput/BaseInput.types.ts, toga-blox/src/components/BaseInput/BaseInput.module.css, toga-blox/src/components/BaseInput/components |
10
- | [blox authoring defect backlog (fix IN blox, not around it)](features/blox-authoring-defects.md) | The standing list of **defects to fix inside `@agilant/toga-blox`**. | toga-blox/src/components/BaseButton, toga-blox/src/api/auth.ts, toga-blox/src/api/axiosInstance.ts, toga-blox/src/reactQuery/queryHelpers.ts, toga-blox/src/components/BaseInput, toga-blox/tsconfig.json, toga-blox/package.json |
11
- | [Primary Table templates (server/client, sizing, virtualization)](features/primary-table-templates.md) | `src/templates/PrimaryTable/` is the **production, wired-up table** built on the [Table component](table.md). | toga-blox/src/components/Table/themeConfig/toga.module.css, toga-blox/src/templates/PrimaryTable/PrimaryTable.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableServerTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableClientTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableHeaderCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableBodyCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableRow.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableExpandableRow.tsx, toga-blox/src/templates/PrimaryTable/types.ts |
10
+ | [blox authoring defect backlog (fix IN blox, not around it)](features/blox-authoring-defects.md) | The standing list of **defects to fix inside `@agilant/toga-blox`**. | toga-blox/src/components/BaseButton, toga-blox/src/components/Table/themeConfig/toga.module.css, toga-blox/src/api/auth.ts, toga-blox/src/api/axiosInstance.ts, toga-blox/src/reactQuery/queryHelpers.ts, toga-blox/src/components/BaseInput, toga-blox/tsconfig.json, toga-blox/package.json |
11
+ | [Primary Table templates (server/client, sizing, virtualization)](features/primary-table-templates.md) | `src/templates/PrimaryTable/` is the **production, wired-up table** built on the [Table component](table.md). | toga-blox/src/components/Table/themeConfig/toga.module.css, toga25-supply/src/themeConfig.json, toga-blox/src/templates/PrimaryTable/PrimaryTable.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableServerTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableClientTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableHeaderCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableBodyCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableRow.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableExpandableRow.tsx, toga-blox/src/templates/PrimaryTable/types.ts |
12
12
  | [TableRecordModal (record-detail modal shell)](features/table-record-modal.md) | `TableRecordModal` is a **generic, presentational modal shell** for showing a single table record (row) in detail — typically opened from a table row click. | toga-blox/src/components/TableRecordModal/TableRecordModal.tsx, toga-blox/src/components/TableRecordModal/index.ts, toga-blox/src/components/TableRecordModal/tableRecordModal.module.css |
13
13
  | [Table component (cells, action cells, filters & sorts, hooks, theming)](features/table.md) | The `Table` component (`src/components/Table/`) is the **TanStack Table v8** building block behind the [Primary Table templates](primary-table-templates.md). | toga-blox/src/components/Table/hooks/useFetchTablePageMeta.ts, toga-blox/src/api/types.ts, toga-blox/src/components/Table/index.ts, toga-blox/src/components/Table/types.ts, toga-blox/src/components/Table/utils/buildTanstackColumns.tsx, toga-blox/src/components/Table/utils/resolveCellType.tsx, toga-blox/src/components/Table/components/cellTypes, toga-blox/src/components/Table/components/actionCells, toga-blox/src/components/Table/components/columnFiltersAndSorts, toga-blox/src/components/Table/hooks, toga-blox/src/components/Table/themeConfig |
14
14
  | [Talos AI-Assistant Component (launcher + docked/drawer chat panel)](features/talos-assistant.md) | `Talos` is a **shared, pure-UI** AI-assistant component in `@agilant/toga-blox`: a header launcher button (`TalosLauncher`) plus a chat panel (`TalosPanel`) tha | toga-blox/src/components/Talos/TalosLauncher.tsx, toga-blox/src/components/Talos/TalosPanel.tsx, toga-blox/src/components/Talos/TalosMessage.tsx, toga-blox/src/components/Talos/types.ts, toga-blox/src/components/Talos/theme.ts, toga-blox/src/components/Talos/helpers.tsx, toga-blox/src/components/Talos/stub.ts, toga-blox/src/components/Talos/Talos.module.css, toga-blox/src/components/Talos/index.ts, toga-blox/src/components/index.ts |
@@ -6,10 +6,11 @@ project: TOGa Blox
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-08-28
10
- owners: [apeterson]
9
+ updated: 2026-08-31
10
+ owners: [apeterson, tcox]
11
11
  files:
12
12
  - toga-blox/src/components/BaseButton
13
+ - toga-blox/src/components/Table/themeConfig/toga.module.css
13
14
  - toga-blox/src/api/auth.ts
14
15
  - toga-blox/src/api/axiosInstance.ts
15
16
  - toga-blox/src/reactQuery/queryHelpers.ts
@@ -108,6 +109,32 @@ declarations to the base button class. Until then a consumer must compensate at
108
109
  [surface-frontend](../../toga25-supply/features/surface-frontend.md)). **Do not patch the shared blox
109
110
  stylesheet from a consumer**: every one of the ~40 call sites inherits it.
110
111
 
112
+ ### 5. Hardcoded visual values in the shared stylesheets are unremovable by a consumer
113
+
114
+ **Mechanism.** blox styles are scoped CSS Modules driven by host tokens (frontend standard §13e), but
115
+ several declarations still carry **literal** values instead of `var(--token, <value>)`. A literal has
116
+ no escape hatch: the consuming app cannot override a class it cannot name, and the host-token layer
117
+ is the only supported styling surface.
118
+
119
+ **Consumer symptom.** "The design says remove this and I can't." Worked example (2026-08-31): the
120
+ `supply`-skin table card shadow was a literal `box-shadow: 0 1px 3px rgba(0,0,0,0.1)` on
121
+ `.tableAndPaginationInner.supply` / `.tableWrapper.supply`, so a toga25-supply design review that
122
+ required *no* table shadow had nothing to set. **Fixed for that property** —
123
+ `var(--primaryTable-box-shadow, 0 1px 3px rgba(0,0,0,0.1))`. The class of defect remains: audit the
124
+ rest of `toga.module.css` and the other component stylesheets the same way.
125
+
126
+ **Fix direction.** When a literal is found, convert it in place to
127
+ `var(--<component>-<prop>, <the existing literal>)`. The fallback makes this **non-breaking** — every
128
+ consumer that defines nothing keeps the exact historical look — so it does not need the coordinated
129
+ bump the other defects here do. Do **not** solve it by patching the shared stylesheet from a consumer
130
+ or by `!important` in app CSS.
131
+
132
+ **Related smell — literals that reference tokens no app defines.** `.headerCell.edgeLeft::after` /
133
+ `.edgeRight::before` styled a divider with `--toga-color-border-default`, a token no consuming app
134
+ declares, on class names `getStickyClass` never emits. Dead rules like this look authoritative when
135
+ someone greps for the divider. Both were deleted 2026-08-31; grep the emitting code before trusting a
136
+ CSS rule, and check the token it names actually exists in a host theme.
137
+
111
138
  ## Already-known authoring items (carried over from §22)
112
139
 
113
140
  These are long-standing and were previously recorded only as consumer-side advice:
@@ -141,6 +168,12 @@ These are long-standing and were previously recorded only as consumer-side advic
141
168
  time**, with no PR. Sequence auth fixes deliberately.
142
169
 
143
170
  ## Change history
171
+ - 2026-08-31 — Added styling defect **5: hardcoded visual values in the shared stylesheets cannot be
172
+ removed by a consumer** — a literal has no host-token escape hatch. Worked example: the `supply`
173
+ table card shadow, which a toga25-supply design review needed gone; converted to
174
+ `var(--primaryTable-box-shadow, <old literal>)`, which is non-breaking because the fallback
175
+ preserves the historical look. Recorded the related smell of dead CSS naming tokens/classes that
176
+ nothing emits (`edgeLeft`/`edgeRight` + `--toga-color-border-default`, both deleted). (tcox)
144
177
  - 2026-08-28 — Added styling defect **4: `BaseButton` `primary` vs `primaryAction` are not
145
178
  interchangeable** — `.primaryBtnAction` sets font-size **and** `height: 26px`, `.primaryBtn` sets
146
179
  neither, so swapping variants silently changes type size and button height. Found wiring the
@@ -6,10 +6,11 @@ project: TOGa Blox
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-08-26
10
- owners: [apeterson]
9
+ updated: 2026-08-31
10
+ owners: [apeterson, tcox]
11
11
  files:
12
12
  - toga-blox/src/components/Table/themeConfig/toga.module.css
13
+ - toga25-supply/src/themeConfig.json
13
14
  - toga-blox/src/templates/PrimaryTable/PrimaryTable.tsx
14
15
  - toga-blox/src/templates/PrimaryTable/PrimaryTableServerTemplate.tsx
15
16
  - toga-blox/src/templates/PrimaryTable/PrimaryTableClientTemplate.tsx
@@ -83,6 +84,40 @@ spacer rows computed from the virtualizer item `.start`/`.end` minus `scrollMarg
83
84
  `supply-modal-table` skin **disables virtualization** (renders all rows, min-height 300px).
84
85
  Sticky columns use a `--sticky-offset` CSS variable summed from neighboring column widths.
85
86
 
87
+ ## Sticky columns: the divider line and first-column padding
88
+
89
+ **The fixed-column divider is a rendered `<span>`, not a pseudo-element.**
90
+ `PrimaryTableHeaderCell` / `PrimaryTableBodyCell` render an absolutely-positioned 1px
91
+ `.stickyEdgeLine` (+ `.stickyEdgeLineLeft` / `.stickyEdgeLineRight`) inside the sticky cell,
92
+ colored `--primaryTable-border-default`. The header variant (`.headerEdgeLine`) is
93
+ `height: calc(100% + 1px)` so it covers the 1px transparent collapsed border on
94
+ `.bodyRow:first-child` — without the overhang a white seam shows between the header's line and
95
+ the first row's. Header cells are never clipped (`truncateCells` sets `overflow:hidden` on
96
+ `.bodyCell` only), so the overhang is safe.
97
+
98
+ **A sticky FIRST column needs its own padding rule.** `.bodyCell.stickyCell` (`padding: 12px 16px`)
99
+ and `.bodyCell:first-child` (`padding: 10px 25px 10px 20px`) have **equal specificity**, so the
100
+ later one in the file wins — a left-pinned first column silently dropped to 16px left padding
101
+ while `.headerCell:first-child` kept 20px, misaligning header against body.
102
+ `.bodyCell.stickyCell:first-child` restores the 20px, and it **must sit after
103
+ `.bodyCell.stickyCell` and before `.bodyCell.stickyCell.actionCell`** so a start-positioned action
104
+ column still wins its `padding: 0`.
105
+
106
+ ## Host tokens in `toga.module.css`
107
+
108
+ Design tokens are `--primaryTable-*`; blox ships **class rules only, zero token values** (see
109
+ frontend standard §13e), so each is written `var(--token, <historical value>)` and the fallback is
110
+ what preserves the existing look for consumers that never define it.
111
+
112
+ - **`--primaryTable-box-shadow`** — the `supply`-skin card shadow on
113
+ `.tableAndPaginationInner.supply` and `.tableWrapper.supply`. Fallback
114
+ `0 1px 3px rgba(0,0,0,0.1)` (the value that used to be hardcoded). `toga25-supply` sets
115
+ `"--primaryTable-box-shadow": "none"` in its `src/themeConfig.json` DEFAULT theme to remove the
116
+ shadow app-wide for every client build. The `desk` / nested skins set `box-shadow: none`
117
+ directly and are unaffected.
118
+ - **`--primaryTable-border-default`** — every table rule line, including the sticky edge line.
119
+ `toga25-supply` resolves it to `--gray-300` (#D4D5D8).
120
+
86
121
  ## The "Show more" hover affordance is CSS-driven, not JS-driven
87
122
 
88
123
  A truncated body cell reveals its "Show more" toggle **on hover via CSS only**:
@@ -106,6 +141,15 @@ runs unconditionally — it no longer no-ops while `isExpanded`.
106
141
  cell's text ellipsizes marginally earlier until the next `mouseleave`. Cosmetically invisible;
107
142
  clearing it properly would need a per-cell scroll listener.
108
143
 
144
+ - **Don't hardcode a themeable value in `toga.module.css`.** A hardcoded property is unremovable by
145
+ a consuming app — there is no `!important` escape hatch through the host-token layer. Expose it as
146
+ `var(--primaryTable-<prop>, <the current hardcoded value>)`: the app gains control and every other
147
+ consumer keeps the historical look with no change.
148
+ - **`edgeLeft` / `edgeRight` were dead classes.** `.headerCell.edgeLeft::after` /
149
+ `.headerCell.edgeRight::before` were removed (2026-08-31) — `getStickyClass` never emitted those
150
+ class names in `src` **or** the published `dist`, and they referenced
151
+ `--toga-color-border-default`, a token no consuming app defines. Chasing the fixed-column divider
152
+ through them is a dead end; it is the `stickyEdgeLine` span above.
109
153
  - Frozen widths measure only **mounted** rows; virtualized tables size from the first paint set.
110
154
  - **Header labels must never abbreviate or overlap.** The full header width is a hard floor
111
155
  (above `maxColumnWidth`, `minColumnWidth`, and pinned `columnWidths`). Measure header width
@@ -120,6 +164,23 @@ runs unconditionally — it no longer no-ops while `isExpanded`.
120
164
  not the column set.
121
165
 
122
166
  ## Change history
167
+ - 2026-08-31 — Host-tokenized the `supply`-skin table shadow: `.tableAndPaginationInner.supply` /
168
+ `.tableWrapper.supply` now use `box-shadow: var(--primaryTable-box-shadow, 0 1px 3px rgba(0,0,0,0.1))`,
169
+ adding `--primaryTable-box-shadow` to the host-token set (a design review needed the shadow gone and
170
+ no token existed; the fallback keeps every other consumer identical). `toga25-supply` sets it to
171
+ `none` in `src/themeConfig.json`. Also **removed dead** `.headerCell.edgeLeft::after` /
172
+ `.edgeRight::before` (never emitted by `getStickyClass` in src or dist; referenced an undefined
173
+ token) and documented the real `stickyEdgeLine` divider. Also fixed a latent misalignment: added
174
+ `.bodyCell.stickyCell:first-child { padding: 10px 25px 10px 20px }` (equal-specificity clash where
175
+ `.bodyCell.stickyCell` beat `.bodyCell:first-child`), placed before `.actionCell` so action columns
176
+ keep `padding: 0`. Blox side is working-tree-only on `TRUE-80767` — unpublished. (tcox)
177
+ - 2026-08-31 — Verified the June-19 table clipping / overlapping-text report is **fully resolved** in
178
+ the production-channel release `1.1.1-production.139` that `toga25-supply` consumes: the Aug-17
179
+ `headerFloors` hard-floor + deterministic header measurement, the Aug-26 CSS-hover "Show more"
180
+ toggle fix, and the Aug-26 `NEVER_EXPANDABLE_TYPES` status-badge fix are all physically present in
181
+ the installed `dist`. Timeline for context: resizable columns + `table-layout: fixed` landed
182
+ 2026-06-16 (`de00d067`) with the truncation system only half-built, so June-19 caught a mid-rollout
183
+ state; the durable fixes landed 2026-07-21 → 2026-08-26. No code change. (tcox)
123
184
  - 2026-08-26 — Fixed: the "Show more" toggle got stuck visible on cells the mouse was not hovering.
124
185
  `.toggle` already had `opacity: 0` + a CSS hover rule, but `PrimaryTableBodyCell` inline-set
125
186
  `opacity: 1` unconditionally (inline beats the cascade), so visibility depended entirely on the
@@ -6,8 +6,8 @@ project: TOGa Blox
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-08-26
10
- owners: [apeterson]
9
+ updated: 2026-08-31
10
+ owners: [apeterson, tcox]
11
11
  files:
12
12
  - toga-blox/src/components/Table/hooks/useFetchTablePageMeta.ts
13
13
  - toga-blox/src/api/types.ts
@@ -217,6 +217,11 @@ layer and emits it — see
217
217
  requires `npm run build` before it takes effect at runtime.
218
218
 
219
219
  ## Change history
220
+ - 2026-08-31 — Verified the `NEVER_EXPANDABLE_TYPES` status-badge fix (and the related header/
221
+ truncation fixes) are present in the **production-channel** release `1.1.1-production.139`, not just
222
+ the `sandbox-client` build below — the June-19 clipping/overlapping-text report is closed for
223
+ `toga25-supply`. See
224
+ [primary-table-templates](primary-table-templates.md). No code change. (tcox)
220
225
  - 2026-08-26 — Fixed: status columns rendered as truncated text with a "Show more" toggle instead of
221
226
  a badge. Root cause was in `resolveCellType` — the `isExpandableCell` branch **discards** the
222
227
  rendered `content` and re-renders the raw `value` in `ExpandableCell`. Added
@@ -127,6 +127,18 @@ The consumer reads blox's `dist`, so rebuild blox after every change.
127
127
 
128
128
  ## Gotchas
129
129
 
130
+ - **Confirm the link actually exists before you trust it — docs and memory go stale.**
131
+ Verified 2026-08-31: `toga25-supply/node_modules/@agilant/toga-blox` is a **real registry install**
132
+ pinned exactly at `1.1.1-production.139`, **not** a junction to `toga-blox-npm` (checked with
133
+ PowerShell `(Get-Item <path>).LinkType` → empty). Its architecture doc still claimed a symlink. On a
134
+ registry install, editing blox `src` — even rebuilding blox — reaches the app **only** via publish +
135
+ pin bump ([dynamic-publish-pipeline](./dynamic-publish-pipeline.md)). Check `LinkType` (or
136
+ `ls -l` / `fsutil reparsepoint query`) first; the symptom of getting this wrong is "my change does
137
+ nothing" with a perfectly good build.
138
+ - **The urgent-case escape hatch is patching the INSTALLED `dist`, and it is ephemeral.** Mirroring
139
+ the source edit into `node_modules/@agilant/toga-blox/dist/**` gives immediate dev visibility, but
140
+ the next `npm install` / `npm ci` (and every CI build) wipes it. It is a preview, never a
141
+ deliverable — the change still has to publish and the consumer still has to bump its pin.
130
142
  - **`prebuild` does `rm -rf dist`.** A consumer dev server that requests a chunk mid-rebuild
131
143
  serves a 500 and then recovers on the next compile. It is not a real failure — rebuild, reload.
132
144
  - **`.next/dev` is locked per app.** A second `next dev` refuses to start while another instance
@@ -142,6 +154,10 @@ The consumer reads blox's `dist`, so rebuild blox after every change.
142
154
  drags every component's CSS into the consumer bundle.
143
155
 
144
156
  ## Change history
157
+ - 2026-08-31 — Added the "is it actually linked?" check: `toga25-supply` is on a **real registry
158
+ install** of `1.1.1-production.139` (`LinkType` empty), not a junction, so blox source edits reach
159
+ it only through publish + pin bump; and recorded that the urgent-case **installed-`dist` patch** is
160
+ ephemeral (wiped by the next `npm install`, never present in CI). (tcox)
145
161
  - 2026-08-31 — Closed out the duplicate-`react-query` case with the parts that made it hard:
146
162
  **both copies were the SAME version (5.101.4)** — identity, not version, is what breaks context;
147
163
  `optimizeDeps.include` pre-bundles blox with its nested copy so the throw appears to originate
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.714",
3
+ "version": "1.0.715",
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",