@buoy-gg/ask-buoy 7.0.33 → 7.0.34

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 (153) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/blocks/AskBlocks.js +1 -338
  3. package/lib/commonjs/blocks/BlockRenderer.js +1 -250
  4. package/lib/commonjs/blocks/ChromePrototypes.js +1 -514
  5. package/lib/commonjs/blocks/DataBlocks.js +1 -545
  6. package/lib/commonjs/blocks/ExtraBlocks.js +1 -1821
  7. package/lib/commonjs/blocks/MediaBlocks.js +1 -140
  8. package/lib/commonjs/blocks/ReceiptBlocks.js +1 -596
  9. package/lib/commonjs/blocks/context.js +1 -42
  10. package/lib/commonjs/blocks/icons.js +1 -96
  11. package/lib/commonjs/blocks/index.js +1 -95
  12. package/lib/commonjs/blocks/primitives.js +1 -312
  13. package/lib/commonjs/blocks/primitivesIndex.js +1 -56
  14. package/lib/commonjs/components/ApprovalCard.js +1 -140
  15. package/lib/commonjs/components/AskBuoyHeader.js +1 -127
  16. package/lib/commonjs/components/AskBuoyIcon.js +1 -19
  17. package/lib/commonjs/components/AskBuoyModal.js +1 -322
  18. package/lib/commonjs/components/ChangesBar.js +1 -211
  19. package/lib/commonjs/components/Composer.js +1 -175
  20. package/lib/commonjs/components/EmptyState.js +1 -154
  21. package/lib/commonjs/components/Markdown.js +1 -252
  22. package/lib/commonjs/components/MessageList.js +1 -648
  23. package/lib/commonjs/components/TypingDots.js +1 -63
  24. package/lib/commonjs/index.js +1 -205
  25. package/lib/commonjs/preset.js +1 -90
  26. package/lib/commonjs/store/askBuoyStore.js +1 -279
  27. package/lib/commonjs/store/useAskBuoy.js +1 -299
  28. package/lib/commonjs/sync/askBuoySyncAdapter.js +1 -119
  29. package/lib/commonjs/sync/askBuoySyncAdapter.test.js +1 -136
  30. package/lib/commonjs/sync/wire.js +1 -58
  31. package/lib/commonjs/types.js +1 -6
  32. package/lib/module/blocks/AskBlocks.js +1 -331
  33. package/lib/module/blocks/BlockRenderer.js +1 -245
  34. package/lib/module/blocks/ChromePrototypes.js +1 -503
  35. package/lib/module/blocks/DataBlocks.js +1 -532
  36. package/lib/module/blocks/ExtraBlocks.js +1 -1794
  37. package/lib/module/blocks/MediaBlocks.js +1 -135
  38. package/lib/module/blocks/ReceiptBlocks.js +1 -584
  39. package/lib/module/blocks/context.js +1 -35
  40. package/lib/module/blocks/icons.js +1 -91
  41. package/lib/module/blocks/index.js +1 -8
  42. package/lib/module/blocks/primitives.js +1 -301
  43. package/lib/module/blocks/primitivesIndex.js +1 -5
  44. package/lib/module/components/ApprovalCard.js +1 -135
  45. package/lib/module/components/AskBuoyHeader.js +1 -124
  46. package/lib/module/components/AskBuoyIcon.js +1 -8
  47. package/lib/module/components/AskBuoyModal.js +1 -317
  48. package/lib/module/components/ChangesBar.js +1 -206
  49. package/lib/module/components/Composer.js +1 -170
  50. package/lib/module/components/EmptyState.js +1 -149
  51. package/lib/module/components/Markdown.js +1 -246
  52. package/lib/module/components/MessageList.js +1 -642
  53. package/lib/module/components/TypingDots.js +1 -58
  54. package/lib/module/index.js +1 -29
  55. package/lib/module/preset.js +1 -73
  56. package/lib/module/store/askBuoyStore.js +1 -275
  57. package/lib/module/store/useAskBuoy.js +1 -293
  58. package/lib/module/sync/askBuoySyncAdapter.js +1 -114
  59. package/lib/module/sync/askBuoySyncAdapter.test.js +1 -135
  60. package/lib/module/sync/wire.js +1 -47
  61. package/lib/module/types.js +1 -4
  62. package/lib/typescript/preset.d.ts +1 -1
  63. package/package.json +8 -8
  64. package/lib/commonjs/blocks/AskBlocks.js.map +0 -1
  65. package/lib/commonjs/blocks/BlockRenderer.js.map +0 -1
  66. package/lib/commonjs/blocks/ChromePrototypes.js.map +0 -1
  67. package/lib/commonjs/blocks/DataBlocks.js.map +0 -1
  68. package/lib/commonjs/blocks/ExtraBlocks.js.map +0 -1
  69. package/lib/commonjs/blocks/MediaBlocks.js.map +0 -1
  70. package/lib/commonjs/blocks/ReceiptBlocks.js.map +0 -1
  71. package/lib/commonjs/blocks/context.js.map +0 -1
  72. package/lib/commonjs/blocks/icons.js.map +0 -1
  73. package/lib/commonjs/blocks/index.js.map +0 -1
  74. package/lib/commonjs/blocks/primitives.js.map +0 -1
  75. package/lib/commonjs/blocks/primitivesIndex.js.map +0 -1
  76. package/lib/commonjs/components/ApprovalCard.js.map +0 -1
  77. package/lib/commonjs/components/AskBuoyHeader.js.map +0 -1
  78. package/lib/commonjs/components/AskBuoyIcon.js.map +0 -1
  79. package/lib/commonjs/components/AskBuoyModal.js.map +0 -1
  80. package/lib/commonjs/components/ChangesBar.js.map +0 -1
  81. package/lib/commonjs/components/Composer.js.map +0 -1
  82. package/lib/commonjs/components/EmptyState.js.map +0 -1
  83. package/lib/commonjs/components/Markdown.js.map +0 -1
  84. package/lib/commonjs/components/MessageList.js.map +0 -1
  85. package/lib/commonjs/components/TypingDots.js.map +0 -1
  86. package/lib/commonjs/index.js.map +0 -1
  87. package/lib/commonjs/preset.js.map +0 -1
  88. package/lib/commonjs/store/askBuoyStore.js.map +0 -1
  89. package/lib/commonjs/store/useAskBuoy.js.map +0 -1
  90. package/lib/commonjs/sync/askBuoySyncAdapter.js.map +0 -1
  91. package/lib/commonjs/sync/askBuoySyncAdapter.test.js.map +0 -1
  92. package/lib/commonjs/sync/wire.js.map +0 -1
  93. package/lib/commonjs/types.js.map +0 -1
  94. package/lib/module/blocks/AskBlocks.js.map +0 -1
  95. package/lib/module/blocks/BlockRenderer.js.map +0 -1
  96. package/lib/module/blocks/ChromePrototypes.js.map +0 -1
  97. package/lib/module/blocks/DataBlocks.js.map +0 -1
  98. package/lib/module/blocks/ExtraBlocks.js.map +0 -1
  99. package/lib/module/blocks/MediaBlocks.js.map +0 -1
  100. package/lib/module/blocks/ReceiptBlocks.js.map +0 -1
  101. package/lib/module/blocks/context.js.map +0 -1
  102. package/lib/module/blocks/icons.js.map +0 -1
  103. package/lib/module/blocks/index.js.map +0 -1
  104. package/lib/module/blocks/primitives.js.map +0 -1
  105. package/lib/module/blocks/primitivesIndex.js.map +0 -1
  106. package/lib/module/components/ApprovalCard.js.map +0 -1
  107. package/lib/module/components/AskBuoyHeader.js.map +0 -1
  108. package/lib/module/components/AskBuoyIcon.js.map +0 -1
  109. package/lib/module/components/AskBuoyModal.js.map +0 -1
  110. package/lib/module/components/ChangesBar.js.map +0 -1
  111. package/lib/module/components/Composer.js.map +0 -1
  112. package/lib/module/components/EmptyState.js.map +0 -1
  113. package/lib/module/components/Markdown.js.map +0 -1
  114. package/lib/module/components/MessageList.js.map +0 -1
  115. package/lib/module/components/TypingDots.js.map +0 -1
  116. package/lib/module/index.js.map +0 -1
  117. package/lib/module/preset.js.map +0 -1
  118. package/lib/module/store/askBuoyStore.js.map +0 -1
  119. package/lib/module/store/useAskBuoy.js.map +0 -1
  120. package/lib/module/sync/askBuoySyncAdapter.js.map +0 -1
  121. package/lib/module/sync/askBuoySyncAdapter.test.js.map +0 -1
  122. package/lib/module/sync/wire.js.map +0 -1
  123. package/lib/module/types.js.map +0 -1
  124. package/lib/typescript/blocks/AskBlocks.d.ts.map +0 -1
  125. package/lib/typescript/blocks/BlockRenderer.d.ts.map +0 -1
  126. package/lib/typescript/blocks/ChromePrototypes.d.ts.map +0 -1
  127. package/lib/typescript/blocks/DataBlocks.d.ts.map +0 -1
  128. package/lib/typescript/blocks/ExtraBlocks.d.ts.map +0 -1
  129. package/lib/typescript/blocks/MediaBlocks.d.ts.map +0 -1
  130. package/lib/typescript/blocks/ReceiptBlocks.d.ts.map +0 -1
  131. package/lib/typescript/blocks/context.d.ts.map +0 -1
  132. package/lib/typescript/blocks/icons.d.ts.map +0 -1
  133. package/lib/typescript/blocks/index.d.ts.map +0 -1
  134. package/lib/typescript/blocks/primitives.d.ts.map +0 -1
  135. package/lib/typescript/blocks/primitivesIndex.d.ts.map +0 -1
  136. package/lib/typescript/components/ApprovalCard.d.ts.map +0 -1
  137. package/lib/typescript/components/AskBuoyHeader.d.ts.map +0 -1
  138. package/lib/typescript/components/AskBuoyIcon.d.ts.map +0 -1
  139. package/lib/typescript/components/AskBuoyModal.d.ts.map +0 -1
  140. package/lib/typescript/components/ChangesBar.d.ts.map +0 -1
  141. package/lib/typescript/components/Composer.d.ts.map +0 -1
  142. package/lib/typescript/components/EmptyState.d.ts.map +0 -1
  143. package/lib/typescript/components/Markdown.d.ts.map +0 -1
  144. package/lib/typescript/components/MessageList.d.ts.map +0 -1
  145. package/lib/typescript/components/TypingDots.d.ts.map +0 -1
  146. package/lib/typescript/index.d.ts.map +0 -1
  147. package/lib/typescript/preset.d.ts.map +0 -1
  148. package/lib/typescript/store/askBuoyStore.d.ts.map +0 -1
  149. package/lib/typescript/store/useAskBuoy.d.ts.map +0 -1
  150. package/lib/typescript/sync/askBuoySyncAdapter.d.ts.map +0 -1
  151. package/lib/typescript/sync/askBuoySyncAdapter.test.d.ts.map +0 -1
  152. package/lib/typescript/sync/wire.d.ts.map +0 -1
  153. package/lib/typescript/types.d.ts.map +0 -1
