fsanyoto commited on
Commit
30feec0
Β·
verified Β·
1 Parent(s): f2db836

Deploy AIOS web (React glide grid + FastAPI slice)

Browse files
RELEASES.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "current": "2de35b7",
3
  "releases": [
4
  {
5
  "version": "v29",
 
1
  {
2
+ "current": "4c54929",
3
  "releases": [
4
  {
5
  "version": "v29",
VERSION CHANGED
@@ -1 +1 @@
1
- 2de35b7
 
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
- /* The launcher. A rail-height strip rather than a floating bubble: a bubble would sit over the
26
- grid's own rows, which is the one place a person is trying to read. */
27
- .cg-chat-open {
28
- display: flex;
29
- align-items: center;
30
- gap: 6px;
31
- align-self: flex-start;
32
- margin: 8px 0 0 8px;
33
- padding: 6px 10px;
34
- border: 1px solid var(--lp-border, #e4e7ec);
35
- border-radius: 6px;
36
- background: var(--lp-surface, #ffffff);
37
- color: var(--lp-ink, #1f2937);
38
- font-size: var(--lp-fs-xs);
39
- line-height: 1.2;
40
- cursor: pointer;
41
- white-space: nowrap;
42
- }
43
-
44
- .cg-chat-open:hover {
45
- border-color: var(--lp-navy, #1f4e78);
46
- color: var(--lp-navy, #1f4e78);
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; }