@buoy-gg/shared-ui 7.0.31 → 7.0.33

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.
Files changed (79) hide show
  1. package/lib/commonjs/JsModal.js +13 -6
  2. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  3. package/lib/commonjs/storage/devToolsStorageKeys.js +12 -0
  4. package/lib/commonjs/ui/components/EmptyState.js +10 -2
  5. package/lib/commonjs/ui/components/ModalHeader.js +5 -0
  6. package/lib/commonjs/ui/components/ToolEmptyState.js +154 -0
  7. package/lib/commonjs/ui/components/WindowControls.js +8 -5
  8. package/lib/commonjs/ui/components/index.js +26 -0
  9. package/lib/commonjs/ui/components/windowDrag.js +45 -0
  10. package/lib/commonjs/ui/index.js +12 -0
  11. package/lib/commonjs/ui/otto/OttoSprite.js +510 -0
  12. package/lib/commonjs/ui/otto/index.js +38 -0
  13. package/lib/commonjs/ui/otto/ottoEngine.js +2734 -0
  14. package/lib/commonjs/ui/otto/ottoSheet.js +191 -0
  15. package/lib/module/JsModal.js +13 -6
  16. package/lib/module/hooks/safe-area-impl.js +1 -1
  17. package/lib/module/storage/devToolsStorageKeys.js +12 -0
  18. package/lib/module/ui/components/EmptyState.js +10 -2
  19. package/lib/module/ui/components/ModalHeader.js +5 -0
  20. package/lib/module/ui/components/ToolEmptyState.js +149 -0
  21. package/lib/module/ui/components/WindowControls.js +8 -5
  22. package/lib/module/ui/components/index.js +4 -0
  23. package/lib/module/ui/components/windowDrag.js +41 -0
  24. package/lib/module/ui/index.js +4 -1
  25. package/lib/module/ui/otto/OttoSprite.js +496 -0
  26. package/lib/module/ui/otto/index.js +20 -0
  27. package/lib/module/ui/otto/ottoEngine.js +2726 -0
  28. package/lib/module/ui/otto/ottoSheet.js +180 -0
  29. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  30. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  31. package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts +12 -0
  32. package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/ui/components/EmptyState.d.ts +14 -1
  34. package/lib/typescript/commonjs/ui/components/EmptyState.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/ui/components/ModalHeader.d.ts.map +1 -1
  36. package/lib/typescript/commonjs/ui/components/ToolEmptyState.d.ts +113 -0
  37. package/lib/typescript/commonjs/ui/components/ToolEmptyState.d.ts.map +1 -0
  38. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts +7 -1
  39. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
  40. package/lib/typescript/commonjs/ui/components/index.d.ts +3 -0
  41. package/lib/typescript/commonjs/ui/components/index.d.ts.map +1 -1
  42. package/lib/typescript/commonjs/ui/components/windowDrag.d.ts +39 -0
  43. package/lib/typescript/commonjs/ui/components/windowDrag.d.ts.map +1 -0
  44. package/lib/typescript/commonjs/ui/index.d.ts +1 -0
  45. package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/ui/otto/OttoSprite.d.ts +103 -0
  47. package/lib/typescript/commonjs/ui/otto/OttoSprite.d.ts.map +1 -0
  48. package/lib/typescript/commonjs/ui/otto/index.d.ts +19 -0
  49. package/lib/typescript/commonjs/ui/otto/index.d.ts.map +1 -0
  50. package/lib/typescript/commonjs/ui/otto/ottoEngine.d.ts +2205 -0
  51. package/lib/typescript/commonjs/ui/otto/ottoEngine.d.ts.map +1 -0
  52. package/lib/typescript/commonjs/ui/otto/ottoSheet.d.ts +73 -0
  53. package/lib/typescript/commonjs/ui/otto/ottoSheet.d.ts.map +1 -0
  54. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  55. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  56. package/lib/typescript/module/storage/devToolsStorageKeys.d.ts +12 -0
  57. package/lib/typescript/module/storage/devToolsStorageKeys.d.ts.map +1 -1
  58. package/lib/typescript/module/ui/components/EmptyState.d.ts +14 -1
  59. package/lib/typescript/module/ui/components/EmptyState.d.ts.map +1 -1
  60. package/lib/typescript/module/ui/components/ModalHeader.d.ts.map +1 -1
  61. package/lib/typescript/module/ui/components/ToolEmptyState.d.ts +113 -0
  62. package/lib/typescript/module/ui/components/ToolEmptyState.d.ts.map +1 -0
  63. package/lib/typescript/module/ui/components/WindowControls.d.ts +7 -1
  64. package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
  65. package/lib/typescript/module/ui/components/index.d.ts +3 -0
  66. package/lib/typescript/module/ui/components/index.d.ts.map +1 -1
  67. package/lib/typescript/module/ui/components/windowDrag.d.ts +39 -0
  68. package/lib/typescript/module/ui/components/windowDrag.d.ts.map +1 -0
  69. package/lib/typescript/module/ui/index.d.ts +1 -0
  70. package/lib/typescript/module/ui/index.d.ts.map +1 -1
  71. package/lib/typescript/module/ui/otto/OttoSprite.d.ts +103 -0
  72. package/lib/typescript/module/ui/otto/OttoSprite.d.ts.map +1 -0
  73. package/lib/typescript/module/ui/otto/index.d.ts +19 -0
  74. package/lib/typescript/module/ui/otto/index.d.ts.map +1 -0
  75. package/lib/typescript/module/ui/otto/ottoEngine.d.ts +2205 -0
  76. package/lib/typescript/module/ui/otto/ottoEngine.d.ts.map +1 -0
  77. package/lib/typescript/module/ui/otto/ottoSheet.d.ts +73 -0
  78. package/lib/typescript/module/ui/otto/ottoSheet.d.ts.map +1 -0
  79. package/package.json +4 -4
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Otto's precomputed animation.
5
+ *
6
+ * Every state is a short loop (48 ticks at most). This module renders that
7
+ * loop once, splits it into a BODY layer and a 7-frame WATER layer (they
8
+ * composite back pixel-for-pixel: compose() only paints water into empty
9
+ * cells and blanks a submerged body below the waterline), dedupes the
10
+ * frames, and turns each distinct frame into merged rectangles. The shipping
11
+ * <Otto/> mounts those rectangles ONCE as a strip of static Views and slides
12
+ * a window over the strip on the UI thread.
13
+ *
14
+ * Why: the buoy-optimize rounds in OTTO_PERF_PLAN.md showed that any renderer
15
+ * re-creating Views per tick pegs the JS thread (5 FPS at 34 sprites, dropped
16
+ * UI frames even at 1 sprite), while "mount once, move a window natively"
17
+ * costs nothing per tick and keeps moving while JS is blocked.
18
+ *
19
+ * Everything here is pure `react-native`-free TypeScript, cached per state.
20
+ */
21
+ import { OTTO_GRID, OTTO_PALETTE, ottoWaterRows, renderOttoFrame } from "./ottoEngine.js";
22
+ export const CELLS = OTTO_GRID * OTTO_GRID;
23
+ export const WATER_ROW0 = 13;
24
+ export const WATER_ROWS = OTTO_GRID - WATER_ROW0;
25
+ export const WATER_CELLS = WATER_ROWS * OTTO_GRID;
26
+ /** The wave is a function of floor(t/2) mod 7. */
27
+ export const WATER_FRAMES = 7;
28
+ export const TRANSPARENT = "transparent";
29
+ /** Longest state cycle in ticks (idle and sleep are 48). */
30
+ export const MAX_PERIOD = 48;
31
+ export function gridKey(grid) {
32
+ return grid.map(r => r.join("")).join("|");
33
+ }
34
+
35
+ /** Flat 256 colours, row-major, `transparent` for empty cells. */
36
+ export function flatColors(grid) {
37
+ const out = new Array(CELLS);
38
+ for (let y = 0; y < OTTO_GRID; y++) {
39
+ const row = grid[y];
40
+ for (let x = 0; x < OTTO_GRID; x++) out[y * OTTO_GRID + x] = OTTO_PALETTE[row[x]] ?? TRANSPARENT;
41
+ }
42
+ return out;
43
+ }
44
+
45
+ // ---------------------------------------------------------------- cycle ---
46
+
47
+ const cycleCache = new Map();
48
+ export function ottoCycle(state, keyline) {
49
+ const cacheKey = `${state}|${keyline ? 1 : 0}`;
50
+ const hit = cycleCache.get(cacheKey);
51
+ if (hit) return hit;
52
+ const keys = [];
53
+ const grids = [];
54
+ for (let t = 0; t < MAX_PERIOD * 2; t++) {
55
+ const g = renderOttoFrame(state, t, {
56
+ water: false,
57
+ keyline
58
+ });
59
+ grids.push(g);
60
+ keys.push(gridKey(g));
61
+ }
62
+ let period = MAX_PERIOD;
63
+ for (let P = 1; P <= MAX_PERIOD; P++) {
64
+ let ok = true;
65
+ for (let t = 0; t < MAX_PERIOD; t++) {
66
+ if (keys[t] !== keys[t + P]) {
67
+ ok = false;
68
+ break;
69
+ }
70
+ }
71
+ if (ok) {
72
+ period = P;
73
+ break;
74
+ }
75
+ }
76
+ const body = grids.slice(0, period).map(flatColors);
77
+ const water = [];
78
+ for (let w = 0; w < WATER_FRAMES; w++) {
79
+ const flat = [];
80
+ for (const row of ottoWaterRows(w * 2)) for (const k of row) flat.push(OTTO_PALETTE[k] ?? TRANSPARENT);
81
+ water.push(flat);
82
+ }
83
+ const cycle = {
84
+ period,
85
+ body,
86
+ water
87
+ };
88
+ cycleCache.set(cacheKey, cycle);
89
+ return cycle;
90
+ }
91
+
92
+ /** Frame indexes for a cycle at local tick `t`. */
93
+ export function cycleIndexes(t, period) {
94
+ const local = Math.max(0, t);
95
+ return {
96
+ bi: local % period,
97
+ wi: Math.floor(local / 2) % WATER_FRAMES
98
+ };
99
+ }
100
+
101
+ // ---------------------------------------------------------------- rects ---
102
+
103
+ /**
104
+ * Same-colour runs per row, then runs merged with the identical run directly
105
+ * below them — roughly a third fewer Views than row runs alone. Covers
106
+ * exactly the non-transparent cells, never overlaps (proved offline over
107
+ * every frame of every state).
108
+ */
109
+ export function rectsOf(colors, cols, rows) {
110
+ const open = [];
111
+ const done = [];
112
+ for (let y = 0; y < rows; y++) {
113
+ const rowRuns = [];
114
+ let x = 0;
115
+ while (x < cols) {
116
+ const color = colors[y * cols + x];
117
+ let w = 1;
118
+ while (x + w < cols && colors[y * cols + x + w] === color) w++;
119
+ if (color !== TRANSPARENT) rowRuns.push({
120
+ x,
121
+ y,
122
+ w,
123
+ h: 1,
124
+ color
125
+ });
126
+ x += w;
127
+ }
128
+ const next = [];
129
+ for (const r of rowRuns) {
130
+ const above = open.find(o => o.x === r.x && o.w === r.w && o.color === r.color && o.y + o.h === r.y);
131
+ if (above) {
132
+ above.h += 1;
133
+ next.push(above);
134
+ } else {
135
+ next.push(r);
136
+ }
137
+ }
138
+ for (const o of open) if (!next.includes(o)) done.push(o);
139
+ open.length = 0;
140
+ open.push(...next);
141
+ }
142
+ done.push(...open);
143
+ return done;
144
+ }
145
+
146
+ // ---------------------------------------------------------------- sheets --
147
+
148
+ /** One layer as a strip of distinct frames, and which frame each tick shows. */
149
+
150
+ const sheetCache = new Map();
151
+ function stripOf(frames, cols, rows) {
152
+ const keys = frames.map(f => f.join(","));
153
+ const indexOf = new Map();
154
+ const distinct = [];
155
+ keys.forEach((k, i) => {
156
+ if (!indexOf.has(k)) {
157
+ indexOf.set(k, distinct.length);
158
+ distinct.push(rectsOf(frames[i], cols, rows));
159
+ }
160
+ });
161
+ return {
162
+ colOf: keys.map(k => indexOf.get(k) ?? 0),
163
+ frames: distinct
164
+ };
165
+ }
166
+
167
+ /** Both layers of a state as strips of rectangles. Pure; cached per state. */
168
+ export function ottoSheets(state, keyline) {
169
+ const key = `${state}|${keyline ? 1 : 0}`;
170
+ const hit = sheetCache.get(key);
171
+ if (hit) return hit;
172
+ const cycle = ottoCycle(state, keyline);
173
+ const built = {
174
+ period: cycle.period,
175
+ body: stripOf(cycle.body, OTTO_GRID, OTTO_GRID),
176
+ water: stripOf(cycle.water, OTTO_GRID, WATER_ROWS)
177
+ };
178
+ sheetCache.set(key, built);
179
+ return built;
180
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AAyHtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC;;;+BAG2B;IAC3B,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,CAAC;IACtE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AA6xDD,eAAO,MAAM,OAAO,oDAAyB,CAAC"}
1
+ {"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AAyHtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC;;;+BAG2B;IAC3B,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,CAAC;IACtE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAoyDD,eAAO,MAAM,OAAO,oDAAyB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated safe area implementation
3
3
  * Detected: none
4
- * Generated at: 2026-08-29T17:41:46.184Z
4
+ * Generated at: 2026-09-02T23:25:39.783Z
5
5
  *
6
6
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
7
7
  *
@@ -245,6 +245,18 @@ export declare const devToolsStorageKeys: {
245
245
  /** Copy/export settings */
246
246
  readonly copySettings: () => "@react_buoy_events_copy_settings";
247
247
  };
248
+ /**
249
+ * Desktop/MCP sync identity
250
+ */
251
+ readonly sync: {
252
+ readonly root: () => "@react_buoy_sync";
253
+ /**
254
+ * The per-install id minted the first time this app dials the broker.
255
+ * It is what makes two devices on the same build register as two
256
+ * devices — see core's deviceIdentity.ts.
257
+ */
258
+ readonly deviceId: () => "@react_buoy_sync_device_id";
259
+ };
248
260
  };
249
261
  /**
250
262
  * Check if a storage key belongs to dev tools
@@ -1 +1 @@
1
- {"version":3,"file":"devToolsStorageKeys.d.ts","sourceRoot":"","sources":["../../../../src/storage/devToolsStorageKeys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;IAC9B;;OAEG;;IAGH;;OAEG;;;;;;;IASH;;OAEG;;;;;;;;IAUH;;;;;;;;;;OAUG;8BACc,MAAM;;QAInB,kEAAkE;;;QAGlE,iCAAiC;sBACnB,MAAM;;IAIxB;;OAEG;;;;;;QAQD,kDAAkD;;QAElD,gCAAgC;;QAGhC,gCAAgC;;;IAKlC;;OAEG;;;QAGD,mCAAmC;;QAEnC,qEAAqE;;;IAIvE;;OAEG;;;;;IAOH;;OAEG;;;;;;;IAQH;;OAEG;;;;;;;IASH;;OAEG;;;;;;;;;;;;;;IAuBH;;;;OAIG;;;;;IAOH;;;;;OAKG;;;;;;;IAQH;;OAEG;;;;;;;;;;;IAiBH;;OAEG;;;;;;;;;;QAcD;;;WAGG;;QAEH;;;;;WAKG;;;IAIL;;OAEG;;;;;;;;;;IAgBH;;OAEG;;;;;;;QAUD,2BAA2B;;;IAK7B;;OAEG;;;;;;;;;IAcH;;OAEG;;;QAGD,8DAA8D;;;IAKhE;;OAEG;;;QAGD;;;;;;;;WAQG;;QAEH,oCAAoC;;QAGpC,wCAAwC;;QAGxC;;;;;WAKG;;QAEH,2BAA2B;;;CAIrB,CAAC;AAwBX;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BzD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE9D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAsBpD"}
1
+ {"version":3,"file":"devToolsStorageKeys.d.ts","sourceRoot":"","sources":["../../../../src/storage/devToolsStorageKeys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;IAC9B;;OAEG;;IAGH;;OAEG;;;;;;;IASH;;OAEG;;;;;;;;IAUH;;;;;;;;;;OAUG;8BACc,MAAM;;QAInB,kEAAkE;;;QAGlE,iCAAiC;sBACnB,MAAM;;IAIxB;;OAEG;;;;;;QAQD,kDAAkD;;QAElD,gCAAgC;;QAGhC,gCAAgC;;;IAKlC;;OAEG;;;QAGD,mCAAmC;;QAEnC,qEAAqE;;;IAIvE;;OAEG;;;;;IAOH;;OAEG;;;;;;;IAQH;;OAEG;;;;;;;IASH;;OAEG;;;;;;;;;;;;;;IAuBH;;;;OAIG;;;;;IAOH;;;;;OAKG;;;;;;;IAQH;;OAEG;;;;;;;;;;;IAiBH;;OAEG;;;;;;;;;;QAcD;;;WAGG;;QAEH;;;;;WAKG;;;IAIL;;OAEG;;;;;;;;;;IAgBH;;OAEG;;;;;;;QAUD,2BAA2B;;;IAK7B;;OAEG;;;;;;;;;IAcH;;OAEG;;;QAGD,8DAA8D;;;IAKhE;;OAEG;;;QAGD;;;;;;;;WAQG;;QAEH,oCAAoC;;QAGpC,wCAAwC;;QAGxC;;;;;WAKG;;QAEH,2BAA2B;;;IAK7B;;OAEG;;;QAGD;;;;WAIG;;;CAGG,CAAC;AAwBX;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BzD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE9D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAsBpD"}
@@ -1,6 +1,19 @@
1
1
  import { ViewStyle } from "react-native";
2
2
  import { LucideIcon } from "../../icons";
3
+ import { type OttoState } from "../otto";
3
4
  interface EmptyStateProps {
5
+ /**
6
+ * Show Otto instead of an icon, in this state.
7
+ *
8
+ * Pick the state whose `OTTO_USES` sentence is literally what this empty
9
+ * state is saying — `fishing` for "capture is on, nothing caught yet",
10
+ * `empty` for a genuinely empty list, `sad` for a search that matched
11
+ * nothing. A mascot in the wrong state is worse than none, because this is
12
+ * a debugging tool and the state reads as a status.
13
+ *
14
+ * Opt-in: with no `otto`, this renders exactly as it always has.
15
+ */
16
+ otto?: OttoState;
4
17
  /** Primary message to display */
5
18
  title: string;
6
19
  /** Optional secondary/description message */
@@ -24,7 +37,7 @@ interface EmptyStateProps {
24
37
  /**
25
38
  * Reusable empty state component for consistent empty/no-data displays
26
39
  */
27
- export declare function EmptyState({ title, description, icon: Icon, iconSize, iconColor, action, variant, style, }: EmptyStateProps): import("react").JSX.Element;
40
+ export declare function EmptyState({ otto, title, description, icon: Icon, iconSize, iconColor, action, variant, style, }: EmptyStateProps): import("react").JSX.Element;
28
41
  /**
29
42
  * Pre-configured empty state for no data scenarios
30
43
  */
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,UAAU,eAAe;IACvB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,CAAC;IACF,6BAA6B;IAC7B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,6BAA6B;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EAAE,IAAI,EACV,QAAa,EACb,SAAoC,EACpC,MAAM,EACN,OAAmB,EACnB,KAAK,GACN,EAAE,eAAe,+BAgCjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,gCAO/B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,gCAOlC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,UAAU,GACX,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,+BAWA"}
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAE/C,UAAU,eAAe;IACvB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,CAAC;IACF,6BAA6B;IAC7B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,6BAA6B;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,IAAI,EAAE,IAAI,EACV,QAAa,EACb,SAAoC,EACpC,MAAM,EACN,OAAmB,EACnB,KAAK,GACN,EAAE,eAAe,+BAsCjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,gCAO/B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,gCAOlC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,UAAU,GACX,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,+BAWA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ModalHeader.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/ModalHeader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAM1D,UAAU,gBAAgB;IACxB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BAEzD;yBAFe,WAAW;;;;;;AAK3B,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,sCAmDnF;AAGD,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,YAAY,+BAsCd;AAID,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAMjD;yBANe,OAAO;;;AAYvB,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;oDACgD;IAChD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,WAAyB,EACzB,SAAgB,EAChB,MAAM,GACP,EAAE,WAAW,+BAiCb"}
1
+ {"version":3,"file":"ModalHeader.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/ModalHeader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAO1D,UAAU,gBAAgB;IACxB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BASzD;yBATe,WAAW;;;;;;AAY3B,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,sCAmDnF;AAGD,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,YAAY,+BAsCd;AAID,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAMjD;yBANe,OAAO;;;AAYvB,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;oDACgD;IAChD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,WAAyB,EACzB,SAAgB,EAChB,MAAM,GACP,EAAE,WAAW,+BAiCb"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * The one "nothing here" panel, for every tool that shows a list.
3
+ *
4
+ * WHY THIS EXISTS
5
+ *
6
+ * Every capture tool — network, events, highlight-updates, storage, zustand,
7
+ * redux, jotai, console — renders the same panel with the same four causes and
8
+ * different nouns. Written out per tool, that produced four copies of the same
9
+ * layout (each of which had to be re-inset by hand the first time a sentence
10
+ * was longer than "No events yet"), and four independent guesses at the
11
+ * PRECEDENCE between those causes. The guesses disagreed, and the disagreements
12
+ * were bugs:
13
+ *
14
+ * - A search that matched nothing showed "Enable tracking to start
15
+ * capturing" — pointing at a toggle that was already on.
16
+ * - Turning every source chip off showed "Events will appear here as they
17
+ * occur" — inviting you to go generate events that were already in the
18
+ * store, behind your own filter.
19
+ * - Typing into a search box while the store was empty produced no
20
+ * acknowledgement of the query at all, which reads as a dead search box.
21
+ *
22
+ * So the precedence lives here, once, and each tool supplies only what is
23
+ * genuinely its own: the noun, and what "switched on but waiting" looks like
24
+ * for it (network fishes, events listens, the highlighter stares).
25
+ *
26
+ * SPLIT IN TWO ON PURPOSE
27
+ *
28
+ * `resolveListEmptyState` is a pure function returning `{ otto, title,
29
+ * message }`, and `ToolEmptyState` renders that object. Tools with a cause
30
+ * nobody else has — storage's "no issues found" (which is a PASS, not a
31
+ * failure), zustand's unregistered store — resolve the common cases and
32
+ * substitute their own, or skip the resolver and hand the shell a literal.
33
+ * Adding a mascot to every tool at once is then one edit in this file, which is
34
+ * also what makes the Flutter and Swift ports one component to mirror instead
35
+ * of eight.
36
+ */
37
+ import { type ViewStyle } from "react-native";
38
+ import { type OttoState } from "../otto";
39
+ /** What a "nothing here" panel says. */
40
+ export interface ToolEmptyContent {
41
+ /**
42
+ * Otto's state. It must be TRUE of the branch that chose it — this is a
43
+ * debugging tool, and a mascot in the wrong state reads as a status. See
44
+ * `OTTO_USES` in the engine for what each one claims.
45
+ */
46
+ otto: OttoState;
47
+ title: string;
48
+ message: string;
49
+ }
50
+ export interface ToolEmptyStateProps extends ToolEmptyContent {
51
+ /**
52
+ * Base testID. Renders `${testID}` on the container, `${testID}-title` and
53
+ * `${testID}-text` on the two lines — the shape the existing e2e suites
54
+ * already select on.
55
+ */
56
+ testID?: string;
57
+ style?: ViewStyle;
58
+ }
59
+ /**
60
+ * The panel itself: Otto, a heading, a sentence. Nothing else — this only ever
61
+ * renders where the alternative is a blank body, so it has no actions and no
62
+ * decoration to compete with the list it stands in for.
63
+ */
64
+ export declare function ToolEmptyState({ otto, title, message, testID, style, }: ToolEmptyStateProps): import("react").JSX.Element;
65
+ export interface ListEmptyFacts {
66
+ /**
67
+ * Plural noun for what the list holds — "requests", "events", "components",
68
+ * "changes", "keys". Used in the generated sentences.
69
+ */
70
+ subject: string;
71
+ /**
72
+ * Past participle for how they got here: "captured" (default), "tracked",
73
+ * "registered". Reads as "None of the 176 tracked components match".
74
+ */
75
+ verb?: string;
76
+ /**
77
+ * The live search box. A non-empty query ALWAYS wins: whatever else is
78
+ * wrong, the user just typed something and is watching for it to land, and
79
+ * a panel that answers with anything else reads as a search box that does
80
+ * nothing. Never gate this on there being something to match.
81
+ */
82
+ search?: string;
83
+ /**
84
+ * How many items exist BEFORE the user's own search and filters — the
85
+ * denominator that separates "your filter hid it" from "nothing happened".
86
+ * Leave undefined and both of those collapse into `waiting`/`paused`.
87
+ */
88
+ total?: number;
89
+ /**
90
+ * The tool's capture/tracking switch. `false` selects `paused`; leave it
91
+ * undefined for tools that have no such switch.
92
+ */
93
+ capturing?: boolean;
94
+ /** Otto + copy for "switched on, nothing has arrived yet". */
95
+ waiting: ToolEmptyContent;
96
+ /** Copy for "switched off". Otto defaults to `paused`. */
97
+ paused?: Partial<ToolEmptyContent>;
98
+ /**
99
+ * A harder blocker to name in the search branch's body instead of the
100
+ * generated sentence — "Every source chip is off, so there is nothing to
101
+ * search." Clearing the query would not help, and saying "clear the search
102
+ * to see them" when it would not is the lie this exists to prevent.
103
+ */
104
+ blocked?: string;
105
+ }
106
+ /**
107
+ * Which "nothing here" this is, in the order the facts answer the question.
108
+ *
109
+ * A typed query first (see `search`), then the user's filters, then the
110
+ * capture switch, then the honest "nothing yet".
111
+ */
112
+ export declare function resolveListEmptyState(facts: ListEmptyFacts): ToolEmptyContent;
113
+ //# sourceMappingURL=ToolEmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolEmptyState.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/ToolEmptyState.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAG/C,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,KAAK,GACN,EAAE,mBAAmB,+BAmBrB;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8DAA8D;IAC9D,OAAO,EAAE,gBAAgB,CAAC;IAC1B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,CAmD7E"}
@@ -15,12 +15,18 @@ interface WindowControlsProps {
15
15
  mode?: ModalMode;
16
16
  /** Host modal's chrome variant — "night" restyles the expanded popover. */
17
17
  variant?: ModalVariant;
18
+ /**
19
+ * Start with the big-button popover open and never auto-dismiss it.
20
+ * For galleries / parity sheets that need the expanded state to sit still
21
+ * for a screenshot; a real modal never sets this.
22
+ */
23
+ defaultExpanded?: boolean;
18
24
  }
19
25
  /**
20
26
  * iPad-style expandable window controls.
21
27
  * Default: small macOS-style colored dots. On tap, expands to reveal
22
28
  * large, easy-to-press buttons. Auto-dismisses after timeout or tap outside.
23
29
  */
24
- export declare function WindowControls({ onClose, onMinimize, onToggleMode, mode, variant, }: WindowControlsProps): import("react").JSX.Element;
30
+ export declare function WindowControls({ onClose, onMinimize, onToggleMode, mode, variant, defaultExpanded, }: WindowControlsProps): import("react").JSX.Element;
25
31
  export {};
26
32
  //# sourceMappingURL=WindowControls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WindowControls.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/WindowControls.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAe7D;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,QAE3D;AAMD,UAAU,mBAAmB;IAC3B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AA+BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAiB,GAClB,EAAE,mBAAmB,+BAuDrB"}
1
+ {"version":3,"file":"WindowControls.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/WindowControls.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAe7D;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,QAE3D;AAMD,UAAU,mBAAmB;IAC3B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA+BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAiB,EACjB,eAAe,GAChB,EAAE,mBAAmB,+BAwDrB"}
@@ -3,6 +3,7 @@ export { ValueTypeBadge } from "./ValueTypeBadge";
3
3
  export { StorageTypeBadge } from "./StorageTypeBadge";
4
4
  export { CopyButton, InlineCopyButton, ToolbarCopyButton, ActionCopyButton, ToolbarClearButton, } from "./CopyButton";
5
5
  export { ModalHeader } from "./ModalHeader";
6
+ export { windowDragProps, noWindowDragProps } from "./windowDrag";
6
7
  export { ModalHintBanner } from "./ModalHintBanner";
7
8
  export { ClipboardHintBanner } from "./ClipboardHintBanner";
8
9
  export { SectionHeader } from "./SectionHeader";
@@ -23,6 +24,8 @@ export { DevToolsCard, DEVTOOLS_CARD_CONSTANTS } from "./DevToolsCard";
23
24
  export type { DevToolsCardProps } from "./DevToolsCard";
24
25
  export { HeaderSearchButton } from "./HeaderSearchButton";
25
26
  export { EmptyState, NoDataEmptyState, NoResultsEmptyState, NoSearchResultsEmptyState, } from "./EmptyState";
27
+ export { ToolEmptyState, resolveListEmptyState } from "./ToolEmptyState";
28
+ export type { ToolEmptyContent, ToolEmptyStateProps, ListEmptyFacts, } from "./ToolEmptyState";
26
29
  export { StatusIndicator } from "./StatusIndicator";
27
30
  export { TimeDisplay } from "./TimeDisplay";
28
31
  export { DetailView } from "./DetailView";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Desktop window-drag tagging for tool headers.
3
+ *
4
+ * Buoy Desktop runs a FRAMELESS Electron window: nothing but a
5
+ * `-webkit-app-region: drag` region moves it. The sidebar's own header carries
6
+ * that duty, but with the sidebar open the content column has no strip of its
7
+ * own — the TOOL's header is the top edge of the window there, so grabbing it
8
+ * looked like it should move the app and didn't.
9
+ *
10
+ * These spread onto a `View` and mark the region for the desktop stylesheet
11
+ * (`apps/desktop/src/index.css`, `[data-buoy-window-drag]`). react-native-web
12
+ * turns `dataSet` into `data-*` attributes; React Native drops the prop on
13
+ * device, so this is INERT on mobile — the styling that gives it meaning only
14
+ * exists in the desktop app.
15
+ *
16
+ * `dataSet` is a react-native-web extension that RN's own prop types don't
17
+ * declare; spreading it (rather than passing it inline) is what keeps
18
+ * TypeScript quiet, and puts the explanation here once instead of a
19
+ * `@ts-ignore` at every header.
20
+ *
21
+ * A drag region SWALLOWS mouse events, so every control inside one has to opt
22
+ * back out or it stops being clickable. The desktop app does that for itself:
23
+ * react-native-web renders touchables as featureless `<div>`s, so it finds
24
+ * them at runtime by their `cursor: pointer` rather than by any selector —
25
+ * see apps/desktop/src/windowDragRegions.ts. `noWindowDragProps` is here for
26
+ * a region that must opt out regardless of how it looks.
27
+ */
28
+ export declare const windowDragProps: {
29
+ dataSet: {
30
+ buoyWindowDrag: string;
31
+ };
32
+ };
33
+ /** Opt a subtree back out of an enclosing {@link windowDragProps} region. */
34
+ export declare const noWindowDragProps: {
35
+ dataSet: {
36
+ buoyNoDrag: string;
37
+ };
38
+ };
39
+ //# sourceMappingURL=windowDrag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windowDrag.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/windowDrag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,eAAe;;;;CAE3B,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB;;;;CAE7B,CAAC"}
@@ -3,4 +3,5 @@ export * from "./backgrounds";
3
3
  export { toolTheme, type ToolTheme } from "./toolTheme";
4
4
  export { CyberpunkSectionButton } from "./console/CyberpunkSectionButton";
5
5
  export * from "./gameUI";
6
+ export * from "./otto";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAC;AAG7B,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAC;AAG7B,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,cAAc,UAAU,CAAC;AAGzB,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,103 @@
1
+ import type { StyleProp, ViewStyle } from "react-native";
2
+ import { Animated } from "react-native";
3
+ import { type OttoRenderOptions, type OttoState } from "./ottoEngine";
4
+ import { WATER_FRAMES } from "./ottoSheet";
5
+ /**
6
+ * The tick span every layer of a state loops over. It is a common multiple of
7
+ * the body cycle and the anchor cycle, so a prop held in Otto's hand and the
8
+ * hand itself repeat together.
9
+ */
10
+ export declare function motionUnits(state: OttoState, keyline?: boolean): number;
11
+ export interface OttoPixelsProps {
12
+ /** A 16×16 grid of palette keys, from `renderOttoFrame`. */
13
+ grid: string[][];
14
+ /** Size of one sprite pixel in points. */
15
+ pixelSize: number;
16
+ style?: StyleProp<ViewStyle>;
17
+ }
18
+ /** Pure renderer: a frame → coloured run Views. Fine for stills; costly per tick. */
19
+ export declare function OttoPixels({ grid, pixelSize, style }: OttoPixelsProps): import("react").JSX.Element;
20
+ export interface OttoStillProps extends OttoRenderOptions {
21
+ /** Default `static`: the base pose, for favicons and stills. */
22
+ state?: OttoState;
23
+ pixelSize?: number;
24
+ style?: StyleProp<ViewStyle>;
25
+ }
26
+ /** Frame 0 of a state, no clock — safe on screens that must not re-render. */
27
+ export declare function OttoStill({ state, pixelSize, water, keyline, style }: OttoStillProps): import("react").JSX.Element;
28
+ /**
29
+ * Walks the demo reel: which state plays now. One React state change per
30
+ * schedule entry (every few seconds), nothing per tick.
31
+ */
32
+ export declare function useOttoReel(enabled: boolean, tickMs?: number, active?: boolean): OttoState;
33
+ export interface StepOffset {
34
+ x: number;
35
+ y: number;
36
+ }
37
+ /** A style that moves a view through offsets in lock-step with Otto's clock. */
38
+ export type StepMotionStyle = Animated.WithAnimatedObject<ViewStyle> | ViewStyle;
39
+ /**
40
+ * The layer the clock moves.
41
+ *
42
+ * On native this has to be an `Animated.View` — it carries interpolated
43
+ * values. On web the motion is a COMPILED CSS class (see `webStepStyle`), and
44
+ * `Animated.View` flattens its style prop into a fresh object, which loses the
45
+ * identity react-native-web looks the compiled rules up by; the keyframes are
46
+ * then silently dropped and the sprite sits on frame 0. So the web path takes
47
+ * a plain View, which passes the class straight through.
48
+ */
49
+ declare const OttoMotionView: typeof Animated.View;
50
+ export { OttoMotionView };
51
+ export interface OttoAnchorMotion {
52
+ /** Spread onto an `Animated.View` holding the prop. */
53
+ style: StepMotionStyle;
54
+ /** Draw the prop over Otto (true) or behind the arms (false). */
55
+ over: boolean;
56
+ /** The prop's resting cell, for layout before motion applies. */
57
+ origin: StepOffset;
58
+ }
59
+ /**
60
+ * Move a prop in lock-step with Otto's hands. `OTTO_ANCHORS[state]` publishes
61
+ * where the hand is each tick; this turns that into the same kind of clocked
62
+ * style the sprite itself uses, on the same timebase, so the two can't drift.
63
+ *
64
+ * Returns `null` for a state that has no anchor.
65
+ */
66
+ export declare function useOttoAnchorMotion(state: OttoState, pixelSize: number, tickMs?: number, active?: boolean, keyline?: boolean): OttoAnchorMotion | null;
67
+ export interface OttoProps extends OttoRenderOptions {
68
+ /** A named state, or `reel` to play the demo schedule. */
69
+ state: OttoState | "reel";
70
+ /** Size of one sprite pixel in points. Default 8 (the mockup's default). */
71
+ pixelSize?: number;
72
+ /** Tick period in ms. Default 140 (the mockup's default). */
73
+ tickMs?: number;
74
+ /** false = frozen at frame 0 with the clock off. */
75
+ active?: boolean;
76
+ /**
77
+ * Mount the animated strips in the SAME commit instead of after the
78
+ * interaction settles. Default false — see `Otto` for why.
79
+ */
80
+ eager?: boolean;
81
+ style?: StyleProp<ViewStyle>;
82
+ }
83
+ /**
84
+ * The shipping sprite.
85
+ *
86
+ * Mounting is deferred on purpose. The strips are ~500 static Views for a
87
+ * typical state, and creating those is native COMMIT cost: measured at 128 ms
88
+ * for one sprite, against 28 ms for a still. A mascot almost always appears
89
+ * while something else is animating (a panel opening, a list settling), and
90
+ * 128 ms of commit dropped into that is a visible hitch.
91
+ *
92
+ * So the first commit paints `OttoStill` — frame 0, ~36 Views, the exact
93
+ * pixels the animation starts on — and the strips mount once the interaction
94
+ * has settled (an idle callback). Nothing pops, because the still IS frame 0.
95
+ * Pass `eager` when the sprite is the thing the user is waiting for.
96
+ *
97
+ * The two layers are siblings that each gate themselves with `return null`
98
+ * rather than a ternary swap, so this component's child slots never change
99
+ * shape (Fabric view-index safety).
100
+ */
101
+ export declare function Otto({ state, pixelSize, water, keyline, tickMs, active, eager, style, }: OttoProps): import("react").JSX.Element;
102
+ export { WATER_FRAMES };
103
+ //# sourceMappingURL=OttoSprite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OttoSprite.d.ts","sourceRoot":"","sources":["../../../../../src/ui/otto/OttoSprite.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAsC,MAAM,cAAc,CAAC;AAC5E,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAiE,MAAM,aAAa,CAAC;AAiB1G;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,UAAO,GAAG,MAAM,CAEpE;AAID,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,eAAe,+BA8BrE;AAID,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACvD,gEAAgE;IAChE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,EAAE,KAAgB,EAAE,SAAa,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,cAAc,+BAGnG;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAM,EAAE,MAAM,UAAO,GAAG,SAAS,CASpF;AAID,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,gFAAgF;AAChF,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;AAIjF;;;;;;;;;GASG;AACH,QAAA,MAAM,cAAc,EAAsC,OAAO,QAAQ,CAAC,IAAI,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,CAAC;AAwH1B,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,KAAK,EAAE,eAAe,CAAC;IACvB,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAC;IACd,iEAAiE;IACjE,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,SAAM,EACZ,MAAM,UAAO,EACb,OAAO,UAAO,GACb,gBAAgB,GAAG,IAAI,CAgBzB;AAID,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IAClD,0DAA0D;IAC1D,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,EACnB,KAAK,EACL,SAAa,EACb,KAAY,EACZ,OAAc,EACd,MAAY,EACZ,MAAa,EACb,KAAa,EACb,KAAK,GACN,EAAE,SAAS,+BAyCX;AAoID,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Otto — the Buoy mascot, as a shared UI primitive.
3
+ *
4
+ * One 16×16 pixel character with a state per product moment. `OTTO_USES` says
5
+ * what each state is for; place him only where the alternative is nothing
6
+ * (empty bodies, waiting states) and only in states that are actually true.
7
+ * See OTTO_PLACEMENT_PLAN.md.
8
+ *
9
+ * The renderer is core-RN only (no Reanimated, no expo-image), so it runs in
10
+ * Expo, in a bare RN CLI host, and on react-native-web. See OTTO_PERF_PLAN.md
11
+ * for the measurements behind that.
12
+ *
13
+ * This is the ONE copy. The example app's review page and the website's lab
14
+ * re-export from here rather than keeping forks.
15
+ */
16
+ export * from "./ottoEngine";
17
+ export * from "./ottoSheet";
18
+ export * from "./OttoSprite";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/ui/otto/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}