@rippling/rippling-sdk 0.2.0-alpha.34 → 0.2.0-alpha.36

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 (270) hide show
  1. package/client.d.mts +6 -0
  2. package/client.d.mts.map +1 -1
  3. package/client.d.ts +6 -0
  4. package/client.d.ts.map +1 -1
  5. package/client.js +6 -0
  6. package/client.js.map +1 -1
  7. package/client.mjs +6 -0
  8. package/client.mjs.map +1 -1
  9. package/examples/.keep +4 -0
  10. package/examples/manifest/dental-practice-management/dental-practice-management.ts +651 -0
  11. package/examples/manifest/dental-practice-management/manifest.json +1870 -0
  12. package/examples/manifest/gym-membership-management/gym-membership-management.ts +757 -0
  13. package/examples/manifest/gym-membership-management/manifest.json +1975 -0
  14. package/examples/sdui/sdui-crud-todo/rippling-function.ts +367 -0
  15. package/examples/sdui/sdui-crud-todo/sdui-crud-todo.ts +282 -0
  16. package/examples/sdui/sdui-showcase/rippling-function.ts +381 -0
  17. package/examples/sdui/sdui-showcase/sdui-showcase.ts +351 -0
  18. package/examples/sdui/sdui-tab-multi-view/rippling-function.ts +1061 -0
  19. package/examples/sdui/sdui-tab-multi-view/sdui-tab-multi-view.ts +924 -0
  20. package/examples/sdui/vote/rippling-function.ts +330 -0
  21. package/examples/sdui/vote/vote.ts +298 -0
  22. package/lib/manifest/app.d.mts +81 -13
  23. package/lib/manifest/app.d.mts.map +1 -1
  24. package/lib/manifest/app.d.ts +81 -13
  25. package/lib/manifest/app.d.ts.map +1 -1
  26. package/lib/manifest/app.js +37 -16
  27. package/lib/manifest/app.js.map +1 -1
  28. package/lib/manifest/app.mjs +37 -16
  29. package/lib/manifest/app.mjs.map +1 -1
  30. package/lib/manifest/category.d.mts +63 -7
  31. package/lib/manifest/category.d.mts.map +1 -1
  32. package/lib/manifest/category.d.ts +63 -7
  33. package/lib/manifest/category.d.ts.map +1 -1
  34. package/lib/manifest/category.js +45 -10
  35. package/lib/manifest/category.js.map +1 -1
  36. package/lib/manifest/category.mjs +43 -8
  37. package/lib/manifest/category.mjs.map +1 -1
  38. package/lib/manifest/custom-object-field-section.d.mts +56 -6
  39. package/lib/manifest/custom-object-field-section.d.mts.map +1 -1
  40. package/lib/manifest/custom-object-field-section.d.ts +56 -6
  41. package/lib/manifest/custom-object-field-section.d.ts.map +1 -1
  42. package/lib/manifest/custom-object-field-section.js +41 -14
  43. package/lib/manifest/custom-object-field-section.js.map +1 -1
  44. package/lib/manifest/custom-object-field-section.mjs +39 -12
  45. package/lib/manifest/custom-object-field-section.mjs.map +1 -1
  46. package/lib/manifest/custom-object-page-layout.d.mts +201 -41
  47. package/lib/manifest/custom-object-page-layout.d.mts.map +1 -1
  48. package/lib/manifest/custom-object-page-layout.d.ts +201 -41
  49. package/lib/manifest/custom-object-page-layout.d.ts.map +1 -1
  50. package/lib/manifest/custom-object-page-layout.js +76 -30
  51. package/lib/manifest/custom-object-page-layout.js.map +1 -1
  52. package/lib/manifest/custom-object-page-layout.mjs +74 -28
  53. package/lib/manifest/custom-object-page-layout.mjs.map +1 -1
  54. package/lib/manifest/custom-object.d.mts +128 -15
  55. package/lib/manifest/custom-object.d.mts.map +1 -1
  56. package/lib/manifest/custom-object.d.ts +128 -15
  57. package/lib/manifest/custom-object.d.ts.map +1 -1
  58. package/lib/manifest/custom-object.js +61 -26
  59. package/lib/manifest/custom-object.js.map +1 -1
  60. package/lib/manifest/custom-object.mjs +61 -26
  61. package/lib/manifest/custom-object.mjs.map +1 -1
  62. package/lib/manifest/field.d.mts +265 -54
  63. package/lib/manifest/field.d.mts.map +1 -1
  64. package/lib/manifest/field.d.ts +265 -54
  65. package/lib/manifest/field.d.ts.map +1 -1
  66. package/lib/manifest/field.js +100 -57
  67. package/lib/manifest/field.js.map +1 -1
  68. package/lib/manifest/field.mjs +100 -57
  69. package/lib/manifest/field.mjs.map +1 -1
  70. package/lib/manifest/list-view.d.mts +105 -14
  71. package/lib/manifest/list-view.d.mts.map +1 -1
  72. package/lib/manifest/list-view.d.ts +105 -14
  73. package/lib/manifest/list-view.d.ts.map +1 -1
  74. package/lib/manifest/list-view.js +50 -14
  75. package/lib/manifest/list-view.js.map +1 -1
  76. package/lib/manifest/list-view.mjs +48 -12
  77. package/lib/manifest/list-view.mjs.map +1 -1
  78. package/lib/manifest/manifest-builder.d.mts +77 -11
  79. package/lib/manifest/manifest-builder.d.mts.map +1 -1
  80. package/lib/manifest/manifest-builder.d.ts +77 -11
  81. package/lib/manifest/manifest-builder.d.ts.map +1 -1
  82. package/lib/manifest/manifest-builder.js +46 -24
  83. package/lib/manifest/manifest-builder.js.map +1 -1
  84. package/lib/manifest/manifest-builder.mjs +44 -22
  85. package/lib/manifest/manifest-builder.mjs.map +1 -1
  86. package/lib/manifest/manifest-function.d.mts +92 -12
  87. package/lib/manifest/manifest-function.d.mts.map +1 -1
  88. package/lib/manifest/manifest-function.d.ts +92 -12
  89. package/lib/manifest/manifest-function.d.ts.map +1 -1
  90. package/lib/manifest/manifest-function.js +40 -11
  91. package/lib/manifest/manifest-function.js.map +1 -1
  92. package/lib/manifest/manifest-function.mjs +38 -9
  93. package/lib/manifest/manifest-function.mjs.map +1 -1
  94. package/lib/manifest/rule.d.mts +94 -16
  95. package/lib/manifest/rule.d.mts.map +1 -1
  96. package/lib/manifest/rule.d.ts +94 -16
  97. package/lib/manifest/rule.d.ts.map +1 -1
  98. package/lib/manifest/rule.js +36 -15
  99. package/lib/manifest/rule.js.map +1 -1
  100. package/lib/manifest/rule.mjs +36 -15
  101. package/lib/manifest/rule.mjs.map +1 -1
  102. package/lib/manifest/sdui-page.d.mts +67 -11
  103. package/lib/manifest/sdui-page.d.mts.map +1 -1
  104. package/lib/manifest/sdui-page.d.ts +67 -11
  105. package/lib/manifest/sdui-page.d.ts.map +1 -1
  106. package/lib/manifest/sdui-page.js +44 -13
  107. package/lib/manifest/sdui-page.js.map +1 -1
  108. package/lib/manifest/sdui-page.mjs +42 -11
  109. package/lib/manifest/sdui-page.mjs.map +1 -1
  110. package/lib/manifest/validation.d.mts +87 -12
  111. package/lib/manifest/validation.d.mts.map +1 -1
  112. package/lib/manifest/validation.d.ts +87 -12
  113. package/lib/manifest/validation.d.ts.map +1 -1
  114. package/lib/manifest/validation.js +41 -15
  115. package/lib/manifest/validation.js.map +1 -1
  116. package/lib/manifest/validation.mjs +39 -13
  117. package/lib/manifest/validation.mjs.map +1 -1
  118. package/lib/sdui/actions.d.mts +25 -0
  119. package/lib/sdui/actions.d.mts.map +1 -0
  120. package/lib/sdui/actions.d.ts +25 -0
  121. package/lib/sdui/actions.d.ts.map +1 -0
  122. package/lib/sdui/actions.js +53 -0
  123. package/lib/sdui/actions.js.map +1 -0
  124. package/lib/sdui/actions.mjs +42 -0
  125. package/lib/sdui/actions.mjs.map +1 -0
  126. package/lib/sdui/component.d.mts +41 -0
  127. package/lib/sdui/component.d.mts.map +1 -0
  128. package/lib/sdui/component.d.ts +41 -0
  129. package/lib/sdui/component.d.ts.map +1 -0
  130. package/lib/sdui/component.js +95 -0
  131. package/lib/sdui/component.js.map +1 -0
  132. package/lib/sdui/component.mjs +91 -0
  133. package/lib/sdui/component.mjs.map +1 -0
  134. package/lib/sdui/components.d.mts +149 -0
  135. package/lib/sdui/components.d.mts.map +1 -0
  136. package/lib/sdui/components.d.ts +149 -0
  137. package/lib/sdui/components.d.ts.map +1 -0
  138. package/lib/sdui/components.js +303 -0
  139. package/lib/sdui/components.js.map +1 -0
  140. package/lib/sdui/components.mjs +298 -0
  141. package/lib/sdui/components.mjs.map +1 -0
  142. package/lib/sdui/conditions.d.mts +25 -0
  143. package/lib/sdui/conditions.d.mts.map +1 -0
  144. package/lib/sdui/conditions.d.ts +25 -0
  145. package/lib/sdui/conditions.d.ts.map +1 -0
  146. package/lib/sdui/conditions.js +47 -0
  147. package/lib/sdui/conditions.js.map +1 -0
  148. package/lib/sdui/conditions.mjs +35 -0
  149. package/lib/sdui/conditions.mjs.map +1 -0
  150. package/lib/sdui/directives.d.mts +18 -0
  151. package/lib/sdui/directives.d.mts.map +1 -0
  152. package/lib/sdui/directives.d.ts +18 -0
  153. package/lib/sdui/directives.d.ts.map +1 -0
  154. package/lib/sdui/directives.js +28 -0
  155. package/lib/sdui/directives.js.map +1 -0
  156. package/lib/sdui/directives.mjs +21 -0
  157. package/lib/sdui/directives.mjs.map +1 -0
  158. package/lib/sdui/index.d.mts +362 -0
  159. package/lib/sdui/index.d.mts.map +1 -0
  160. package/lib/sdui/index.d.ts +362 -0
  161. package/lib/sdui/index.d.ts.map +1 -0
  162. package/lib/sdui/index.js +375 -0
  163. package/lib/sdui/index.js.map +1 -0
  164. package/lib/sdui/index.mjs +199 -0
  165. package/lib/sdui/index.mjs.map +1 -0
  166. package/lib/sdui/props.d.mts +12 -0
  167. package/lib/sdui/props.d.mts.map +1 -0
  168. package/lib/sdui/props.d.ts +12 -0
  169. package/lib/sdui/props.d.ts.map +1 -0
  170. package/lib/sdui/props.js +25 -0
  171. package/lib/sdui/props.js.map +1 -0
  172. package/lib/sdui/props.mjs +21 -0
  173. package/lib/sdui/props.mjs.map +1 -0
  174. package/lib/sdui/render.d.mts +23 -0
  175. package/lib/sdui/render.d.mts.map +1 -0
  176. package/lib/sdui/render.d.ts +23 -0
  177. package/lib/sdui/render.d.ts.map +1 -0
  178. package/lib/sdui/render.js +40 -0
  179. package/lib/sdui/render.js.map +1 -0
  180. package/lib/sdui/render.mjs +37 -0
  181. package/lib/sdui/render.mjs.map +1 -0
  182. package/lib/sdui/state.d.mts +22 -0
  183. package/lib/sdui/state.d.mts.map +1 -0
  184. package/lib/sdui/state.d.ts +22 -0
  185. package/lib/sdui/state.d.ts.map +1 -0
  186. package/lib/sdui/state.js +57 -0
  187. package/lib/sdui/state.js.map +1 -0
  188. package/lib/sdui/state.mjs +53 -0
  189. package/lib/sdui/state.mjs.map +1 -0
  190. package/package.json +11 -1
  191. package/resources/company-legal-entity-workers.d.mts +79 -0
  192. package/resources/company-legal-entity-workers.d.mts.map +1 -0
  193. package/resources/company-legal-entity-workers.d.ts +79 -0
  194. package/resources/company-legal-entity-workers.d.ts.map +1 -0
  195. package/resources/company-legal-entity-workers.js +30 -0
  196. package/resources/company-legal-entity-workers.js.map +1 -0
  197. package/resources/company-legal-entity-workers.mjs +26 -0
  198. package/resources/company-legal-entity-workers.mjs.map +1 -0
  199. package/resources/draft-hires.d.mts +4 -0
  200. package/resources/draft-hires.d.mts.map +1 -1
  201. package/resources/draft-hires.d.ts +4 -0
  202. package/resources/draft-hires.d.ts.map +1 -1
  203. package/resources/files.d.mts +16 -1
  204. package/resources/files.d.mts.map +1 -1
  205. package/resources/files.d.ts +16 -1
  206. package/resources/files.d.ts.map +1 -1
  207. package/resources/headcount-positions.d.mts +2 -2
  208. package/resources/headcount-positions.d.mts.map +1 -1
  209. package/resources/headcount-positions.d.ts +2 -2
  210. package/resources/headcount-positions.d.ts.map +1 -1
  211. package/resources/index.d.mts +1 -0
  212. package/resources/index.d.mts.map +1 -1
  213. package/resources/index.d.ts +1 -0
  214. package/resources/index.d.ts.map +1 -1
  215. package/resources/index.js +4 -2
  216. package/resources/index.js.map +1 -1
  217. package/resources/index.mjs +1 -0
  218. package/resources/index.mjs.map +1 -1
  219. package/resources/legal-entities.d.mts +1 -1
  220. package/resources/legal-entities.d.mts.map +1 -1
  221. package/resources/legal-entities.d.ts +1 -1
  222. package/resources/legal-entities.d.ts.map +1 -1
  223. package/resources/location-factors.d.mts +2 -2
  224. package/resources/location-factors.d.mts.map +1 -1
  225. package/resources/location-factors.d.ts +2 -2
  226. package/resources/location-factors.d.ts.map +1 -1
  227. package/resources/shared.d.mts +1 -1
  228. package/resources/shared.d.mts.map +1 -1
  229. package/resources/shared.d.ts +1 -1
  230. package/resources/shared.d.ts.map +1 -1
  231. package/resources/workers.d.mts +2 -2
  232. package/resources/workers.d.mts.map +1 -1
  233. package/resources/workers.d.ts +2 -2
  234. package/resources/workers.d.ts.map +1 -1
  235. package/src/client.ts +20 -0
  236. package/src/lib/manifest/app.ts +81 -26
  237. package/src/lib/manifest/category.ts +63 -14
  238. package/src/lib/manifest/custom-object-field-section.ts +56 -17
  239. package/src/lib/manifest/custom-object-page-layout.ts +201 -66
  240. package/src/lib/manifest/custom-object.ts +128 -37
  241. package/src/lib/manifest/field.ts +265 -75
  242. package/src/lib/manifest/list-view.ts +105 -25
  243. package/src/lib/manifest/manifest-builder.ts +75 -32
  244. package/src/lib/manifest/manifest-function.ts +92 -22
  245. package/src/lib/manifest/rule.ts +95 -29
  246. package/src/lib/manifest/sdui-page.ts +67 -21
  247. package/src/lib/manifest/validation.ts +87 -24
  248. package/src/lib/sdui/actions.ts +58 -0
  249. package/src/lib/sdui/component.ts +122 -0
  250. package/src/lib/sdui/components.ts +308 -0
  251. package/src/lib/sdui/conditions.ts +59 -0
  252. package/src/lib/sdui/directives.ts +42 -0
  253. package/src/lib/sdui/index.ts +365 -0
  254. package/src/lib/sdui/props.ts +32 -0
  255. package/src/lib/sdui/render.ts +58 -0
  256. package/src/lib/sdui/state.ts +60 -0
  257. package/src/resources/company-legal-entity-workers.ts +115 -0
  258. package/src/resources/draft-hires.ts +5 -0
  259. package/src/resources/files.ts +18 -1
  260. package/src/resources/headcount-positions.ts +2 -0
  261. package/src/resources/index.ts +7 -0
  262. package/src/resources/legal-entities.ts +1 -0
  263. package/src/resources/location-factors.ts +2 -0
  264. package/src/resources/shared.ts +1 -0
  265. package/src/resources/workers.ts +2 -0
  266. package/src/version.ts +1 -1
  267. package/version.d.mts +1 -1
  268. package/version.d.ts +1 -1
  269. package/version.js +1 -1
  270. package/version.mjs +1 -1
