@upstart.gg/sdk 0.0.135 → 0.0.136

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 (258) hide show
  1. package/dist/shared/ai/schemas.d.ts +11 -2
  2. package/dist/shared/ai/schemas.d.ts.map +1 -1
  3. package/dist/shared/ai/schemas.js +43 -8
  4. package/dist/shared/ai/schemas.js.map +1 -1
  5. package/dist/shared/ai/types.d.ts +125 -65
  6. package/dist/shared/ai/types.d.ts.map +1 -1
  7. package/dist/shared/ajv.js +2 -2
  8. package/dist/shared/attributes.d.ts +3 -1
  9. package/dist/shared/attributes.d.ts.map +1 -1
  10. package/dist/shared/attributes.js +9 -9
  11. package/dist/shared/brick-manifest.js +4 -4
  12. package/dist/shared/bricks/manifests/_types.d.ts +9 -0
  13. package/dist/shared/bricks/manifests/_types.d.ts.map +1 -0
  14. package/dist/shared/bricks/manifests/_types.js +3 -0
  15. package/dist/shared/bricks/manifests/_types.js.map +1 -0
  16. package/dist/shared/bricks/manifests/accordion.manifest.d.ts +2 -6
  17. package/dist/shared/bricks/manifests/accordion.manifest.d.ts.map +1 -1
  18. package/dist/shared/bricks/manifests/accordion.manifest.js +5 -5
  19. package/dist/shared/bricks/manifests/all-manifests.d.ts.map +1 -1
  20. package/dist/shared/bricks/manifests/all-manifests.js +28 -28
  21. package/dist/shared/bricks/manifests/box.manifest.d.ts +2 -6
  22. package/dist/shared/bricks/manifests/box.manifest.d.ts.map +1 -1
  23. package/dist/shared/bricks/manifests/box.manifest.js +5 -5
  24. package/dist/shared/bricks/manifests/button.manifest.d.ts +2 -6
  25. package/dist/shared/bricks/manifests/button.manifest.d.ts.map +1 -1
  26. package/dist/shared/bricks/manifests/button.manifest.js +5 -5
  27. package/dist/shared/bricks/manifests/card.manifest.d.ts +8 -7
  28. package/dist/shared/bricks/manifests/card.manifest.d.ts.map +1 -1
  29. package/dist/shared/bricks/manifests/card.manifest.js +5 -5
  30. package/dist/shared/bricks/manifests/carousel.manifest.d.ts +2 -6
  31. package/dist/shared/bricks/manifests/carousel.manifest.d.ts.map +1 -1
  32. package/dist/shared/bricks/manifests/carousel.manifest.js +5 -5
  33. package/dist/shared/bricks/manifests/footer.manifest.d.ts +2 -6
  34. package/dist/shared/bricks/manifests/footer.manifest.d.ts.map +1 -1
  35. package/dist/shared/bricks/manifests/footer.manifest.js +5 -5
  36. package/dist/shared/bricks/manifests/form.manifest.d.ts +2 -6
  37. package/dist/shared/bricks/manifests/form.manifest.d.ts.map +1 -1
  38. package/dist/shared/bricks/manifests/form.manifest.js +5 -5
  39. package/dist/shared/bricks/manifests/hero.manifest.d.ts +2 -6
  40. package/dist/shared/bricks/manifests/hero.manifest.d.ts.map +1 -1
  41. package/dist/shared/bricks/manifests/hero.manifest.js +5 -5
  42. package/dist/shared/bricks/manifests/html.manifest.d.ts +2 -6
  43. package/dist/shared/bricks/manifests/html.manifest.d.ts.map +1 -1
  44. package/dist/shared/bricks/manifests/html.manifest.js +5 -5
  45. package/dist/shared/bricks/manifests/icon.manifest.d.ts +2 -6
  46. package/dist/shared/bricks/manifests/icon.manifest.d.ts.map +1 -1
  47. package/dist/shared/bricks/manifests/icon.manifest.js +5 -5
  48. package/dist/shared/bricks/manifests/image.manifest.d.ts +1 -0
  49. package/dist/shared/bricks/manifests/image.manifest.d.ts.map +1 -1
  50. package/dist/shared/bricks/manifests/image.manifest.js +5 -5
  51. package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts +2 -6
  52. package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts.map +1 -1
  53. package/dist/shared/bricks/manifests/images-gallery.manifest.js +5 -5
  54. package/dist/shared/bricks/manifests/map.manifest.d.ts +2 -6
  55. package/dist/shared/bricks/manifests/map.manifest.d.ts.map +1 -1
  56. package/dist/shared/bricks/manifests/map.manifest.js +5 -5
  57. package/dist/shared/bricks/manifests/navbar.manifest.d.ts +2 -6
  58. package/dist/shared/bricks/manifests/navbar.manifest.d.ts.map +1 -1
  59. package/dist/shared/bricks/manifests/navbar.manifest.js +5 -5
  60. package/dist/shared/bricks/manifests/sidebar.manifest.d.ts +2 -6
  61. package/dist/shared/bricks/manifests/sidebar.manifest.d.ts.map +1 -1
  62. package/dist/shared/bricks/manifests/sidebar.manifest.js +5 -5
  63. package/dist/shared/bricks/manifests/social-links.manifest.d.ts +2 -6
  64. package/dist/shared/bricks/manifests/social-links.manifest.d.ts.map +1 -1
  65. package/dist/shared/bricks/manifests/social-links.manifest.js +5 -5
  66. package/dist/shared/bricks/manifests/spacer.manifest.d.ts +2 -6
  67. package/dist/shared/bricks/manifests/spacer.manifest.d.ts.map +1 -1
  68. package/dist/shared/bricks/manifests/spacer.manifest.js +5 -5
  69. package/dist/shared/bricks/manifests/table.manifest.d.ts +2 -6
  70. package/dist/shared/bricks/manifests/table.manifest.d.ts.map +1 -1
  71. package/dist/shared/bricks/manifests/table.manifest.js +5 -5
  72. package/dist/shared/bricks/manifests/tabs.manifest.d.ts +2 -6
  73. package/dist/shared/bricks/manifests/tabs.manifest.d.ts.map +1 -1
  74. package/dist/shared/bricks/manifests/tabs.manifest.js +5 -5
  75. package/dist/shared/bricks/manifests/testimonials.manifest.d.ts +2 -6
  76. package/dist/shared/bricks/manifests/testimonials.manifest.d.ts.map +1 -1
  77. package/dist/shared/bricks/manifests/testimonials.manifest.js +5 -5
  78. package/dist/shared/bricks/manifests/text.manifest.d.ts +2 -6
  79. package/dist/shared/bricks/manifests/text.manifest.d.ts.map +1 -1
  80. package/dist/shared/bricks/manifests/text.manifest.js +5 -5
  81. package/dist/shared/bricks/manifests/timeline.manifest.d.ts +2 -6
  82. package/dist/shared/bricks/manifests/timeline.manifest.d.ts.map +1 -1
  83. package/dist/shared/bricks/manifests/timeline.manifest.js +5 -5
  84. package/dist/shared/bricks/manifests/video.manifest.d.ts +2 -6
  85. package/dist/shared/bricks/manifests/video.manifest.d.ts.map +1 -1
  86. package/dist/shared/bricks/manifests/video.manifest.js +5 -5
  87. package/dist/shared/bricks/props/dynamic.js +2 -2
  88. package/dist/shared/bricks/props/geolocation.js +1 -1
  89. package/dist/shared/bricks/props/string.js +1 -1
  90. package/dist/shared/bricks.d.ts +5 -3
  91. package/dist/shared/bricks.d.ts.map +1 -1
  92. package/dist/shared/bricks.js +31 -29
  93. package/dist/shared/{chunk-CKFRSHR2.js → chunk-2IHKVMKW.js} +3 -3
  94. package/dist/shared/chunk-2IHKVMKW.js.map +1 -0
  95. package/dist/shared/{chunk-P3RH5URN.js → chunk-2VDR4ZYY.js} +3 -3
  96. package/dist/shared/chunk-2VDR4ZYY.js.map +1 -0
  97. package/dist/shared/{chunk-MLZT7MRQ.js → chunk-36PLZKMW.js} +4 -4
  98. package/dist/shared/chunk-36PLZKMW.js.map +1 -0
  99. package/dist/shared/{chunk-QQQ3FYPG.js → chunk-42OUNI7C.js} +123 -5
  100. package/dist/shared/chunk-42OUNI7C.js.map +1 -0
  101. package/dist/shared/{chunk-2HO4FHLM.js → chunk-4MNWMEMM.js} +118 -152
  102. package/dist/shared/chunk-4MNWMEMM.js.map +1 -0
  103. package/dist/shared/chunk-CRS7QCPZ.js +308 -0
  104. package/dist/shared/chunk-CRS7QCPZ.js.map +1 -0
  105. package/dist/shared/{chunk-WGDUJSSS.js → chunk-DFAFDBYZ.js} +4 -4
  106. package/dist/shared/chunk-DFAFDBYZ.js.map +1 -0
  107. package/dist/shared/{chunk-FVU5PXRC.js → chunk-DV3G7X34.js} +2 -2
  108. package/dist/shared/{chunk-TB3X4LRQ.js → chunk-EVLRH6VG.js} +2 -2
  109. package/dist/shared/{chunk-Z35I5JM5.js → chunk-F247VKAE.js} +3 -3
  110. package/dist/shared/chunk-F247VKAE.js.map +1 -0
  111. package/dist/shared/{chunk-QL3T5HJQ.js → chunk-FOGAVJC2.js} +2 -2
  112. package/dist/shared/chunk-FOGAVJC2.js.map +1 -0
  113. package/dist/shared/{chunk-4WI23M7W.js → chunk-FQDR2BBZ.js} +3 -3
  114. package/dist/shared/chunk-FQDR2BBZ.js.map +1 -0
  115. package/dist/shared/{chunk-3KLRW4I2.js → chunk-GFAQWQER.js} +182 -124
  116. package/dist/shared/chunk-GFAQWQER.js.map +1 -0
  117. package/dist/shared/{chunk-DRTGM2UJ.js → chunk-GIGFNQBO.js} +2 -2
  118. package/dist/shared/chunk-GIGFNQBO.js.map +1 -0
  119. package/dist/shared/{chunk-SHUGHJ7V.js → chunk-GQTZPN5D.js} +3 -3
  120. package/dist/shared/chunk-GQTZPN5D.js.map +1 -0
  121. package/dist/shared/{chunk-D4YQ6ABM.js → chunk-H5JM2M2T.js} +211 -34
  122. package/dist/shared/chunk-H5JM2M2T.js.map +1 -0
  123. package/dist/shared/{chunk-NT3IW52F.js → chunk-HTUSL2U7.js} +2 -2
  124. package/dist/shared/{chunk-BW6EFRSF.js → chunk-IQIISR22.js} +2 -2
  125. package/dist/shared/{chunk-BW6EFRSF.js.map → chunk-IQIISR22.js.map} +1 -1
  126. package/dist/shared/{chunk-Z2NTDFB4.js → chunk-KEM5N6GJ.js} +4 -4
  127. package/dist/shared/chunk-KEM5N6GJ.js.map +1 -0
  128. package/dist/shared/{chunk-V3UA3LRK.js → chunk-KIDICX3Y.js} +32 -7
  129. package/dist/shared/chunk-KIDICX3Y.js.map +1 -0
  130. package/dist/shared/chunk-KILJYJFE.js +354 -0
  131. package/dist/shared/chunk-KILJYJFE.js.map +1 -0
  132. package/dist/shared/{chunk-GRMY35BU.js → chunk-L6C7HUSA.js} +148 -20
  133. package/dist/shared/chunk-L6C7HUSA.js.map +1 -0
  134. package/dist/shared/{chunk-GCQURRVB.js → chunk-LCJ2VFPM.js} +4 -4
  135. package/dist/shared/chunk-LCJ2VFPM.js.map +1 -0
  136. package/dist/shared/{chunk-QSND5IWT.js → chunk-LLNPH3XR.js} +19 -36
  137. package/dist/shared/chunk-LLNPH3XR.js.map +1 -0
  138. package/dist/shared/{chunk-LXAO3JA6.js → chunk-LTIJI7Y3.js} +4 -4
  139. package/dist/shared/chunk-LTIJI7Y3.js.map +1 -0
  140. package/dist/shared/{chunk-6E42XWFH.js → chunk-MFNHFN2B.js} +3 -3
  141. package/dist/shared/{chunk-6E42XWFH.js.map → chunk-MFNHFN2B.js.map} +1 -1
  142. package/dist/shared/{chunk-TEO6TJOM.js → chunk-N3BEBLWF.js} +27 -26
  143. package/dist/shared/{chunk-TEO6TJOM.js.map → chunk-N3BEBLWF.js.map} +1 -1
  144. package/dist/shared/{chunk-UQF52PWK.js → chunk-N3ZTQD5I.js} +2 -2
  145. package/dist/shared/chunk-N3ZTQD5I.js.map +1 -0
  146. package/dist/shared/{chunk-EQMU6NIU.js → chunk-TNTFKLCR.js} +16 -13
  147. package/dist/shared/chunk-TNTFKLCR.js.map +1 -0
  148. package/dist/shared/{chunk-EWSPTRDL.js → chunk-U5ZECCJM.js} +102 -16
  149. package/dist/shared/chunk-U5ZECCJM.js.map +1 -0
  150. package/dist/shared/{chunk-O5PLB3YB.js → chunk-UXTASZ23.js} +16 -10
  151. package/dist/shared/chunk-UXTASZ23.js.map +1 -0
  152. package/dist/shared/{chunk-BMWRR4DI.js → chunk-YWOTQWIQ.js} +3 -3
  153. package/dist/shared/chunk-YWOTQWIQ.js.map +1 -0
  154. package/dist/shared/{chunk-GPCI2N2A.js → chunk-ZR6R6Z6O.js} +106 -5
  155. package/dist/shared/chunk-ZR6R6Z6O.js.map +1 -0
  156. package/dist/shared/{chunk-U7TVEPKA.js → chunk-ZRRAK5NS.js} +3 -3
  157. package/dist/shared/chunk-ZRRAK5NS.js.map +1 -0
  158. package/dist/shared/context.d.ts +1 -0
  159. package/dist/shared/context.d.ts.map +1 -1
  160. package/dist/shared/datarecords/types.d.ts +7 -60
  161. package/dist/shared/datarecords/types.d.ts.map +1 -1
  162. package/dist/shared/datarecords/types.js +3 -5
  163. package/dist/shared/datasources/external/threads/media/fetcher.js +3 -3
  164. package/dist/shared/datasources/types.js +2 -2
  165. package/dist/shared/datasources.d.ts +1 -1
  166. package/dist/shared/datasources.d.ts.map +1 -1
  167. package/dist/shared/datasources.js +1 -3
  168. package/dist/shared/datasources.js.map +1 -1
  169. package/dist/shared/page.d.ts.map +1 -1
  170. package/dist/shared/page.js +31 -31
  171. package/dist/shared/site.d.ts +6 -6
  172. package/dist/shared/site.js +36 -36
  173. package/dist/shared/site.js.map +1 -1
  174. package/dist/shared/sitemap.d.ts +6 -5
  175. package/dist/shared/sitemap.d.ts.map +1 -1
  176. package/dist/shared/sitemap.js +32 -32
  177. package/dist/shared/theme.js +3 -3
  178. package/dist/shared/utils/llm.js +2 -2
  179. package/dist/shared/utils/schema-registry.js +2 -2
  180. package/dist/shared/utils/schema.js +3 -3
  181. package/package.json +2 -2
  182. package/src/shared/ai/schemas.ts +46 -10
  183. package/src/shared/ai/types.ts +128 -60
  184. package/src/shared/attributes.ts +11 -3
  185. package/src/shared/bricks/manifests/_types.ts +9 -0
  186. package/src/shared/bricks/manifests/accordion.manifest.ts +128 -161
  187. package/src/shared/bricks/manifests/all-manifests.ts +1 -0
  188. package/src/shared/bricks/manifests/box.manifest.ts +195 -129
  189. package/src/shared/bricks/manifests/button.manifest.ts +158 -71
  190. package/src/shared/bricks/manifests/card.manifest.ts +200 -28
  191. package/src/shared/bricks/manifests/carousel.manifest.ts +154 -22
  192. package/src/shared/bricks/manifests/footer.manifest.ts +2 -5
  193. package/src/shared/bricks/manifests/form.manifest.ts +122 -7
  194. package/src/shared/bricks/manifests/hero.manifest.ts +103 -18
  195. package/src/shared/bricks/manifests/html.manifest.ts +2 -5
  196. package/src/shared/bricks/manifests/icon.manifest.ts +216 -36
  197. package/src/shared/bricks/manifests/image.manifest.ts +103 -2
  198. package/src/shared/bricks/manifests/images-gallery.manifest.ts +2 -5
  199. package/src/shared/bricks/manifests/map.manifest.ts +2 -5
  200. package/src/shared/bricks/manifests/navbar.manifest.ts +2 -5
  201. package/src/shared/bricks/manifests/sidebar.manifest.ts +2 -5
  202. package/src/shared/bricks/manifests/social-links.manifest.ts +2 -5
  203. package/src/shared/bricks/manifests/spacer.manifest.ts +2 -5
  204. package/src/shared/bricks/manifests/table.manifest.ts +2 -5
  205. package/src/shared/bricks/manifests/tabs.manifest.ts +2 -5
  206. package/src/shared/bricks/manifests/testimonials.manifest.ts +2 -5
  207. package/src/shared/bricks/manifests/text.manifest.ts +31 -10
  208. package/src/shared/bricks/manifests/timeline.manifest.ts +2 -5
  209. package/src/shared/bricks/manifests/video.manifest.ts +2 -5
  210. package/src/shared/bricks/props/string.ts +1 -1
  211. package/src/shared/bricks.ts +12 -9
  212. package/src/shared/context.ts +1 -0
  213. package/src/shared/datarecords/types.ts +47 -37
  214. package/src/shared/datasources.ts +2 -4
  215. package/src/shared/page.ts +0 -1
  216. package/src/shared/site.ts +3 -3
  217. package/src/shared/sitemap.ts +2 -0
  218. package/src/shared/tests/schema-registry.test.ts +0 -2
  219. package/src/shared/utils/schema-registry.ts +5 -5
  220. package/src/shared/utils/tests/schema.test.ts +43 -2
  221. package/dist/shared/chunk-2HO4FHLM.js.map +0 -1
  222. package/dist/shared/chunk-3KLRW4I2.js.map +0 -1
  223. package/dist/shared/chunk-4WI23M7W.js.map +0 -1
  224. package/dist/shared/chunk-BMWRR4DI.js.map +0 -1
  225. package/dist/shared/chunk-CKFRSHR2.js.map +0 -1
  226. package/dist/shared/chunk-D4YQ6ABM.js.map +0 -1
  227. package/dist/shared/chunk-DRTGM2UJ.js.map +0 -1
  228. package/dist/shared/chunk-EQMU6NIU.js.map +0 -1
  229. package/dist/shared/chunk-EWSPTRDL.js.map +0 -1
  230. package/dist/shared/chunk-GCQURRVB.js.map +0 -1
  231. package/dist/shared/chunk-GPCI2N2A.js.map +0 -1
  232. package/dist/shared/chunk-GRMY35BU.js.map +0 -1
  233. package/dist/shared/chunk-LXAO3JA6.js.map +0 -1
  234. package/dist/shared/chunk-MLZT7MRQ.js.map +0 -1
  235. package/dist/shared/chunk-O5PLB3YB.js.map +0 -1
  236. package/dist/shared/chunk-P3RH5URN.js.map +0 -1
  237. package/dist/shared/chunk-QL3T5HJQ.js.map +0 -1
  238. package/dist/shared/chunk-QQQ3FYPG.js.map +0 -1
  239. package/dist/shared/chunk-QSND5IWT.js.map +0 -1
  240. package/dist/shared/chunk-SHUGHJ7V.js.map +0 -1
  241. package/dist/shared/chunk-U7TVEPKA.js.map +0 -1
  242. package/dist/shared/chunk-UQF52PWK.js.map +0 -1
  243. package/dist/shared/chunk-V3UA3LRK.js.map +0 -1
  244. package/dist/shared/chunk-WGDUJSSS.js.map +0 -1
  245. package/dist/shared/chunk-X6N463D4.js +0 -222
  246. package/dist/shared/chunk-X6N463D4.js.map +0 -1
  247. package/dist/shared/chunk-X75YV73Q.js +0 -178
  248. package/dist/shared/chunk-X75YV73Q.js.map +0 -1
  249. package/dist/shared/chunk-Z2NTDFB4.js.map +0 -1
  250. package/dist/shared/chunk-Z35I5JM5.js.map +0 -1
  251. package/dist/shared/schema-registry.d.ts +0 -5
  252. package/dist/shared/schema-registry.d.ts.map +0 -1
  253. package/dist/shared/schema-registry.js +0 -119
  254. package/dist/shared/schema-registry.js.map +0 -1
  255. package/src/shared/schema-registry.ts +0 -82
  256. /package/dist/shared/{chunk-FVU5PXRC.js.map → chunk-DV3G7X34.js.map} +0 -0
  257. /package/dist/shared/{chunk-TB3X4LRQ.js.map → chunk-EVLRH6VG.js.map} +0 -0
  258. /package/dist/shared/{chunk-NT3IW52F.js.map → chunk-HTUSL2U7.js.map} +0 -0
