@upstart.gg/sdk 0.0.137 → 0.0.138

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 (232) hide show
  1. package/dist/shared/ai/schemas.js +2 -2
  2. package/dist/shared/ai/schemas.js.map +1 -1
  3. package/dist/shared/ai/types.d.ts +2 -2
  4. package/dist/shared/ai/types.d.ts.map +1 -1
  5. package/dist/shared/ajv.js +26 -25
  6. package/dist/shared/ajv.js.map +1 -1
  7. package/dist/shared/attributes.d.ts +8 -0
  8. package/dist/shared/attributes.d.ts.map +1 -1
  9. package/dist/shared/attributes.js +15 -14
  10. package/dist/shared/brick-manifest.js +2 -2
  11. package/dist/shared/bricks/manifests/accordion.manifest.js +8 -7
  12. package/dist/shared/bricks/manifests/all-manifests.js +38 -37
  13. package/dist/shared/bricks/manifests/all-props.d.ts +32 -22
  14. package/dist/shared/bricks/manifests/all-props.d.ts.map +1 -1
  15. package/dist/shared/bricks/manifests/all-props.js +40 -39
  16. package/dist/shared/bricks/manifests/all-props.js.map +1 -1
  17. package/dist/shared/bricks/manifests/box.manifest.js +11 -10
  18. package/dist/shared/bricks/manifests/button.manifest.js +10 -9
  19. package/dist/shared/bricks/manifests/card.manifest.d.ts +2 -0
  20. package/dist/shared/bricks/manifests/card.manifest.d.ts.map +1 -1
  21. package/dist/shared/bricks/manifests/card.manifest.js +13 -12
  22. package/dist/shared/bricks/manifests/carousel.manifest.d.ts +1 -0
  23. package/dist/shared/bricks/manifests/carousel.manifest.d.ts.map +1 -1
  24. package/dist/shared/bricks/manifests/carousel.manifest.js +11 -10
  25. package/dist/shared/bricks/manifests/footer.manifest.d.ts +2 -0
  26. package/dist/shared/bricks/manifests/footer.manifest.d.ts.map +1 -1
  27. package/dist/shared/bricks/manifests/footer.manifest.js +9 -8
  28. package/dist/shared/bricks/manifests/form.manifest.js +9 -8
  29. package/dist/shared/bricks/manifests/hero.manifest.d.ts +2 -4
  30. package/dist/shared/bricks/manifests/hero.manifest.d.ts.map +1 -1
  31. package/dist/shared/bricks/manifests/hero.manifest.js +10 -9
  32. package/dist/shared/bricks/manifests/html.manifest.d.ts +1 -0
  33. package/dist/shared/bricks/manifests/html.manifest.d.ts.map +1 -1
  34. package/dist/shared/bricks/manifests/html.manifest.js +6 -5
  35. package/dist/shared/bricks/manifests/icon.manifest.d.ts.map +1 -1
  36. package/dist/shared/bricks/manifests/icon.manifest.js +9 -8
  37. package/dist/shared/bricks/manifests/image.manifest.d.ts +1 -0
  38. package/dist/shared/bricks/manifests/image.manifest.d.ts.map +1 -1
  39. package/dist/shared/bricks/manifests/image.manifest.js +12 -11
  40. package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts +2 -0
  41. package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts.map +1 -1
  42. package/dist/shared/bricks/manifests/images-gallery.manifest.js +11 -10
  43. package/dist/shared/bricks/manifests/map.manifest.d.ts +1 -0
  44. package/dist/shared/bricks/manifests/map.manifest.d.ts.map +1 -1
  45. package/dist/shared/bricks/manifests/map.manifest.js +9 -8
  46. package/dist/shared/bricks/manifests/navbar.manifest.d.ts +2 -0
  47. package/dist/shared/bricks/manifests/navbar.manifest.d.ts.map +1 -1
  48. package/dist/shared/bricks/manifests/navbar.manifest.js +11 -10
  49. package/dist/shared/bricks/manifests/sidebar.manifest.d.ts.map +1 -1
  50. package/dist/shared/bricks/manifests/sidebar.manifest.js +11 -10
  51. package/dist/shared/bricks/manifests/social-links.manifest.d.ts.map +1 -1
  52. package/dist/shared/bricks/manifests/social-links.manifest.js +10 -9
  53. package/dist/shared/bricks/manifests/spacer.manifest.d.ts.map +1 -1
  54. package/dist/shared/bricks/manifests/spacer.manifest.js +6 -5
  55. package/dist/shared/bricks/manifests/table.manifest.d.ts +1 -0
  56. package/dist/shared/bricks/manifests/table.manifest.d.ts.map +1 -1
  57. package/dist/shared/bricks/manifests/table.manifest.js +10 -9
  58. package/dist/shared/bricks/manifests/tabs.manifest.d.ts +1 -1
  59. package/dist/shared/bricks/manifests/tabs.manifest.d.ts.map +1 -1
  60. package/dist/shared/bricks/manifests/tabs.manifest.js +11 -10
  61. package/dist/shared/bricks/manifests/testimonials.manifest.d.ts +3 -1
  62. package/dist/shared/bricks/manifests/testimonials.manifest.d.ts.map +1 -1
  63. package/dist/shared/bricks/manifests/testimonials.manifest.js +13 -12
  64. package/dist/shared/bricks/manifests/text.manifest.d.ts +2 -5
  65. package/dist/shared/bricks/manifests/text.manifest.d.ts.map +1 -1
  66. package/dist/shared/bricks/manifests/text.manifest.js +10 -9
  67. package/dist/shared/bricks/manifests/timeline.manifest.js +11 -10
  68. package/dist/shared/bricks/manifests/video.manifest.js +9 -8
  69. package/dist/shared/bricks/props/background.d.ts.map +1 -1
  70. package/dist/shared/bricks/props/background.js +1 -1
  71. package/dist/shared/bricks/props/border.js +2 -2
  72. package/dist/shared/bricks/props/color.d.ts.map +1 -1
  73. package/dist/shared/bricks/props/color.js +1 -1
  74. package/dist/shared/bricks/props/common.d.ts.map +1 -1
  75. package/dist/shared/bricks/props/common.js +2 -1
  76. package/dist/shared/bricks/props/grow.d.ts +3 -0
  77. package/dist/shared/bricks/props/grow.d.ts.map +1 -0
  78. package/dist/shared/bricks/props/grow.js +10 -0
  79. package/dist/shared/bricks/props/grow.js.map +1 -0
  80. package/dist/shared/bricks/props/helpers.js +3 -2
  81. package/dist/shared/bricks/props/image.d.ts +1 -0
  82. package/dist/shared/bricks/props/image.d.ts.map +1 -1
  83. package/dist/shared/bricks/props/image.js +1 -1
  84. package/dist/shared/bricks/props/string.d.ts.map +1 -1
  85. package/dist/shared/bricks/props/string.js +1 -1
  86. package/dist/shared/bricks.d.ts +18 -17
  87. package/dist/shared/bricks.d.ts.map +1 -1
  88. package/dist/shared/bricks.js +39 -38
  89. package/dist/shared/chunk-2EOCK66Z.js +19 -0
  90. package/dist/shared/chunk-2EOCK66Z.js.map +1 -0
  91. package/dist/shared/{chunk-XXPSM6UA.js → chunk-2UEPTT5J.js} +5 -9
  92. package/dist/shared/chunk-2UEPTT5J.js.map +1 -0
  93. package/dist/shared/{chunk-DRQKKPTX.js → chunk-2Z5WOCFS.js} +41 -1
  94. package/dist/shared/chunk-2Z5WOCFS.js.map +1 -0
  95. package/dist/shared/{chunk-7U5WPHXB.js → chunk-34IUWNRX.js} +7 -7
  96. package/dist/shared/chunk-57NRTXRA.js +309 -0
  97. package/dist/shared/chunk-57NRTXRA.js.map +1 -0
  98. package/dist/shared/{chunk-T6C3NG2L.js → chunk-5HJT5NJ3.js} +8 -8
  99. package/dist/shared/{chunk-BZTWZC77.js → chunk-5J4Y43RM.js} +37 -179
  100. package/dist/shared/chunk-5J4Y43RM.js.map +1 -0
  101. package/dist/shared/{chunk-KKWT3OXF.js → chunk-5OVOXUFX.js} +3 -2
  102. package/dist/shared/{chunk-KKWT3OXF.js.map → chunk-5OVOXUFX.js.map} +1 -1
  103. package/dist/shared/{chunk-XK2CERPB.js → chunk-5SNSUC6Q.js} +7 -7
  104. package/dist/shared/{chunk-JLDAS3VE.js → chunk-B5T2LFV2.js} +10 -14
  105. package/dist/shared/chunk-B5T2LFV2.js.map +1 -0
  106. package/dist/shared/{chunk-PF75LW33.js → chunk-E3ZW57HF.js} +18 -9
  107. package/dist/shared/chunk-E3ZW57HF.js.map +1 -0
  108. package/dist/shared/{chunk-JSDKK5QN.js → chunk-EUFVTHAG.js} +5 -3
  109. package/dist/shared/chunk-EUFVTHAG.js.map +1 -0
  110. package/dist/shared/{chunk-U4KZUX37.js → chunk-FC52EHCC.js} +8 -8
  111. package/dist/shared/chunk-FC52EHCC.js.map +1 -0
  112. package/dist/shared/{chunk-JW7MQAU4.js → chunk-FVV27R73.js} +9 -94
  113. package/dist/shared/chunk-FVV27R73.js.map +1 -0
  114. package/dist/shared/{chunk-SQXZNGQF.js → chunk-FYGFB5U5.js} +3 -1
  115. package/dist/shared/chunk-FYGFB5U5.js.map +1 -0
  116. package/dist/shared/{chunk-J45LSQT6.js → chunk-GNTJT7MR.js} +2 -2
  117. package/dist/shared/chunk-HHUFGV7J.js +259 -0
  118. package/dist/shared/chunk-HHUFGV7J.js.map +1 -0
  119. package/dist/shared/{chunk-W2RFDII5.js → chunk-IMDOF55E.js} +12 -4
  120. package/dist/shared/chunk-IMDOF55E.js.map +1 -0
  121. package/dist/shared/{chunk-KQH6V22E.js → chunk-IPWYNE6Y.js} +25 -25
  122. package/dist/shared/{chunk-H6TMBELF.js → chunk-J6R3GSKS.js} +46 -34
  123. package/dist/shared/chunk-J6R3GSKS.js.map +1 -0
  124. package/dist/shared/{chunk-TBT2PTGB.js → chunk-KRODRZNS.js} +9 -9
  125. package/dist/shared/chunk-KTA7XES3.js +168 -0
  126. package/dist/shared/chunk-KTA7XES3.js.map +1 -0
  127. package/dist/shared/{chunk-SK2O7GFC.js → chunk-L4W4B2RQ.js} +15 -70
  128. package/dist/shared/chunk-L4W4B2RQ.js.map +1 -0
  129. package/dist/shared/{chunk-MYOLWTB2.js → chunk-NTP6BKRU.js} +9 -9
  130. package/dist/shared/chunk-NTP6BKRU.js.map +1 -0
  131. package/dist/shared/{chunk-JF52BBFD.js → chunk-O53V22BK.js} +18 -10
  132. package/dist/shared/chunk-O53V22BK.js.map +1 -0
  133. package/dist/shared/{chunk-ZVJNRKT4.js → chunk-ORIUCOED.js} +7 -7
  134. package/dist/shared/{chunk-LGDDJJHK.js → chunk-PFZMRSHJ.js} +11 -11
  135. package/dist/shared/{chunk-6AE7UD73.js → chunk-QHKOAIOK.js} +31 -60
  136. package/dist/shared/chunk-QHKOAIOK.js.map +1 -0
  137. package/dist/shared/{chunk-LPAQ47C6.js → chunk-RDOCVLCF.js} +11 -11
  138. package/dist/shared/{chunk-VSLRTXLF.js → chunk-RFH7PEVS.js} +5 -4
  139. package/dist/shared/chunk-RFH7PEVS.js.map +1 -0
  140. package/dist/shared/{chunk-XNRSL6FL.js → chunk-T3UPW5OW.js} +5 -4
  141. package/dist/shared/{chunk-XNRSL6FL.js.map → chunk-T3UPW5OW.js.map} +1 -1
  142. package/dist/shared/{chunk-FUUSAMN3.js → chunk-TGKNA2JS.js} +8 -8
  143. package/dist/shared/{chunk-HY7JOP3J.js → chunk-TZ6X7ZM5.js} +19 -11
  144. package/dist/shared/chunk-TZ6X7ZM5.js.map +1 -0
  145. package/dist/shared/{chunk-VTCHJT4O.js → chunk-UC75KRLX.js} +2 -2
  146. package/dist/shared/{chunk-4KY7OZWD.js → chunk-VMIJ6MG5.js} +13 -13
  147. package/dist/shared/{chunk-SRYBJ6NQ.js → chunk-VYA2FCTY.js} +2 -2
  148. package/dist/shared/{chunk-LGGPCCCY.js → chunk-XYWSIMZ6.js} +3 -3
  149. package/dist/shared/chunk-XYWSIMZ6.js.map +1 -0
  150. package/dist/shared/{chunk-FHA4DFIM.js → chunk-ZYQZUWF7.js} +10 -10
  151. package/dist/shared/{chunk-2O5HVPID.js → chunk-ZZVYD4BG.js} +3 -3
  152. package/dist/shared/context.d.ts +4 -0
  153. package/dist/shared/context.d.ts.map +1 -1
  154. package/dist/shared/context.js +43 -42
  155. package/dist/shared/context.js.map +1 -1
  156. package/dist/shared/page.d.ts +2 -0
  157. package/dist/shared/page.d.ts.map +1 -1
  158. package/dist/shared/page.js +41 -40
  159. package/dist/shared/site.d.ts +7 -0
  160. package/dist/shared/site.d.ts.map +1 -1
  161. package/dist/shared/site.js +43 -42
  162. package/dist/shared/sitemap.js +42 -41
  163. package/dist/shared/utils/schema.d.ts +0 -5
  164. package/dist/shared/utils/schema.d.ts.map +1 -1
  165. package/dist/shared/utils/schema.js +1 -3
  166. package/package.json +2 -2
  167. package/src/shared/ai/schemas.ts +1 -1
  168. package/src/shared/ai/types.ts +2 -2
  169. package/src/shared/bricks/manifests/card.manifest.ts +25 -168
  170. package/src/shared/bricks/manifests/hero.manifest.ts +44 -249
  171. package/src/shared/bricks/manifests/html.manifest.ts +6 -0
  172. package/src/shared/bricks/manifests/icon.manifest.ts +1 -89
  173. package/src/shared/bricks/manifests/image.manifest.ts +0 -4
  174. package/src/shared/bricks/manifests/images-gallery.manifest.ts +8 -0
  175. package/src/shared/bricks/manifests/map.manifest.ts +9 -65
  176. package/src/shared/bricks/manifests/sidebar.manifest.ts +0 -1
  177. package/src/shared/bricks/manifests/social-links.manifest.ts +0 -1
  178. package/src/shared/bricks/manifests/spacer.manifest.ts +0 -1
  179. package/src/shared/bricks/manifests/table.manifest.ts +6 -0
  180. package/src/shared/bricks/manifests/tabs.manifest.ts +12 -429
  181. package/src/shared/bricks/manifests/testimonials.manifest.ts +28 -226
  182. package/src/shared/bricks/manifests/text.manifest.ts +16 -44
  183. package/src/shared/bricks/props/background.ts +2 -1
  184. package/src/shared/bricks/props/color.ts +5 -2
  185. package/src/shared/bricks/props/common.ts +2 -8
  186. package/src/shared/bricks/props/grow.ts +11 -0
  187. package/src/shared/bricks/props/image.ts +40 -0
  188. package/src/shared/bricks/props/string.ts +2 -0
  189. package/src/shared/bricks.ts +33 -23
  190. package/src/shared/page.ts +1 -0
  191. package/src/shared/site.ts +1 -0
  192. package/src/shared/utils/schema.ts +28 -18
  193. package/src/shared/utils/tests/schema.test.ts +211 -4
  194. package/dist/shared/chunk-6AE7UD73.js.map +0 -1
  195. package/dist/shared/chunk-BZTWZC77.js.map +0 -1
  196. package/dist/shared/chunk-DRQKKPTX.js.map +0 -1
  197. package/dist/shared/chunk-H6TMBELF.js.map +0 -1
  198. package/dist/shared/chunk-HUWMIXNN.js +0 -570
  199. package/dist/shared/chunk-HUWMIXNN.js.map +0 -1
  200. package/dist/shared/chunk-HY7JOP3J.js.map +0 -1
  201. package/dist/shared/chunk-JF52BBFD.js.map +0 -1
  202. package/dist/shared/chunk-JLDAS3VE.js.map +0 -1
  203. package/dist/shared/chunk-JSDKK5QN.js.map +0 -1
  204. package/dist/shared/chunk-JW7MQAU4.js.map +0 -1
  205. package/dist/shared/chunk-LGGPCCCY.js.map +0 -1
  206. package/dist/shared/chunk-MYOLWTB2.js.map +0 -1
  207. package/dist/shared/chunk-O24RDXZS.js +0 -505
  208. package/dist/shared/chunk-O24RDXZS.js.map +0 -1
  209. package/dist/shared/chunk-PF75LW33.js.map +0 -1
  210. package/dist/shared/chunk-QEJGPYTB.js +0 -462
  211. package/dist/shared/chunk-QEJGPYTB.js.map +0 -1
  212. package/dist/shared/chunk-SK2O7GFC.js.map +0 -1
  213. package/dist/shared/chunk-SQXZNGQF.js.map +0 -1
  214. package/dist/shared/chunk-U4KZUX37.js.map +0 -1
  215. package/dist/shared/chunk-VSLRTXLF.js.map +0 -1
  216. package/dist/shared/chunk-W2RFDII5.js.map +0 -1
  217. package/dist/shared/chunk-XXPSM6UA.js.map +0 -1
  218. /package/dist/shared/{chunk-7U5WPHXB.js.map → chunk-34IUWNRX.js.map} +0 -0
  219. /package/dist/shared/{chunk-T6C3NG2L.js.map → chunk-5HJT5NJ3.js.map} +0 -0
  220. /package/dist/shared/{chunk-XK2CERPB.js.map → chunk-5SNSUC6Q.js.map} +0 -0
  221. /package/dist/shared/{chunk-J45LSQT6.js.map → chunk-GNTJT7MR.js.map} +0 -0
  222. /package/dist/shared/{chunk-KQH6V22E.js.map → chunk-IPWYNE6Y.js.map} +0 -0
  223. /package/dist/shared/{chunk-TBT2PTGB.js.map → chunk-KRODRZNS.js.map} +0 -0
  224. /package/dist/shared/{chunk-ZVJNRKT4.js.map → chunk-ORIUCOED.js.map} +0 -0
  225. /package/dist/shared/{chunk-LGDDJJHK.js.map → chunk-PFZMRSHJ.js.map} +0 -0
  226. /package/dist/shared/{chunk-LPAQ47C6.js.map → chunk-RDOCVLCF.js.map} +0 -0
  227. /package/dist/shared/{chunk-FUUSAMN3.js.map → chunk-TGKNA2JS.js.map} +0 -0
  228. /package/dist/shared/{chunk-VTCHJT4O.js.map → chunk-UC75KRLX.js.map} +0 -0
  229. /package/dist/shared/{chunk-4KY7OZWD.js.map → chunk-VMIJ6MG5.js.map} +0 -0
  230. /package/dist/shared/{chunk-SRYBJ6NQ.js.map → chunk-VYA2FCTY.js.map} +0 -0
  231. /package/dist/shared/{chunk-FHA4DFIM.js.map → chunk-ZYQZUWF7.js.map} +0 -0
  232. /package/dist/shared/{chunk-2O5HVPID.js.map → chunk-ZZVYD4BG.js.map} +0 -0
