trama-ui 0.1.0

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 (285) hide show
  1. package/CATALOG.md +1237 -0
  2. package/LICENSE +21 -0
  3. package/README.md +78 -0
  4. package/THIRD-PARTY.md +4 -0
  5. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/brown.png +0 -0
  6. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/brown_inlay.png +0 -0
  7. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/brown_pressed.png +0 -0
  8. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/grey.png +0 -0
  9. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/grey_inlay.png +0 -0
  10. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/grey_pressed.png +0 -0
  11. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/tan.png +0 -0
  12. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/tan_inlay.png +0 -0
  13. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/tan_pressed.png +0 -0
  14. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/white.png +0 -0
  15. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/white_inlay.png +0 -0
  16. package/assets/pixel/kenney-pixel-ui/9-slice/Ancient/white_pressed.png +0 -0
  17. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/blue.png +0 -0
  18. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/blue_pressed.png +0 -0
  19. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/green.png +0 -0
  20. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/green_pressed.png +0 -0
  21. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/grey.png +0 -0
  22. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/grey_pressed.png +0 -0
  23. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/red.png +0 -0
  24. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/red_pressed.png +0 -0
  25. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/yellow.png +0 -0
  26. package/assets/pixel/kenney-pixel-ui/9-slice/Colored/yellow_pressed.png +0 -0
  27. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/blue.png +0 -0
  28. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/blue_pressed.png +0 -0
  29. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/green.png +0 -0
  30. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/green_pressed.png +0 -0
  31. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/red.png +0 -0
  32. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/red_pressed.png +0 -0
  33. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/yellow.png +0 -0
  34. package/assets/pixel/kenney-pixel-ui/9-slice/Outline/yellow_pressed.png +0 -0
  35. package/assets/pixel/kenney-pixel-ui/9-slice/list.png +0 -0
  36. package/assets/pixel/kenney-pixel-ui/9-slice/space.png +0 -0
  37. package/assets/pixel/kenney-pixel-ui/9-slice/space_inlay.png +0 -0
  38. package/assets/pixel/kenney-pixel-ui/License.txt +23 -0
  39. package/assets/pixel/kenney-pixel-ui/spritesheet/sheet.png +0 -0
  40. package/bin/trama-ui.mjs +27 -0
  41. package/dist/components/ui/Accordion.d.ts +12 -0
  42. package/dist/components/ui/Accordion.js +12 -0
  43. package/dist/components/ui/Alert.d.ts +15 -0
  44. package/dist/components/ui/Alert.js +15 -0
  45. package/dist/components/ui/ArticlesSection.d.ts +30 -0
  46. package/dist/components/ui/ArticlesSection.js +18 -0
  47. package/dist/components/ui/AsciiBackground.d.ts +58 -0
  48. package/dist/components/ui/AsciiBackground.js +173 -0
  49. package/dist/components/ui/AsciiCard.d.ts +78 -0
  50. package/dist/components/ui/AsciiCard.js +253 -0
  51. package/dist/components/ui/AsciiChart.d.ts +18 -0
  52. package/dist/components/ui/AsciiChart.js +47 -0
  53. package/dist/components/ui/Badge.d.ts +15 -0
  54. package/dist/components/ui/Badge.js +8 -0
  55. package/dist/components/ui/BitmapText.d.ts +25 -0
  56. package/dist/components/ui/BitmapText.js +21 -0
  57. package/dist/components/ui/BlogCard.d.ts +33 -0
  58. package/dist/components/ui/BlogCard.js +13 -0
  59. package/dist/components/ui/Breadcrumbs.d.ts +9 -0
  60. package/dist/components/ui/Breadcrumbs.js +7 -0
  61. package/dist/components/ui/Button.d.ts +74 -0
  62. package/dist/components/ui/Button.js +48 -0
  63. package/dist/components/ui/CTASection.d.ts +13 -0
  64. package/dist/components/ui/CTASection.js +7 -0
  65. package/dist/components/ui/Carousel.d.ts +30 -0
  66. package/dist/components/ui/Carousel.js +80 -0
  67. package/dist/components/ui/CheckboxGroup.d.ts +11 -0
  68. package/dist/components/ui/CheckboxGroup.js +20 -0
  69. package/dist/components/ui/CodeBlock.d.ts +11 -0
  70. package/dist/components/ui/CodeBlock.js +20 -0
  71. package/dist/components/ui/ContactForm.d.ts +25 -0
  72. package/dist/components/ui/ContactForm.js +26 -0
  73. package/dist/components/ui/CrtOverlay.d.ts +10 -0
  74. package/dist/components/ui/CrtOverlay.js +5 -0
  75. package/dist/components/ui/Divider.d.ts +12 -0
  76. package/dist/components/ui/Divider.js +7 -0
  77. package/dist/components/ui/Drawer.d.ts +16 -0
  78. package/dist/components/ui/Drawer.js +25 -0
  79. package/dist/components/ui/Dropdown.d.ts +10 -0
  80. package/dist/components/ui/Dropdown.js +21 -0
  81. package/dist/components/ui/FAQSection.d.ts +14 -0
  82. package/dist/components/ui/FAQSection.js +7 -0
  83. package/dist/components/ui/FeatureGrid.d.ts +18 -0
  84. package/dist/components/ui/FeatureGrid.js +14 -0
  85. package/dist/components/ui/Footer.d.ts +14 -0
  86. package/dist/components/ui/Footer.js +16 -0
  87. package/dist/components/ui/GlyphCursor.d.ts +22 -0
  88. package/dist/components/ui/GlyphCursor.js +50 -0
  89. package/dist/components/ui/GridBackground.d.ts +15 -0
  90. package/dist/components/ui/GridBackground.js +6 -0
  91. package/dist/components/ui/Hero.d.ts +21 -0
  92. package/dist/components/ui/Hero.js +12 -0
  93. package/dist/components/ui/HoverFX.d.ts +29 -0
  94. package/dist/components/ui/HoverFX.js +75 -0
  95. package/dist/components/ui/Icon.d.ts +33 -0
  96. package/dist/components/ui/Icon.js +29 -0
  97. package/dist/components/ui/ImageGallery.d.ts +31 -0
  98. package/dist/components/ui/ImageGallery.js +79 -0
  99. package/dist/components/ui/LogoCloud.d.ts +12 -0
  100. package/dist/components/ui/LogoCloud.js +9 -0
  101. package/dist/components/ui/MagneticButton.d.ts +12 -0
  102. package/dist/components/ui/MagneticButton.js +49 -0
  103. package/dist/components/ui/Marquee.d.ts +29 -0
  104. package/dist/components/ui/Marquee.js +15 -0
  105. package/dist/components/ui/Modal.d.ts +40 -0
  106. package/dist/components/ui/Modal.js +51 -0
  107. package/dist/components/ui/NavBar.d.ts +14 -0
  108. package/dist/components/ui/NavBar.js +12 -0
  109. package/dist/components/ui/NeonSign.d.ts +14 -0
  110. package/dist/components/ui/NeonSign.js +7 -0
  111. package/dist/components/ui/OtpInput.d.ts +9 -0
  112. package/dist/components/ui/OtpInput.js +27 -0
  113. package/dist/components/ui/Pagination.d.ts +10 -0
  114. package/dist/components/ui/Pagination.js +24 -0
  115. package/dist/components/ui/Panel.d.ts +21 -0
  116. package/dist/components/ui/Panel.js +8 -0
  117. package/dist/components/ui/PixelFrame.d.ts +61 -0
  118. package/dist/components/ui/PixelFrame.js +29 -0
  119. package/dist/components/ui/Presence.d.ts +51 -0
  120. package/dist/components/ui/Presence.js +343 -0
  121. package/dist/components/ui/PricingCard.d.ts +30 -0
  122. package/dist/components/ui/PricingCard.js +21 -0
  123. package/dist/components/ui/PricingSection.d.ts +35 -0
  124. package/dist/components/ui/PricingSection.js +21 -0
  125. package/dist/components/ui/Progress.d.ts +17 -0
  126. package/dist/components/ui/Progress.js +9 -0
  127. package/dist/components/ui/RadioGroup.d.ts +10 -0
  128. package/dist/components/ui/RadioGroup.js +11 -0
  129. package/dist/components/ui/RangeSlider.d.ts +14 -0
  130. package/dist/components/ui/RangeSlider.js +11 -0
  131. package/dist/components/ui/Reveal.d.ts +48 -0
  132. package/dist/components/ui/Reveal.js +181 -0
  133. package/dist/components/ui/SceneFlash.d.ts +14 -0
  134. package/dist/components/ui/SceneFlash.js +51 -0
  135. package/dist/components/ui/ScrambleText.d.ts +31 -0
  136. package/dist/components/ui/ScrambleText.js +51 -0
  137. package/dist/components/ui/ScrollArea.d.ts +15 -0
  138. package/dist/components/ui/ScrollArea.js +18 -0
  139. package/dist/components/ui/SectionHeader.d.ts +12 -0
  140. package/dist/components/ui/SectionHeader.js +6 -0
  141. package/dist/components/ui/Select.d.ts +17 -0
  142. package/dist/components/ui/Select.js +31 -0
  143. package/dist/components/ui/Skeleton.d.ts +12 -0
  144. package/dist/components/ui/Skeleton.js +18 -0
  145. package/dist/components/ui/Spinner.d.ts +15 -0
  146. package/dist/components/ui/Spinner.js +24 -0
  147. package/dist/components/ui/Spotlight.d.ts +16 -0
  148. package/dist/components/ui/Spotlight.js +16 -0
  149. package/dist/components/ui/Sprite.d.ts +27 -0
  150. package/dist/components/ui/Sprite.js +19 -0
  151. package/dist/components/ui/StatCounter.d.ts +24 -0
  152. package/dist/components/ui/StatCounter.js +70 -0
  153. package/dist/components/ui/StatsSection.d.ts +14 -0
  154. package/dist/components/ui/StatsSection.js +13 -0
  155. package/dist/components/ui/Stepper.d.ts +10 -0
  156. package/dist/components/ui/Stepper.js +7 -0
  157. package/dist/components/ui/Table.d.ts +10 -0
  158. package/dist/components/ui/Table.js +8 -0
  159. package/dist/components/ui/Tabs.d.ts +12 -0
  160. package/dist/components/ui/Tabs.js +18 -0
  161. package/dist/components/ui/TeamSection.d.ts +18 -0
  162. package/dist/components/ui/TeamSection.js +19 -0
  163. package/dist/components/ui/TerminalTyper.d.ts +20 -0
  164. package/dist/components/ui/TerminalTyper.js +45 -0
  165. package/dist/components/ui/Testimonial.d.ts +19 -0
  166. package/dist/components/ui/Testimonial.js +9 -0
  167. package/dist/components/ui/TestimonialSection.d.ts +20 -0
  168. package/dist/components/ui/TestimonialSection.js +15 -0
  169. package/dist/components/ui/TextField.d.ts +26 -0
  170. package/dist/components/ui/TextField.js +13 -0
  171. package/dist/components/ui/TextmodeBackground.d.ts +52 -0
  172. package/dist/components/ui/TextmodeBackground.js +83 -0
  173. package/dist/components/ui/Timeline.d.ts +13 -0
  174. package/dist/components/ui/Timeline.js +8 -0
  175. package/dist/components/ui/Toast.d.ts +30 -0
  176. package/dist/components/ui/Toast.js +47 -0
  177. package/dist/components/ui/Toggle.d.ts +13 -0
  178. package/dist/components/ui/Toggle.js +10 -0
  179. package/dist/components/ui/Tooltip.d.ts +20 -0
  180. package/dist/components/ui/Tooltip.js +20 -0
  181. package/dist/components/ui/Typewriter.d.ts +20 -0
  182. package/dist/components/ui/Typewriter.js +46 -0
  183. package/dist/components/ui/VideoPlayer.d.ts +81 -0
  184. package/dist/components/ui/VideoPlayer.js +379 -0
  185. package/dist/components/ui/fill.d.ts +32 -0
  186. package/dist/components/ui/fill.js +27 -0
  187. package/dist/components/ui/intent.d.ts +20 -0
  188. package/dist/components/ui/intent.js +23 -0
  189. package/dist/components/ui/styles/kit.css +31 -0
  190. package/dist/components/ui/styles/ui-carousel.css +113 -0
  191. package/dist/components/ui/styles/ui-kit.css +1135 -0
  192. package/dist/components/ui/styles/ui-video.css +75 -0
  193. package/dist/components/ui/swiperCss.d.ts +15 -0
  194. package/dist/components/ui/swiperCss.js +15 -0
  195. package/dist/components/ui/variants.d.ts +12 -0
  196. package/dist/components/ui/variants.js +10 -0
  197. package/dist/index.d.ts +77 -0
  198. package/dist/index.js +77 -0
  199. package/dist/lib/asciify/painters.d.ts +25 -0
  200. package/dist/lib/asciify/painters.js +604 -0
  201. package/dist/lib/asciify/pointer.d.ts +12 -0
  202. package/dist/lib/asciify/pointer.js +54 -0
  203. package/dist/lib/asciify/shape-painters.d.ts +44 -0
  204. package/dist/lib/asciify/shape-painters.js +335 -0
  205. package/dist/lib/asciify/theme-painters.d.ts +8 -0
  206. package/dist/lib/asciify/theme-painters.js +437 -0
  207. package/dist/lib/cells.d.ts +46 -0
  208. package/dist/lib/cells.js +114 -0
  209. package/dist/lib/scroll/store.d.ts +21 -0
  210. package/dist/lib/scroll/store.js +25 -0
  211. package/dist/lib/sketches/aurora.d.ts +3 -0
  212. package/dist/lib/sketches/aurora.js +42 -0
  213. package/dist/lib/sketches/fire.d.ts +3 -0
  214. package/dist/lib/sketches/fire.js +80 -0
  215. package/dist/lib/sketches/flow.d.ts +3 -0
  216. package/dist/lib/sketches/flow.js +70 -0
  217. package/dist/lib/sketches/life.d.ts +3 -0
  218. package/dist/lib/sketches/life.js +107 -0
  219. package/dist/lib/sketches/matrix.d.ts +3 -0
  220. package/dist/lib/sketches/matrix.js +64 -0
  221. package/dist/lib/sketches/ocean.d.ts +3 -0
  222. package/dist/lib/sketches/ocean.js +56 -0
  223. package/dist/lib/sketches/plasma.d.ts +3 -0
  224. package/dist/lib/sketches/plasma.js +29 -0
  225. package/dist/lib/sketches/registry.d.ts +6 -0
  226. package/dist/lib/sketches/registry.js +60 -0
  227. package/dist/lib/sketches/ripples.d.ts +3 -0
  228. package/dist/lib/sketches/ripples.js +84 -0
  229. package/dist/lib/sketches/scroll-assemble.d.ts +8 -0
  230. package/dist/lib/sketches/scroll-assemble.js +90 -0
  231. package/dist/lib/sketches/scroll-parallax.d.ts +6 -0
  232. package/dist/lib/sketches/scroll-parallax.js +76 -0
  233. package/dist/lib/sketches/scroll-rain.d.ts +6 -0
  234. package/dist/lib/sketches/scroll-rain.js +82 -0
  235. package/dist/lib/sketches/scroll-stats.d.ts +7 -0
  236. package/dist/lib/sketches/scroll-stats.js +81 -0
  237. package/dist/lib/sketches/scroll-terminal.d.ts +6 -0
  238. package/dist/lib/sketches/scroll-terminal.js +87 -0
  239. package/dist/lib/sketches/scroll-zoom.d.ts +7 -0
  240. package/dist/lib/sketches/scroll-zoom.js +49 -0
  241. package/dist/lib/sketches/starfield.d.ts +3 -0
  242. package/dist/lib/sketches/starfield.js +54 -0
  243. package/dist/lib/sketches/text-3d.d.ts +6 -0
  244. package/dist/lib/sketches/text-3d.js +62 -0
  245. package/dist/lib/sketches/text-combo-figlet.d.ts +6 -0
  246. package/dist/lib/sketches/text-combo-figlet.js +91 -0
  247. package/dist/lib/sketches/text-glitch.d.ts +3 -0
  248. package/dist/lib/sketches/text-glitch.js +57 -0
  249. package/dist/lib/sketches/text-marquee.d.ts +3 -0
  250. package/dist/lib/sketches/text-marquee.js +35 -0
  251. package/dist/lib/sketches/text-particles.d.ts +9 -0
  252. package/dist/lib/sketches/text-particles.js +91 -0
  253. package/dist/lib/sketches/text-rain.d.ts +3 -0
  254. package/dist/lib/sketches/text-rain.js +73 -0
  255. package/dist/lib/sketches/text-scramble.d.ts +6 -0
  256. package/dist/lib/sketches/text-scramble.js +49 -0
  257. package/dist/lib/sketches/text-wave.d.ts +3 -0
  258. package/dist/lib/sketches/text-wave.js +43 -0
  259. package/dist/lib/sketches/theme-orbit.d.ts +6 -0
  260. package/dist/lib/sketches/theme-orbit.js +119 -0
  261. package/dist/lib/sketches/theme-pulse.d.ts +7 -0
  262. package/dist/lib/sketches/theme-pulse.js +84 -0
  263. package/dist/lib/sketches/tunnel.d.ts +3 -0
  264. package/dist/lib/sketches/tunnel.js +28 -0
  265. package/dist/lib/text/banner.d.ts +5 -0
  266. package/dist/lib/text/banner.js +35 -0
  267. package/dist/lib/text/mask.d.ts +40 -0
  268. package/dist/lib/text/mask.js +143 -0
  269. package/dist/lib/text/store.d.ts +23 -0
  270. package/dist/lib/text/store.js +86 -0
  271. package/dist/lib/ui/card-fields.d.ts +52 -0
  272. package/dist/lib/ui/card-fields.js +193 -0
  273. package/dist/lib/ui/fonts.d.ts +56 -0
  274. package/dist/lib/ui/fonts.js +94 -0
  275. package/dist/lib/ui/fx.d.ts +42 -0
  276. package/dist/lib/ui/fx.js +162 -0
  277. package/dist/lib/ui/icons.d.ts +437 -0
  278. package/dist/lib/ui/icons.js +314 -0
  279. package/dist/lib/ui/placeholder.d.ts +11 -0
  280. package/dist/lib/ui/placeholder.js +65 -0
  281. package/dist/lib/ui/tokens.d.ts +49 -0
  282. package/dist/lib/ui/tokens.js +129 -0
  283. package/dist/lib/ui/useTokens.d.ts +10 -0
  284. package/dist/lib/ui/useTokens.js +32 -0
  285. package/package.json +80 -0