@@ -10,13 +10,15 @@ import { borderRef, roundingRef } from "../props/border";
10
10
  import { colorPresetRef } from "../props/color-preset";
11
11
  import { loopRef } from "../props/dynamic";
12
12
  import { StringEnum } from "~/shared/utils/string-enum";
13
+ import { urlOrPageIdRef } from "../props/string";
14
+ import type { BrickExample } from "./_types";
13
15
 
14
16
  export const manifest = defineBrickManifest({
15
17
  type: "card",
16
18
  name: "Card",
17
19
  description: "A card that can have a title, image, and content.",
18
20
  aiInstructions:
19
- "Use this brick to create cards that contain an image, title, and text content. Cards are useful for displaying information in a concise and visually appealing way.",
21
+ "Use this brick to create visually distinct content blocks (product, feature, testimonial, event, article, CTA, etc.).\n\nGuidelines:\n- Button is REQUIRED. Always provide a short action label (1–3 words) and pick a color matching semantic weight (primary/accent for primary actions, neutral/secondary for low emphasis).\n- Image is OPTIONAL. If present you may set imagePosition to top | middle | bottom. Default is top. Pick middle for vertically centered feature highlights, bottom for caption-first layouts.\n- Set noTitle: true when the card is intentionally title-less (e.g. a quote card or pure media focus). Do NOT include an empty title string alongside noTitle.\n- Use dynamic tokens (e.g. {{products.price}}) instead of duplicating literal values.\n- Prefer gradient presets for more visual emphasis (e.g. primary-gradient-400 with gradientDirection).\n- border + rounding + shadow should be cohesive: stronger borders pair well with larger rounding + moderate shadow; minimal / flat cards may use border-0 + no shadow.\n- For internal navigation you can supply a page ID (e.g. 'about') OR a relative/absolute URL (e.g. '/pricing', 'https://example.com').\n- Keep HTML inside text minimal (<strong>, <em>, <br>) — for richer structure consider multiple bricks instead.\n- Avoid mixing noTitle with large heading text embedded inside the text field — in that case keep a proper title.\n\nReturn ONLY valid properties defined in the schema; do not invent new ones.",
20
22
  icon: BsCardText,
21
23
  defaultWidth: { desktop: "400px", mobile: "100%" },
22
24
  minWidth: { desktop: 300 },
@@ -39,8 +41,8 @@ export const manifest = defineBrickManifest({
39
41
  }),
40
42
  ),
41
43
  imagePosition: Type.Optional(
42
- StringEnum(["top", "middle", "bottom", "left", "right"], {
43
- enumNames: ["Top", "Middle", "Bottom", "Left", "Right"],
44
+ StringEnum(["top", "middle", "bottom"], {
45
+ enumNames: ["Top", "Middle", "Bottom"],
44
46
  title: "Image Position",
45
47
  description: "Where the image should be placed in the card",
46
48
  default: "top",
@@ -79,34 +81,147 @@ export const manifest = defineBrickManifest({
79
81
  }),
80
82
  ),
81
83
  loop: Type.Optional(loopRef()),
84
+ button: Type.Object(
85
+ {
86
+ label: Type.String({
87
+ title: "Button label",
88
+ default: "Click me",
89
+ examples: ["Learn more", "Buy now", "Sign up"],
90
+ metadata: {
91
+ category: "content",
92
+ },
93
+ }),
94
+ url: urlOrPageIdRef({
95
+ title: "Button URL",
96
+ description: "The URL the button should link to.",
97
+ metadata: {
98
+ category: "content",
99
+ },
100
+ }),
101
+ color: Type.Optional(
102
+ StringEnum(["btn-neutral", "btn-primary", "btn-secondary", "btn-accent"], {
103
+ enumNames: ["Neutral", "Primary", "Secondary", "Accent"],
104
+ title: "Color",
105
+ default: "btn-primary",
106
+ }),
107
+ ),
108
+ },
109
+ { title: "Button", description: "Button displayed at the bottom of the card" },
110
+ ),
82
111
  }),
83
112
  });
84
113
 
85
114
  export type Manifest = typeof manifest;
86
115
 
87
- export const examples: {
88
- description: string;
89
- type: string;
90
- props: BrickProps<Manifest>["brick"]["props"];
91
- }[] = [
116
+ export const examples: BrickExample<Manifest>[] = [
92
117
  {
93
118
  description: "A simple card with a title and content",
94
119
  type: "card",
95
120
  props: {
96
121
  title: "Card Title",
97
122
  text: "This is the body of the card.",
123
+ button: {
124
+ label: "Learn more",
125
+ url: "/learn-more",
126
+ color: "btn-primary",
127
+ },
98
128
  },
99
129
  },
130
+ // IMAGE POSITION MIDDLE VARIANT
100
131
  {
101
- description: "Product card with image on the left",
132
+ description: "Feature highlight card with centered image (imagePosition=middle)",
102
133
  type: "card",
103
134
  props: {
104
- cardImage: {
105
- src: "https://via.placeholder.com/200x200",
106
- alt: "Product image",
107
- },
108
- title: "Premium Headphones",
109
- text: "High-quality wireless headphones with noise cancellation and 30-hour battery life.",
135
+ cardImage: { src: "https://via.placeholder.com/420x240", alt: "Feature visual" },
136
+ imagePosition: "middle",
137
+ title: "Blazing Performance",
138
+ text: "Our new engine reduces processing time by 45% while maintaining reliability.",
139
+ colorPreset: { color: "primary-100" },
140
+ border: { width: "border", color: "border-primary-200" },
141
+ rounding: "rounded-lg",
142
+ shadow: "shadow-sm",
143
+ button: { label: "Learn More", url: "/features/performance", color: "btn-primary" },
144
+ },
145
+ },
146
+ // IMAGE POSITION BOTTOM VARIANT
147
+ {
148
+ description: "Case study card with image at the bottom (imagePosition=bottom)",
149
+ type: "card",
150
+ props: {
151
+ title: "Case Study: ScaleOps",
152
+ text: "How ScaleOps handled 10x growth with zero downtime using our platform.",
153
+ cardImage: { src: "https://via.placeholder.com/600x260", alt: "Scale graph" },
154
+ imagePosition: "bottom",
155
+ colorPreset: { color: "secondary-50" },
156
+ rounding: "rounded-md",
157
+ shadow: "shadow-sm",
158
+ button: { label: "Read Study", url: "/cases/scaleops", color: "btn-secondary" },
159
+ },
160
+ },
161
+ // NO TITLE VARIANT
162
+ {
163
+ description: "Quote / testimonial style card without a title (uses noTitle=true)",
164
+ type: "card",
165
+ props: {
166
+ noTitle: true,
167
+ text: '"This toolkit accelerated our launch by weeks — the component quality is outstanding."<br><em>— CTO, FinEdge</em>',
168
+ colorPreset: { color: "neutral-100" },
169
+ border: { width: "border", color: "border-neutral-300" },
170
+ rounding: "rounded-xl",
171
+ shadow: "shadow-sm",
172
+ button: { label: "See More", url: "/testimonials", color: "btn-neutral" },
173
+ },
174
+ },
175
+ // INTERNAL PAGE ID LINK VARIANT
176
+ {
177
+ description: "Internal navigation card using a page ID instead of a URL",
178
+ type: "card",
179
+ props: {
180
+ title: "About Our Mission",
181
+ text: "Learn how we're building an open, extensible site generation platform for modern teams.",
182
+ colorPreset: { color: "base-100" },
183
+ rounding: "rounded-md",
184
+ button: { label: "About Us", url: "about", color: "btn-primary" },
185
+ },
186
+ },
187
+ // GRADIENT & STRONG BORDER VARIANT
188
+ {
189
+ description: "High-emphasis promotional card using gradient background and thick border",
190
+ type: "card",
191
+ props: {
192
+ title: "Limited Time Offer",
193
+ text: "Upgrade now and receive a complimentary strategy session plus extended analytics access.",
194
+ colorPreset: { color: "primary-gradient-400", gradientDirection: "bg-gradient-to-tr" },
195
+ border: { width: "border-4", color: "border-primary-400" },
196
+ rounding: "rounded-xl",
197
+ shadow: "shadow-lg",
198
+ button: { label: "Upgrade", url: "/pricing", color: "btn-accent" },
199
+ },
200
+ },
201
+ // MINIMAL / FLAT VARIANT (no border, no shadow, subtle preset)
202
+ {
203
+ description: "Minimal flat information card (border-0, no shadow)",
204
+ type: "card",
205
+ props: {
206
+ title: "Maintenance Window",
207
+ text: "Scheduled maintenance on Saturday 02:00–03:00 UTC. API responses may be delayed.",
208
+ colorPreset: { color: "neutral-50" },
209
+ border: { width: "border-0", color: "border-neutral-200" },
210
+ button: { label: "Status Page", url: "/status", color: "btn-neutral" },
211
+ },
212
+ },
213
+ // DARK / INVERTED VARIANT
214
+ {
215
+ description: "Dark themed spotlight card (primary-800 background)",
216
+ type: "card",
217
+ props: {
218
+ title: "Night Mode Preview",
219
+ text: "Experience the new adaptive dark theme optimized for low ambient light environments.",
220
+ colorPreset: { color: "primary-800" },
221
+ border: { width: "border", color: "border-primary-600" },
222
+ rounding: "rounded-lg",
223
+ shadow: "shadow-md",
224
+ button: { label: "Preview", url: "/themes/dark", color: "btn-primary" },
110
225
  },
111
226
  },
112
227
  {
@@ -115,29 +230,31 @@ export const examples: {
115
230
  props: {
116
231
  title: "Key Feature",
117
232
  text: "This feature provides exceptional value and enhances user experience significantly.",
233
+ colorPreset: { color: "primary-50" },
234
+ border: { width: "border", color: "border-primary-200" },
235
+ rounding: "rounded-lg",
236
+ shadow: "shadow-sm",
237
+ button: {
238
+ label: "Discover More",
239
+ url: "/features",
240
+ color: "btn-primary",
241
+ },
118
242
  },
119
243
  },
120
244
  {
121
245
  description: "Blog post card with image at the bottom",
122
246
  type: "card",
123
247
  props: {
124
- title: "The Future of Technology",
248
+ title: "Future of Tech",
125
249
  text: "Exploring emerging trends and innovations that will shape our digital landscape in the coming decade.",
126
250
  cardImage: {
127
251
  src: "https://via.placeholder.com/400x200",
128
252
  alt: "Technology concept",
129
253
  },
130
- },
131
- },
132
- {
133
- description: "Testimonial card with right-side image",
134
- type: "card",
135
- props: {
136
- title: "Customer Review",
137
- text: '"This product exceeded my expectations. The quality is outstanding and the customer service is top-notch!"',
138
- cardImage: {
139
- src: "https://via.placeholder.com/150x150",
140
- alt: "Customer photo",
254
+ button: {
255
+ label: "Read More",
256
+ url: "/blog/{{ blogPosts.$slug }}",
257
+ color: "btn-primary",
141
258
  },
142
259
  },
143
260
  },
@@ -147,6 +264,11 @@ export const examples: {
147
264
  props: {
148
265
  title: "Simple Announcement",
149
266
  text: "Important updates will be posted here regularly.",
267
+ button: {
268
+ label: "View Updates",
269
+ url: "/updates",
270
+ color: "btn-neutral",
271
+ },
150
272
  },
151
273
  },
152
274
  {
@@ -159,6 +281,11 @@ export const examples: {
159
281
  },
160
282
  title: "Annual Conference 2025",
161
283
  text: "Join us for three days of inspiring talks, networking opportunities, and hands-on workshops.",
284
+ button: {
285
+ label: "Register Now",
286
+ url: "/events/conference-2025",
287
+ color: "btn-primary",
288
+ },
162
289
  },
163
290
  },
164
291
  {
@@ -171,6 +298,11 @@ export const examples: {
171
298
  },
172
299
  title: "Breaking News Update",
173
300
  text: "Latest developments in the ongoing story with expert analysis and community reactions.",
301
+ button: {
302
+ label: "Read Full Article",
303
+ url: "/news/breaking-update",
304
+ color: "btn-secondary",
305
+ },
174
306
  },
175
307
  },
176
308
  {
@@ -179,6 +311,11 @@ export const examples: {
179
311
  props: {
180
312
  title: "Get Started Today",
181
313
  text: "Transform your workflow with our powerful tools. Sign up now and get 30 days free!",
314
+ button: {
315
+ label: "Sign Up Now",
316
+ url: "/signup",
317
+ color: "btn-primary",
318
+ },
182
319
  },
183
320
  },
184
321
  {
@@ -195,6 +332,11 @@ export const examples: {
195
332
  border: { width: "border", color: "border-primary-200" },
196
333
  rounding: "rounded-lg",
197
334
  shadow: "shadow-md",
335
+ button: {
336
+ label: "Buy Now",
337
+ url: "{{products.purchaseUrl}}",
338
+ color: "btn-primary",
339
+ },
198
340
  loop: {
199
341
  over: "products",
200
342
  },
@@ -214,6 +356,11 @@ export const examples: {
214
356
  colorPreset: { color: "neutral-100" },
215
357
  rounding: "rounded-xl",
216
358
  shadow: "shadow-lg",
359
+ button: {
360
+ label: "Contact",
361
+ url: "mailto:{{teamMembers.email}}",
362
+ color: "btn-neutral",
363
+ },
217
364
  loop: {
218
365
  over: "teamMembers",
219
366
  },
@@ -234,6 +381,11 @@ export const examples: {
234
381
  border: { width: "border", color: "border-secondary-300" },
235
382
  rounding: "rounded-md",
236
383
  shadow: "shadow-sm",
384
+ button: {
385
+ label: "Read More",
386
+ url: "{{blogPosts.url}}",
387
+ color: "btn-secondary",
388
+ },
237
389
  loop: {
238
390
  over: "blogPosts",
239
391
  },
@@ -254,6 +406,11 @@ export const examples: {
254
406
  border: { width: "border-2", color: "border-accent-400" },
255
407
  rounding: "rounded-lg",
256
408
  shadow: "shadow-md",
409
+ button: {
410
+ label: "Book Tickets",
411
+ url: "{{upcomingEvents.ticketUrl}}",
412
+ color: "btn-accent",
413
+ },
257
414
  loop: {
258
415
  over: "upcomingEvents",
259
416
  },
@@ -267,12 +424,17 @@ export const examples: {
267
424
  src: "{{customerReviews.customerPhoto}}",
268
425
  alt: "{{customerReviews.customerName}}",
269
426
  },
270
- imagePosition: "left",
427
+ imagePosition: "top",
271
428
  title: "{{customerReviews.customerName}}",
272
429
  text: '"{{customerReviews.review}}"<br><br><strong>Rating: {{customerReviews.rating}}/5 stars</strong><br>{{customerReviews.company}} • {{customerReviews.position}}',
273
430
  colorPreset: { color: "neutral-50" },
274
431
  rounding: "rounded-xl",
275
432
  shadow: "shadow-lg",
433
+ button: {
434
+ label: "See All Reviews",
435
+ url: "/reviews",
436
+ color: "btn-neutral",
437
+ },
276
438
  loop: {
277
439
  over: "customerReviews",
278
440
  },
@@ -293,6 +455,11 @@ export const examples: {
293
455
  border: { width: "border", color: "border-primary-300" },
294
456
  rounding: "rounded-lg",
295
457
  shadow: "shadow-md",
458
+ button: {
459
+ label: "Learn More",
460
+ url: "{{companyServices.detailsUrl}}",
461
+ color: "btn-primary",
462
+ },
296
463
  loop: {
297
464
  over: "companyServices",
298
465
  },
@@ -312,6 +479,11 @@ export const examples: {
312
479
  colorPreset: { color: "secondary-100" },
313
480
  rounding: "rounded-md",
314
481
  shadow: "shadow-sm",
482
+ button: {
483
+ label: "View Project",
484
+ url: "{{portfolioWork.projectUrl}}",
485
+ color: "btn-secondary",
486
+ },
315
487
  loop: {
316
488
  over: "portfolioWork",
317
489
  },
@@ -9,13 +9,54 @@ import { roundingRef } from "../props/border";
9
9
  import { colorPresetRef } from "../props/color-preset";
10
10
  import { loopRef } from "../props/dynamic";
11
11
  import { cssLengthRef } from "../props/css-length";
12
+ import type { BrickExample } from "./_types";
12
13
 
13
14
  export const manifest = defineBrickManifest({
14
15
  type: "carousel",
15
16
  name: "Carousel",
16
17
  description: "An image carousel with navigation arrows and dots or numbers indicator",
17
- aiInstructions:
18
- "Use this brick to create an image carousel or slideshow. It can display multiple images that users can navigate through using arrows or dots. Each image can have an optional legend or caption. This brick is ideal for showcasing portfolios, product images, or any visual content in an engaging way.",
18
+ aiInstructions: `Use the carousel component for showcasing sequential visual content with smooth navigation between images.
19
+
20
+ WHEN TO USE:
21
+ - Product galleries with multiple angles or variations
22
+ - Portfolio showcases with project images
23
+ - Step-by-step tutorials or processes (recipes, instructions)
24
+ - Before/after comparisons or transformations
25
+ - Team member profiles with photos
26
+ - Event photo galleries or highlights
27
+ - Feature demonstrations or software screenshots
28
+ - Travel destinations or location showcases
29
+
30
+ CONTENT GUIDELINES:
31
+ - Optimal range: 2-8 images for best user engagement (max 12 supported)
32
+ - Single image allowed only as placeholder for future expansion
33
+ - Each image needs: { src: { src, alt }, legend }
34
+ - Alt text MUST be descriptive and never empty
35
+ - Legend text should be concise (≤90 characters) and informative
36
+ - Use empty string ("") for legend only when no caption is intentionally desired
37
+
38
+ IMAGE CONSISTENCY:
39
+ - Keep aspect ratios similar across slides to prevent layout jumps
40
+ - Avoid mixing very tall portrait with very wide landscape images
41
+ - Use consistent image quality and style throughout carousel
42
+ - Consider loading performance with image optimization
43
+
44
+ STYLING OPTIONS:
45
+ - padding: "0" for edge-to-edge, "1rem" for standard, "2rem+" for generous spacing
46
+ - borderRadius: "rounded-none" for sharp/modern, "rounded-md" for standard, "rounded-xl" for friendly, "rounded-full" for circular (avatars)
47
+ - colorPreset: Use sparingly - "neutral-50"/"primary-50" for subtle framing, gradients for premium feel
48
+
49
+ DYNAMIC CONTENT:
50
+ - Use loop property with single template object for data-driven carousels
51
+ - Template variables in src and legend: "{{product.image}}", "{{team.name}} - {{team.role}}"
52
+ - Perfect for: product catalogs, team directories, portfolio projects, event galleries
53
+
54
+ AVOID:
55
+ - Including unrelated properties (buttons, titles outside legend)
56
+ - Heavy background colors that distract from images
57
+ - Inconsistent aspect ratios that cause jarring transitions
58
+ - More than 12 images (reduces focus and performance)
59
+ - Empty or placeholder alt text (accessibility requirement)`,
19
60
  category: "media",
20
61
  defaultInspectorTab: "content",
21
62
  consumesMultipleQueryRows: true,
@@ -74,13 +115,10 @@ export const manifest = defineBrickManifest({
74
115
 
75
116
  export type Manifest = typeof manifest;
76
117
 
77
- export const examples: {
78
- description: string;
79
- type: string;
80
- props: BrickProps<Manifest>["brick"]["props"];
81
- }[] = [
118
+ export const examples: BrickExample<Manifest>[] = [
119
+ // BASIC CAROUSEL EXAMPLES
82
120
  {
83
- description: "Basic image carousel with legends",
121
+ description: "Basic image carousel with legends - Simple content showcase",
84
122
  type: "carousel",
85
123
  props: {
86
124
  images: [
@@ -108,8 +146,10 @@ export const examples: {
108
146
  ],
109
147
  },
110
148
  },
149
+
150
+ // PRODUCT & COMMERCIAL
111
151
  {
112
- description: "Product showcase carousel with rounded corners and padding",
152
+ description: "Product showcase carousel with rounded corners and padding - E-commerce gallery style",
113
153
  type: "carousel",
114
154
  props: {
115
155
  images: [
@@ -144,11 +184,13 @@ export const examples: {
144
184
  ],
145
185
  borderRadius: "rounded-xl",
146
186
  padding: "2rem",
147
- colorPreset: { color: "gray-50" },
187
+ colorPreset: { color: "neutral-50" },
148
188
  },
149
189
  },
190
+
191
+ // PORTFOLIO & CREATIVE
150
192
  {
151
- description: "Portfolio carousel with minimal styling",
193
+ description: "Portfolio carousel with minimal styling - Clean professional presentation",
152
194
  type: "carousel",
153
195
  props: {
154
196
  images: [
@@ -178,8 +220,10 @@ export const examples: {
178
220
  padding: "0",
179
221
  },
180
222
  },
223
+
224
+ // EVENTS & EXPERIENCES
181
225
  {
182
- description: "Event photos carousel with primary color theme",
226
+ description: "Event photos carousel with primary color theme - Conference or gathering highlights",
183
227
  type: "carousel",
184
228
  props: {
185
229
  images: [
@@ -262,8 +306,10 @@ export const examples: {
262
306
  padding: "1rem",
263
307
  },
264
308
  },
309
+
310
+ // TEAM & PEOPLE
265
311
  {
266
- description: "Team members carousel with blue color scheme",
312
+ description: "Team members carousel with circular images - Professional team showcase",
267
313
  type: "carousel",
268
314
  props: {
269
315
  images: [
@@ -296,13 +342,15 @@ export const examples: {
296
342
  legend: "Emily Chen - Marketing Director",
297
343
  },
298
344
  ],
299
- colorPreset: { color: "blue-50" },
345
+ colorPreset: { color: "primary-50" },
300
346
  borderRadius: "rounded-full",
301
347
  padding: "2rem",
302
348
  },
303
349
  },
350
+
351
+ // TUTORIALS & PROCESSES
304
352
  {
305
- description: "Recipe steps carousel with detailed descriptions",
353
+ description: "Recipe steps carousel with detailed descriptions - Step-by-step instructional content",
306
354
  type: "carousel",
307
355
  props: {
308
356
  images: [
@@ -335,7 +383,7 @@ export const examples: {
335
383
  legend: "Step 4: Season and serve hot",
336
384
  },
337
385
  ],
338
- colorPreset: { color: "orange-50" },
386
+ colorPreset: { color: "accent-50" },
339
387
  borderRadius: "rounded-md",
340
388
  padding: "1.5rem",
341
389
  },
@@ -374,7 +422,7 @@ export const examples: {
374
422
  legend: "Living Room - After",
375
423
  },
376
424
  ],
377
- colorPreset: { color: "green-50" },
425
+ colorPreset: { color: "accent-100" },
378
426
  borderRadius: "rounded-lg",
379
427
  padding: "1rem",
380
428
  },
@@ -406,7 +454,7 @@ export const examples: {
406
454
  legend: "Color Study #7 - 2024",
407
455
  },
408
456
  ],
409
- colorPreset: { color: "gray-900" },
457
+ colorPreset: { color: "neutral-900" },
410
458
  borderRadius: "rounded-sm",
411
459
  padding: "3rem",
412
460
  },
@@ -459,7 +507,7 @@ export const examples: {
459
507
  legend: "Weekend Casual - Relaxed Fit",
460
508
  },
461
509
  ],
462
- colorPreset: { color: "purple-100" },
510
+ colorPreset: { color: "secondary-100" },
463
511
  borderRadius: "rounded-xl",
464
512
  padding: "2rem",
465
513
  },
@@ -491,7 +539,7 @@ export const examples: {
491
539
  legend: "Electric Sedan",
492
540
  },
493
541
  ],
494
- colorPreset: { color: "red-50" },
542
+ colorPreset: { color: "accent-50" },
495
543
  borderRadius: "rounded-lg",
496
544
  padding: "0.5rem",
497
545
  },
@@ -530,13 +578,13 @@ export const examples: {
530
578
  legend: "Security - Enterprise-grade protection",
531
579
  },
532
580
  ],
533
- colorPreset: { color: "indigo-50" },
581
+ colorPreset: { color: "primary-50" },
534
582
  borderRadius: "rounded-2xl",
535
583
  padding: "4rem",
536
584
  },
537
585
  },
538
586
  {
539
- description: "Dynamic product gallery using products query with pricing and details",
587
+ description: "Dynamic product gallery using products query - Data-driven product showcase",
540
588
  type: "carousel",
541
589
  props: {
542
590
  images: [
@@ -556,6 +604,90 @@ export const examples: {
556
604
  },
557
605
  },
558
606
  },
607
+
608
+ // DYNAMIC CONTENT EXAMPLES
609
+ {
610
+ description: "Loop template for portfolioProjects query (one object will repeat per row)",
611
+ type: "carousel",
612
+ props: {
613
+ images: [
614
+ {
615
+ src: {
616
+ src: "{{portfolioProjects.featuredImage}}",
617
+ alt: "{{portfolioProjects.projectName}} featured image",
618
+ },
619
+ legend:
620
+ "{{portfolioProjects.projectName}} – {{portfolioProjects.clientName}} ({{portfolioProjects.year}})",
621
+ },
622
+ ],
623
+ colorPreset: { color: "neutral-50" },
624
+ borderRadius: "rounded-md",
625
+ padding: "1rem",
626
+ loop: {
627
+ over: "portfolioProjects",
628
+ },
629
+ },
630
+ },
631
+
632
+ // SPECIAL STYLING VARIATIONS
633
+ {
634
+ description: "Showcase carousel with subtle gradient background frame",
635
+ type: "carousel",
636
+ props: {
637
+ images: [
638
+ {
639
+ src: { src: "https://via.placeholder.com/900x500.png?text=Showcase+1", alt: "Showcase slide 1" },
640
+ legend: "Launch Dashboard",
641
+ },
642
+ {
643
+ src: { src: "https://via.placeholder.com/900x500.png?text=Showcase+2", alt: "Showcase slide 2" },
644
+ legend: "Collaboration Tools",
645
+ },
646
+ {
647
+ src: { src: "https://via.placeholder.com/900x500.png?text=Showcase+3", alt: "Showcase slide 3" },
648
+ legend: "Usage Analytics",
649
+ },
650
+ ],
651
+ colorPreset: { color: "primary-gradient-300", gradientDirection: "bg-gradient-to-br" },
652
+ borderRadius: "rounded-xl",
653
+ padding: "2rem",
654
+ },
655
+ },
656
+ // MINIMAL EDGE (no padding, square corners)
657
+ {
658
+ description: "Minimal edge-to-edge carousel (no padding, no rounding)",
659
+ type: "carousel",
660
+ props: {
661
+ images: [
662
+ {
663
+ src: { src: "https://via.placeholder.com/800x400.png?text=Edge+1", alt: "Edge slide 1" },
664
+ legend: "",
665
+ },
666
+ {
667
+ src: { src: "https://via.placeholder.com/800x400.png?text=Edge+2", alt: "Edge slide 2" },
668
+ legend: "",
669
+ },
670
+ ],
671
+ borderRadius: "rounded-none",
672
+ padding: "0",
673
+ },
674
+ },
675
+ // SINGLE IMAGE (acts as prepared placeholder carousel)
676
+ {
677
+ description: "Single-image carousel (placeholder for future expansion)",
678
+ type: "carousel",
679
+ props: {
680
+ images: [
681
+ {
682
+ src: { src: "https://via.placeholder.com/1000x420.png?text=Banner", alt: "Promotional banner" },
683
+ legend: "Early Access Program",
684
+ },
685
+ ],
686
+ colorPreset: { color: "secondary-50" },
687
+ borderRadius: "rounded-lg",
688
+ padding: "1.25rem",
689
+ },
690
+ },
559
691
  {
560
692
  description: "Team member carousel using teamMembers query with roles and departments",
561
693
  type: "carousel",
@@ -9,6 +9,7 @@ import { fontSizeRef } from "../props/text";
9
9
  import type { BrickProps } from "../props/types";
10
10
  import { toLLMSchema } from "~/shared/utils/llm";
11
11
  import { cssLengthRef } from "../props/css-length";
12
+ import type { BrickExample } from "./_types";
12
13
 
13
14
  export const manifest = defineBrickManifest({
14
15
  type: "footer",
@@ -107,11 +108,7 @@ export const footerSchemaPropsLLM = toLLMSchema(manifest.props);
107
108
 
108
109
  export type FooterProps = Static<Manifest["props"]>;
109
110
 
110
- export const examples: {
111
- description: string;
112
- type: string;
113
- props: BrickProps<Manifest>["brick"]["props"];
114
- }[] = [
111
+ export const examples: BrickExample<Manifest>[] = [
115
112
  {
116
113
  description: "Simple footer with logo on the left",
117
114
  type: "footer",