Deploy AIOS web (React glide grid + FastAPI slice)
Browse files- RELEASES.json +1 -1
- VERSION +1 -1
- web/src/customer-grid/CustomerGrid.tsx +0 -0
- web/src/customer-grid/ViewSidebar.tsx +39 -0
- web/src/customer-grid/chatDock.css +48 -52
RELEASES.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
{
|
| 2 |
-
"current": "
|
| 3 |
"releases": [
|
| 4 |
{
|
| 5 |
"version": "v29",
|
|
|
|
| 1 |
{
|
| 2 |
+
"current": "4c54929",
|
| 3 |
"releases": [
|
| 4 |
{
|
| 5 |
"version": "v29",
|
VERSION
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
|
|
|
|
| 1 |
+
4c54929
|
web/src/customer-grid/CustomerGrid.tsx
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
web/src/customer-grid/ViewSidebar.tsx
CHANGED
|
@@ -288,12 +288,30 @@ interface ViewSidebarProps {
|
|
| 288 |
agentPanel?: ReactNode;
|
| 289 |
agentOpen?: boolean;
|
| 290 |
onToggleAgent?: () => void;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 291 |
}
|
| 292 |
|
| 293 |
export default function ViewSidebar({
|
| 294 |
agentPanel = null,
|
| 295 |
agentOpen = false,
|
| 296 |
onToggleAgent,
|
|
|
|
|
|
|
| 297 |
views,
|
| 298 |
activeViewId,
|
| 299 |
saveState,
|
|
@@ -812,6 +830,27 @@ export default function ViewSidebar({
|
|
| 812 |
</svg>
|
| 813 |
</button>
|
| 814 |
)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 815 |
{/* ββ THE DATABASE'S OWN TOTAL IS DELETED FROM THIS ROW (W35-T27, owner item 9 / R4).
|
| 816 |
Owner, verbatim: *"remove [the important count] anywhere else but the View itself."*
|
| 817 |
W33-T16 put a summed badge here and W34-T20 stripped its label; item 9 removes the
|
|
|
|
| 288 |
agentPanel?: ReactNode;
|
| 289 |
agentOpen?: boolean;
|
| 290 |
onToggleAgent?: () => void;
|
| 291 |
+
/** ββ OWNER, 2026-08-19 β the grid chat's launcher lives in THIS row, beside the minimize
|
| 292 |
+
* control, exactly as the view agent's does. It was a text pill floating in the gap between
|
| 293 |
+
* this rail and the grid; the owner called it *"ugly as hell"* and named where it belongs:
|
| 294 |
+
* *"the same Navigation as the View navigation just beside its minimize icon"*.
|
| 295 |
+
* β Optional, and ABSENT rather than disabled when the surface has no database to chat about
|
| 296 |
+
* (embedded and Query bindings) β the same posture `onToggleAgent` takes one line up. */
|
| 297 |
+
chatOpen?: boolean;
|
| 298 |
+
/** β RENDERED AFTER the minimize toggle, never before it. W35-T28 made that control this
|
| 299 |
+
* row's FIRST child on purpose and `verify_grid_ux.py`'s views-rail scan asserts the ordering,
|
| 300 |
+
* so adding beside it is the instruction and re-ordering it would undo a shipped owner item to
|
| 301 |
+
* satisfy a new one β the same rule the view-agent robot follows.
|
| 302 |
+
* β IT IS AN ICON, NOT A LABEL. This row is a 26px control strip; the text pill is precisely
|
| 303 |
+
* what made the old launcher read as bolted on. The sentence it used to show ("Ask about this
|
| 304 |
+
* data") is now the `aria-label` AND the `title`, so nothing is lost to a screen reader or to
|
| 305 |
+
* a hover β moving a control must not quietly cost its name. */
|
| 306 |
+
onToggleChat?: () => void;
|
| 307 |
}
|
| 308 |
|
| 309 |
export default function ViewSidebar({
|
| 310 |
agentPanel = null,
|
| 311 |
agentOpen = false,
|
| 312 |
onToggleAgent,
|
| 313 |
+
chatOpen = false,
|
| 314 |
+
onToggleChat,
|
| 315 |
views,
|
| 316 |
activeViewId,
|
| 317 |
saveState,
|
|
|
|
| 830 |
</svg>
|
| 831 |
</button>
|
| 832 |
)}
|
| 833 |
+
{/* ββ OWNER 2026-08-19 β the chat launcher. AFTER the toggle, same rule as the robot.
|
| 834 |
+
Rationale is on the `onToggleChat` prop; kept short here because this row's source
|
| 835 |
+
region carries a 2,400-char cap that `verify_grid_ux.py`'s views-rail scan enforces. */}
|
| 836 |
+
{onToggleChat && (
|
| 837 |
+
<button
|
| 838 |
+
type="button"
|
| 839 |
+
className={"cg-chat-toggle" + (chatOpen ? " is-on" : "")}
|
| 840 |
+
aria-label={chatOpen ? "Close the chat about this data"
|
| 841 |
+
: "Ask about this data"}
|
| 842 |
+
aria-expanded={chatOpen}
|
| 843 |
+
title={chatOpen ? "Close the chat about this data" : "Ask about this data"}
|
| 844 |
+
onClick={onToggleChat}
|
| 845 |
+
>
|
| 846 |
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
| 847 |
+
<path d="M13.4 9.2c0 1.5-1.3 2.7-2.9 2.7H6.9l-3 2.1v-2.3a2.8 2.8 0 0 1-1.3-2.3V5.1c0-1.5 1.3-2.7 2.9-2.7h5c1.6 0 2.9 1.2 2.9 2.7z"
|
| 848 |
+
stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" />
|
| 849 |
+
<path d="M5.9 7.2h4.2" stroke="currentColor" strokeWidth="1.3"
|
| 850 |
+
strokeLinecap="round" />
|
| 851 |
+
</svg>
|
| 852 |
+
</button>
|
| 853 |
+
)}
|
| 854 |
{/* ββ THE DATABASE'S OWN TOTAL IS DELETED FROM THIS ROW (W35-T27, owner item 9 / R4).
|
| 855 |
Owner, verbatim: *"remove [the important count] anywhere else but the View itself."*
|
| 856 |
W33-T16 put a summed badge here and W34-T20 stripped its label; item 9 removes the
|
web/src/customer-grid/chatDock.css
CHANGED
|
@@ -1,52 +1,48 @@
|
|
| 1 |
-
/* customer-grid/chatDock.css β W37-T29 (contract C6 + C8): the chat's DOCK and its LAUNCHER.
|
| 2 |
-
*
|
| 3 |
-
* β A SEPARATE SHEET FROM E's `gridChat.css` ON PURPOSE, and the split is the contract rather
|
| 4 |
-
* than taste. C8 hands `index.css` to lane A alone and tells every other lane to add styles in its
|
| 5 |
-
* own per-surface sheet; E owns how the PANEL looks and this file owns where the HOST puts it and
|
| 6 |
-
* how a person opens it. Two lanes editing one sheet is the collision C8 exists to prevent.
|
| 7 |
-
*
|
| 8 |
-
* ββ THE LAUNCHER IS THE WHOLE REASON THIS FILE EXISTS. A panel with no control that opens it is
|
| 9 |
-
* mounted-but-never-offered, which is this repo's most repeated defect: one wave shipped five whole,
|
| 10 |
-
* correct, unreachable features past every gate. E's sheet cannot carry the launcher, because the
|
| 11 |
-
* launcher is not part of the panel.
|
| 12 |
-
* β Tokens only, never fresh hexes (DESIGN.md: navy #1F4E78 + gold #C8A24B). No emojis, no
|
| 13 |
-
* ALL-CAPS chrome.
|
| 14 |
-
*/
|
| 15 |
-
|
| 16 |
-
/* The dock: a flex child of `.cg-shell`, seated between the views rail and the grid, so the panel
|
| 17 |
-
reads as part of the workspace rather than as an overlay floating on top of it. E's `.cg-chat`
|
| 18 |
-
brings its own width floor, ceiling and left border; this wrapper only owns the seat. */
|
| 19 |
-
.cg-chat-dock {
|
| 20 |
-
display: flex;
|
| 21 |
-
min-height: 0;
|
| 22 |
-
align-self: stretch;
|
| 23 |
-
}
|
| 24 |
-
|
| 25 |
-
/*
|
| 26 |
-
|
| 27 |
-
.
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
}
|
| 48 |
-
|
| 49 |
-
.cg-chat-open:focus-visible {
|
| 50 |
-
outline: 2px solid var(--lp-gold, #c8a24b);
|
| 51 |
-
outline-offset: 1px;
|
| 52 |
-
}
|
|
|
|
| 1 |
+
/* customer-grid/chatDock.css β W37-T29 (contract C6 + C8): the chat's DOCK and its LAUNCHER.
|
| 2 |
+
*
|
| 3 |
+
* β A SEPARATE SHEET FROM E's `gridChat.css` ON PURPOSE, and the split is the contract rather
|
| 4 |
+
* than taste. C8 hands `index.css` to lane A alone and tells every other lane to add styles in its
|
| 5 |
+
* own per-surface sheet; E owns how the PANEL looks and this file owns where the HOST puts it and
|
| 6 |
+
* how a person opens it. Two lanes editing one sheet is the collision C8 exists to prevent.
|
| 7 |
+
*
|
| 8 |
+
* ββ THE LAUNCHER IS THE WHOLE REASON THIS FILE EXISTS. A panel with no control that opens it is
|
| 9 |
+
* mounted-but-never-offered, which is this repo's most repeated defect: one wave shipped five whole,
|
| 10 |
+
* correct, unreachable features past every gate. E's sheet cannot carry the launcher, because the
|
| 11 |
+
* launcher is not part of the panel.
|
| 12 |
+
* β Tokens only, never fresh hexes (DESIGN.md: navy #1F4E78 + gold #C8A24B). No emojis, no
|
| 13 |
+
* ALL-CAPS chrome.
|
| 14 |
+
*/
|
| 15 |
+
|
| 16 |
+
/* The dock: a flex child of `.cg-shell`, seated between the views rail and the grid, so the panel
|
| 17 |
+
reads as part of the workspace rather than as an overlay floating on top of it. E's `.cg-chat`
|
| 18 |
+
brings its own width floor, ceiling and left border; this wrapper only owns the seat. */
|
| 19 |
+
.cg-chat-dock {
|
| 20 |
+
display: flex;
|
| 21 |
+
min-height: 0;
|
| 22 |
+
align-self: stretch;
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
/* ββ THE LAUNCHER, MOVED 2026-08-19 ON THE OWNER'S INSTRUCTION.
|
| 26 |
+
It was `.cg-chat-open`: a text pill reading "Ask about this data", floating in the gap between
|
| 27 |
+
the views rail and the grid with a `margin: 8px 0 0 8px`. The owner called it *"ugly as hell"*
|
| 28 |
+
and said where it belongs β *"the same Navigation as the View navigation just beside its
|
| 29 |
+
minimize icon"*. It is now a 26px icon button INSIDE `.cg-views-top`, and these rules match
|
| 30 |
+
`.cg-agent-open` (scriptView.css) exactly, because the two controls sit side by side in one
|
| 31 |
+
26px strip and a launcher that is 2px taller than its neighbour is what reads as bolted on.
|
| 32 |
+
β The old class is GONE rather than left orphaned: a dead rule for a removed node is how a
|
| 33 |
+
later reader concludes the feature still has two entry points. */
|
| 34 |
+
.cg-chat-toggle {
|
| 35 |
+
display: inline-flex;
|
| 36 |
+
align-items: center;
|
| 37 |
+
justify-content: center;
|
| 38 |
+
width: 26px;
|
| 39 |
+
height: 26px;
|
| 40 |
+
border: 0;
|
| 41 |
+
border-radius: 6px;
|
| 42 |
+
background: transparent;
|
| 43 |
+
color: var(--lp-text-muted, #667085);
|
| 44 |
+
cursor: pointer;
|
| 45 |
+
}
|
| 46 |
+
.cg-chat-toggle:hover { background: var(--lp-surface-sunken, #f2f4f7); }
|
| 47 |
+
.cg-chat-toggle.is-on { background: var(--lp-surface-sunken, #f2f4f7); color: var(--lp-navy, #1f4e78); }
|
| 48 |
+
.cg-chat-toggle:focus-visible { outline: 2px solid var(--lp-gold, #c8a24b); outline-offset: 1px; }
|
|
|
|
|
|
|
|
|
|
|
|