@@ -0,0 +1,330 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * PASTE INTO THE RIPPLING FUNCTION EDITOR TO PREVIEW. DEPENDS ON
4
+ * @rippling/rippling-sdk AND @rippling/sdui-builder. MOCK POLL ONLY.
5
+ * ----------------------------------------------------------------------------
6
+ */
7
+
8
+ /*
9
+ import SDUI from '@rippling/sdui-builder';
10
+ import { FunctionContext, FunctionEvent, FunctionResponse } from '@rippling/rippling-sdk';
11
+
12
+ // Whole-number percentages that sum to 100 — matches what DistributionBar
13
+ // and ProgressBar both expect, so they tell the same visual story.
14
+ const PCT_V = 52;
15
+ const PCT_Q = 33;
16
+ const PCT_D = 15;
17
+ const POLL_TOTAL = PCT_V + PCT_Q + PCT_D;
18
+
19
+ const POLL_SEGMENTS = [
20
+ { value: PCT_V, segmentColor: '#4F46E5' },
21
+ { value: PCT_Q, segmentColor: '#059669' },
22
+ { value: PCT_D, segmentColor: '#EA580C' },
23
+ ];
24
+
25
+ function renderSpec(_functionId: string) {
26
+ const s = SDUI.createState({
27
+ voteChoice: '',
28
+ resultsVisible: false,
29
+ });
30
+
31
+ // Vote cards: every card gets the same explicit width: '33%' so they're
32
+ // mathematically equal regardless of content length. justify 'space-between'
33
+ // is a real CSS value (unlike 'stretch') so layout actually applies.
34
+ const voteCards = SDUI.components.HStack({
35
+ gap: 'space500',
36
+ wrap: false,
37
+ justify: 'space-between',
38
+ align: 'stretch',
39
+ children: [
40
+ SDUI.components.Layout({
41
+ width: '33%',
42
+ children: [
43
+ SDUI.components.Card({
44
+ title: 'Ship faster',
45
+ padding: '32',
46
+ children: [
47
+ SDUI.components.VStack({
48
+ gap: 'space500',
49
+ align: 'stretch',
50
+ children: [
51
+ SDUI.components.Text({
52
+ text: 'More releases, shorter cycles.',
53
+ typestyle: 'bodyLg',
54
+ color: 'secondary',
55
+ }),
56
+ SDUI.components.Button({
57
+ label: 'Vote',
58
+ appearance: 'PRIMARY',
59
+ size: 'L',
60
+ onPress: [
61
+ SDUI.actions.set(s.voteChoice, 'velocity'),
62
+ SDUI.actions.set(s.resultsVisible, true),
63
+ ],
64
+ }),
65
+ ],
66
+ }),
67
+ ],
68
+ }),
69
+ ],
70
+ }),
71
+ SDUI.components.Layout({
72
+ width: '33%',
73
+ children: [
74
+ SDUI.components.Card({
75
+ title: 'Raise quality',
76
+ padding: '32',
77
+ children: [
78
+ SDUI.components.VStack({
79
+ gap: 'space500',
80
+ align: 'stretch',
81
+ children: [
82
+ SDUI.components.Text({
83
+ text: 'Fewer bugs, better UX.',
84
+ typestyle: 'bodyLg',
85
+ color: 'secondary',
86
+ }),
87
+ SDUI.components.Button({
88
+ label: 'Vote',
89
+ appearance: 'SUCCESS',
90
+ size: 'L',
91
+ onPress: [
92
+ SDUI.actions.set(s.voteChoice, 'quality'),
93
+ SDUI.actions.set(s.resultsVisible, true),
94
+ ],
95
+ }),
96
+ ],
97
+ }),
98
+ ],
99
+ }),
100
+ ],
101
+ }),
102
+ SDUI.components.Layout({
103
+ width: '33%',
104
+ children: [
105
+ SDUI.components.Card({
106
+ title: 'Pay down debt',
107
+ padding: '32',
108
+ children: [
109
+ SDUI.components.VStack({
110
+ gap: 'space500',
111
+ align: 'stretch',
112
+ children: [
113
+ SDUI.components.Text({
114
+ text: 'Refactors and infra.',
115
+ typestyle: 'bodyLg',
116
+ color: 'secondary',
117
+ }),
118
+ SDUI.components.Button({
119
+ label: 'Vote',
120
+ appearance: 'WARNING',
121
+ size: 'L',
122
+ onPress: [
123
+ SDUI.actions.set(s.voteChoice, 'debt'),
124
+ SDUI.actions.set(s.resultsVisible, true),
125
+ ],
126
+ }),
127
+ ],
128
+ }),
129
+ ],
130
+ }),
131
+ ],
132
+ }),
133
+ ],
134
+ });
135
+
136
+ const shell = SDUI.components.Layout({
137
+ width: '100%',
138
+ maxWidth: '1200px',
139
+ margin: { left: 'auto', right: 'auto' },
140
+ padding: { top: 48, bottom: 56, left: 32, right: 32 },
141
+ children: [
142
+ SDUI.components.VStack({
143
+ gap: 'space700',
144
+ align: 'stretch',
145
+ children: [
146
+ SDUI.components.VStack({
147
+ gap: 'space300',
148
+ align: 'center',
149
+ children: [
150
+ SDUI.components.Heading({
151
+ level: '1',
152
+ align: 'center',
153
+ text: 'Where should we focus next quarter?',
154
+ }),
155
+ SDUI.components.Text({
156
+ align: 'center',
157
+ maxWidth: '680px',
158
+ text: 'One vote. Percentages are mock data — swap in real counts later.',
159
+ typestyle: 'bodyLg',
160
+ color: 'secondary',
161
+ }),
162
+ ],
163
+ }),
164
+ SDUI.components.Divider({}),
165
+ voteCards,
166
+ SDUI.components.HStack({
167
+ gap: 'space300',
168
+ justify: 'center',
169
+ wrap: true,
170
+ children: [
171
+ SDUI.components.Chip({
172
+ text: 'Start over',
173
+ appearance: 'NEUTRAL',
174
+ onPress: [
175
+ SDUI.actions.set(s.voteChoice, ''),
176
+ SDUI.actions.set(s.resultsVisible, false),
177
+ ],
178
+ }),
179
+ ],
180
+ }),
181
+ SDUI.visible(
182
+ SDUI.conditions.falsy(s.resultsVisible),
183
+ SDUI.components.Text({
184
+ align: 'center',
185
+ maxWidth: '560px',
186
+ typestyle: 'bodyMd',
187
+ color: 'secondary',
188
+ text: 'Tap Vote — results open below with a split bar plus one bar per option.',
189
+ }),
190
+ ),
191
+ SDUI.visible(
192
+ SDUI.conditions.truthy(s.resultsVisible),
193
+ SDUI.components.VStack({
194
+ gap: 'space500',
195
+ align: 'stretch',
196
+ children: [
197
+ // The "you voted" badge sits centered above the result card
198
+ SDUI.components.HStack({
199
+ gap: 'space200',
200
+ justify: 'center',
201
+ wrap: true,
202
+ children: [
203
+ SDUI.visible(
204
+ SDUI.conditions.eq(s.voteChoice, 'velocity'),
205
+ SDUI.components.Badge({
206
+ text: 'You voted · Ship faster',
207
+ appearance: 'PRIMARY',
208
+ }),
209
+ ),
210
+ SDUI.visible(
211
+ SDUI.conditions.eq(s.voteChoice, 'quality'),
212
+ SDUI.components.Badge({
213
+ text: 'You voted · Raise quality',
214
+ appearance: 'SUCCESS',
215
+ }),
216
+ ),
217
+ SDUI.visible(
218
+ SDUI.conditions.eq(s.voteChoice, 'debt'),
219
+ SDUI.components.Badge({
220
+ text: 'You voted · Pay down debt',
221
+ appearance: 'WARNING',
222
+ }),
223
+ ),
224
+ ],
225
+ }),
226
+ // Result card uses the Card's title prop and stretches to fill
227
+ // the shell's full width because the parent VStack is align:stretch
228
+ SDUI.components.Card({
229
+ title: 'Vote share (mock)',
230
+ padding: '32',
231
+ children: [
232
+ SDUI.components.VStack({
233
+ gap: 'space500',
234
+ align: 'stretch',
235
+ children: [
236
+ SDUI.components.Text({
237
+ typestyle: 'bodyMdEmphasis',
238
+ text: 'Overall mix',
239
+ }),
240
+ SDUI.components.Layout({
241
+ width: '100%',
242
+ padding: { top: 8, bottom: 16 },
243
+ children: [
244
+ SDUI.components.DistributionBar({
245
+ segments: POLL_SEGMENTS,
246
+ totalValue: POLL_TOTAL,
247
+ size: 'standard',
248
+ }),
249
+ ],
250
+ }),
251
+ SDUI.components.Text({
252
+ typestyle: 'bodyMdEmphasis',
253
+ text: 'Each option',
254
+ }),
255
+ SDUI.components.VStack({
256
+ gap: 'space400',
257
+ children: [
258
+ SDUI.components.ProgressBar({
259
+ value: PCT_V,
260
+ label: 'Ship faster',
261
+ appearance: 'PRIMARY',
262
+ showPercentage: true,
263
+ }),
264
+ SDUI.components.ProgressBar({
265
+ value: PCT_Q,
266
+ label: 'Raise quality',
267
+ appearance: 'SUCCESS',
268
+ showPercentage: true,
269
+ }),
270
+ SDUI.components.ProgressBar({
271
+ value: PCT_D,
272
+ label: 'Pay down debt',
273
+ appearance: 'WARNING',
274
+ showPercentage: true,
275
+ }),
276
+ ],
277
+ }),
278
+ SDUI.components.Text({
279
+ align: 'center',
280
+ typestyle: 'bodySm',
281
+ color: 'secondary',
282
+ text: 'Hook callFunction to replace mock totals.',
283
+ }),
284
+ ],
285
+ }),
286
+ ],
287
+ }),
288
+ ],
289
+ }),
290
+ ),
291
+ ],
292
+ }),
293
+ ],
294
+ });
295
+
296
+ const root = SDUI.components.VStack({
297
+ align: 'stretch',
298
+ gap: 'space0',
299
+ children: [shell],
300
+ });
301
+
302
+ return SDUI.render(s, root);
303
+ }
304
+
305
+ export async function onRipplingEvent(
306
+ event: FunctionEvent,
307
+ context: FunctionContext,
308
+ ): Promise<FunctionResponse> {
309
+ const params = event['parameters'] as Record<string, string | undefined> | undefined;
310
+ const action = params?.['action'];
311
+
312
+ if (!action || action === 'init') {
313
+ const spec = renderSpec(context.function?.function_id ?? 'demo-fn');
314
+ return new FunctionResponse({
315
+ body: { spec: JSON.stringify(spec) },
316
+ statusCode: 200,
317
+ headers: {},
318
+ message: '',
319
+ });
320
+ }
321
+
322
+ return new FunctionResponse({
323
+ body: {},
324
+ statusCode: 200,
325
+ headers: {},
326
+ message: '',
327
+ });
328
+ }
329
+
330
+ */
@@ -0,0 +1,298 @@
1
+ /**
2
+ * One-screen team poll: pick a priority → see a colored breakdown (preview totals).
3
+ * No tabs, no Custom Objects. Run:
4
+ * npx ts-node --transpile-only -r tsconfig-paths/register examples/sdui/vote/vote.ts
5
+ */
6
+ import SDUI from '../../../src/lib/sdui';
7
+
8
+ // Whole-number percentages that sum to 100 — matches what DistributionBar
9
+ // and ProgressBar both expect, so they tell the same visual story.
10
+ const PCT_V = 52;
11
+ const PCT_Q = 33;
12
+ const PCT_D = 15;
13
+ const POLL_TOTAL = PCT_V + PCT_Q + PCT_D;
14
+
15
+ const POLL_SEGMENTS = [
16
+ { value: PCT_V, segmentColor: '#4F46E5' },
17
+ { value: PCT_Q, segmentColor: '#059669' },
18
+ { value: PCT_D, segmentColor: '#EA580C' },
19
+ ];
20
+
21
+ function renderSpec(_functionId: string) {
22
+ const s = SDUI.createState({
23
+ voteChoice: '',
24
+ resultsVisible: false,
25
+ });
26
+
27
+ // Vote cards: every card gets the same explicit width: '33%' so they're
28
+ // mathematically equal regardless of content length. justify 'space-between'
29
+ // is a real CSS value (unlike 'stretch') so layout actually applies.
30
+ const voteCards = SDUI.components.HStack({
31
+ gap: 'space500',
32
+ wrap: false,
33
+ justify: 'space-between',
34
+ align: 'stretch',
35
+ children: [
36
+ SDUI.components.Layout({
37
+ width: '33%',
38
+ children: [
39
+ SDUI.components.Card({
40
+ title: 'Ship faster',
41
+ padding: '32',
42
+ children: [
43
+ SDUI.components.VStack({
44
+ gap: 'space500',
45
+ align: 'stretch',
46
+ children: [
47
+ SDUI.components.Text({
48
+ text: 'More releases, shorter cycles.',
49
+ typestyle: 'bodyLg',
50
+ color: 'secondary',
51
+ }),
52
+ SDUI.components.Button({
53
+ label: 'Vote',
54
+ appearance: 'PRIMARY',
55
+ size: 'L',
56
+ onPress: [
57
+ SDUI.actions.set(s.voteChoice, 'velocity'),
58
+ SDUI.actions.set(s.resultsVisible, true),
59
+ ],
60
+ }),
61
+ ],
62
+ }),
63
+ ],
64
+ }),
65
+ ],
66
+ }),
67
+ SDUI.components.Layout({
68
+ width: '33%',
69
+ children: [
70
+ SDUI.components.Card({
71
+ title: 'Raise quality',
72
+ padding: '32',
73
+ children: [
74
+ SDUI.components.VStack({
75
+ gap: 'space500',
76
+ align: 'stretch',
77
+ children: [
78
+ SDUI.components.Text({
79
+ text: 'Fewer bugs, better UX.',
80
+ typestyle: 'bodyLg',
81
+ color: 'secondary',
82
+ }),
83
+ SDUI.components.Button({
84
+ label: 'Vote',
85
+ appearance: 'SUCCESS',
86
+ size: 'L',
87
+ onPress: [
88
+ SDUI.actions.set(s.voteChoice, 'quality'),
89
+ SDUI.actions.set(s.resultsVisible, true),
90
+ ],
91
+ }),
92
+ ],
93
+ }),
94
+ ],
95
+ }),
96
+ ],
97
+ }),
98
+ SDUI.components.Layout({
99
+ width: '33%',
100
+ children: [
101
+ SDUI.components.Card({
102
+ title: 'Pay down debt',
103
+ padding: '32',
104
+ children: [
105
+ SDUI.components.VStack({
106
+ gap: 'space500',
107
+ align: 'stretch',
108
+ children: [
109
+ SDUI.components.Text({
110
+ text: 'Refactors and infra.',
111
+ typestyle: 'bodyLg',
112
+ color: 'secondary',
113
+ }),
114
+ SDUI.components.Button({
115
+ label: 'Vote',
116
+ appearance: 'WARNING',
117
+ size: 'L',
118
+ onPress: [
119
+ SDUI.actions.set(s.voteChoice, 'debt'),
120
+ SDUI.actions.set(s.resultsVisible, true),
121
+ ],
122
+ }),
123
+ ],
124
+ }),
125
+ ],
126
+ }),
127
+ ],
128
+ }),
129
+ ],
130
+ });
131
+
132
+ const shell = SDUI.components.Layout({
133
+ width: '100%',
134
+ maxWidth: '1200px',
135
+ margin: { left: 'auto', right: 'auto' },
136
+ padding: { top: 48, bottom: 56, left: 32, right: 32 },
137
+ children: [
138
+ SDUI.components.VStack({
139
+ gap: 'space700',
140
+ align: 'stretch',
141
+ children: [
142
+ SDUI.components.VStack({
143
+ gap: 'space300',
144
+ align: 'center',
145
+ children: [
146
+ SDUI.components.Heading({
147
+ level: '1',
148
+ align: 'center',
149
+ text: 'Where should we focus next quarter?',
150
+ }),
151
+ SDUI.components.Text({
152
+ align: 'center',
153
+ maxWidth: '680px',
154
+ text: 'One vote. Percentages are mock data — swap in real counts later.',
155
+ typestyle: 'bodyLg',
156
+ color: 'secondary',
157
+ }),
158
+ ],
159
+ }),
160
+ SDUI.components.Divider({}),
161
+ voteCards,
162
+ SDUI.components.HStack({
163
+ gap: 'space300',
164
+ justify: 'center',
165
+ wrap: true,
166
+ children: [
167
+ SDUI.components.Chip({
168
+ text: 'Start over',
169
+ appearance: 'NEUTRAL',
170
+ onPress: [SDUI.actions.set(s.voteChoice, ''), SDUI.actions.set(s.resultsVisible, false)],
171
+ }),
172
+ ],
173
+ }),
174
+ SDUI.visible(
175
+ SDUI.conditions.falsy(s.resultsVisible),
176
+ SDUI.components.Text({
177
+ align: 'center',
178
+ maxWidth: '560px',
179
+ typestyle: 'bodyMd',
180
+ color: 'secondary',
181
+ text: 'Tap Vote — results open below with a split bar plus one bar per option.',
182
+ }),
183
+ ),
184
+ SDUI.visible(
185
+ SDUI.conditions.truthy(s.resultsVisible),
186
+ SDUI.components.VStack({
187
+ gap: 'space500',
188
+ align: 'stretch',
189
+ children: [
190
+ // The "you voted" badge sits centered above the result card
191
+ SDUI.components.HStack({
192
+ gap: 'space200',
193
+ justify: 'center',
194
+ wrap: true,
195
+ children: [
196
+ SDUI.visible(
197
+ SDUI.conditions.eq(s.voteChoice, 'velocity'),
198
+ SDUI.components.Badge({
199
+ text: 'You voted · Ship faster',
200
+ appearance: 'PRIMARY',
201
+ }),
202
+ ),
203
+ SDUI.visible(
204
+ SDUI.conditions.eq(s.voteChoice, 'quality'),
205
+ SDUI.components.Badge({
206
+ text: 'You voted · Raise quality',
207
+ appearance: 'SUCCESS',
208
+ }),
209
+ ),
210
+ SDUI.visible(
211
+ SDUI.conditions.eq(s.voteChoice, 'debt'),
212
+ SDUI.components.Badge({
213
+ text: 'You voted · Pay down debt',
214
+ appearance: 'WARNING',
215
+ }),
216
+ ),
217
+ ],
218
+ }),
219
+ // Result card uses the Card's title prop and stretches to fill
220
+ // the shell's full width because the parent VStack is align:stretch
221
+ SDUI.components.Card({
222
+ title: 'Vote share (mock)',
223
+ padding: '32',
224
+ children: [
225
+ SDUI.components.VStack({
226
+ gap: 'space500',
227
+ align: 'stretch',
228
+ children: [
229
+ SDUI.components.Text({
230
+ typestyle: 'bodyMdEmphasis',
231
+ text: 'Overall mix',
232
+ }),
233
+ SDUI.components.Layout({
234
+ width: '100%',
235
+ padding: { top: 8, bottom: 16 },
236
+ children: [
237
+ SDUI.components.DistributionBar({
238
+ segments: POLL_SEGMENTS,
239
+ totalValue: POLL_TOTAL,
240
+ size: 'standard',
241
+ }),
242
+ ],
243
+ }),
244
+ SDUI.components.Text({
245
+ typestyle: 'bodyMdEmphasis',
246
+ text: 'Each option',
247
+ }),
248
+ SDUI.components.VStack({
249
+ gap: 'space400',
250
+ children: [
251
+ SDUI.components.ProgressBar({
252
+ value: PCT_V,
253
+ label: 'Ship faster',
254
+ appearance: 'PRIMARY',
255
+ showPercentage: true,
256
+ }),
257
+ SDUI.components.ProgressBar({
258
+ value: PCT_Q,
259
+ label: 'Raise quality',
260
+ appearance: 'SUCCESS',
261
+ showPercentage: true,
262
+ }),
263
+ SDUI.components.ProgressBar({
264
+ value: PCT_D,
265
+ label: 'Pay down debt',
266
+ appearance: 'WARNING',
267
+ showPercentage: true,
268
+ }),
269
+ ],
270
+ }),
271
+ SDUI.components.Text({
272
+ align: 'center',
273
+ typestyle: 'bodySm',
274
+ color: 'secondary',
275
+ text: 'Hook callFunction to replace mock totals.',
276
+ }),
277
+ ],
278
+ }),
279
+ ],
280
+ }),
281
+ ],
282
+ }),
283
+ ),
284
+ ],
285
+ }),
286
+ ],
287
+ });
288
+
289
+ const root = SDUI.components.VStack({
290
+ align: 'stretch',
291
+ gap: 'space0',
292
+ children: [shell],
293
+ });
294
+
295
+ return SDUI.render(s, root);
296
+ }
297
+
298
+ console.log(JSON.stringify(renderSpec('demo-fn'), null, 2));