@@ -12,16 +12,18 @@ import { loop } from "../props/dynamic";
12
12
  import { border } from "../props/border";
13
13
  import { shadow } from "../props/effects";
14
14
  import type { BrickExample } from "./_types";
15
+ import { grow } from "../props/grow";
15
16
 
16
17
  export const manifest = defineBrickManifest({
17
18
  type: "testimonials",
18
19
  name: "Testimonials",
19
- description: "Display testimonials from users",
20
+ description: "Display a list of testimonials from users",
20
21
  defaultWidth: { desktop: "100%" },
21
22
  icon: HiOutlineChatBubbleBottomCenter,
22
23
  consumesMultipleQueryRows: true,
23
- aiInstructions: `This brick displays user testimonials with optional avatars and social icons.
24
+ aiInstructions: `This brick displays a list of testimonials with optional avatars and social icons.
24
25
  It is typically used to showcase customer feedback or endorsements.
26
+ It can directly consume data from a page query to populate the testimonials dynamically.
25
27
  Optionally either use an avatar or a social icon but not both at the same time.`,
26
28
  props: defineProps(
27
29
  {
@@ -77,17 +79,32 @@ Optionally either use an avatar or a social icon but not both at the same time.`
77
79
  "ui:placeholder": "Not specified (static)",
78
80
  }),