@@ -1,331 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * Ask blocks — the user has to decide, and the turn is waiting.
5
- *
6
- * Choice, Confirm and Input all lock once answered: the chosen option stays
7
- * highlighted, the rest dim, and nothing in history is tappable twice. The
8
- * answer is handed to the sheet as a BlockAnswer and becomes the next user
9
- * message, so the model reads plain words ("Business checkout"), never JSON.
10
- */
11
- import { useState } from "react";
12
- import { Pressable, StyleSheet, Text, TextInput, View } from "react-native";
13
- import { Check, ChevronRight, night } from "@buoy-gg/shared-ui";
14
- import { useBlockHandlers } from "./context";
15
- import { BlockIcon } from "./icons";
16
- import { Card } from "./primitives";
17
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
18
- export function Choice({
19
- block
20
- }) {
21
- const h = useBlockHandlers();
22
- const answer = h.answered[block.id];
23
- const chosen = answer?.kind === "choice" ? answer.optionId : null;
24
- const locked = !!answer;
25
- return /*#__PURE__*/_jsxs(Card, {
26
- testID: `buoy-block-choice-${block.id}`,
27
- tone: locked ? undefined : "info",
28
- children: [/*#__PURE__*/_jsx(Text, {
29
- style: styles.question,
30
- children: block.question
31
- }), /*#__PURE__*/_jsx(View, {
32
- style: styles.options,
33
- children: block.options.slice(0, 5).map((o, i) => {
34
- const isChosen = chosen === o.id;
35
- return /*#__PURE__*/_jsxs(Pressable, {
36
- testID: `buoy-block-option-${o.id}`,
37
- accessibilityRole: "button",
38
- accessibilityState: {
39
- selected: isChosen,
40
- disabled: locked
41
- },
42
- disabled: locked,
43
- onPress: () => h.answer({
44
- blockId: block.id,
45
- kind: "choice",
46
- optionId: o.id,
47
- label: o.label
48
- }),
49
- style: ({
50
- pressed
51
- }) => [styles.option, i > 0 && styles.optionDivider, isChosen && styles.optionChosen, locked && !isChosen && styles.optionDimmed, pressed && !locked && styles.pressed],
52
- children: [o.icon ? /*#__PURE__*/_jsx(BlockIcon, {
53
- name: o.icon
54
- }) : null, /*#__PURE__*/_jsxs(View, {
55
- style: styles.optionText,
56
- children: [/*#__PURE__*/_jsx(Text, {
57
- style: [styles.optionLabel, isChosen && styles.optionLabelChosen],
58
- children: o.label
59
- }), o.detail ? /*#__PURE__*/_jsx(Text, {
60
- style: styles.optionDetail,
61
- children: o.detail
62
- }) : null]
63
- }), isChosen ? /*#__PURE__*/_jsx(Check, {
64
- size: 14,
65
- color: night.color.accent
66
- }) : locked ? null : /*#__PURE__*/_jsx(ChevronRight, {
67
- size: 14,
68
- color: night.color.textTertiary
69
- })]
70
- }, o.id);
71
- })
72
- }), !locked && block.allowFreeText !== false ? /*#__PURE__*/_jsx(Text, {
73
- style: styles.hint,
74
- children: "Or just type your answer below."
75
- }) : null]
76
- });
77
- }
78
- export function Confirm({
79
- block
80
- }) {
81
- const h = useBlockHandlers();
82
- const answer = h.answered[block.id];
83
- const locked = !!answer;
84
- const approved = answer?.kind === "confirm" ? answer.approved : null;
85
- return /*#__PURE__*/_jsxs(Card, {
86
- testID: `buoy-block-confirm-${block.id}`,
87
- tone: locked ? undefined : "warning",
88
- children: [/*#__PURE__*/_jsx(Text, {
89
- style: styles.confirmTitle,
90
- children: block.title
91
- }), /*#__PURE__*/_jsx(Text, {
92
- style: styles.confirmChange,
93
- children: block.change
94
- }), block.consequence ? /*#__PURE__*/_jsx(Text, {
95
- style: styles.confirmConsequence,
96
- children: block.consequence
97
- }) : null, /*#__PURE__*/_jsx(View, {
98
- style: styles.confirmActions,
99
- children: locked ? /*#__PURE__*/_jsx(Text, {
100
- style: styles.decided,
101
- children: approved ? `✓ ${block.approveLabel ?? "Done"}` : `✕ ${block.declineLabel ?? "Not now"}`
102
- }) : /*#__PURE__*/_jsxs(_Fragment, {
103
- children: [/*#__PURE__*/_jsx(Pressable, {
104
- testID: "buoy-block-approve",
105
- accessibilityRole: "button",
106
- onPress: () => h.answer({
107
- blockId: block.id,
108
- kind: "confirm",
109
- approved: true
110
- }),
111
- style: ({
112
- pressed
113
- }) => [styles.button, styles.buttonPrimary, pressed && styles.pressed],
114
- children: /*#__PURE__*/_jsx(Text, {
115
- style: styles.buttonTextPrimary,
116
- children: block.approveLabel ?? "Do it"
117
- })
118
- }), /*#__PURE__*/_jsx(Pressable, {
119
- testID: "buoy-block-decline",
120
- accessibilityRole: "button",
121
- onPress: () => h.answer({
122
- blockId: block.id,
123
- kind: "confirm",
124
- approved: false
125
- }),
126
- style: ({
127
- pressed
128
- }) => [styles.button, styles.buttonPlate, pressed && styles.pressed],
129
- children: /*#__PURE__*/_jsx(Text, {
130
- style: styles.buttonTextPlate,
131
- children: block.declineLabel ?? "Not now"
132
- })
133
- })]
134
- })
135
- })]
136
- });
137
- }
138
- export function Input({
139
- block
140
- }) {
141
- const h = useBlockHandlers();
142
- const answer = h.answered[block.id];
143
- const locked = !!answer;
144
- const [value, setValue] = useState("");
145
- const secret = block.type === "secret";
146
- const submit = () => {
147
- const v = value.trim();
148
- if (!v) return;
149
- h.answer({
150
- blockId: block.id,
151
- kind: "input",
152
- value: v
153
- });
154
- };
155
- return /*#__PURE__*/_jsxs(Card, {
156
- testID: `buoy-block-input-${block.id}`,
157
- tone: locked ? undefined : "info",
158
- children: [/*#__PURE__*/_jsx(Text, {
159
- style: styles.question,
160
- children: block.label
161
- }), locked ? /*#__PURE__*/_jsx(Text, {
162
- style: styles.decided,
163
- children: answer.kind === "input" ? secret ? "••••••" : answer.value : "(skipped)"
164
- }) : /*#__PURE__*/_jsxs(View, {
165
- style: styles.inputRow,
166
- children: [/*#__PURE__*/_jsx(TextInput, {
167
- testID: "buoy-block-input-field",
168
- style: styles.input,
169
- value: value,
170
- onChangeText: setValue,
171
- placeholder: block.placeholder ?? "",
172
- placeholderTextColor: night.color.placeholder,
173
- keyboardType: block.type === "number" ? "numeric" : "ascii-capable",
174
- secureTextEntry: secret,
175
- autoCapitalize: "none",
176
- autoCorrect: false,
177
- returnKeyType: "send",
178
- onSubmitEditing: submit
179
- }), /*#__PURE__*/_jsx(Pressable, {
180
- testID: "buoy-block-input-submit",
181
- accessibilityRole: "button",
182
- disabled: !value.trim(),
183
- onPress: submit,
184
- style: ({
185
- pressed
186
- }) => [styles.button, styles.buttonPrimary, !value.trim() && styles.buttonDisabled, pressed && styles.pressed],
187
- children: /*#__PURE__*/_jsx(Text, {
188
- style: styles.buttonTextPrimary,
189
- children: block.submitLabel ?? "Send"
190
- })
191
- })]
192
- })]
193
- });
194
- }
195
- const styles = StyleSheet.create({
196
- question: {
197
- color: night.color.text,
198
- fontSize: night.font.row,
199
- fontWeight: "600",
200
- lineHeight: 20,
201
- paddingHorizontal: 12,
202
- paddingTop: 12,
203
- paddingBottom: 8
204
- },
205
- options: {
206
- marginHorizontal: 8,
207
- marginBottom: 8,
208
- borderRadius: night.radius.row,
209
- backgroundColor: night.color.surfaceElevated,
210
- overflow: "hidden"
211
- },
212
- option: {
213
- flexDirection: "row",
214
- alignItems: "center",
215
- gap: 10,
216
- paddingHorizontal: 12,
217
- paddingVertical: 11
218
- },
219
- optionDivider: {
220
- borderTopWidth: StyleSheet.hairlineWidth,
221
- borderTopColor: night.color.separator
222
- },
223
- optionChosen: {
224
- backgroundColor: night.color.accentSoft
225
- },
226
- optionDimmed: {
227
- opacity: 0.45
228
- },
229
- optionText: {
230
- flex: 1,
231
- gap: 2
232
- },
233
- optionLabel: {
234
- color: night.color.text,
235
- fontSize: night.font.body,
236
- fontWeight: "500"
237
- },
238
- optionLabelChosen: {
239
- color: night.color.accent
240
- },
241
- optionDetail: {
242
- color: night.color.textSecondary,
243
- fontSize: night.font.caption,
244
- lineHeight: 17
245
- },
246
- hint: {
247
- color: night.color.textTertiary,
248
- fontSize: night.font.micro,
249
- paddingHorizontal: 12,
250
- paddingBottom: 10
251
- },
252
- confirmTitle: {
253
- color: night.color.text,
254
- fontSize: night.font.row,
255
- fontWeight: "600",
256
- paddingHorizontal: 12,
257
- paddingTop: 12
258
- },
259
- confirmChange: {
260
- color: night.color.text,
261
- fontSize: night.font.body,
262
- lineHeight: 19,
263
- paddingHorizontal: 12,
264
- paddingTop: 6
265
- },
266
- confirmConsequence: {
267
- color: night.color.warning,
268
- fontSize: night.font.caption,
269
- lineHeight: 17,
270
- paddingHorizontal: 12,
271
- paddingTop: 6
272
- },
273
- confirmActions: {
274
- flexDirection: "row",
275
- gap: 8,
276
- paddingHorizontal: 12,
277
- paddingVertical: 12,
278
- alignItems: "center"
279
- },
280
- decided: {
281
- color: night.color.textSecondary,
282
- fontSize: night.font.caption,
283
- fontWeight: "600",
284
- paddingHorizontal: 12,
285
- paddingVertical: 10
286
- },
287
- inputRow: {
288
- flexDirection: "row",
289
- alignItems: "center",
290
- gap: 8,
291
- paddingHorizontal: 12,
292
- paddingBottom: 12
293
- },
294
- input: {
295
- flex: 1,
296
- height: 38,
297
- paddingHorizontal: 12,
298
- borderRadius: night.radius.row,
299
- backgroundColor: night.color.surfaceElevated,
300
- color: night.color.text,
301
- fontSize: night.font.body
302
- },
303
- button: {
304
- paddingHorizontal: 14,
305
- paddingVertical: 9,
306
- borderRadius: night.radius.row
307
- },
308
- buttonPrimary: {
309
- backgroundColor: night.color.accent
310
- },
311
- buttonPlate: {
312
- backgroundColor: night.color.button
313
- },
314
- buttonDisabled: {
315
- opacity: 0.5
316
- },
317
- buttonTextPrimary: {
318
- color: night.color.onAccent,
319
- fontSize: night.font.caption,
320
- fontWeight: "600"
321
- },
322
- buttonTextPlate: {
323
- color: night.color.text,
324
- fontSize: night.font.caption,
325
- fontWeight: "600"
326
- },
327
- pressed: {
328
- opacity: 0.7
329
- }
330
- });
331
- //# sourceMappingURL=AskBlocks.js.map
1
+ "use strict";import{useState}from"react";import{Pressable,StyleSheet,Text,TextInput,View}from"react-native";import{Check,ChevronRight,night}from"@buoy-gg/shared-ui";import{useBlockHandlers}from"./context";import{BlockIcon}from"./icons";import{Card}from"./primitives";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";export function Choice({block:e}){const t=useBlockHandlers(),o=t.answered[e.id],n="choice"===o?.kind?o.optionId:null,i=!!o;return _jsxs(Card,{testID:`buoy-block-choice-${e.id}`,tone:i?void 0:"info",children:[_jsx(Text,{style:styles.question,children:e.question}),_jsx(View,{style:styles.options,children:e.options.slice(0,5).map((o,l)=>{const s=n===o.id;return _jsxs(Pressable,{testID:`buoy-block-option-${o.id}`,accessibilityRole:"button",accessibilityState:{selected:s,disabled:i},disabled:i,onPress:()=>t.answer({blockId:e.id,kind:"choice",optionId:o.id,label:o.label}),style:({pressed:e})=>[styles.option,l>0&&styles.optionDivider,s&&styles.optionChosen,i&&!s&&styles.optionDimmed,e&&!i&&styles.pressed],children:[o.icon?_jsx(BlockIcon,{name:o.icon}):null,_jsxs(View,{style:styles.optionText,children:[_jsx(Text,{style:[styles.optionLabel,s&&styles.optionLabelChosen],children:o.label}),o.detail?_jsx(Text,{style:styles.optionDetail,children:o.detail}):null]}),s?_jsx(Check,{size:14,color:night.color.accent}):i?null:_jsx(ChevronRight,{size:14,color:night.color.textTertiary})]},o.id)})}),i||!1===e.allowFreeText?null:_jsx(Text,{style:styles.hint,children:"Or just type your answer below."})]})}export function Confirm({block:e}){const t=useBlockHandlers(),o=t.answered[e.id],n=!!o,i="confirm"===o?.kind?o.approved:null;return _jsxs(Card,{testID:`buoy-block-confirm-${e.id}`,tone:n?void 0:"warning",children:[_jsx(Text,{style:styles.confirmTitle,children:e.title}),_jsx(Text,{style:styles.confirmChange,children:e.change}),e.consequence?_jsx(Text,{style:styles.confirmConsequence,children:e.consequence}):null,_jsx(View,{style:styles.confirmActions,children:n?_jsx(Text,{style:styles.decided,children:i?`✓ ${e.approveLabel??"Done"}`:`✕ ${e.declineLabel??"Not now"}`}):_jsxs(_Fragment,{children:[_jsx(Pressable,{testID:"buoy-block-approve",accessibilityRole:"button",onPress:()=>t.answer({blockId:e.id,kind:"confirm",approved:!0}),style:({pressed:e})=>[styles.button,styles.buttonPrimary,e&&styles.pressed],children:_jsx(Text,{style:styles.buttonTextPrimary,children:e.approveLabel??"Do it"})}),_jsx(Pressable,{testID:"buoy-block-decline",accessibilityRole:"button",onPress:()=>t.answer({blockId:e.id,kind:"confirm",approved:!1}),style:({pressed:e})=>[styles.button,styles.buttonPlate,e&&styles.pressed],children:_jsx(Text,{style:styles.buttonTextPlate,children:e.declineLabel??"Not now"})})]})})]})}export function Input({block:e}){const t=useBlockHandlers(),o=t.answered[e.id],n=!!o,[i,l]=useState(""),s="secret"===e.type,r=()=>{const o=i.trim();o&&t.answer({blockId:e.id,kind:"input",value:o})};return _jsxs(Card,{testID:`buoy-block-input-${e.id}`,tone:n?void 0:"info",children:[_jsx(Text,{style:styles.question,children:e.label}),n?_jsx(Text,{style:styles.decided,children:"input"===o.kind?s?"••••••":o.value:"(skipped)"}):_jsxs(View,{style:styles.inputRow,children:[_jsx(TextInput,{testID:"buoy-block-input-field",style:styles.input,value:i,onChangeText:l,placeholder:e.placeholder??"",placeholderTextColor:night.color.placeholder,keyboardType:"number"===e.type?"numeric":"ascii-capable",secureTextEntry:s,autoCapitalize:"none",autoCorrect:!1,returnKeyType:"send",onSubmitEditing:r}),_jsx(Pressable,{testID:"buoy-block-input-submit",accessibilityRole:"button",disabled:!i.trim(),onPress:r,style:({pressed:e})=>[styles.button,styles.buttonPrimary,!i.trim()&&styles.buttonDisabled,e&&styles.pressed],children:_jsx(Text,{style:styles.buttonTextPrimary,children:e.submitLabel??"Send"})})]})]})}const styles=StyleSheet.create({question:{color:night.color.text,fontSize:night.font.row,fontWeight:"600",lineHeight:20,paddingHorizontal:12,paddingTop:12,paddingBottom:8},options:{marginHorizontal:8,marginBottom:8,borderRadius:night.radius.row,backgroundColor:night.color.surfaceElevated,overflow:"hidden"},option:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:12,paddingVertical:11},optionDivider:{borderTopWidth:StyleSheet.hairlineWidth,borderTopColor:night.color.separator},optionChosen:{backgroundColor:night.color.accentSoft},optionDimmed:{opacity:.45},optionText:{flex:1,gap:2},optionLabel:{color:night.color.text,fontSize:night.font.body,fontWeight:"500"},optionLabelChosen:{color:night.color.accent},optionDetail:{color:night.color.textSecondary,fontSize:night.font.caption,lineHeight:17},hint:{color:night.color.textTertiary,fontSize:night.font.micro,paddingHorizontal:12,paddingBottom:10},confirmTitle:{color:night.color.text,fontSize:night.font.row,fontWeight:"600",paddingHorizontal:12,paddingTop:12},confirmChange:{color:night.color.text,fontSize:night.font.body,lineHeight:19,paddingHorizontal:12,paddingTop:6},confirmConsequence:{color:night.color.warning,fontSize:night.font.caption,lineHeight:17,paddingHorizontal:12,paddingTop:6},confirmActions:{flexDirection:"row",gap:8,paddingHorizontal:12,paddingVertical:12,alignItems:"center"},decided:{color:night.color.textSecondary,fontSize:night.font.caption,fontWeight:"600",paddingHorizontal:12,paddingVertical:10},inputRow:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:12,paddingBottom:12},input:{flex:1,height:38,paddingHorizontal:12,borderRadius:night.radius.row,backgroundColor:night.color.surfaceElevated,color:night.color.text,fontSize:night.font.body},button:{paddingHorizontal:14,paddingVertical:9,borderRadius:night.radius.row},buttonPrimary:{backgroundColor:night.color.accent},buttonPlate:{backgroundColor:night.color.button},buttonDisabled:{opacity:.5},buttonTextPrimary:{color:night.color.onAccent,fontSize:night.font.caption,fontWeight:"600"},buttonTextPlate:{color:night.color.text,fontSize:night.font.caption,fontWeight:"600"},pressed:{opacity:.7}});
@@ -1,245 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * One switch, one component per kind. Unknown kinds render nothing — an
5
- * older sheet receiving a newer engine's block must not crash the transcript.
6
- *
7
- * Every block renders inside an error boundary for the same reason: block
8
- * data comes from tool results and (via `buoy_ui`) from the model, and a
9
- * shape the renderer chokes on must cost ONE card, not the conversation. A
10
- * live eval watched model-fabricated data crash the app and take the chat —
11
- * the only undo surface — down with it.
12
- */
13
- import { Component } from "react";
14
- import { StyleSheet, Text } from "react-native";
15
- import { night } from "@buoy-gg/shared-ui";
16
- import { Choice, Confirm, Input } from "./AskBlocks";
17
- import { Chart, Code, Diff, Finding, KeyValue, List, Notice, Steps, Table } from "./DataBlocks";
18
- import { ImageGrid } from "./MediaBlocks";
19
- import { Crash, LogList, Peek, RequestCard, RequestList, RouteChips, RuleCard, ScreenElements } from "./ReceiptBlocks";
20
- import { Banner, CardCarousel, CardView, Checkpoint, Claim, Compare, DateTime, Details, File, Form, MultiSelect, Plan, Proposal, Screenshot, Select, Slider, Sparkline, Suggestions, Tabs, Task, Timeline, Upload } from "./ExtraBlocks";
21
- import { ActionRow } from "./primitives";
22
- import { jsx as _jsx } from "react/jsx-runtime";
23
- class BlockBoundary extends Component {
24
- state = {
25
- failed: false
26
- };
27
- static getDerivedStateFromError() {
28
- return {
29
- failed: true
30
- };
31
- }
32
- render() {
33
- if (this.state.failed) {
34
- return /*#__PURE__*/_jsx(Text, {
35
- style: boundaryStyles.fallback,
36
- testID: "buoy-block-render-failed",
37
- children: "This card couldn't be drawn \u2014 the data behind it is still in the conversation."
38
- });
39
- }
40
- return this.props.children;
41
- }
42
- }
43
- const boundaryStyles = StyleSheet.create({
44
- fallback: {
45
- color: night.color.textTertiary,
46
- fontSize: night.font.micro,
47
- fontStyle: "italic",
48
- paddingVertical: 6
49
- }
50
- });
51
- export function BlockRenderer({
52
- block
53
- }) {
54
- return /*#__PURE__*/_jsx(BlockBoundary, {
55
- children: /*#__PURE__*/_jsx(BlockRendererInner, {
56
- block: block
57
- })
58
- });
59
- }
60
- function BlockRendererInner({
61
- block
62
- }) {
63
- switch (block.kind) {
64
- case "choice":
65
- return /*#__PURE__*/_jsx(Choice, {
66
- block: block
67
- });
68
- case "confirm":
69
- return /*#__PURE__*/_jsx(Confirm, {
70
- block: block
71
- });
72
- case "input":
73
- return /*#__PURE__*/_jsx(Input, {
74
- block: block
75
- });
76
- case "table":
77
- return /*#__PURE__*/_jsx(Table, {
78
- block: block
79
- });
80
- case "keyValue":
81
- return /*#__PURE__*/_jsx(KeyValue, {
82
- block: block
83
- });
84
- case "list":
85
- return /*#__PURE__*/_jsx(List, {
86
- block: block
87
- });
88
- case "imageGrid":
89
- return /*#__PURE__*/_jsx(ImageGrid, {
90
- block: block
91
- });
92
- case "diff":
93
- return /*#__PURE__*/_jsx(Diff, {
94
- block: block
95
- });
96
- case "chart":
97
- return /*#__PURE__*/_jsx(Chart, {
98
- block: block
99
- });
100
- case "steps":
101
- return /*#__PURE__*/_jsx(Steps, {
102
- block: block
103
- });
104
- case "code":
105
- return /*#__PURE__*/_jsx(Code, {
106
- block: block
107
- });
108
- case "actions":
109
- return /*#__PURE__*/_jsx(ActionRow, {
110
- actions: block.actions,
111
- blockId: block.id
112
- });
113
- case "notice":
114
- return /*#__PURE__*/_jsx(Notice, {
115
- block: block
116
- });
117
- case "finding":
118
- return /*#__PURE__*/_jsx(Finding, {
119
- block: block
120
- });
121
- case "requestList":
122
- return /*#__PURE__*/_jsx(RequestList, {
123
- block: block
124
- });
125
- case "requestCard":
126
- return /*#__PURE__*/_jsx(RequestCard, {
127
- block: block
128
- });
129
- case "ruleCard":
130
- return /*#__PURE__*/_jsx(RuleCard, {
131
- block: block
132
- });
133
- case "screenElements":
134
- return /*#__PURE__*/_jsx(ScreenElements, {
135
- block: block
136
- });
137
- case "routeChips":
138
- return /*#__PURE__*/_jsx(RouteChips, {
139
- block: block
140
- });
141
- case "logList":
142
- return /*#__PURE__*/_jsx(LogList, {
143
- block: block
144
- });
145
- case "crash":
146
- return /*#__PURE__*/_jsx(Crash, {
147
- block: block
148
- });
149
- case "peek":
150
- return /*#__PURE__*/_jsx(Peek, {
151
- block: block
152
- });
153
- case "suggestions":
154
- return /*#__PURE__*/_jsx(Suggestions, {
155
- block: block
156
- });
157
- case "multiSelect":
158
- return /*#__PURE__*/_jsx(MultiSelect, {
159
- block: block
160
- });
161
- case "select":
162
- return /*#__PURE__*/_jsx(Select, {
163
- block: block
164
- });
165
- case "slider":
166
- return /*#__PURE__*/_jsx(Slider, {
167
- block: block
168
- });
169
- case "dateTime":
170
- return /*#__PURE__*/_jsx(DateTime, {
171
- block: block
172
- });
173
- case "form":
174
- return /*#__PURE__*/_jsx(Form, {
175
- block: block
176
- });
177
- case "proposal":
178
- return /*#__PURE__*/_jsx(Proposal, {
179
- block: block
180
- });
181
- case "claim":
182
- return /*#__PURE__*/_jsx(Claim, {
183
- block: block
184
- });
185
- case "details":
186
- return /*#__PURE__*/_jsx(Details, {
187
- block: block
188
- });
189
- case "tabs":
190
- return /*#__PURE__*/_jsx(Tabs, {
191
- block: block
192
- });
193
- case "timeline":
194
- return /*#__PURE__*/_jsx(Timeline, {
195
- block: block
196
- });
197
- case "sparkline":
198
- return /*#__PURE__*/_jsx(Sparkline, {
199
- block: block
200
- });
201
- case "compare":
202
- return /*#__PURE__*/_jsx(Compare, {
203
- block: block
204
- });
205
- case "card":
206
- return /*#__PURE__*/_jsx(CardView, {
207
- block: block
208
- });
209
- case "cardCarousel":
210
- return /*#__PURE__*/_jsx(CardCarousel, {
211
- block: block
212
- });
213
- case "screenshot":
214
- return /*#__PURE__*/_jsx(Screenshot, {
215
- block: block
216
- });
217
- case "plan":
218
- return /*#__PURE__*/_jsx(Plan, {
219
- block: block
220
- });
221
- case "checkpoint":
222
- return /*#__PURE__*/_jsx(Checkpoint, {
223
- block: block
224
- });
225
- case "task":
226
- return /*#__PURE__*/_jsx(Task, {
227
- block: block
228
- });
229
- case "banner":
230
- return /*#__PURE__*/_jsx(Banner, {
231
- block: block
232
- });
233
- case "file":
234
- return /*#__PURE__*/_jsx(File, {
235
- block: block
236
- });
237
- case "upload":
238
- return /*#__PURE__*/_jsx(Upload, {
239
- block: block
240
- });
241
- default:
242
- return null;
243
- }
244
- }
245
- //# sourceMappingURL=BlockRenderer.js.map
1
+ "use strict";import{Component}from"react";import{StyleSheet,Text}from"react-native";import{night}from"@buoy-gg/shared-ui";import{Choice,Confirm,Input}from"./AskBlocks";import{Chart,Code,Diff,Finding,KeyValue,List,Notice,Steps,Table}from"./DataBlocks";import{ImageGrid}from"./MediaBlocks";import{Crash,LogList,Peek,RequestCard,RequestList,RouteChips,RuleCard,ScreenElements}from"./ReceiptBlocks";import{Banner,CardCarousel,CardView,Checkpoint,Claim,Compare,DateTime,Details,File,Form,MultiSelect,Plan,Proposal,Screenshot,Select,Slider,Sparkline,Suggestions,Tabs,Task,Timeline,Upload}from"./ExtraBlocks";import{ActionRow}from"./primitives";import{jsx as _jsx}from"react/jsx-runtime";class BlockBoundary extends Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?_jsx(Text,{style:boundaryStyles.fallback,testID:"buoy-block-render-failed",children:"This card couldn't be drawn — the data behind it is still in the conversation."}):this.props.children}}const boundaryStyles=StyleSheet.create({fallback:{color:night.color.textTertiary,fontSize:night.font.micro,fontStyle:"italic",paddingVertical:6}});export function BlockRenderer({block:e}){return _jsx(BlockBoundary,{children:_jsx(BlockRendererInner,{block:e})})}function BlockRendererInner({block:e}){switch(e.kind){case"choice":return _jsx(Choice,{block:e});case"confirm":return _jsx(Confirm,{block:e});case"input":return _jsx(Input,{block:e});case"table":return _jsx(Table,{block:e});case"keyValue":return _jsx(KeyValue,{block:e});case"list":return _jsx(List,{block:e});case"imageGrid":return _jsx(ImageGrid,{block:e});case"diff":return _jsx(Diff,{block:e});case"chart":return _jsx(Chart,{block:e});case"steps":return _jsx(Steps,{block:e});case"code":return _jsx(Code,{block:e});case"actions":return _jsx(ActionRow,{actions:e.actions,blockId:e.id});case"notice":return _jsx(Notice,{block:e});case"finding":return _jsx(Finding,{block:e});case"requestList":return _jsx(RequestList,{block:e});case"requestCard":return _jsx(RequestCard,{block:e});case"ruleCard":return _jsx(RuleCard,{block:e});case"screenElements":return _jsx(ScreenElements,{block:e});case"routeChips":return _jsx(RouteChips,{block:e});case"logList":return _jsx(LogList,{block:e});case"crash":return _jsx(Crash,{block:e});case"peek":return _jsx(Peek,{block:e});case"suggestions":return _jsx(Suggestions,{block:e});case"multiSelect":return _jsx(MultiSelect,{block:e});case"select":return _jsx(Select,{block:e});case"slider":return _jsx(Slider,{block:e});case"dateTime":return _jsx(DateTime,{block:e});case"form":return _jsx(Form,{block:e});case"proposal":return _jsx(Proposal,{block:e});case"claim":return _jsx(Claim,{block:e});case"details":return _jsx(Details,{block:e});case"tabs":return _jsx(Tabs,{block:e});case"timeline":return _jsx(Timeline,{block:e});case"sparkline":return _jsx(Sparkline,{block:e});case"compare":return _jsx(Compare,{block:e});case"card":return _jsx(CardView,{block:e});case"cardCarousel":return _jsx(CardCarousel,{block:e});case"screenshot":return _jsx(Screenshot,{block:e});case"plan":return _jsx(Plan,{block:e});case"checkpoint":return _jsx(Checkpoint,{block:e});case"task":return _jsx(Task,{block:e});case"banner":return _jsx(Banner,{block:e});case"file":return _jsx(File,{block:e});case"upload":return _jsx(Upload,{block:e});default:return null}}