package/CATALOG.md ADDED
@@ -0,0 +1,1237 @@
1
+ # Catálogo de Trama
2
+
3
+ > Generado por `scripts/build-catalog.mts` desde `lib/catalog/`. No editar a mano: `npm run catalog`.
4
+ > Versión en datos: [`catalog.json`](./catalog.json).
5
+
6
+ Todos los componentes: `import X from "trama-ui/X"`, CSS una vez con `import "trama-ui/styles.css"`,
7
+ tema con los tokens `--bg --fg --mut --acc --acc2 --card --ln --r` en cualquier contenedor, estilo con
8
+ `variant` (glass · solid · outline · neon · retro · terminal · minimal). Las listas se pasan como texto (una entrada por línea o separadas por comas; campos con `|`), tal como muestran los defaults.
9
+
10
+ ## Fondos (`fondos`)
11
+
12
+ Escenas de caracteres que rellenan un contenedor.
13
+
14
+ ### Fondo ASCII (Studio) — `AsciiBackground`
15
+
16
+ Escena procedural convertida en caracteres con asciify-engine. 15 estilos de render, hover, acabado óptico y paleta del tema.
17
+
18
+ | prop | tipo | default |
19
+ |---|---|---|
20
+ | `scene` | `lava` · `waves` · `plasma` · `synthwave` · `galaxy` · `rings` · `kaleido` · `torus` · `cube` · `pyramid` · `sphere` · `cylinder` · `cone` · `octahedron` · `tetrahedron` · `icosahedron` · `hexprism` · `diamond` · `torusknot` · `orbs` · `tide` · `wave` · `brew` · `bloom` · `arcade` | "lava" |
21
+ | `asciiStyle` | `ascii` · `braille` · `dots` · `lines` · `blocks` · `cross` · `diagonal` · `diamond` · `mixed` · `pixel` · `mosaic` · `lego` · `voxel` · `disco` · `dither` | "ascii" |
22
+ | `palette` | `original` · `tint` · `duotone` · `gradient` | "tint" |
23
+ | `tintAmount` | number 0–1 | 0.6 |
24
+ | `cellSize` | number 4–24 | 8 |
25
+ | `colorMode` | `source` · `accent` · `gray` | "source" |
26
+ | `charset` | `detailed` · `standard` · `blocks` · `braille` · `technical` | "detailed" |
27
+ | `asciiHover` | `none` · `trail` · `water` · `contour` · `dissolve` · `silk` · `vortex` | "water" |
28
+ | `hoverStrength` | number 0–1 | 0.7 |
29
+ | `hoverRadius` | number 0.1–0.6 | 0.28 |
30
+ | `speed` | number 0.1–4 | 1 |
31
+ | `fps` | number 10–60 | 60 |
32
+ | `bloom` | number 0–1 | 0.2 |
33
+ | `scanlines` | number 0–1 | 0 |
34
+ | `vignette` | number 0–1 | 0.3 |
35
+ | `grain` | number 0–1 | 0 |
36
+ | `glitch` | number 0–1 | 0 |
37
+ | `opacity` | number 0.1–1 | 1 |
38
+ | `progress` | number 0–1 | 0.3 |
39
+
40
+ - Rellena el contenedor: debe tener position: relative y tamaño.
41
+ - palette reinterpreta los colores con --bg, --acc y --acc2: cambia el tema y el fondo cambia.
42
+ - Las escenas marcadas con progreso cambian con la prop progress (0–1).
43
+ - Cambiar props no remonta: se aplican en caliente.
44
+
45
+ ### Fondo generativo (textmode.js) — `TextmodeBackground`
46
+
47
+ Simulaciones por celda con textmode.js: plasma, lluvia, fuego, vida… El puntero interactúa y la paleta sigue el tema.
48
+
49
+ | prop | tipo | default |
50
+ |---|---|---|
51
+ | `sketch` | `plasma` · `matrix` · `starfield` · `ripples` · `life` · `flow` · `fire` · `ocean` · `tunnel` · `aurora` | "plasma" |
52
+ | `palette` | `original` · `tint` · `duotone` · `gradient` | "tint" |
53
+ | `tintAmount` | number 0–1 | 0.6 |
54
+ | `fontSize` | number 8–28 | 14 |
55
+ | `frameRate` | number 10–60 | 60 |
56
+ | `opacity` | number 0.1–1 | 1 |
57
+
58
+ - Cada celda es un carácter con su propio color.
59
+ - Cambiar sketch, tamaño o fps recrea el lienzo; la paleta y la opacidad no.
60
+
61
+ ### Fondo de rejilla (CSS) — `GridBackground`
62
+
63
+ Puntos, líneas, cruces o diagonales con CSS puro. La opción más ligera para fondos discretos.
64
+
65
+ | prop | tipo | default |
66
+ |---|---|---|
67
+ | `kind` | `dots` · `lines` · `cross` · `diagonal` | "dots" |
68
+ | `cellSize` | number 12–80 | 28 |
69
+ | `opacity` | number 0.1–1 | 0.6 |
70
+ | `fade` | boolean | true |
71
+ | `drift` | boolean | false |
72
+
73
+ ### Efecto CRT — `CrtOverlay`
74
+
75
+ Capa de monitor antiguo: líneas de barrido, viñeta, parpadeo y barra de refresco. Se superpone a cualquier contenido.
76
+
77
+ | prop | tipo | default |
78
+ |---|---|---|
79
+ | `scanlines` | number 0–0.8 | 0.3 |
80
+ | `vignette` | number 0–1 | 0.6 |
81
+ | `flicker` | number 0–1 | 0.4 |
82
+ | `sweep` | boolean | true |
83
+
84
+ - Se coloca como hijo de un contenedor con position: relative.
85
+ - No bloquea el puntero.
86
+
87
+ ## Texto (`texto`)
88
+
89
+ Titulares y cintas con efectos de texto.
90
+
91
+ ### Texto que se descifra — `ScrambleText`
92
+
93
+ Titular que se resuelve entre glifos aleatorios (GSAP ScrambleText). El texto real está siempre en el DOM.
94
+
95
+ | prop | tipo | default |
96
+ |---|---|---|
97
+ | `text` | text | "Aprende a leer el mar" |
98
+ | `chars` | text | "!<>-_\\/[]{}=+*^?#" |
99
+ | `duration` | number 0.3–4 | 1.2 |
100
+ | `speed` | number 0.2–2 | 0.6 |
101
+ | `trigger` | `mount` · `hover` · `loop` | "mount" |
102
+ | `tone` | `fg` · `acc` · `acc2` · `mut` · `gradient` | "fg" |
103
+ | `as` | `h1` · `h2` · `h3` · `p` · `span` | "h2" |
104
+ | `fontSize` | number 16–96 | 40 |
105
+ | `weight` | number 300–900 | 800 |
106
+ | `tracking` | number -0.05–0.3 | -0.02 |
107
+ | `align` | `left` · `center` · `right` | "center" |
108
+ | `uppercase` | boolean | false |
109
+
110
+ ### Frases que se escriben — `Typewriter`
111
+
112
+ Titular de héroe con frases que se escriben y se borran en bucle.
113
+
114
+ | prop | tipo | default |
115
+ |---|---|---|
116
+ | `prefix` | text | "Aprende " |
117
+ | `phrases` | text | "surf en Cantabria\nolas para todos\nel mar te espera" |
118
+ | `typeSpeed` | number 4–40 | 14 |
119
+ | `deleteSpeed` | number 8–80 | 30 |
120
+ | `pause` | number 0–5 | 1.4 |
121
+ | `cursor` | `bar` · `block` · `underscore` · `none` | "bar" |
122
+ | `fontSize` | number 16–80 | 40 |
123
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
124
+
125
+ ### Rótulo de neón — `NeonSign`
126
+
127
+ Tubo de neón, contorno o sombra de píxel, con parpadeo opcional. Usa --acc y --acc2.
128
+
129
+ | prop | tipo | default |
130
+ |---|---|---|
131
+ | `text` | text | "ABIERTO" |
132
+ | `mode` | `tube` · `outline` · `pixel` | "tube" |
133
+ | `tone` | `acc` · `acc2` · `fg` | "acc" |
134
+ | `fontSize` | number 24–120 | 64 |
135
+ | `flicker` | boolean | true |
136
+
137
+ ### Titular ASCII (bitmap / FIGlet) — `BitmapText`
138
+
139
+ Arte de texto generado por asciify-engine: fuente bitmap 7×7 o 21 fuentes FIGlet.
140
+
141
+ | prop | tipo | default |
142
+ |---|---|---|
143
+ | `text` | text | "PIXEL" |
144
+ | `font` | `Bitmap` · `Standard` · `Slant` · `Small` · `Big` · `Banner` · `Block` · `Bubble` · `Digital` · `Doom` · `Lean` · `Mini` · `Script` · `Shadow` · `Speed` · `Starwars` · `Stop` · `Straight` · `Thin` · `ThreeD` · `Univers` · `Wavy` | "Bitmap" |
145
+ | `char` | text | "#" |
146
+ | `scale` | number 1–3 | 1 |
147
+ | `fontSize` | number 5–16 | 11 |
148
+ | `tone` | `fg` · `acc` · `acc2` · `mut` | "acc" |
149
+ | `align` | `left` · `center` · `right` | "left" |
150
+ | `glow` | boolean | true |
151
+ | `glowSize` | number 2–30 | 8 |
152
+ | `animate` | `none` · `flicker` · `scan` | "none" |
153
+
154
+ ### Cinta de texto — `Marquee`
155
+
156
+ Filas de texto en bucle, en CSS puro y sin JS. Siete estilos y color por token.
157
+
158
+ | prop | tipo | default |
159
+ |---|---|---|
160
+ | `text` | text | "NUEVA COLECCIÓN" |
161
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "terminal" |
162
+ | `tone` | `fg` · `acc` · `acc2` · `mut` | "acc" |
163
+ | `direction` | `alternate` · `left` · `right` | "alternate" |
164
+ | `duration` | number 6–60 | 18 |
165
+ | `rows` | number 1–5 | 2 |
166
+ | `fontSize` | number 14–64 | 28 |
167
+ | `tilt` | number -8–8 | 0 |
168
+ | `separator` | text | " // " |
169
+ | `edgeFade` | boolean | false |
170
+ | `pauseOnHover` | boolean | true |
171
+
172
+ ### Cabecera de sección — `SectionHeader`
173
+
174
+ Sobretítulo, titular, subtítulo y regla decorativa.
175
+
176
+ | prop | tipo | default |
177
+ |---|---|---|
178
+ | `kicker` | text | "Cómo funciona" |
179
+ | `title` | text | "Tres pasos y estás en el agua" |
180
+ | `subtitle` | text | "Reserva, elige tu horario y nosotros nos ocupamos del resto." |
181
+ | `align` | `left` · `center` | "left" |
182
+ | `rule` | `none` · `line` · `ascii` · `dots` | "line" |
183
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
184
+
185
+ ### Separador — `Divider`
186
+
187
+ Separador con etiqueta. El modo texto dibuja la regla con caracteres.
188
+
189
+ | prop | tipo | default |
190
+ |---|---|---|
191
+ | `label` | text | "o continúa con" |
192
+ | `mode` | `line` · `text` | "line" |
193
+ | `pattern` | text | "-=" |
194
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
195
+
196
+ ## Tarjetas (`tarjetas`)
197
+
198
+ Superficies de contenido con capas ASCII.
199
+
200
+ ### Tarjeta ASCII — `AsciiCard`
201
+
202
+ Número bitmap, fondo ASCII (15 campos procedurales animados × 8 juegos de caracteres, texto repetido o una escena de AsciiBackground), revelado e inclinación hacia el puntero. Siete estilos.
203
+
204
+ | prop | tipo | default |
205
+ |---|---|---|
206
+ | `title` | text | "Iniciación" |
207
+ | `text` | text | "Grupos de seis, espuma blanda y mucha paciencia. Te levantas el primer día." |
208
+ | `meta` | text | "2 h · desde 35 €" |
209
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
210
+ | `align` | `left` · `center` | "left" |
211
+ | `minHeight` | number 160–420 | 250 |
212
+ | `reveal` | `none` · `wipe` · `rise` · `dissolve` | "rise" |
213
+ | `revealDuration` | number 0.3–3 | 0.9 |
214
+ | `dissolveCell` | number 8–30 | 14 |
215
+ | `trigger` | `mount` · `inview` | "mount" |
216
+ | `background` | `field` · `text` · `scene` · `none` | "field" |
217
+ | `field` | `plasma` · `waves` · `rings` · `noise` · `rain` · `stars` · `dither` · `topo` · `maze` · `grid` · `halftone` · `vortex` · `tunnel` · `binary` · `scan` | "plasma" |
218
+ | `charset` | `detailed` · `standard` · `blocks` · `braille` · `dots` · `lines` · `binary` · `glyph` | "detailed" |
219
+ | `fieldColor` | `mut` · `accent` · `gradient` · `value` | "mut" |
220
+ | `fieldHover` | `none` · `glow` · `ripple` · `repel` · `reveal` | "glow" |
221
+ | `animate` | boolean | true |
222
+ | `speed` | number 0.1–3 | 1 |
223
+ | `scene` | `lava` · `waves` · `plasma` · `synthwave` · `galaxy` · `rings` · `kaleido` · `torus` · `cube` · `pyramid` · `sphere` · `cylinder` · `cone` · `octahedron` · `tetrahedron` · `icosahedron` · `hexprism` · `diamond` · `torusknot` · `orbs` · `tide` · `wave` · `brew` · `bloom` · `arcade` | "waves" |
224
+ | `sceneStyle` | `ascii` · `braille` · `dots` · `lines` · `blocks` · `cross` · `diagonal` · `diamond` · `mixed` · `pixel` · `mosaic` · `lego` · `voxel` · `disco` · `dither` | "braille" |
225
+ | `tile` | text | "OLA · MAR · SAL · " |
226
+ | `textHover` | `spotlight` · `magnify` · `repel` · `glow` · `colorShift` · `attract` · `shatter` · `trail` · `glitchText` | "trail" |
227
+ | `hoverStrength` | number 0–1 | 0.9 |
228
+ | `hoverRadius` | number 0.1–0.8 | 0.4 |
229
+ | `tileSize` | number 6–24 | 11 |
230
+ | `tileOpacity` | number 10–255 | 110 |
231
+ | `showNumeral` | boolean | true |
232
+ | `index` | number 1–9 | 1 |
233
+ | `glyph` | text | "#" |
234
+ | `glow` | boolean | true |
235
+ | `tilt` | boolean | true |
236
+ | `tiltMax` | number 2–25 | 10 |
237
+ | `scramble` | boolean | true |
238
+ | `chars` | text | "~-=^_" |
239
+ | `fill` | `surface` · `tint` · `gradient` · `accent` · `pattern` · `image` | "surface" |
240
+ | `pattern` | `dots` · `grid` · `diagonal` · `waves` · `checker` · `rays` | "dots" |
241
+ | `image` | text | "gen:3" |
242
+ | `tone` | `acc` · `acc2` | "acc" |
243
+
244
+ - El color sale de --bg, --mut, --acc y --acc2 y se actualiza al cambiar de tema sin repetir el revelado.
245
+ - reveal: dissolve dibuja celdas ASCII opacas que se apagan.
246
+ - Con movimiento reducido o táctil se desactivan tilt y scramble.
247
+ - El campo animado corre a ~30 fps y solo mientras la tarjeta está a la vista; «scene» monta un AsciiBackground por tarjeta (más pesado).
248
+ - index sirve de semilla: tres tarjetas con el mismo campo no salen iguales.
249
+
250
+ ### Panel — `Panel`
251
+
252
+ Superficie genérica con barra opcional, título, cuerpo y pie. Base de cualquier tarjeta simple.
253
+
254
+ | prop | tipo | default |
255
+ |---|---|---|
256
+ | `title` | text | "Resumen de reserva" |
257
+ | `body` | text | "Dos clases de iniciación el sábado por la mañana, con neopreno y tabla incluidos." |
258
+ | `footer` | text | "Cancelación gratuita hasta 24 h antes" |
259
+ | `bar` | text | "reserva.txt" |
260
+ | `cornerGlyph` | text | "" |
261
+ | `fill` | `surface` · `tint` · `gradient` · `accent` · `pattern` · `image` | "surface" |
262
+ | `pattern` | `dots` · `grid` · `diagonal` · `waves` · `checker` · `rays` | "dots" |
263
+ | `image` | text | "gen:3" |
264
+ | `tone` | `acc` · `acc2` | "acc" |
265
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
266
+
267
+ ### Tarjeta de precios — `PricingCard`
268
+
269
+ Plan con precio, características (incluidas y no incluidas) y llamada a la acción. Tres maquetaciones, tres formas de destacar (halo, invertida, borde), precio tachado y nota.
270
+
271
+ | prop | tipo | default |
272
+ |---|---|---|
273
+ | `layout` | `classic` · `compact` · `horizontal` | "classic" |
274
+ | `plan` | text | "Pro" |
275
+ | `description` | text | "Para quien publica cada semana" |
276
+ | `price` | text | "29 €" |
277
+ | `originalPrice` | text | "" |
278
+ | `period` | text | "/ mes" |
279
+ | `note` | text | "" |
280
+ | `features` | text | "Proyectos ilimitados\nSoporte prioritario\nExportación a PNG y SVG\n-Facturación centr…" |
281
+ | `cta` | text | "Empezar ahora" |
282
+ | `highlighted` | boolean | true |
283
+ | `highlight` | `glow` · `invert` · `border` | "invert" |
284
+ | `badge` | text | "Más popular" |
285
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
286
+ | `fill` | `surface` · `tint` · `gradient` · `accent` · `pattern` · `image` | "surface" |
287
+ | `pattern` | `dots` · `grid` · `diagonal` · `waves` · `checker` · `rays` | "dots" |
288
+ | `image` | text | "gen:3" |
289
+ | `tone` | `acc` · `acc2` | "acc" |
290
+
291
+ ### Testimonio — `Testimonial`
292
+
293
+ Cita con avatar de iniciales, autor, cargo y valoración.
294
+
295
+ | prop | tipo | default |
296
+ |---|---|---|
297
+ | `quote` | text | "Levanté la tabla el primer día. El equipo es paciente y el mar, una maravilla." |
298
+ | `author` | text | "Lucía Pardo" |
299
+ | `role` | text | "Alumna, curso de iniciación" |
300
+ | `rating` | number 0–5 | 5 |
301
+ | `fill` | `surface` · `tint` · `gradient` · `accent` · `pattern` · `image` | "surface" |
302
+ | `pattern` | `dots` · `grid` · `diagonal` · `waves` · `checker` · `rays` | "dots" |
303
+ | `image` | text | "gen:3" |
304
+ | `tone` | `acc` · `acc2` | "acc" |
305
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
306
+
307
+ ### Tarjeta de artículo — `BlogCard`
308
+
309
+ Artículo con cabecera (imagen, trama de CSS o caracteres), categoría, titular, extracto, autor y meta. Cuatro maquetaciones: apilada, horizontal, superpuesta (imagen de fondo) y mínima. Con href, toda la tarjeta es un enlace.
310
+
311
+ | prop | tipo | default |
312
+ |---|---|---|
313
+ | `layout` | `stacked` · `horizontal` · `overlay` · `minimal` | "stacked" |
314
+ | `media` | `image` · `pattern` · `glyph` · `none` | "image" |
315
+ | `image` | text | "gen:1" |
316
+ | `pattern` | `dots` · `grid` · `diagonal` · `waves` · `checker` · `rays` | "waves" |
317
+ | `glyph` | text | "~" |
318
+ | `category` | text | "Técnica" |
319
+ | `title` | text | "Cinco errores al remar que te frenan la primera ola" |
320
+ | `excerpt` | text | "El remo cuenta más que la fuerza: la postura y el timing son lo que de verdad te sube …" |
321
+ | `author` | text | "Nora Vidal" |
322
+ | `date` | text | "12 mar 2026" |
323
+ | `readTime` | text | "4 min" |
324
+ | `href` | text | "#" |
325
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
326
+ | `fill` | `surface` · `tint` · `gradient` · `accent` | "surface" |
327
+ | `tone` | `acc` · `acc2` | "acc" |
328
+
329
+ ## Interacción (`interaccion`)
330
+
331
+ Respuestas al puntero.
332
+
333
+ ### Botón — `Button`
334
+
335
+ Botón del sistema: 6 colores (acento, neutro, éxito, info, aviso, peligro) × 5 énfasis (relleno, superficie, borde, fantasma, enlace), estados pulsado, cargando y deshabilitado, solo icono y como enlace. Siete estilos.
336
+
337
+ | prop | tipo | default |
338
+ |---|---|---|
339
+ | `label` | text | "Reservar clase" |
340
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "solid" |
341
+ | `intent` | `accent` · `neutral` · `success` · `info` · `warning` · `danger` | "accent" |
342
+ | `emphasis` | `primary` · `secondary` · `outline` · `ghost` · `link` | "primary" |
343
+ | `size` | `sm` · `md` · `lg` | "md" |
344
+ | `glyph` | text | "" |
345
+ | `glyphPosition` | `start` · `end` | "end" |
346
+ | `iconOnly` | boolean | false |
347
+ | `active` | boolean | false |
348
+ | `loading` | boolean | false |
349
+ | `disabled` | boolean | false |
350
+ | `href` | text | "" |
351
+ | `fullWidth` | boolean | false |
352
+
353
+ - intent cambia el color y tone el énfasis: son independientes, cualquier color con cualquier énfasis y estilo.
354
+ - active pone aria-pressed (botón conmutable); loading pone aria-busy y bloquea el clic; con href se pinta como <a>.
355
+ - iconOnly usa glyph como contenido y label como aria-label.
356
+
357
+ ### Botón magnético — `MagneticButton`
358
+
359
+ Button que se desplaza (y gira un poco) hacia el puntero cuando se acerca. Sin efecto en táctil.
360
+
361
+ | prop | tipo | default |
362
+ |---|---|---|
363
+ | `label` | text | "Reservar clase" |
364
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "solid" |
365
+ | `emphasis` | `primary` · `secondary` · `ghost` | "primary" |
366
+ | `size` | `sm` · `md` · `lg` | "md" |
367
+ | `glyph` | text | "" |
368
+ | `strength` | number 0–1 | 0.35 |
369
+ | `radius` | number 40–400 | 160 |
370
+ | `tilt` | number 0–20 | 0 |
371
+
372
+ ### Cursor personalizado — `GlyphCursor`
373
+
374
+ Un carácter, un anillo o un punto que persigue al puntero dentro de su contenedor. Colócalo como hijo del área donde debe actuar.
375
+
376
+ | prop | tipo | default |
377
+ |---|---|---|
378
+ | `mode` | `glyph` · `ring` · `dot` | "glyph" |
379
+ | `glyph` | text | "*" |
380
+ | `tone` | `fg` · `acc` · `acc2` · `mut` | "acc" |
381
+ | `cursorSize` | number 10–48 | 22 |
382
+ | `lag` | number 0.05–1.2 | 0.45 |
383
+ | `offset` | number 0–40 | 14 |
384
+ | `spin` | boolean | true |
385
+ | `glow` | boolean | true |
386
+
387
+ ### Foco que sigue al puntero — `Spotlight`
388
+
389
+ Superficie con un foco de luz (y borde iluminado) bajo el puntero. Envuelve cualquier contenido.
390
+
391
+ Envuelve contenido (`children`), p. ej.: `<h3>Pasa el puntero</h3> <p>Un foco de luz sigue tu cursor.</p>`
392
+
393
+ | prop | tipo | default |
394
+ |---|---|---|
395
+ | `radius` | number 60–500 | 220 |
396
+ | `intensity` | number 5–80 | 30 |
397
+ | `border` | boolean | true |
398
+ | `tone` | `acc` · `acc2` · `fg` | "acc" |
399
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
400
+
401
+ ### Efectos de hover — `HoverFX`
402
+
403
+ Envoltorio de hover reutilizable en cualquier contenido: elevación, escala, inclinación 3D, brillo que sigue al puntero, destello, barrido de escaneo, micro-glitch, corchetes de objetivo o subrayado.
404
+
405
+ Envuelve contenido (`children`), p. ej.: `<PricingCard plan="Pro" />`
406
+
407
+ | prop | tipo | default |
408
+ |---|---|---|
409
+ | `effect` | `lift` · `scale` · `tilt` · `glow` · `shine` · `scanline` · `jitter` · `brackets` · `underline` · `none` | "glow" |
410
+ | `strength` | number 0.1–1 | 0.6 |
411
+ | `tone` | `acc` · `acc2` · `fg` · `mut` | "acc" |
412
+ | `radius` | number 60–460 | 220 |
413
+ | `tiltMax` | number 2–25 | 10 |
414
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
415
+
416
+ - La mayoría de efectos son CSS puro; «tilt» y «glow» siguen el puntero con GSAP.
417
+ - Se puede combinar con Presence: HoverFX dentro, Presence fuera (o al revés) para tener entrada/salida y hover a la vez.
418
+ - Todo componente del catálogo puede envolverse así: activa el panel «FX» de la cabecera para probarlo con cualquier demo.
419
+
420
+ ### Área con scroll — `ScrollArea`
421
+
422
+ Caja de contenido largo (registro de cambios, comentarios, salida de terminal…) con su propia barra de desplazamiento, distinta en cada estilo.
423
+
424
+ | prop | tipo | default |
425
+ |---|---|---|
426
+ | `content` | text | "Registro de cambios\nv1.4.0 — Panel de tokens con selector de tipografía y fuentes de …" |
427
+ | `height` | number 120–400 | 220 |
428
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
429
+
430
+ - La barra de scroll no es exclusiva de este componente: cualquier superficie ui-s--<variante> la hereda automáticamente (ver components/ui/styles/ui-kit.css).
431
+
432
+ ## Transiciones (`transiciones`)
433
+
434
+ Cambios de escena y de sección.
435
+
436
+ ### Transición de escena — `SceneFlash`
437
+
438
+ Barrido, iris, rebanadas, persianas o mosaico de píxeles para acompañar un cambio de sección. Usa --acc y --acc2.
439
+
440
+ | prop | tipo | default |
441
+ |---|---|---|
442
+ | `kind` | `sweep` · `iris` · `slices` · `blinds` · `pixels` | "sweep" |
443
+ | `duration` | number 0.3–3 | 1 |
444
+ | `loop` | boolean | false |
445
+
446
+ ### Revelado de contenido — `Reveal`
447
+
448
+ Revela lo que envuelve al montar, al entrar en pantalla o siguiendo el scroll: 7 efectos × 4 direcciones, escalonado de hijos o de palabras/letras, curvas con rebote y repetición al volver a entrar.
449
+
450
+ Envuelve contenido (`children`), p. ej.: `<Card /> <Card /> <Card />`
451
+
452
+ | prop | tipo | default |
453
+ |---|---|---|
454
+ | `kind` | `fade` · `slide` · `scale` · `blur` · `wipe` · `flip` · `iris` | "slide" |
455
+ | `direction` | `up` · `down` · `left` · `right` | "up" |
456
+ | `distance` | number 0–160 | 40 |
457
+ | `trigger` | `mount` · `inview` · `scroll` | "inview" |
458
+ | `once` | boolean | true |
459
+ | `threshold` | number 0–1 | 0.2 |
460
+ | `duration` | number 0.2–3 | 0.8 |
461
+ | `delay` | number 0–2 | 0 |
462
+ | `easing` | `out` · `in-out` · `back` · `linear` | "out" |
463
+ | `stagger` | number 0–0.5 | 0.12 |
464
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
465
+
466
+ - Con «inview» y «scroll», desplaza el escenario: el contenido empieza debajo.
467
+ - «stagger» escalona los hijos directos (aquí, las tres tarjetas); «split» trocea un texto plano (aquí, el titular).
468
+ - El estado oculto viene en el HTML del servidor: no hay parpadeo antes de hidratar. Sin JS o con movimiento reducido se ve directamente.
469
+ - Al terminar no deja transform/filter/clip-path: un Modal o Drawer dentro sigue funcionando.
470
+
471
+ ### Aparición / desaparición (hacker) — `Presence`
472
+
473
+ Envuelve cualquier contenido y anima su entrada y salida: capas de glifos que se descifran, glitch con separación RGB y corrupción, datamosh, fragmentos, encendido CRT, parpadeo de neón, estática de TV, censura o arranque de sistema.
474
+
475
+ Envuelve contenido (`children`), p. ej.: `<Panel title="ACCESO_CONCEDIDO.sh" body="usuario: root…" variant="terminal" />`
476
+
477
+ | prop | tipo | default |
478
+ |---|---|---|
479
+ | `effect` | `ascii-rain` · `ascii-random` · `ascii-sweep` · `ascii-radial` · `ascii-rows` · `glitch` · `slices` · `shatter` · `crt` · `flicker` · `static` · `redact` · `boot` | "ascii-rain" |
480
+ | `loop` | boolean | true |
481
+ | `show` | boolean | true |
482
+ | `hold` | number 0.2–4 | 1.2 |
483
+ | `duration` | number 0.3–3 | 1.2 |
484
+ | `intensity` | number 0.1–1 | 0.7 |
485
+ | `tone` | `acc` · `acc2` · `fg` | "acc" |
486
+ | `chars` | `symbols` · `binary` · `hex` · `code` · `blocks` · `dots` | "symbols" |
487
+ | `cell` | number 8–28 | 14 |
488
+ | `edge` | boolean | true |
489
+ | `tiles` | number 3–10 | 6 |
490
+ | `bands` | number 4–24 | 10 |
491
+ | `rowHeight` | number 12–40 | 22 |
492
+ | `redactLabel` | text | "REDACTED" |
493
+ | `bootLines` | text | "[ OK ] montando sistema de archivos\n[ OK ] iniciando servicios\n[ .. ] descifrando in…" |
494
+
495
+ - El contenido está siempre en el DOM; con movimiento reducido se muestra u oculta sin animar.
496
+ - Con «Bucle automático» activado se repite sola; desactívalo para controlarla con «Mostrar contenido».
497
+ - chars, celda y rastro solo aplican a los efectos «ascii-*»; columnas a fragmentos; bandas a datamosh; alto de barra y texto a censura; líneas a arranque.
498
+ - 13 efectos, 7 estilos de superficie para el contenido de ejemplo: 91 combinaciones.
499
+
500
+ ## Datos (`datos`)
501
+
502
+ Cifras, gráficos, terminales y tablas.
503
+
504
+ ### Cifra ASCII que cuenta — `StatCounter`
505
+
506
+ Número grande en fuente bitmap de asciify-engine que cuenta hacia arriba con GSAP.
507
+
508
+ | prop | tipo | default |
509
+ |---|---|---|
510
+ | `value` | number 0–9999999 | 250 |
511
+ | `format` | `int` · `decimal` · `compact` | "int" |
512
+ | `decimals` | number 0–3 | 1 |
513
+ | `prefix` | text | "" |
514
+ | `suffix` | text | "+" |
515
+ | `label` | text | "PROYECTOS" |
516
+ | `tone` | `fg` · `acc` · `acc2` · `mut` | "acc" |
517
+ | `align` | `left` · `center` · `right` | "center" |
518
+ | `char` | text | "#" |
519
+ | `scale` | number 1–3 | 1 |
520
+ | `duration` | number 0.5–4 | 1.6 |
521
+ | `trigger` | `mount` · `inview` · `hover` | "mount" |
522
+
523
+ ### Gráfico ASCII — `AsciiChart`
524
+
525
+ Barras verticales, horizontales, área o sparkline dibujados con caracteres, con animación de crecimiento.
526
+
527
+ | prop | tipo | default |
528
+ |---|---|---|
529
+ | `data` | text | "12, 18, 9, 24, 31, 27, 40, 36" |
530
+ | `labels` | text | "L,M,X,J,V,S,D,L" |
531
+ | `kind` | `bars` · `hbars` · `area` · `spark` | "bars" |
532
+ | `height` | number 4–20 | 10 |
533
+ | `fillChar` | text | "█" |
534
+ | `animate` | boolean | true |
535
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "terminal" |
536
+
537
+ ### Terminal que escribe sola — `TerminalTyper`
538
+
539
+ Terminal con escritura carácter a carácter. En estilo retro es un monitor de fósforo con el color de --acc.
540
+
541
+ | prop | tipo | default |
542
+ |---|---|---|
543
+ | `lines` | text | "$ npx create-landing hoja-vivero\n[ok] plantilla descargada\n[ok] gsap ScrollTrigger c…" |
544
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "terminal" |
545
+ | `chrome` | boolean | true |
546
+ | `title` | text | "zsh — proyecto" |
547
+ | `cursor` | `block` · `bar` · `underscore` | "block" |
548
+ | `charsPerSecond` | number 8–120 | 32 |
549
+ | `prompt` | text | "$" |
550
+ | `loop` | boolean | true |
551
+
552
+ ### Línea de pasos — `Timeline`
553
+
554
+ Proceso, hoja de ruta o historial en vertical, con marcadores numerados, punto o carácter.
555
+
556
+ | prop | tipo | default |
557
+ |---|---|---|
558
+ | `steps` | text | "Reserva\|Eliges día y nivel en menos de un minuto.\nLlegada\|Recibes neopreno y tabla …" |
559
+ | `marker` | `number` · `dot` · `glyph` | "number" |
560
+ | `glyph` | text | "*" |
561
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
562
+
563
+ ### Tabla de datos — `Table`
564
+
565
+ Tabla a partir de texto CSV. La cabecera y las filas se adaptan a la variante.
566
+
567
+ | prop | tipo | default |
568
+ |---|---|---|
569
+ | `csv` | text | "Plan, Clases, Precio\nIniciación, 1, 35 €\nBono 5, 5, 150 €\nSurf trip, 6, 240 €" |
570
+ | `striped` | boolean | true |
571
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "solid" |
572
+
573
+ ### Bloque de código — `CodeBlock`
574
+
575
+ Código con cabecera, numeración de línea opcional y botón de copiar. Sin resaltado de sintaxis.
576
+
577
+ | prop | tipo | default |
578
+ |---|---|---|
579
+ | `code` | text | "export function greet(name: string) {\n return `Hola, ${name}`;\n}" |
580
+ | `language` | text | "tsx" |
581
+ | `filename` | text | "" |
582
+ | `showLineNumbers` | boolean | true |
583
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "terminal" |
584
+
585
+ ## Navegación (`navegacion`)
586
+
587
+ Barras, pestañas y acordeones.
588
+
589
+ ### Barra de navegación — `NavBar`
590
+
591
+ Marca, enlaces y llamada a la acción. El enlace activo se marca de forma distinta en cada estilo.
592
+
593
+ | prop | tipo | default |
594
+ |---|---|---|
595
+ | `brand` | text | "Maré" |
596
+ | `links` | text | "Clases, Tablas, Reservas, Contacto" |
597
+ | `cta` | text | "Reservar" |
598
+ | `defaultActive` | number 0–5 | 0 |
599
+ | `floating` | boolean | false |
600
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
601
+
602
+ ### Pestañas — `Tabs`
603
+
604
+ Pestañas con teclado (←/→) y panel. El indicador de la activa cambia con el estilo.
605
+
606
+ | prop | tipo | default |
607
+ |---|---|---|
608
+ | `items` | text | "Resumen, Detalles, Reseñas" |
609
+ | `content` | text | "Una vista general del producto.\nEspecificaciones técnicas y medidas.\nLo que dicen qu…" |
610
+ | `defaultIndex` | number 0–5 | 0 |
611
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
612
+
613
+ ### Acordeón — `Accordion`
614
+
615
+ Preguntas frecuentes con paneles animados por CSS.
616
+
617
+ | prop | tipo | default |
618
+ |---|---|---|
619
+ | `items` | text | "¿Necesito experiencia?\|Ninguna. Empezamos desde cero con material blando.\n¿Qué inclu…" |
620
+ | `multiple` | boolean | false |
621
+ | `defaultOpen` | number 0–5 | 0 |
622
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
623
+
624
+ ### Migas de pan — `Breadcrumbs`
625
+
626
+ Ruta de navegación. El último elemento es la página actual, sin enlace.
627
+
628
+ | prop | tipo | default |
629
+ |---|---|---|
630
+ | `items` | text | "Inicio, Cursos, Iniciación al surf" |
631
+ | `separator` | text | "/" |
632
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
633
+
634
+ ### Paginación — `Pagination`
635
+
636
+ Números de página con elipsis cuando hay muchas. Gestiona su propia página activa.
637
+
638
+ | prop | tipo | default |
639
+ |---|---|---|
640
+ | `total` | number 1–40 | 9 |
641
+ | `defaultPage` | number 1–40 | 4 |
642
+ | `siblingCount` | number 0–3 | 1 |
643
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
644
+
645
+ ### Menú desplegable — `Dropdown`
646
+
647
+ Botón que abre una lista de acciones (⋮). Para elegir un valor de formulario, ver Select en Formularios.
648
+
649
+ | prop | tipo | default |
650
+ |---|---|---|
651
+ | `label` | text | "⋮" |
652
+ | `items` | text | "Editar, Duplicar, Archivar, Eliminar" |
653
+ | `align` | `left` · `right` | "right" |
654
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
655
+
656
+ ## Formularios (`formularios`)
657
+
658
+ Campos, interruptores y deslizadores.
659
+
660
+ ### Campo de texto — `TextField`
661
+
662
+ Entrada con etiqueta, ayuda, prefijo y estados de error o éxito. El foco usa --acc. Con multiline dibuja un textarea (ver Formulario de contacto).
663
+
664
+ | prop | tipo | default |
665
+ |---|---|---|
666
+ | `label` | text | "Correo electrónico" |
667
+ | `placeholder` | text | "tu@correo.com" |
668
+ | `defaultValue` | text | "" |
669
+ | `hint` | text | "Solo te escribiremos para confirmar la reserva." |
670
+ | `prefix` | text | "@" |
671
+ | `intent` | `none` · `success` · `info` · `warning` · `danger` | "none" |
672
+ | `size` | `sm` · `md` · `lg` | "md" |
673
+ | `type` | `text` · `email` · `password` · `search` | "text" |
674
+ | `multiline` | boolean | false |
675
+ | `rows` | number 2–10 | 4 |
676
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
677
+
678
+ ### Interruptor — `Toggle`
679
+
680
+ Interruptor accesible. Retro y terminal lo muestran como texto [ON ]/[OFF].
681
+
682
+ | prop | tipo | default |
683
+ |---|---|---|
684
+ | `label` | text | "Notificaciones" |
685
+ | `defaultChecked` | boolean | true |
686
+ | `size` | `sm` · `md` · `lg` | "md" |
687
+ | `onText` | text | "ON " |
688
+ | `offText` | text | "OFF" |
689
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
690
+
691
+ ### Deslizador — `RangeSlider`
692
+
693
+ Deslizador con pista y pulgar propios de cada estilo.
694
+
695
+ | prop | tipo | default |
696
+ |---|---|---|
697
+ | `label` | text | "Intensidad" |
698
+ | `min` | number -100–100 | 0 |
699
+ | `max` | number 1–500 | 100 |
700
+ | `step` | number 1–20 | 1 |
701
+ | `defaultValue` | number 0–100 | 40 |
702
+ | `unit` | text | "%" |
703
+ | `showValue` | boolean | true |
704
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
705
+
706
+ ### Desplegable — `Select`
707
+
708
+ Lista de opciones con estilo propio (no un <select> nativo): mismo aspecto en los 7 estilos, abierto o cerrado.
709
+
710
+ | prop | tipo | default |
711
+ |---|---|---|
712
+ | `label` | text | "País" |
713
+ | `options` | text | "España, Francia, Portugal, Italia, Alemania" |
714
+ | `defaultValue` | text | "" |
715
+ | `placeholder` | text | "Elige una opción" |
716
+ | `size` | `sm` · `md` · `lg` | "md" |
717
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
718
+
719
+ ### Grupo de casillas — `CheckboxGroup`
720
+
721
+ Casillas independientes. Retro y terminal las muestran como texto [x]/[ ].
722
+
723
+ | prop | tipo | default |
724
+ |---|---|---|
725
+ | `label` | text | "Notificaciones" |
726
+ | `options` | text | "Email, SMS, Push, Newsletter" |
727
+ | `defaultValue` | text | "Email, Push" |
728
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
729
+
730
+ ### Grupo de opciones — `RadioGroup`
731
+
732
+ Selección única entre varias opciones. Retro y terminal las muestran como texto (•)/( ).
733
+
734
+ | prop | tipo | default |
735
+ |---|---|---|
736
+ | `label` | text | "Plan" |
737
+ | `options` | text | "Mensual, Anual" |
738
+ | `defaultValue` | text | "Mensual" |
739
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
740
+
741
+ ### Pasos — `Stepper`
742
+
743
+ Indicador de progreso por pasos (alta, checkout, onboarding…). No gestiona el contenido de cada paso.
744
+
745
+ | prop | tipo | default |
746
+ |---|---|---|
747
+ | `steps` | text | "Datos, Envío, Pago, Confirmación" |
748
+ | `current` | number 0–5 | 1 |
749
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
750
+
751
+ ### Código de verificación — `OtpInput`
752
+
753
+ Casillas de código (SMS, autenticación en dos pasos): el foco avanza solo al escribir.
754
+
755
+ | prop | tipo | default |
756
+ |---|---|---|
757
+ | `length` | number 4–8 | 6 |
758
+ | `size` | `sm` · `md` · `lg` | "md" |
759
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "terminal" |
760
+
761
+ ## Feedback (`feedback`)
762
+
763
+ Estados, avisos y carga.
764
+
765
+ ### Insignia — `Badge`
766
+
767
+ Etiqueta de estado en cinco tonos, con punto opcional.
768
+
769
+ | prop | tipo | default |
770
+ |---|---|---|
771
+ | `text` | text | "Nuevo" |
772
+ | `intent` | `accent` · `neutral` · `success` · `info` · `warning` · `danger` | "accent" |
773
+ | `size` | `md` · `lg` | "md" |
774
+ | `dot` | boolean | false |
775
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
776
+
777
+ ### Barra de progreso — `Progress`
778
+
779
+ Barra con franjas animadas o dibujada con caracteres. Retro la dibuja por bloques.
780
+
781
+ | prop | tipo | default |
782
+ |---|---|---|
783
+ | `label` | text | "Subiendo" |
784
+ | `value` | number 0–100 | 62 |
785
+ | `showValue` | boolean | true |
786
+ | `striped` | boolean | false |
787
+ | `ascii` | boolean | false |
788
+ | `fillChar` | text | "#" |
789
+ | `emptyChar` | text | "-" |
790
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
791
+
792
+ ### Aviso — `Alert`
793
+
794
+ Mensaje inline con icono según el tipo, permanente (no desaparece solo). Para una notificación temporal, ver Toast en Overlays.
795
+
796
+ | prop | tipo | default |
797
+ |---|---|---|
798
+ | `title` | text | "Cambios guardados" |
799
+ | `message` | text | "Tu perfil se actualizó correctamente." |
800
+ | `intent` | `accent` · `neutral` · `success` · `info` · `warning` · `danger` | "success" |
801
+ | `dismissible` | boolean | true |
802
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
803
+
804
+ ### Indicador de carga — `Spinner`
805
+
806
+ Anillo CSS o animaciones de texto: línea, braille, puntos, barra y bloques.
807
+
808
+ | prop | tipo | default |
809
+ |---|---|---|
810
+ | `kind` | `ring` · `line` · `braille` · `dots` · `bar` · `blocks` | "braille" |
811
+ | `label` | text | "Cargando…" |
812
+ | `fontSize` | number 12–48 | 20 |
813
+ | `fps` | number 2–30 | 12 |
814
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "terminal" |
815
+
816
+ ### Esqueleto de carga — `Skeleton`
817
+
818
+ Placeholder con barrido animado mientras carga el contenido real: texto, tarjeta, avatar o filas de tabla.
819
+
820
+ | prop | tipo | default |
821
+ |---|---|---|
822
+ | `kind` | `text` · `card` · `avatar` · `table` | "text" |
823
+ | `lines` | number 1–6 | 3 |
824
+ | `tone` | `fg` · `acc` · `acc2` · `mut` | "mut" |
825
+
826
+ ## Galerías y vídeo (`galerias`)
827
+
828
+ Galerías de imágenes y carruseles sobre Swiper (coverflow, baraja, cubo, mosaico, cintas continuas) y reproductor de vídeo.
829
+
830
+ ### Galería de imágenes — `ImageGallery`
831
+
832
+ Ocho presentaciones de las mismas fotos: imagen grande con miniaturas, coverflow 3D, baraja, fundido, cubo, creativa, tira libre y mosaico de dos filas. Táctil, con teclado y flechas; sin imágenes propias usa escenas pixel art generadas.
833
+
834
+ | prop | tipo | default |
835
+ |---|---|---|
836
+ | `layout` | `thumbs` · `coverflow` · `cards` · `fade` · `cube` · `creative` · `filmstrip` · `mosaic` | "thumbs" |
837
+ | `images` | text | "gen:0\|Amanecer\|Primera luz sobre la bahía\ngen:1\|Mediodía\|Mar limpio y viento suav…" |
838
+ | `ratio` | `4/3` · `16/9` · `21/9` · `1/1` · `3/4` | "4/3" |
839
+ | `captions` | boolean | true |
840
+ | `autoplay` | number 0–8 | 0 |
841
+ | `loop` | boolean | false |
842
+ | `zoom` | boolean | false |
843
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "retro" |
844
+
845
+ - Cada línea de «imágenes» es «imagen|título|texto». La imagen puede ser una URL o ruta, o `gen:N` (0, 1, 2…) para una escena de ejemplo generada, sin descargas.
846
+ - Las flechas, los puntos y las imágenes toman borde, radio y sombra de la variante de estilo (variables --s-*).
847
+ - El zoom (doble clic o pellizco) solo se aplica a los modos thumbs y fade.
848
+
849
+ ### Carrusel — `Carousel`
850
+
851
+ Carrusel genérico sobre Swiper: cada hijo es una diapositiva. Diapositivas visibles responsivas, reproducción automática, bucle, fundido, baraja apilada o cinta continua, con flechas y puntos cuadrados del estilo activo.
852
+
853
+ | prop | tipo | default |
854
+ |---|---|---|
855
+ | `cards` | text | "Iniciación\|Grupos de seis y mucha paciencia.\nPrivadas\|Un monitor solo para ti.\nSur…" |
856
+ | `effect` | `slide` · `fade` · `cards` | "slide" |
857
+ | `perView` | number 1–5 | 3 |
858
+ | `gap` | number 0–40 | 20 |
859
+ | `autoplay` | number 0–8 | 0 |
860
+ | `loop` | boolean | true |
861
+ | `arrows` | boolean | true |
862
+ | `dots` | `none` · `bullets` · `progress` · `fraction` | "bullets" |
863
+ | `ticker` | boolean | false |
864
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
865
+
866
+ - Las secciones (testimonios, ventajas, precios, equipo, blog) lo usan por dentro con `layout="carousel"`; úsalo directamente para cualquier lista de tarjetas.
867
+ - En pantallas estrechas baja solo a 2 y a 1 diapositiva visible.
868
+
869
+ ### Reproductor de vídeo — `VideoPlayer`
870
+
871
+ Reproductor sobre el <video> nativo, sin dependencias, con controles propios del estilo: play, progreso arrastrable, volumen, velocidad, subtítulos, imagen en imagen, pantalla completa y atajos de teclado. Los enlaces de YouTube y Vimeo se cargan bajo demanda, sin cookies hasta pulsar play. El modo fondo rellena un contenedor, en bucle y sin controles.
872
+
873
+ | prop | tipo | default |
874
+ |---|---|---|
875
+ | `src` | `https://res.cloudinary.com/martinezsebastian-test/video/upload/v1701113097/samples/cld-sample-video.mp4` · `https://res.cloudinary.com/martinezsebastian-test/video/upload/v1701113091/samples/sea-turtle.mp4` · `/video/pixel-life.mp4` · `https://www.youtube.com/watch?v=aqz-KE-bpKQ` | "https://res.cloudinary.com/martinezsebastian-test/video/upload/v1701113097/samples/cld…" |
876
+ | `poster` | text | "" |
877
+ | `title` | text | "Vida en píxeles" |
878
+ | `ratio` | `16/9` · `21/9` · `4/3` · `1/1` · `9/16` | "16/9" |
879
+ | `controls` | `full` · `minimal` · `none` | "full" |
880
+ | `autoplay` | boolean | false |
881
+ | `muted` | boolean | false |
882
+ | `loop` | boolean | false |
883
+ | `startAt` | number 0–30 | 0 |
884
+ | `background` | boolean | false |
885
+ | `scanlines` | boolean | false |
886
+ | `ascii` | boolean | false |
887
+ | `asciiStyle` | `ascii` · `braille` · `dots` · `lines` · `blocks` · `cross` · `diagonal` · `diamond` · `mixed` · `pixel` · `mosaic` · `lego` · `voxel` · `disco` · `dither` | "ascii" |
888
+ | `asciiCell` | number 3–20 | 6 |
889
+ | `asciiColor` | `source` · `accent` · `gray` | "source" |
890
+ | `asciiHover` | `none` · `trail` · `water` · `contour` · `dissolve` · `silk` · `vortex` | "water" |
891
+ | `asciiHoverStrength` | number 0–1 | 0.7 |
892
+ | `asciiHoverRadius` | number 0.1–0.6 | 0.28 |
893
+ | `pauseOffscreen` | boolean | true |
894
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "retro" |
895
+
896
+ - «Fuente» admite un archivo (.mp4, .webm), un enlace de YouTube (watch, youtu.be, shorts) o de Vimeo. Con un enlace de YouTube/Vimeo solo aplican título, proporción y carátula.
897
+ - Atajos con el reproductor enfocado: espacio o K, ←/→ ±5 s (J/L ±10 s), ↑/↓ volumen, M silencio, F pantalla completa, C subtítulos, 0–9 salta al 0–90 %.
898
+ - Muestras: dos vídeos de Cloudinary (cld-sample-video y sea-turtle), uno local generado con ffmpeg (public/video/pixel-life.mp4, 8 s, sin audio) y un enlace de YouTube. La carátula de los de Cloudinary sale de un fotograma del propio vídeo (cloudinaryPoster).
899
+ - El efecto ASCII pinta el vídeo como caracteres encima del original (que sigue reproduciéndose debajo). Exige que el servidor del vídeo permita CORS: Cloudinary y los archivos del propio sitio sí; si no, avisa y muestra el vídeo normal.
900
+ - Con prefers-reduced-motion el autoplay y el modo fondo no arrancan; fuera de pantalla el vídeo se pausa solo (pauseOffscreen).
901
+
902
+ ## Secciones (`secciones`)
903
+
904
+ Bloques compuestos, listos para pegar en una landing: hero, contacto, precios, FAQ…
905
+
906
+ ### Hero — `Hero`
907
+
908
+ Cabecera de landing: sobretítulo, titular, subtítulo, una o dos llamadas a la acción e insignias de confianza. El fondo decorativo es CSS puro.
909
+
910
+ | prop | tipo | default |
911
+ |---|---|---|
912
+ | `kicker` | text | "ESCUELA DE SURF · CANTABRIA" |
913
+ | `title` | text | "Aprende a leer el mar" |
914
+ | `subtitle` | text | "Del primer remo a tu primera ola verde. Neopreno, tabla y monitores titulados incluidos." |
915
+ | `primaryCta` | text | "Reservar clase" |
916
+ | `secondaryCta` | text | "Ver horarios" |
917
+ | `badges` | text | "+500 alumnos, 4.9 ★ valoración, Grupos de 6" |
918
+ | `align` | `left` · `center` | "center" |
919
+ | `backdrop` | `none` · `grid` · `dots` · `glow` | "grid" |
920
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
921
+
922
+ ### Formulario de contacto — `ContactForm`
923
+
924
+ Nombre, email y mensaje (o solo email, en línea, para un boletín) con estado de envío propio. Conecta el envío real con la prop `onSubmit`.
925
+
926
+ | prop | tipo | default |
927
+ |---|---|---|
928
+ | `title` | text | "Escríbenos" |
929
+ | `subtitle` | text | "Te respondemos en menos de 24 horas." |
930
+ | `fields` | `name,email,message` · `email` | "name,email,message" |
931
+ | `layout` | `stacked` · `inline` | "stacked" |
932
+ | `submitLabel` | text | "Enviar mensaje" |
933
+ | `successMessage` | text | "Gracias, te contestaremos pronto." |
934
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
935
+
936
+ ### Banner de llamada a la acción — `CTASection`
937
+
938
+ Cierre de página: titular corto, una frase y uno o dos botones sobre una superficie destacada.
939
+
940
+ | prop | tipo | default |
941
+ |---|---|---|
942
+ | `kicker` | text | "" |
943
+ | `title` | text | "El swell llega el sábado" |
944
+ | `subtitle` | text | "Quedan doce plazas. Trae toalla, nosotros ponemos el resto." |
945
+ | `primaryCta` | text | "Apuntarme" |
946
+ | `secondaryCta` | text | "" |
947
+ | `align` | `left` · `center` | "center" |
948
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "neon" |
949
+
950
+ ### Sección de FAQ — `FAQSection`
951
+
952
+ Cabecera de sección más acordeón: las preguntas frecuentes listas para el final de una landing.
953
+
954
+ | prop | tipo | default |
955
+ |---|---|---|
956
+ | `kicker` | text | "Preguntas frecuentes" |
957
+ | `title` | text | "Todo lo que necesitas saber" |
958
+ | `items` | text | "¿Necesito experiencia?\|Ninguna. Empezamos desde cero con material blando.\n¿Qué inclu…" |
959
+ | `multiple` | boolean | true |
960
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
961
+
962
+ ### Sección de cifras — `StatsSection`
963
+
964
+ Cabecera de sección más una fila de cifras ASCII que cuentan hacia arriba (StatCounter): la sección de «resultados» típica.
965
+
966
+ | prop | tipo | default |
967
+ |---|---|---|
968
+ | `kicker` | text | "En números" |
969
+ | `title` | text | "Diez años enseñando a leer el mar" |
970
+ | `stats` | text | "500\|+\|Alumnos formados\n4.9\|\|Valoración media\n12\|\|Años de experiencia" |
971
+ | `tone` | `fg` · `acc` · `acc2` · `mut` | "acc" |
972
+
973
+ ### Sección de precios — `PricingSection`
974
+
975
+ Cabecera + planes (PricingCard) con selector mensual/anual, plan destacado (invertido, con halo o con borde) y características no incluidas. Rejilla, lista horizontal o carrusel.
976
+
977
+ | prop | tipo | default |
978
+ |---|---|---|
979
+ | `kicker` | text | "Precios" |
980
+ | `title` | text | "Un plan para cada tamaño" |
981
+ | `subtitle` | text | "Cambia o cancela cuando quieras." |
982
+ | `plans` | text | "Básico\|9 €\|/ mes\|no\|Un proyecto;Exportación PNG;Soporte por email;-Dominio propio\…" |
983
+ | `layout` | `grid` · `list` · `carousel` | "grid" |
984
+ | `cardLayout` | `classic` · `compact` | "classic" |
985
+ | `highlight` | `invert` · `glow` · `border` | "invert" |
986
+ | `fill` | `surface` · `tint` · `gradient` · `pattern` | "surface" |
987
+ | `yearlyNote` | text | "2 meses gratis" |
988
+ | `perView` | number 1–4 | 3 |
989
+ | `autoplay` | number 0–8 | 0 |
990
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
991
+
992
+ ### Sección de testimonios — `TestimonialSection`
993
+
994
+ Cabecera de sección más un grid de reseñas (Testimonial): prueba social lista para pegar.
995
+
996
+ | prop | tipo | default |
997
+ |---|---|---|
998
+ | `kicker` | text | "Lo que dicen" |
999
+ | `title` | text | "Alumnos que ya cogieron su ola" |
1000
+ | `items` | text | "Levanté la tabla el primer día. El equipo es paciente y el mar, una maravilla.\|Lucía …" |
1001
+ | `layout` | `grid` · `carousel` | "grid" |
1002
+ | `perView` | number 1–4 | 3 |
1003
+ | `autoplay` | number 0–8 | 0 |
1004
+ | `effect` | `slide` · `fade` · `cards` | "slide" |
1005
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
1006
+
1007
+ ### Pie de página — `Footer`
1008
+
1009
+ Marca, columnas de enlaces, redes y línea de copyright: el cierre habitual de cualquier landing.
1010
+
1011
+ | prop | tipo | default |
1012
+ |---|---|---|
1013
+ | `brand` | text | "Maré Surf Club" |
1014
+ | `tagline` | text | "Del primer remo a tu primera ola verde." |
1015
+ | `columns` | text | "Escuela: Clases, Monitores, Ubicación; Ayuda: Reservas, Cancelaciones, FAQ; Legal: Pri…" |
1016
+ | `social` | text | "X, IG, YT" |
1017
+ | `copyright` | text | "© 2026 Maré Surf Club. Todos los derechos reservados." |
1018
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
1019
+
1020
+ ### Rejilla de ventajas — `FeatureGrid`
1021
+
1022
+ Cabecera de sección + rejilla de «por qué elegirnos» (glifo + título + texto): la sección más pedida en cualquier landing.
1023
+
1024
+ | prop | tipo | default |
1025
+ |---|---|---|
1026
+ | `kicker` | text | "Por qué nosotros" |
1027
+ | `title` | text | "Lo que nos hace distintos" |
1028
+ | `items` | text | "~\|Monitores titulados\|Todo el equipo tiene titulación oficial de escuela de surf y p…" |
1029
+ | `layout` | `grid` · `carousel` | "grid" |
1030
+ | `perView` | number 1–4 | 3 |
1031
+ | `autoplay` | number 0–8 | 0 |
1032
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
1033
+
1034
+ ### Sección de equipo — `TeamSection`
1035
+
1036
+ Cabecera de sección + grid de perfiles con avatar de iniciales: la página «sobre nosotros» lista para pegar.
1037
+
1038
+ | prop | tipo | default |
1039
+ |---|---|---|
1040
+ | `kicker` | text | "El equipo" |
1041
+ | `title` | text | "Quién te va a enseñar" |
1042
+ | `people` | text | "Marta Solé\|Directora y monitora\nEnzo Rial\|Monitor de iniciación\nCarla Duque\|Monit…" |
1043
+ | `layout` | `grid` · `carousel` | "grid" |
1044
+ | `perView` | number 1–4 | 3 |
1045
+ | `autoplay` | number 0–8 | 0 |
1046
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
1047
+
1048
+ ### Tira de marcas — `LogoCloud`
1049
+
1050
+ «Con la confianza de…»: marcas en texto, sin depender de imágenes que el kit no tiene.
1051
+
1052
+ | prop | tipo | default |
1053
+ |---|---|---|
1054
+ | `label` | text | "Con la confianza de" |
1055
+ | `brands` | text | "Nautilus, Costa Brava FM, Surfrider, Deporte Norte, Vela & Mar" |
1056
+ | `layout` | `row` · `ticker` | "row" |
1057
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "minimal" |
1058
+
1059
+ ### Sección de blog — `ArticlesSection`
1060
+
1061
+ Cabecera + artículos (BlogCard) en rejilla, destacado (el primero grande con imagen de fondo), lista o carrusel. Cada tarjeta varía trama y acento sola.
1062
+
1063
+ | prop | tipo | default |
1064
+ |---|---|---|
1065
+ | `kicker` | text | "El blog" |
1066
+ | `title` | text | "Últimas entradas" |
1067
+ | `articles` | text | "Técnica\|Cinco errores al remar que te frenan la primera ola\|El remo cuenta más que l…" |
1068
+ | `layout` | `grid` · `featured` · `list` · `carousel` | "grid" |
1069
+ | `cardLayout` | `stacked` · `overlay` · `minimal` | "stacked" |
1070
+ | `fill` | `surface` · `tint` · `gradient` | "surface" |
1071
+ | `vary` | boolean | true |
1072
+ | `perView` | number 1–4 | 3 |
1073
+ | `autoplay` | number 0–8 | 0 |
1074
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
1075
+
1076
+ ## Overlays (`overlays`)
1077
+
1078
+ Elementos que aparecen encima de la página: diálogos, notificaciones, ayuda.
1079
+
1080
+ ### Modal — `Modal`
1081
+
1082
+ Diálogo modal: un botón lo abre, el fondo o Escape lo cierran. position: fixed, sin portal.
1083
+
1084
+ | prop | tipo | default |
1085
+ |---|---|---|
1086
+ | `triggerLabel` | text | "Eliminar cuenta" |
1087
+ | `title` | text | "¿Seguro que quieres continuar?" |
1088
+ | `body` | text | "Esta acción no se puede deshacer. Se borrarán todos tus datos y no podrás recuperarlos." |
1089
+ | `confirmLabel` | text | "Sí, eliminar" |
1090
+ | `cancelLabel` | text | "Cancelar" |
1091
+ | `size` | `sm` · `md` · `lg` | "md" |
1092
+ | `intent` | `accent` · `neutral` · `success` · `info` · `warning` · `danger` | "accent" |
1093
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
1094
+
1095
+ ### Notificación (Toast) — `Toast`
1096
+
1097
+ Notificación temporal apilable, construida sobre sonner (apilado, gestos y temporizador ya resueltos) con el aspecto del kit por encima.
1098
+
1099
+ | prop | tipo | default |
1100
+ |---|---|---|
1101
+ | `intent` | `accent` · `neutral` · `success` · `info` · `warning` · `danger` | "success" |
1102
+ | `loading` | boolean | false |
1103
+ | `title` | text | "Cambios guardados" |
1104
+ | `description` | text | "Tu perfil se actualizó correctamente." |
1105
+ | `position` | `top-left` · `top-center` · `top-right` · `bottom-left` · `bottom-center` · `bottom-right` | "bottom-right" |
1106
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
1107
+
1108
+ - Usa la librería sonner (toast/Toaster): sin ella habría que reimplementar apilado, gestos táctiles, temporizador y accesibilidad.
1109
+ - Cada instancia lleva un id propio para no cruzarse con otras — importante en «Comparar los 7 estilos», donde conviven 7 Toaster a la vez.
1110
+
1111
+ ### Tooltip — `Tooltip`
1112
+
1113
+ Texto de ayuda al posar el ratón o el foco. Envuelve el disparador real (botón, icono, enlace) o pinta un texto subrayado. Solo CSS, sin JavaScript.
1114
+
1115
+ Envuelve contenido (`children`), p. ej.: `<Button label="Exportar" glyph="icon:download" />`
1116
+
1117
+ | prop | tipo | default |
1118
+ |---|---|---|
1119
+ | `label` | text | "Pasa el ratón por aquí" |
1120
+ | `content` | text | "Descarga el informe en CSV." |
1121
+ | `side` | `top` · `right` · `bottom` · `left` | "top" |
1122
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
1123
+
1124
+ - Con un único elemento como hijo, este recibe aria-describedby apuntando al tooltip; el foco lo pone el propio botón, sin paradas de tabulador extra.
1125
+
1126
+ ### Panel lateral (Drawer) — `Drawer`
1127
+
1128
+ Panel deslizante desde un lateral (menú móvil, carrito, filtros). Se cierra con el fondo, Escape o su botón.
1129
+
1130
+ | prop | tipo | default |
1131
+ |---|---|---|
1132
+ | `triggerLabel` | text | "Abrir menú" |
1133
+ | `side` | `left` · `right` | "left" |
1134
+ | `title` | text | "Menú" |
1135
+ | `body` | text | "Clases, Tablas, Reservas, Contacto, Ayuda." |
1136
+ | `variant` | `glass` · `solid` · `outline` · `neon` · `retro` · `terminal` · `minimal` | "glass" |
1137
+
1138
+ ## Pixel art (`pixel`)
1139
+
1140
+ Iconos SVG que se tiñen con el tema, marcos de 9 cortes y sprites: píxeles hechos a mano, no filtros.
1141
+
1142
+ ### Icono pixel art — `Icon`
1143
+
1144
+ Icono SVG de Pixelarticons sobre rejilla de 24 px. Se tiñe con un token del tema o con el color del texto que lo rodea.
1145
+
1146
+ | prop | tipo | default |
1147
+ |---|---|---|
1148
+ | `name` | `plus` · `minus` · `close` · `check` · `pencil` · `trash` · `copy` · `save` · `download` · `upload` · `reload` · `search` · `filter` · `link` · `share` · `send` · `arrow-left` · `arrow-right` · `arrow-up` · `arrow-down` · `chevron-left` · `chevron-right` · `chevron-up` · `chevron-down` · `menu` · `home` · `external-link` · `more-horizontal` · `more-vertical` · `login` · `logout` · `circle-info` · `warning-diamond` · `circle-question` · `bell` · `heart` · `star` · `bookmark` · `flag` · `lock` · `unlock` · `eye` · `eye-off` · `shield` · `user` · `users` · `mail` · `message` · `phone` · `at-sign` · `terminal` · `code` · `cpu` · `database` · `server` · `cloud` · `wifi` · `battery-full` · `zap` · `power` · `settings-cog` · `bug` · `git-branch` · `globe` · `github` · `discord` · `linkedin` · `instagram` · `youtube` · `mastodon` · `bluesky` · `react` · `npm` · `vercel` · `file` · `file-text` · `folder` · `image` · `camera` · `video` · `music` · `play` · `pause` · `volume` · `mic` · `headphone` · `gamepad` · `joystick` · `sword` · `skull` · `bomb` · `trophy` · `crown` · `coins` · `potion` · `robot` · `alien` · `castle` · `chess` · `fire` · `sparkles` · `leaf` · `tree` · `sun` · `moon` · `snowflake` · `calendar` · `clock` · `map-pin` · `shopping-cart` · `gift` · `key` · `lightbulb` · `coffee` · `compass` · `target` · `hourglass` · `feather` · `wand` | "heart" |
1149
+ | `iconSize` | number 16–120 | 48 |
1150
+ | `sharp` | boolean | false |
1151
+ | `tone` | `fg` · `acc` · `acc2` · `mut` | "acc" |
1152
+
1153
+ - Sin `tone` el icono hereda el color del texto (`currentColor`): dentro de un Button o un Badge toma el color de ese componente.
1154
+ - Sin `label` es decorativo (aria-hidden); con `label` se anuncia como imagen.
1155
+ - Para un icono fuera del set: `import { Zap } from "pixelarticons/react/Zap"` y `<Icon icon={Zap} />` (también valen las variantes …Solid y …Glyph).
1156
+ - Iconos de Pixelarticons, licencia MIT (© Gerrit Halfmann).
1157
+
1158
+ ### Marco pixel art — `PixelFrame`
1159
+
1160
+ Panel de 9 cortes (border-image) con las piezas de Kenney «Pixel UI». Trae fondo propio y una paleta de tinta local: se lee igual sobre cualquier tema.
1161
+
1162
+ | prop | tipo | default |
1163
+ |---|---|---|
1164
+ | `skin` | `colored` · `outline` · `ancient` | "colored" |
1165
+ | `color` | `blue` · `green` · `grey` · `red` · `yellow` · `brown` · `tan` · `white` | "blue" |
1166
+ | `pressed` | boolean | false |
1167
+ | `scale` | `1` · `2` · `3` · `4` | "2" |
1168
+ | `title` | text | "Sala del archivo" |
1169
+ | `text` | text | "Cada marco trae su propio fondo: el texto no depende de lo que haya detrás." |
1170
+
1171
+ - El marco sustituye la paleta del kit por una de tinta sobre papel (fondo, texto y acentos): los componentes de dentro se leen sobre el marco, no sobre la página. La variante neon no es legible ahí dentro; usa solid, outline, minimal, glass o retro.
1172
+ - Piezas de Kenney «Pixel UI» (CC0, sin atribución obligatoria): public/pixel/kenney-pixel-ui/. Las versiones «inlay» del pack (44 px) no se usan.
1173
+
1174
+ ### Sprite pixel art — `Sprite`
1175
+
1176
+ Una baldosa 16×16 de la hoja de Kenney «Pixel UI»: flechas, casillas, punteros. Píxeles ya coloreados, no se tiñen con el tema.
1177
+
1178
+ | prop | tipo | default |
1179
+ |---|---|---|
1180
+ | `col` | number 0–29 | 16 |
1181
+ | `row` | number 0–32 | 23 |
1182
+ | `scale` | number 1–12 | 6 |
1183
+
1184
+ - La hoja tiene 30 columnas × 33 filas de baldosas de 16 px con 2 px de margen; la que eliges sale enmarcada abajo. Las baldosas vacías simplemente no dibujan nada.
1185
+ - Piezas de Kenney «Pixel UI» (CC0): public/pixel/kenney-pixel-ui/spritesheet/sheet.png.
1186
+
1187
+ ## Landings de referencia
1188
+
1189
+ Componentes del kit que usa cada una, en orden de aparición. Pídelas como plantilla por su slug.
1190
+
1191
+ ### CIPHERGRID · producto ciberpunk — `/demo/th-ciphergrid`
1192
+
1193
+ Landing retrowave completa construida solo con components/ui/: fondos reactivos al scroll, modal, notificaciones, formulario y prácticamente todo el catálogo.
1194
+
1195
+ Archivo: `components/landings/CyberpunkLanding.tsx`
1196
+
1197
+ `GridBackground` ×3 → `AsciiBackground` ×2 → `SceneFlash` → `CrtOverlay` → `GlyphCursor` → `Toast` → `NavBar` → `Drawer` → `Hero` → `Reveal` ×19 → `TerminalTyper` → `Typewriter` → `StatsSection` → `FeatureGrid` → `BitmapText` → `Spotlight` → `AsciiCard` ×3 → `SectionHeader` ×5 → `Tabs` → `CodeBlock` ×2 → `Table` → `Timeline` → `HoverFX` → `AsciiChart` → `Progress` → `Badge` ×3 → `Alert` → `Spinner` → `Skeleton` → `StatCounter` → `PricingSection` → `NeonSign` → `Stepper` → `TextField` → `Select` → `CheckboxGroup` → `RadioGroup` → `RangeSlider` → `Toggle` → `OtpInput` → `Tooltip` → `MagneticButton` → `Modal` → `Breadcrumbs` → `Panel` → `Dropdown` → `Pagination` → `ScrollArea` → `TestimonialSection` → `TeamSection` → `LogoCloud` → `ArticlesSection` → `FAQSection` → `ScrambleText` → `ContactForm` → `CTASection` → `Divider` → `Footer`
1198
+
1199
+ ### MYCEL · red micelar orgánica — `/demo/th-mycel`
1200
+
1201
+ Segunda landing completa construida solo con components/ui/, opuesta a CIPHERGRID: una red de sensores de campo que germina de verdad al hacer scroll por el héroe, sin que el fondo tape nunca el contenido.
1202
+
1203
+ Archivo: `components/landings/MycelLanding.tsx`
1204
+
1205
+ `AsciiBackground` → `GridBackground` ×2 → `TextmodeBackground` ×2 → `SceneFlash` → `GlyphCursor` → `Toast` → `NavBar` → `Drawer` → `Hero` → `Reveal` ×19 → `TerminalTyper` → `Typewriter` → `StatsSection` → `FeatureGrid` → `BitmapText` → `Spotlight` → `AsciiCard` ×3 → `SectionHeader` ×5 → `Tabs` → `CodeBlock` ×2 → `Table` → `Timeline` → `HoverFX` → `AsciiChart` → `Progress` → `Badge` ×3 → `Alert` → `Spinner` → `Skeleton` → `StatCounter` → `PricingSection` → `NeonSign` → `Stepper` → `TextField` → `Select` → `CheckboxGroup` → `RadioGroup` → `RangeSlider` → `Toggle` → `OtpInput` → `Tooltip` → `MagneticButton` → `Modal` → `Breadcrumbs` → `Panel` → `Dropdown` → `Pagination` → `ScrollArea` → `TestimonialSection` → `TeamSection` → `LogoCloud` → `ArticlesSection` → `FAQSection` → `ScrambleText` → `ContactForm` → `CTASection` → `Divider` → `Footer`
1206
+
1207
+ ### FOLIO · editorial de tema claro — `/demo/th-folio`
1208
+
1209
+ Tercera landing completa construida solo con components/ui/, la única de tema claro: papel, tinta y tipografía para una herramienta editorial, con fondos en patrones de papelería real en vez de escenas cargadas.
1210
+
1211
+ Archivo: `components/landings/FolioLanding.tsx`
1212
+
1213
+ `GridBackground` ×4 → `TextmodeBackground` → `SceneFlash` → `GlyphCursor` → `Toast` → `NavBar` → `Drawer` → `Hero` → `Reveal` ×19 → `TerminalTyper` → `Typewriter` → `StatsSection` → `FeatureGrid` → `BitmapText` → `Spotlight` → `AsciiCard` ×3 → `SectionHeader` ×5 → `Tabs` → `CodeBlock` ×2 → `Table` → `Timeline` → `HoverFX` → `AsciiChart` → `Progress` → `Badge` ×3 → `Alert` → `Spinner` → `Skeleton` → `StatCounter` → `PricingSection` → `NeonSign` → `Stepper` → `TextField` → `Select` → `CheckboxGroup` → `RadioGroup` → `RangeSlider` → `Toggle` → `OtpInput` → `Tooltip` → `MagneticButton` → `Modal` → `Breadcrumbs` → `Panel` → `Dropdown` → `Pagination` → `ScrollArea` → `TestimonialSection` → `TeamSection` → `LogoCloud` → `ArticlesSection` → `FAQSection` → `ScrambleText` → `ContactForm` → `CTASection` → `Divider` → `Footer`
1214
+
1215
+ ### MARÉ · minimal pixel — `/demo/th-minimal`
1216
+
1217
+ Landing mínima de Maré Surf Club: fondo dither de cuadrados duros que evoluciona de amanecer a noche con el scroll, tipografía pixel, titulares con aparición glitch y palabra rotativa.
1218
+
1219
+ Archivo: `components/landings/minimal/MinimalLanding.tsx`
1220
+
1221
+ `AsciiBackground`
1222
+
1223
+ ### FORMAS · 2000dvh — `/demo/th-geometry`
1224
+
1225
+ Demo de 2000dvh en ocho capítulos: el scroll interpola el tamaño de celda (fino casi siempre), bloom, grano y tinte; en cada cambio la imagen se rompe en bloques y salta de cubo a pirámide, esfera, octaedro, icosaedro, prisma, nudo toroidal y cono. Varias figuras se colocan al borde de la página y cada una tiene su propio hover.
1226
+
1227
+ Archivo: `components/landings/minimal/GeometryLanding.tsx`
1228
+
1229
+ `AsciiBackground`
1230
+
1231
+ ### FACETA · landing larga con kit — `/demo/th-faceta`
1232
+
1233
+ Landing de prueba de más de 3000dvh: dieciséis actos con el fondo de formas 3D evolucionando con el scroll (celda fina, figuras al borde, hover propio) y, entre carteles con aparición distinta, componentes del kit en estilo pixel duro: características, cifras, marquesina, proceso, pestañas, precios, opiniones, FAQ, galerías de imágenes con Swiper, carrusel de opiniones, cinta de marcas, formulario y pie.
1234
+
1235
+ Archivo: `components/landings/minimal/FacetaLanding.tsx`
1236
+
1237
+ `FeatureGrid` → `StatsSection` → `SectionHeader` ×18 → `VideoPlayer` ×9 → `Marquee` → `Timeline` → `Stepper` → `Tabs` → `Progress` ×3 → `Badge` ×4 → `ImageGallery` ×8 → `LogoCloud` → `PricingSection` → `TestimonialSection` → `FAQSection` → `CTASection` → `ContactForm` → `Accordion` → `Button` → `Footer`