79
81
  ),
82
+ grow: Type.Optional(
83
+ grow({
84
+ default: true,
85
+ }),
86
+ ),
80
87
  testimonials: Type.Optional(
81
88
  Type.Array(
82
89
  Type.Object({
83
90
  text: Type.String({
84
91
  title: "Text",
85
92
  default: "Amazing product!",
93
+ description: "The testimonial text",
86
94
  "ui:multiline": true,
87
95
  "ui:textarea-class": "h-20",
88
96
  }),
89
- author: Type.String({ title: "Author", default: "John Doe" }),
90
- company: Type.Optional(Type.String({ title: "Company" })),
97
+ author: Type.String({
98
+ title: "Author",
99
+ description: "Name of the person giving the testimonial",
100
+ default: "John Doe",
101
+ }),
102
+ subtitle: Type.Optional(
103
+ Type.String({
104
+ title: "Subtitle",
105
+ description: "Subtitle, can be a company, social handle, job title, etc",
106
+ }),
107
+ ),
91
108
  avatar: Type.Optional(
92
109
  image({
93
110
  title: "Avatar",
@@ -138,13 +155,13 @@ export type Manifest = typeof manifest;
138
155
 
139
156
  export const examples: BrickExample<Manifest>[] = [
140
157
  {
141
- description: "SaaS platform testimonials with avatars",
158
+ description: "SaaS platform testimonials with avatars (static content)",
142
159
  type: "testimonials",
143
160
  props: {
144
161
  testimonials: [
145
162
  {
146
163
  author: "Sarah Johnson",
147
- company: "TechCorp Solutions",
164
+ subtitle: "TechCorp Solutions",
148
165
  text: "This platform has completely transformed how we manage our projects. The intuitive interface and powerful automation features have saved us countless hours.",
149
166
  avatar: {
150
167
  src: "https://via.placeholder.com/80x80.png?text=SJ",
@@ -154,7 +171,7 @@ export const examples: BrickExample<Manifest>[] = [
154
171
  },
155
172
  {
156
173
  author: "Mike Chen",
157
- company: "StartupFlow",
174
+ subtitle: "StartupFlow",
158
175
  text: "Outstanding customer support and regular feature updates. We've been using this for over a year and it keeps getting better. Highly recommend!",
159
176
  avatar: {
160
177
  src: "https://via.placeholder.com/80x80.png?text=MC",
@@ -164,7 +181,7 @@ export const examples: BrickExample<Manifest>[] = [
164
181
  },
165
182
  {
166
183
  author: "Emily Rodriguez",
167
- company: "Digital Agency Pro",
184
+ subtitle: "Digital Agency Pro",
168
185
  text: "The automation capabilities are game-changing. What used to take us days now happens automatically. It's like having an extra team member.",
169
186
  avatar: {
170
187
  src: "https://via.placeholder.com/80x80.png?text=ER",
@@ -176,135 +193,7 @@ export const examples: BrickExample<Manifest>[] = [
176
193
  },
177
194
  },
178
195
  {
179
- description: "E-commerce customer reviews",
180
- type: "testimonials",
181
- props: {
182
- testimonials: [
183
- {
184
- author: "Jessica Williams",
185
- company: "Happy Customer",
186
- text: "Amazing product quality and fast shipping! The item exceeded my expectations and the customer service was excellent when I had questions.",
187
- avatar: {
188
- src: "https://via.placeholder.com/60x60.png?text=JW",
189
- alt: "Jessica Williams customer photo",
190
- },
191
- socialIcon: "mdi:star",
192
- },
193
- {
194
- author: "David Park",
195
- text: "Five stars! Been using this product for 6 months and it's still going strong. Definitely worth the investment and I've already recommended it to friends.",
196
- avatar: {
197
- src: "https://via.placeholder.com/60x60.png?text=DP",
198
- alt: "David Park customer photo",
199
- },
200
- socialIcon: "mdi:thumbs-up",
201
- },
202
- ],
203
- },
204
- },
205
- {
206
- description: "Agency client testimonials with company info",
207
- type: "testimonials",
208
- props: {
209
- testimonials: [
210
- {
211
- author: "Rachel Thompson",
212
- company: "Global Enterprises",
213
- text: "The team delivered exceptional results on time and within budget. Their creative approach and attention to detail made all the difference for our brand.",
214
- avatar: {
215
- src: "https://via.placeholder.com/70x70.png?text=RT",
216
- alt: "Rachel Thompson headshot",
217
- },
218
- socialIcon: "mdi:briefcase",
219
- },
220
- {
221
- author: "Alex Kumar",
222
- company: "Innovation Labs",
223
- text: "Working with this agency was a game-changer for our digital presence. They understood our vision and brought it to life beautifully.",
224
- avatar: {
225
- src: "https://via.placeholder.com/70x70.png?text=AK",
226
- alt: "Alex Kumar profile",
227
- },
228
- socialIcon: "mdi:lightbulb",
229
- },
230
- {
231
- author: "Maria Santos",
232
- company: "Retail Plus",
233
- text: "Professional, creative, and results-driven. Our website traffic increased by 200% after their redesign. Couldn't be happier!",
234
- avatar: {
235
- src: "https://via.placeholder.com/70x70.png?text=MS",
236
- alt: "Maria Santos photo",
237
- },
238
- socialIcon: "mdi:chart-line",
239
- },
240
- ],
241
- },
242
- },
243
- {
244
- description: "App user feedback",
245
- type: "testimonials",
246
- props: {
247
- testimonials: [
248
- {
249
- author: "Tom Wilson",
250
- text: "This app has made my daily routine so much easier. Love the clean interface and how everything just works seamlessly across all my devices.",
251
- avatar: {
252
- src: "https://via.placeholder.com/65x65.png?text=TW",
253
- alt: "Tom Wilson user photo",
254
- },
255
- socialIcon: "mdi:cellphone",
256
- },
257
- {
258
- author: "Lisa Chang",
259
- text: "Been using this app for months and it's become essential to my workflow. The latest update with AI features is incredibly impressive.",
260
- avatar: {
261
- src: "https://via.placeholder.com/65x65.png?text=LC",
262
- alt: "Lisa Chang profile picture",
263
- },
264
- socialIcon: "mdi:robot",
265
- },
266
- {
267
- author: "James Miller",
268
- text: "Simple, powerful, and reliable. Exactly what I was looking for. The customer support team is also very responsive and helpful.",
269
- avatar: {
270
- src: "https://via.placeholder.com/65x65.png?text=JM",
271
- alt: "James Miller avatar",
272
- },
273
- socialIcon: "mdi:heart",
274
- },
275
- ],
276
- },
277
- },
278
- {
279
- description: "Course/education testimonials with social icons",
280
- type: "testimonials",
281
- props: {
282
- testimonials: [
283
- {
284
- author: "Amanda Foster",
285
- company: "UX Designer",
286
- text: "This course completely changed my career trajectory. The practical projects and expert feedback helped me land my dream job in just 3 months.",
287
- avatar: {
288
- src: "https://via.placeholder.com/75x75.png?text=AF",
289
- alt: "Amanda Foster student photo",
290
- },
291
- socialIcon: "mdi:school",
292
- },
293
- {
294
- author: "Carlos Rodriguez",
295
- company: "Software Engineer",
296
- text: "The instructors are industry experts and the content is always up-to-date. I've taken three courses here and each one exceeded my expectations.",
297
- avatar: {
298
- src: "https://via.placeholder.com/75x75.png?text=CR",
299
- alt: "Carlos Rodriguez profile",
300
- },
301
- socialIcon: "mdi:code-tags",
302
- },
303
- ],
304
- },
305
- },
306
- {
307
- description: "Simple testimonials without avatars",
196
+ description: "Simple testimonials without avatars (static content)",
308
197
  type: "testimonials",
309
198
  props: {
310
199
  testimonials: [
@@ -326,72 +215,6 @@ export const examples: BrickExample<Manifest>[] = [
326
215
  ],
327
216
  },
328
217
  },
329
- {
330
- description: "Consultant testimonials with professional focus",
331
- type: "testimonials",
332
- props: {
333
- testimonials: [
334
- {
335
- author: "Dr. Patricia Lee",
336
- company: "Medical Practice Solutions",
337
- text: "The consulting services provided were invaluable to our practice. Revenue increased by 40% and patient satisfaction scores improved significantly.",
338
- avatar: {
339
- src: "https://via.placeholder.com/80x80.png?text=PL",
340
- alt: "Dr. Patricia Lee headshot",
341
- },
342
- socialIcon: "mdi:medical-bag",
343
- },
344
- {
345
- author: "Robert Kim",
346
- company: "Manufacturing Inc.",
347
- text: "Their strategic insights helped us streamline operations and reduce costs by 25%. The ROI was evident within the first quarter.",
348
- avatar: {
349
- src: "https://via.placeholder.com/80x80.png?text=RK",
350
- alt: "Robert Kim executive photo",
351
- },
352
- socialIcon: "mdi:factory",
353
- },
354
- ],
355
- },
356
- },
357
- {
358
- description: "Event testimonials with social media icons",
359
- type: "testimonials",
360
- props: {
361
- testimonials: [
362
- {
363
- author: "Jennifer Adams",
364
- company: "Marketing Director",
365
- text: "Best conference I've attended in years! The networking opportunities were incredible and the speakers were top-notch industry leaders.",
366
- avatar: {
367
- src: "https://via.placeholder.com/70x70.png?text=JA",
368
- alt: "Jennifer Adams conference attendee",
369
- },
370
- socialIcon: "mdi:twitter",
371
- },
372
- {
373
- author: "Michael Brown",
374
- company: "Tech Startup Founder",
375
- text: "The workshops were incredibly practical and I left with actionable strategies I could implement immediately. Already planning to attend next year!",
376
- avatar: {
377
- src: "https://via.placeholder.com/70x70.png?text=MB",
378
- alt: "Michael Brown participant photo",
379
- },
380
- socialIcon: "mdi:linkedin",
381
- },
382
- {
383
- author: "Sophie Chen",
384
- company: "Product Manager",
385
- text: "Amazing organization and valuable content. Met so many like-minded professionals and learned cutting-edge techniques I'm excited to try.",
386
- avatar: {
387
- src: "https://via.placeholder.com/70x70.png?text=SC",
388
- alt: "Sophie Chen attendee photo",
389
- },
390
- socialIcon: "mdi:instagram",
391
- },
392
- ],
393
- },
394
- },
395
218
  {
396
219
  description: "Dynamic customer testimonials using customerReviews query",
397
220
  type: "testimonials",
@@ -399,7 +222,7 @@ export const examples: BrickExample<Manifest>[] = [
399
222
  testimonials: [
400
223
  {
401
224
  author: "{{customerReviews.customerName}}",
402
- company: "{{customerReviews.company}}",
225
+ subtitle: "{{customerReviews.company}}",
403
226
  text: "{{customerReviews.reviewText}}",
404
227
  avatar: {
405
228
  src: "{{customerReviews.customerPhoto}}",
@@ -420,7 +243,7 @@ export const examples: BrickExample<Manifest>[] = [
420
243
  testimonials: [
421
244
  {
422
245
  author: "{{clientFeedback.clientName}}",
423
- company: "{{clientFeedback.companyName}} - {{clientFeedback.position}}",
246
+ subtitle: "{{clientFeedback.companyName}} - {{clientFeedback.position}}",
424
247
  text: "{{clientFeedback.testimonial}}",
425
248
  avatar: {
426
249
  src: "{{clientFeedback.headshot}}",
@@ -454,25 +277,4 @@ export const examples: BrickExample<Manifest>[] = [
454
277
  },
455
278
  },
456
279
  },
457
- {
458
- description: "Dynamic employee testimonials using teamTestimonials query",
459
- type: "testimonials",
460
- props: {
461
- testimonials: [
462
- {
463
- author: "{{teamTestimonials.employeeName}}",
464
- company: "{{teamTestimonials.department}} - {{teamTestimonials.jobTitle}}",
465
- text: "{{teamTestimonials.testimonial}}",
466
- avatar: {
467
- src: "{{teamTestimonials.profilePhoto}}",
468
- alt: "{{teamTestimonials.employeeName}} profile photo",
469
- },
470
- socialIcon: "{{teamTestimonials.socialIcon}}",
471
- },
472
- ],
473
- loop: {
474
- over: "teamTestimonials",
475
- },
476
- },
477
- },
478
280
  ];
@@ -6,10 +6,10 @@ import { RxTextAlignLeft } from "react-icons/rx";
6
6
  import { Type } from "@sinclair/typebox";
7
7
  import { alignItems } from "../props/align";
8
8
  import { shadow } from "../props/effects";
9
- import { colorPreset } from "../props/color-preset";
10
- import { loop } from "../props/dynamic";
11
9
  import { cssLength } from "../props/css-length";
12
10
  import type { BrickExample } from "./_types";
11
+ import { backgroundColor } from "../props/background";
12
+ import { color } from "../props/color";
13
13
 
14
14
  export const manifest = defineBrickManifest({
15
15
  type: "text",
@@ -26,25 +26,23 @@ CONTENT FORMATTING:
26
26
  - Lists: <ul><li>Item 1</li><li>Item 2</li></ul>
27
27
 
28
28
  STYLING OPTIONS:
29
- - colorPreset: Leave empty to inherit parent colors, or use "primary-100", "secondary-200", "neutral-50", "accent-100" for backgrounds
30
- - padding: Use CSS values like "1rem", "2rem", "24px" for internal spacing
31
- - rounding: "rounded-none" (sharp), "rounded-md" (standard), "rounded-lg" (friendly), "rounded-xl" (soft)
32
- - border: Add borders with width ("border", "border-2") and color ("border-gray-300", "border-primary-500")
33
- - shadow: Add depth with "shadow-sm", "shadow-md", "shadow-lg"
29
+ - "color": Leave empty to inherit parent text color, which is the recommended setting when the brick is a direct child of a section or box with background color.
30
+ - "backgroundColor": Only use when the text brick is a direct child of a section.Leave empty for transparent background, or set to a color like "bg-xxx-nnn" for emphasis.
31
+ - "padding": Use CSS values like "1rem", "2rem", "24px" for internal spacing
34
32
 
35
33
  WHEN TO USE:
34
+ - All text content that requires formatting
36
35
  - Rich content sections (About Us, Service descriptions)
37
36
  - Announcements and notices
38
37
  - Product descriptions with formatting
39
38
  - Quotes and testimonials
40
39
  - FAQ content and detailed explanations
41
- - Footer information and legal text
42
40
 
43
41
  BEST PRACTICES:
44
42
  - Keep HTML minimal - complex layouts should use multiple components
45
43
  - Use semantic headings (h2, h3, h4) for proper hierarchy
46
- - Center-align for quotes/testimonials, left-align for body text
47
- - Choose background colors that provide good contrast, or no background for inline text`,
44
+ - Center-align for quotes/testimonials, left-align for body text`,
45
+
48
46
  defaultWidth: {
49
47
  mobile: "100%",
50
48
  },
@@ -55,9 +53,14 @@ BEST PRACTICES:
55
53
  staticClasses: "prose lg:prose-lg",
56
54
  icon: RxTextAlignLeft,
57
55
  props: defineProps({
58
- colorPreset: Type.Optional(
59
- colorPreset({
60
- title: "Color",
56
+ backgroundColor: Type.Optional(
57
+ backgroundColor({
58
+ title: "Background color",
59
+ }),
60
+ ),
61
+ color: Type.Optional(
62
+ color({
63
+ title: "Text color",
61
64
  }),
62
65
  ),
63
66
  content: textContent({
@@ -66,12 +69,6 @@ BEST PRACTICES:
66
69
  // category: "content",
67
70
  // },
68
71
  }),
69
- verticalAlign: Type.Optional(
70
- alignItems({
71
- default: "items-center",
72
- title: "Align",
73
- }),
74
- ),
75
72
  padding: Type.Optional(
76
73
  cssLength({
77
74
  default: "2rem",
@@ -127,9 +124,6 @@ export const examples: BrickExample<Manifest>[] = [
127
124
  props: {
128
125
  content:
129
126
  "<h2>About Our Company</h2><p>We've been serving customers since 2010, building trust through quality products and exceptional service.</p>",
130
- colorPreset: {
131
- color: "primary-100",
132
- },
133
127
  },
134
128
  },
135
129
  {
@@ -148,9 +142,6 @@ export const examples: BrickExample<Manifest>[] = [
148
142
  content:
149
143
  "<p>Scheduled maintenance will occur on <em>Sunday, March 15th</em> from 2:00 AM to 6:00 AM UTC.</p><p>During this time, some features may be temporarily unavailable. We apologize for any inconvenience.</p>",
150
144
  padding: "1rem",
151
- colorPreset: {
152
- color: "neutral-700",
153
- },
154
145
  border: {
155
146
  width: "border",
156
147
  color: "border-neutral-400",
@@ -172,13 +163,9 @@ export const examples: BrickExample<Manifest>[] = [
172
163
  props: {
173
164
  content:
174
165
  "<h3 style='text-align: center'>Ready to Get Started?</h3><p style='text-align: center'>Join thousands of satisfied customers who trust our platform. <strong>Sign up today</strong> and experience the difference!</p><p style='text-align: center'><a href='/signup'>Create Your Free Account</a></p>",
175
- colorPreset: {
176
- color: "secondary-200",
177
- },
178
166
  padding: "2.5rem",
179
167
  rounding: "rounded-xl",
180
168
  shadow: "shadow-md",
181
- verticalAlign: "items-center",
182
169
  },
183
170
  },
184
171
  {
@@ -187,9 +174,6 @@ export const examples: BrickExample<Manifest>[] = [
187
174
  props: {
188
175
  content:
189
176
  "<h4>API Authentication</h4><p>To authenticate your requests, include your API key in the header:</p><p><strong>Authorization: Bearer YOUR_API_KEY</strong></p><p>All API endpoints require authentication. You can find your API key in the <a href='/dashboard'>dashboard settings</a>.</p>",
190
- colorPreset: {
191
- color: "accent-100",
192
- },
193
177
  padding: "1.5rem",
194
178
  rounding: "rounded-md",
195
179
  border: {
@@ -204,13 +188,9 @@ export const examples: BrickExample<Manifest>[] = [
204
188
  props: {
205
189
  content:
206
190
  "<h3>✅ Payment Successful!</h3><p>Thank you for your purchase. Your order <strong>#12345</strong> has been confirmed.</p><p>You will receive an email confirmation shortly at your registered email address.</p>",
207
- colorPreset: {
208
- color: "primary-200",
209
- },
210
191
  padding: "2rem",
211
192
  rounding: "rounded-lg",
212
193
  shadow: "shadow-sm",
213
- verticalAlign: "items-start",
214
194
  },
215
195
  },
216
196
  {
@@ -219,11 +199,7 @@ export const examples: BrickExample<Manifest>[] = [
219
199
  props: {
220
200
  content:
221
201
  "<p style='text-align: center'>© 2024 Company Name. All rights reserved.</p><p style='text-align: center'><a href='/privacy'>Privacy Policy</a> | <a href='/terms'>Terms of Service</a> | <a href='/contact'>Contact Us</a></p><p style='text-align: center'><em>Follow us on social media for the latest updates</em></p>",
222
- colorPreset: {
223
- color: "neutral-800",
224
- },
225
202
  padding: "1.5rem",
226
- verticalAlign: "items-end",
227
203
  },
228
204
  },
229
205
  {
@@ -247,9 +223,6 @@ export const examples: BrickExample<Manifest>[] = [
247
223
  props: {
248
224
  content:
249
225
  "<h3 style='text-align: center'>⚠️ URGENT NOTICE</h3><p style='text-align: center'><strong>System maintenance is currently in progress.</strong></p><p style='text-align: center'>Some services may be <em>temporarily unavailable</em>. We expect full restoration by 4:00 PM EST.</p><p style='text-align: center'>For urgent support, please <a href='/emergency-contact'>contact our emergency line</a>.</p>",
250
- colorPreset: {
251
- color: "accent-400",
252
- },
253
226
  padding: "2rem",
254
227
  rounding: "rounded-md",
255
228
  border: {
@@ -257,7 +230,6 @@ export const examples: BrickExample<Manifest>[] = [
257
230
  color: "border-accent-600",
258
231
  },
259
232
  shadow: "shadow-xl",
260
- verticalAlign: "items-center",
261
233
  },
262
234
  },
263
235
  ];
@@ -53,7 +53,8 @@ export function backgroundColor(options: SchemaOptions = {}) {
53
53
  title: "Background color",
54
54
  // $id: "styles:backgroundColor",
55
55
  "ai:instructions":
56
- "Can be set to transparent, hex/rgb/rgba color, or classes like `bg-<variant>-<shade>`, variants being primary, secondary, accent and neutral, and shades between 100 and 900. Use bg-<variant>-<shade> classes as much as possible.",
56
+ "Must be formated like `bg-<variant>-<shade>`, variants being primary, secondary, accent and neutral, or base and shades between 100 and 900, except the base with takes shades betwen 100 and 300 only.",
57
+ pattern: "^bg-(primary|secondary|accent|neutral|base)-?(50|100|200|300|400|500|600|700|800|900)?$",
57
58
  "ui:field": "color",
58
59
  "ui:color-type": "background",
59
60
  // "ui:advanced": true,
@@ -4,7 +4,9 @@ export function color(options: StringOptions = {}) {
4
4
  return Type.String({
5
5
  title: "Text color",
6
6
  "ai:instructions":
7
- "hex/rgb/rgba color or classes like `text-<variant>-<shade>`, variants being `primary`, `secondary`, `accent` and `neutral`, and shades between 50 and 900",
7
+ "Format is `text-<variant>-<shade>`, variants being `primary`, `secondary`, `accent` and `neutral`, and shades between 50 and 900",
8
+ pattern:
9
+ "^text-(primary|secondary|accent|neutral|base|inherit)-?(50|100|200|300|400|500|600|700|800|900)?$",
8
10
  "ui:styleId": "styles:color",
9
11
  "ui:field": "color",
10
12
  "ui:color-type": "text",
@@ -18,7 +20,8 @@ export function borderColor(options: StringOptions = {}) {
18
20
  return Type.String({
19
21
  title: "Border color",
20
22
  "ai:instructions":
21
- "hex/rgb/rgba color or classes like `border-<variant>-<shade>`, variants being `primary`, `secondary`, `accent` and `neutral`, and shades between 50 and 900",
23
+ "Format is `border-<variant>-<shade>`, variants being `primary`, `secondary`, `accent` and `neutral`, and shades between 50 and 900",
24
+ pattern: "^border-(primary|secondary|accent|neutral|base)-?(50|100|200|300|400|500|600|700|800|900)?$",
22
25
  "ui:styleId": "styles:borderColor",
23
26
  "ui:field": "color",
24
27
  "ui:color-type": "border",
@@ -1,6 +1,7 @@
1
1
  import { type Static, type TString, Type } from "@sinclair/typebox";
2
2
  import { cssLength } from "./css-length";
3
3
  import { alignSelf } from "./align";
4
+ import { grow } from "./grow";
4
5
 
5
6
  export function hidden() {
6
7
  return Type.Object(
@@ -48,14 +49,7 @@ export const commonProps = {
48
49
  "ui:field": "hidden",
49
50
  }),
50
51
  ),
51
- grow: Type.Optional(
52
- Type.Boolean({
53
- title: "Auto expand",
54
- description: "If set, the brick will grow to fill the available space of its parent section or box.",
55
- "ui:styleId": "styles:grow",
56
- "ui:responsive": true,
57
- }),
58
- ),
52
+ grow: Type.Optional(grow()),
59
53
  alignSelf: Type.Optional(alignSelf()),
60
54
  };
61
55
 
@@ -0,0 +1,11 @@
1
+ import { Type, type SchemaOptions } from "@sinclair/typebox";
2
+
3
+ export function grow(options: SchemaOptions = {}) {
4
+ return Type.Boolean({
5
+ title: "Auto expand",
6
+ description: "If set, the brick will grow to fill the available space of its parent section or box.",
7
+ "ui:styleId": "styles:grow",
8
+ "ui:responsive": true,
9
+ ...options,
10
+ });
11
+ }
@@ -22,6 +22,46 @@ export function image(options: PropImageOptions = {}) {
22
22
  "ui:placeholder": "Your image description",
23
23
  }),
24
24
  ),
25
+ aspectRatio: Type.Optional(
26
+ StringEnum(
27
+ [
28
+ "auto",
29
+ "1:1",
30
+ "4:3",
31
+ "3:4",
32
+ "16:9",
33
+ "9:16",
34
+ "2:3",
35
+ "3:2",
36
+ "5:4",
37
+ "4:5",
38
+ "21:9",
39
+ "9:21",
40
+ "original",
41
+ ],
42
+ {
43
+ enumNames: [
44
+ "Auto",
45
+ "1:1 (Square)",
46
+ "4:3 (Standard landscape)",
47
+ "3:4 (Standard portrait)",
48
+ "16:9 (Widescreen)",
49
+ "9:16 (Vertical video)",
50
+ "2:3 (Portrait)",
51
+ "3:2 (Landscape)",
52
+ "5:4 (Classic photo)",
53
+ "4:5 (Instagram post)",
54
+ "21:9 (Cinema widescreen)",
55
+ "9:21 (Tall vertical)",
56
+ "Original",
57
+ ],
58
+ title: "Aspect Ratio",
59
+ description: "The aspect ratio of the image",
60
+ "ui:field": "enum",
61
+ "ui:styleId": "styles:aspectRatio",
62
+ },
63
+ ),
64
+ ),
25
65
  fit: Type.Optional(
26
66
  StringEnum(["object-none", "object-contain", "object-cover", "object-fill", "object-scale-down"], {
27
67
  enumNames: ["None", "Contain", "Cover", "Fill", "Scale down"],
@@ -30,6 +30,7 @@ export function urlOrPageId(options: StringOptions = {}) {
30
30
  {
31
31
  // $id: "content:urlOrPageId",
32
32
  title: "URL",
33
+ description: "A URL or a page ID",
33
34
  metadata: {
34
35
  category: "content",
35
36
  },
@@ -48,6 +49,7 @@ type IconOptions = StrFieldOptions & { "ui:default-icon-collection"?: string };
48
49
  export function icon(options: IconOptions = {}) {
49
50
  return Type.String({
50
51
  title: "Icon",
52
+ description: "An icon from the Iconify collection",
51
53
  "ai:instructions": "Use a iconify reference like 'mdi:heart' or 'fa-solid:coffee'.",
52
54
  "ui:field": "iconify",
53
55
  // $id: "assets:icon",