@hanzo/ui 5.0.2 → 5.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 (371) hide show
  1. package/dist/accordion.js +1 -0
  2. package/dist/accordion.mjs +1 -0
  3. package/dist/alert-dialog.js +1 -0
  4. package/dist/alert-dialog.mjs +1 -0
  5. package/dist/alert.js +1 -0
  6. package/dist/alert.mjs +1 -0
  7. package/dist/avatar.js +1 -0
  8. package/dist/avatar.mjs +1 -0
  9. package/dist/badge.js +1 -0
  10. package/dist/badge.mjs +1 -0
  11. package/dist/breadcrumb.js +1 -0
  12. package/dist/breadcrumb.mjs +1 -0
  13. package/dist/calendar.js +1 -0
  14. package/dist/calendar.mjs +1 -0
  15. package/dist/carousel.js +1 -0
  16. package/dist/carousel.mjs +1 -0
  17. package/dist/checkbox.js +1 -0
  18. package/dist/checkbox.mjs +1 -0
  19. package/dist/chunk-3H5S2OQ3.mjs +1 -0
  20. package/dist/chunk-5GRJ7UQX.js +1 -0
  21. package/dist/chunk-63HNMH7C.js +1 -0
  22. package/dist/chunk-72TOQ4DM.mjs +1 -0
  23. package/dist/chunk-7AEFTV5R.mjs +1 -0
  24. package/dist/chunk-7M4AVV2R.js +1 -0
  25. package/dist/chunk-DKPVJSBC.js +1 -0
  26. package/dist/chunk-EI7MMDWY.js +1 -0
  27. package/dist/chunk-GANGDIZG.mjs +1 -0
  28. package/dist/chunk-GRGT2Z4K.js +1 -0
  29. package/dist/chunk-JCUUC6NY.mjs +1 -0
  30. package/dist/chunk-JUQMWLIN.js +1 -0
  31. package/dist/chunk-PRVEIITE.js +1 -0
  32. package/dist/chunk-SH52AKNZ.js +1 -0
  33. package/dist/chunk-TU67EJEW.mjs +1 -0
  34. package/dist/chunk-WN5KN73U.mjs +1 -0
  35. package/dist/chunk-YSXGDEY5.mjs +1 -0
  36. package/dist/chunk-Z76OOVUE.mjs +1 -0
  37. package/dist/collapsible.js +1 -0
  38. package/dist/collapsible.mjs +1 -0
  39. package/dist/command.js +1 -0
  40. package/dist/command.mjs +1 -0
  41. package/dist/context-menu.js +1 -0
  42. package/dist/context-menu.mjs +1 -0
  43. package/dist/dialog.js +1 -0
  44. package/dist/dialog.mjs +1 -0
  45. package/dist/drawer.js +1 -0
  46. package/dist/drawer.mjs +1 -0
  47. package/dist/dropdown-menu.js +1 -0
  48. package/dist/dropdown-menu.mjs +1 -0
  49. package/dist/form.js +1 -0
  50. package/dist/form.mjs +1 -0
  51. package/dist/hover-card.js +1 -0
  52. package/dist/hover-card.mjs +1 -0
  53. package/dist/index.js +1 -9079
  54. package/dist/index.mjs +1 -8700
  55. package/dist/input-otp.js +1 -0
  56. package/dist/input-otp.mjs +1 -0
  57. package/dist/lib/utils.js +1 -0
  58. package/dist/lib/utils.mjs +1 -0
  59. package/dist/navigation-menu.js +1 -0
  60. package/dist/navigation-menu.mjs +1 -0
  61. package/dist/popover.js +1 -0
  62. package/dist/popover.mjs +1 -0
  63. package/dist/progress.js +1 -0
  64. package/dist/progress.mjs +1 -0
  65. package/dist/radio-group.js +1 -0
  66. package/dist/radio-group.mjs +1 -0
  67. package/dist/resizable.js +1 -0
  68. package/dist/resizable.mjs +1 -0
  69. package/dist/scroll-area.js +1 -0
  70. package/dist/scroll-area.mjs +1 -0
  71. package/dist/select.js +1 -0
  72. package/dist/select.mjs +1 -0
  73. package/dist/separator.js +1 -0
  74. package/dist/separator.mjs +1 -0
  75. package/dist/sheet.js +1 -0
  76. package/dist/sheet.mjs +1 -0
  77. package/dist/skeleton.js +1 -0
  78. package/dist/skeleton.mjs +1 -0
  79. package/dist/slider.js +1 -0
  80. package/dist/slider.mjs +1 -0
  81. package/dist/sonner.js +1 -0
  82. package/dist/sonner.mjs +1 -0
  83. package/dist/src/utils.js +1 -0
  84. package/dist/src/utils.mjs +1 -0
  85. package/dist/switch.js +1 -0
  86. package/dist/switch.mjs +1 -0
  87. package/dist/table.js +1 -0
  88. package/dist/table.mjs +1 -0
  89. package/dist/tabs.js +1 -0
  90. package/dist/tabs.mjs +1 -0
  91. package/dist/tailwind/index.js +1 -0
  92. package/dist/tailwind/index.mjs +1 -0
  93. package/dist/textarea.js +1 -0
  94. package/dist/textarea.mjs +1 -0
  95. package/dist/toggle-group.js +1 -0
  96. package/dist/toggle-group.mjs +1 -0
  97. package/dist/toggle.js +1 -0
  98. package/dist/toggle.mjs +1 -0
  99. package/dist/tooltip.js +1 -0
  100. package/dist/tooltip.mjs +1 -0
  101. package/dist/types/index.js +1 -0
  102. package/dist/types/index.mjs +1 -0
  103. package/package.json +110 -81
  104. package/assets/ai-icons.tsx +0 -207
  105. package/assets/crypto.tsx +0 -33
  106. package/assets/file-type-icon.tsx +0 -66
  107. package/assets/file.tsx +0 -45
  108. package/assets/general.tsx +0 -2318
  109. package/assets/hanzo-logo.svg +0 -9
  110. package/assets/hanzo-logo.tsx +0 -17
  111. package/assets/index.ts +0 -122
  112. package/assets/index.tsx +0 -4
  113. package/assets/llm-provider.tsx +0 -1094
  114. package/blocks/auth/index.ts +0 -6
  115. package/blocks/auth/login-2fa.tsx +0 -165
  116. package/blocks/auth/login-basic.tsx +0 -94
  117. package/blocks/auth/login-social.tsx +0 -148
  118. package/blocks/auth/magic-link.tsx +0 -129
  119. package/blocks/auth/password-reset.tsx +0 -97
  120. package/blocks/auth/signup.tsx +0 -157
  121. package/blocks/components/accordian-block.tsx +0 -48
  122. package/blocks/components/block-component-props.ts +0 -11
  123. package/blocks/components/bullet-cards-block.tsx +0 -46
  124. package/blocks/components/card-block/index.tsx +0 -171
  125. package/blocks/components/card-block/link-out-button.tsx +0 -20
  126. package/blocks/components/card-block/util.ts +0 -28
  127. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  128. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  129. package/blocks/components/content.tsx +0 -70
  130. package/blocks/components/cta-block.tsx +0 -115
  131. package/blocks/components/enh-heading-block.tsx +0 -204
  132. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  133. package/blocks/components/grid-block/index.tsx +0 -83
  134. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  135. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  136. package/blocks/components/group-block.tsx +0 -83
  137. package/blocks/components/heading-block.tsx +0 -88
  138. package/blocks/components/image-block.tsx +0 -111
  139. package/blocks/components/index.ts +0 -30
  140. package/blocks/components/screenful-block/content.tsx +0 -123
  141. package/blocks/components/screenful-block/index.tsx +0 -107
  142. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  143. package/blocks/components/screenful-block/video-background.tsx +0 -45
  144. package/blocks/components/space-block.tsx +0 -66
  145. package/blocks/components/video-block.tsx +0 -138
  146. package/blocks/data-display/activity-feed.tsx +0 -242
  147. package/blocks/data-display/data-table.tsx +0 -235
  148. package/blocks/data-display/stats-grid.tsx +0 -194
  149. package/blocks/def/accordian-block.ts +0 -14
  150. package/blocks/def/block.ts +0 -7
  151. package/blocks/def/bullet-cards-block.ts +0 -22
  152. package/blocks/def/card-block.ts +0 -22
  153. package/blocks/def/carte-blanche-block.ts +0 -21
  154. package/blocks/def/cta-block.ts +0 -19
  155. package/blocks/def/element-block.ts +0 -11
  156. package/blocks/def/enh-heading-block.ts +0 -44
  157. package/blocks/def/grid-block.ts +0 -16
  158. package/blocks/def/group-block.ts +0 -11
  159. package/blocks/def/heading-block.ts +0 -15
  160. package/blocks/def/image-block.ts +0 -31
  161. package/blocks/def/index.ts +0 -35
  162. package/blocks/def/screenful-block.ts +0 -54
  163. package/blocks/def/space-block.ts +0 -64
  164. package/blocks/def/video-block.ts +0 -9
  165. package/blocks/ecommerce/checkout.tsx +0 -242
  166. package/blocks/ecommerce/index.ts +0 -7
  167. package/blocks/ecommerce/product-detail.tsx +0 -257
  168. package/blocks/ecommerce/product-grid.tsx +0 -148
  169. package/blocks/ecommerce/shopping-cart.tsx +0 -181
  170. package/blocks/index.ts +0 -2
  171. package/blocks/marketing/cta-section.tsx +0 -207
  172. package/blocks/marketing/faq.tsx +0 -159
  173. package/blocks/marketing/features-grid.tsx +0 -156
  174. package/blocks/marketing/hero-section.tsx +0 -192
  175. package/blocks/marketing/index.ts +0 -6
  176. package/blocks/marketing/pricing-table.tsx +0 -121
  177. package/blocks/marketing/testimonials.tsx +0 -196
  178. package/components/index.ts +0 -9
  179. package/dist/index.js.map +0 -1
  180. package/dist/index.mjs.map +0 -1
  181. package/dist/tailwind.js +0 -2025
  182. package/dist/tailwind.js.map +0 -1
  183. package/dist/tailwind.mjs +0 -2013
  184. package/dist/tailwind.mjs.map +0 -1
  185. package/dist/types.js +0 -59
  186. package/dist/types.js.map +0 -1
  187. package/dist/types.mjs +0 -53
  188. package/dist/types.mjs.map +0 -1
  189. package/dist/utils.js +0 -30
  190. package/dist/utils.js.map +0 -1
  191. package/dist/utils.mjs +0 -26
  192. package/dist/utils.mjs.map +0 -1
  193. package/frameworks/core/index.ts +0 -6
  194. package/frameworks/core/utils/index.ts +0 -64
  195. package/frameworks/react/components/button.tsx +0 -26
  196. package/frameworks/react/components/index.ts +0 -5
  197. package/frameworks/react/hooks/index.ts +0 -5
  198. package/frameworks/react/index.ts +0 -9
  199. package/frameworks/react/package.json +0 -8
  200. package/frameworks/react/utils/index.ts +0 -2
  201. package/frameworks/react-native/index.ts +0 -9
  202. package/frameworks/react-native/package.json +0 -8
  203. package/frameworks/registry.json +0 -371
  204. package/frameworks/setup.sh +0 -69
  205. package/frameworks/svelte/index.ts +0 -9
  206. package/frameworks/svelte/package.json +0 -8
  207. package/frameworks/tracker.json +0 -1854
  208. package/frameworks/vue/index.ts +0 -9
  209. package/frameworks/vue/package.json +0 -8
  210. package/helpers/file.ts +0 -33
  211. package/helpers/memoization.ts +0 -40
  212. package/primitives/accordion.tsx +0 -74
  213. package/primitives/action-button.tsx +0 -42
  214. package/primitives/alert-dialog.tsx +0 -185
  215. package/primitives/alert.tsx +0 -74
  216. package/primitives/apply-typography.tsx +0 -55
  217. package/primitives/aspect-ratio.tsx +0 -5
  218. package/primitives/avatar.tsx +0 -57
  219. package/primitives/background-beams.tsx +0 -142
  220. package/primitives/badge.tsx +0 -45
  221. package/primitives/breadcrumb.tsx +0 -130
  222. package/primitives/breakpoint-indicator.tsx +0 -19
  223. package/primitives/button.tsx +0 -72
  224. package/primitives/calendar.tsx +0 -72
  225. package/primitives/card.tsx +0 -97
  226. package/primitives/carousel.tsx +0 -238
  227. package/primitives/chat/chat-input-area.tsx +0 -88
  228. package/primitives/chat/chat-input.tsx +0 -71
  229. package/primitives/chat/files-preview.tsx +0 -331
  230. package/primitives/chat/index.ts +0 -6
  231. package/primitives/chat/json-form.tsx +0 -8
  232. package/primitives/chat/message-list.tsx +0 -308
  233. package/primitives/chat/message.tsx +0 -569
  234. package/primitives/chat/sqlite-preview.tsx +0 -215
  235. package/primitives/checkbox.tsx +0 -32
  236. package/primitives/collapsible.tsx +0 -9
  237. package/primitives/combobox.tsx +0 -239
  238. package/primitives/command.tsx +0 -151
  239. package/primitives/context-menu.tsx +0 -206
  240. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  241. package/primitives/dialog-video-controller.tsx +0 -38
  242. package/primitives/dialog.tsx +0 -128
  243. package/primitives/dot-pattern.tsx +0 -57
  244. package/primitives/dots-loader.tsx +0 -13
  245. package/primitives/drawer.tsx +0 -113
  246. package/primitives/dropdown-menu.tsx +0 -199
  247. package/primitives/error-message.tsx +0 -19
  248. package/primitives/file-uploader.tsx +0 -203
  249. package/primitives/form.tsx +0 -185
  250. package/primitives/hover-card.tsx +0 -28
  251. package/primitives/icons/github.tsx +0 -14
  252. package/primitives/icons/index.ts +0 -18
  253. package/primitives/icons/youtube-logo.tsx +0 -59
  254. package/primitives/index-client.ts +0 -4
  255. package/primitives/index-common.ts +0 -304
  256. package/primitives/index-next.ts +0 -4
  257. package/primitives/input-otp.tsx +0 -65
  258. package/primitives/input.tsx +0 -128
  259. package/primitives/label.tsx +0 -21
  260. package/primitives/list-adaptor.ts +0 -12
  261. package/primitives/list-box.tsx +0 -74
  262. package/primitives/loading-spinner.tsx +0 -33
  263. package/primitives/markdown-preview.tsx +0 -612
  264. package/primitives/mermaid.tsx +0 -196
  265. package/primitives/navigation-menu.tsx +0 -147
  266. package/primitives/next/image.tsx +0 -91
  267. package/primitives/next/index.ts +0 -7
  268. package/primitives/next/inline-icon.tsx +0 -36
  269. package/primitives/next/link-element.tsx +0 -109
  270. package/primitives/next/mdx-link.tsx +0 -22
  271. package/primitives/next/media-stack.tsx +0 -52
  272. package/primitives/next/nav-items.tsx +0 -45
  273. package/primitives/next/youtube-embed.tsx +0 -83
  274. package/primitives/pagination.tsx +0 -117
  275. package/primitives/popover.tsx +0 -34
  276. package/primitives/pretty-json-print.tsx +0 -28
  277. package/primitives/progress.tsx +0 -27
  278. package/primitives/prompt-textarea.tsx +0 -72
  279. package/primitives/qr-code.tsx +0 -112
  280. package/primitives/radio-group.tsx +0 -42
  281. package/primitives/resizable.tsx +0 -47
  282. package/primitives/scroll-area.tsx +0 -57
  283. package/primitives/search-input.tsx +0 -66
  284. package/primitives/select.tsx +0 -122
  285. package/primitives/separator.tsx +0 -26
  286. package/primitives/sheet.tsx +0 -139
  287. package/primitives/skeleton.tsx +0 -18
  288. package/primitives/slider.tsx +0 -63
  289. package/primitives/sonner.tsx +0 -35
  290. package/primitives/step-indicator.tsx +0 -69
  291. package/primitives/stepper.tsx +0 -272
  292. package/primitives/switch.tsx +0 -27
  293. package/primitives/table.tsx +0 -105
  294. package/primitives/tabs.tsx +0 -50
  295. package/primitives/text-area.tsx +0 -26
  296. package/primitives/text-link.tsx +0 -27
  297. package/primitives/textarea.tsx +0 -64
  298. package/primitives/textfield.tsx +0 -78
  299. package/primitives/toast.tsx +0 -30
  300. package/primitives/toggle-group.tsx +0 -63
  301. package/primitives/toggle.tsx +0 -44
  302. package/primitives/tooltip.tsx +0 -47
  303. package/primitives/video-player.tsx +0 -23
  304. package/src/button.ts +0 -1
  305. package/src/hooks/index.ts +0 -7
  306. package/src/hooks/use-click-away.ts +0 -31
  307. package/src/hooks/use-combined-refs.ts +0 -22
  308. package/src/hooks/use-copy-clipboard.ts +0 -30
  309. package/src/hooks/use-debounce.ts +0 -17
  310. package/src/hooks/use-fill-ids.ts +0 -25
  311. package/src/hooks/use-map.ts +0 -26
  312. package/src/hooks/use-measure.ts +0 -42
  313. package/src/hooks/use-reverse-video-playback.ts +0 -43
  314. package/src/hooks/use-scroll-restoration.ts +0 -50
  315. package/src/index-lean.ts +0 -87
  316. package/src/index.ts +0 -54
  317. package/src/mcp/README.md +0 -141
  318. package/src/mcp/enhanced-server.ts +0 -1208
  319. package/src/mcp/index.ts +0 -518
  320. package/src/mcp/package.json +0 -10
  321. package/src/registry/api.ts +0 -164
  322. package/src/registry/index.ts +0 -60
  323. package/src/registry/package.json +0 -10
  324. package/src/utils.ts +0 -19
  325. package/tailwind/colors.tailwind.js +0 -53
  326. package/tailwind/fontFamily.tailwind.ts +0 -7
  327. package/tailwind/fontSize.tailwind.ts +0 -13
  328. package/tailwind/index.ts +0 -7
  329. package/tailwind/safelist.tailwind.js +0 -26
  330. package/tailwind/screens.tailwind.js +0 -8
  331. package/tailwind/spacing.tailwind.js +0 -65
  332. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  333. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  334. package/tailwind/tw-font-desc.ts +0 -15
  335. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  336. package/tailwind/typo-plugin/index.d.ts +0 -9
  337. package/tailwind/typo-plugin/index.js +0 -141
  338. package/tailwind/typo-plugin/utils.js +0 -60
  339. package/tailwind/typography-test.mdx +0 -35
  340. package/tailwind/z-index.tailwind.js +0 -71
  341. package/types/animation-def.ts +0 -3
  342. package/types/breakpoints.ts +0 -11
  343. package/types/bullet-item.ts +0 -10
  344. package/types/button-def.ts +0 -39
  345. package/types/dimensions.ts +0 -8
  346. package/types/grid-def.ts +0 -56
  347. package/types/image-def.ts +0 -32
  348. package/types/index.ts +0 -30
  349. package/types/link-def.ts +0 -56
  350. package/types/media-stack-def.ts +0 -31
  351. package/types/t-shirt-size.ts +0 -5
  352. package/types/tshirt-dimensions.ts +0 -20
  353. package/types/video-def.ts +0 -25
  354. package/util/blob.ts +0 -33
  355. package/util/copy-to-clipboard.ts +0 -17
  356. package/util/create-shadow-root.ts +0 -22
  357. package/util/date.ts +0 -84
  358. package/util/debounce.ts +0 -11
  359. package/util/file.ts +0 -15
  360. package/util/format-and-abbreviate-as-currency.ts +0 -125
  361. package/util/format-text.ts +0 -34
  362. package/util/format-to-max-char.ts +0 -68
  363. package/util/index-client.ts +0 -3
  364. package/util/index.ts +0 -112
  365. package/util/number-abbreviate.ts +0 -49
  366. package/util/specifier.ts +0 -43
  367. package/util/spread-to-transform.ts +0 -25
  368. package/util/step-animation.ts +0 -90
  369. package/util/timing.ts +0 -3
  370. package/util/toasts.tsx +0 -17
  371. package/util/two-way-map.ts +0 -19
@@ -1,88 +0,0 @@
1
- import React from 'react'
2
-
3
- import type { HeadingBlock } from '../def'
4
- import { ApplyTypography } from '../../primitives/index-common'
5
-
6
- import type BlockComponentProps from './block-component-props'
7
-
8
- const HeadingBlockComponent: React.FC<BlockComponentProps> = ({
9
- block,
10
- className=''
11
- }) => {
12
-
13
- if (block.blockType !== 'heading') {
14
- return <>heading block required</>
15
- }
16
- const heading = block as HeadingBlock
17
-
18
- let Tag: React.ElementType
19
- let BylineTag: React.ElementType | undefined = undefined
20
-
21
- switch (heading.bylineLevel) {
22
- case 0: {
23
- BylineTag = 'p'
24
- } break
25
- case 1: {
26
- BylineTag = 'h1'
27
- } break
28
- case 2: {
29
- BylineTag = 'h2'
30
- } break
31
- case 3: {
32
- BylineTag = 'h3'
33
- } break
34
- case 4: {
35
- BylineTag = 'h4'
36
- } break
37
- case 5: {
38
- BylineTag = 'h5'
39
- } break
40
- case 6: {
41
- BylineTag = 'h6'
42
- } break
43
- }
44
- // bylineLevel default is two levels below the main heading
45
- switch (heading.level) {
46
- case 0: {
47
- Tag = 'p'
48
- BylineTag = BylineTag ?? 'p'
49
- } break
50
- case 1: {
51
- Tag = 'h1'
52
- BylineTag = BylineTag ?? 'h3'
53
- } break
54
- case 2: {
55
- Tag = 'h2'
56
- BylineTag = BylineTag ?? 'h4'
57
- } break
58
- // 3 is default
59
- case 4: {
60
- Tag = 'h4'
61
- BylineTag = BylineTag ?? 'h6'
62
- } break
63
- case 5: {
64
- Tag = 'h5'
65
- BylineTag = BylineTag ?? 'p'
66
- } break
67
- case 6: {
68
- Tag = 'h6'
69
- BylineTag = BylineTag ?? 'p'
70
- } break
71
- default: {
72
- Tag = 'h3'
73
- BylineTag = BylineTag ?? 'h5'
74
- }
75
- }
76
-
77
- // Had to do this way, since tw typo plugin does support overrding typo styling wiithout .not-typography
78
- return (
79
- <ApplyTypography className={className}>
80
- <Tag >{heading.heading}</Tag>
81
- {heading.spaceBetween && <div className={'w-[1px] ' + `h-${heading.spaceBetween}`} />}
82
- {heading.byline && (<BylineTag>{heading.byline}</BylineTag>)}
83
- {heading.spaceAfter && <div className={'w-[1px] ' + `h-${heading.spaceAfter}`} />}
84
- </ApplyTypography>
85
- )
86
- }
87
-
88
- export default HeadingBlockComponent
@@ -1,111 +0,0 @@
1
- import React from 'react'
2
- import Image from 'next/image'
3
-
4
- import type { Dimensions } from '../../types'
5
- import type { ImageBlock } from '../def'
6
- import { constrain, containsToken, cn } from '../../util'
7
-
8
- import type BlockComponentProps from './block-component-props'
9
-
10
-
11
- const ImageBlockComponent: React.FC<BlockComponentProps & {
12
- constraintTo?: Dimensions
13
- }> = ({
14
- block,
15
- className='',
16
- agent,
17
- constraintTo
18
- }) => {
19
-
20
- if (block.blockType !== 'image') {
21
- return <>image block required</>
22
- }
23
-
24
- const {
25
- src,
26
- alt,
27
- dim,
28
- props,
29
- sizes,
30
- fullWidthOnMobile,
31
- svgFillClass,
32
- specifiers
33
- } = block as ImageBlock
34
-
35
- const specified = (s: string): boolean => (containsToken(specifiers, s))
36
-
37
- const toSpread: any = {}
38
- if (props?.fill === undefined) {
39
- const resolved = constraintTo ? constrain(dim, constraintTo) : dim
40
- toSpread.width = resolved.w
41
- toSpread.height = resolved.h
42
- }
43
-
44
- let _alt: string
45
- if (alt) {
46
- _alt = alt
47
- }
48
- else {
49
- const tokens = src.split('/')
50
- // Something remotely meaningful
51
- _alt = (tokens.length > 0) ? tokens[tokens.length] : src
52
- }
53
-
54
- const _svgFillClass = svgFillClass ?? ''
55
-
56
- // TODO: use two elements with 'md:hidden' for 3/4 size
57
- // https://nextjs.org/docs/app/building-your-application/optimizing/images#responsive
58
- if (agent === 'phone' ) {
59
- if (specified('mobile-full-width') || fullWidthOnMobile) {
60
- const toSpread: any = {
61
- style: {
62
- width: '100%',
63
- height: 'auto',
64
- maxWidth: '420px'
65
- },
66
- sizes: '100vw',
67
- }
68
- // only for aspect ratio and to satisfy parser
69
- toSpread.width = dim.w
70
- toSpread.height = dim.h
71
-
72
- return (
73
- <div className='flex flex-col items-center w-full'>
74
- <Image src={src} alt={_alt} {...toSpread} className={cn(_svgFillClass, className)}/>
75
- </div>
76
- )
77
- }
78
- // TODO use constraint
79
- else if (!specified('mobile-no-scale')) {
80
- if (props?.style?.width === 'auto' && typeof props.style.height === 'number' ) {
81
- props.style.height = props.style.height *.75
82
- }
83
- else if (props?.style?.height === 'auto' && typeof props?.style?.width === 'number' ) {
84
- props.style.width = props.style.width *.75
85
- }
86
- else if (props?.style && !props?.style.width) {
87
- toSpread.width = dim.w * .75
88
- toSpread.height = dim.h * .75
89
- }
90
- }
91
- }
92
- if (sizes) {
93
- toSpread.sizes = sizes
94
- }
95
-
96
- const right = containsToken(specifiers, 'right')
97
- const center = containsToken(specifiers, 'center')
98
-
99
- const alignSelfClx = right ? 'self-end' : (center ? 'self-center' : 'self-start')
100
-
101
- return (props?.fill) ? (
102
- <div className='relative w-full h-full'>
103
- <Image src={src} alt={_alt} {...toSpread} {...props} className={cn(_svgFillClass, 'max-w-[70vw] mx-auto', className)}/>
104
- </div>
105
- ) : (
106
- <Image src={src} alt={_alt} {...toSpread} {...props} className={cn(alignSelfClx, _svgFillClass, 'max-w-[70vw] mx-auto', className)}/>
107
- )
108
- }
109
-
110
- export default ImageBlockComponent
111
-
@@ -1,30 +0,0 @@
1
- import AccordianBlock from './accordian-block'
2
- import type BlockComponentProps from './block-component-props'
3
- import Blocks from './content'
4
- import CardBlock from './card-block'
5
- import { default as ContentComponent, registerBlockType} from './content'
6
- import CTABlock from './cta-block'
7
- import EnhHeadingBlock from './enh-heading-block'
8
- import GroupBlock from './group-block'
9
- import HeadingBlock from './heading-block'
10
- import ImageBlock from './image-block'
11
- import SpaceBlock from './space-block'
12
- import ScreenfulBlock from './screenful-block'
13
- import VideoBlock from './video-block'
14
-
15
- export {
16
- AccordianBlock as AccordianBlockComponent,
17
- type BlockComponentProps,
18
- Blocks as BlocksComponent,
19
- CardBlock as CardBlockComponent,
20
- ContentComponent,
21
- CTABlock as CTABlockComponent,
22
- EnhHeadingBlock as EnhHeadingBlockComponent,
23
- GroupBlock as GroupBlockComponent,
24
- HeadingBlock as HeadingBlockComponent,
25
- ImageBlock as ImageBlockComponent,
26
- registerBlockType,
27
- SpaceBlock as SpaceBlockComponent,
28
- ScreenfulBlock as ScreenfulBlockComponent,
29
- VideoBlock as VideoBlockComponent,
30
- }
@@ -1,123 +0,0 @@
1
- import React, { PropsWithChildren } from 'react'
2
-
3
- import type { Block, ScreenfulBlock} from '../../def'
4
- import { containsToken, cn } from '../../../util'
5
- import ContentComponent from '../content'
6
-
7
- const ContentColumn: React.FC<{
8
- blocks: Block[]
9
- specifiers?: string
10
- agent?: string
11
- className?: string
12
- }> = ({
13
- blocks,
14
- specifiers,
15
- agent,
16
- className='',
17
- }) => {
18
-
19
- const specified = (s: string) => (containsToken(specifiers, s))
20
-
21
- let modifiers = ''
22
-
23
- if (agent !== 'phone') {
24
- if (specified('right')) {
25
- modifiers += 'items-end '
26
-
27
- }
28
- else if (specified('center')) {
29
- modifiers += 'items-center '
30
- }
31
- // default to left
32
- else {
33
- modifiers += 'items-start '
34
- }
35
- }
36
- // default to left
37
- else {
38
- modifiers += 'items-start '
39
- }
40
-
41
- if (agent !== 'phone') {
42
- if (specified('bottom')) {
43
- modifiers += 'justify-end '
44
- }
45
- else if (specified('vert-center')) {
46
- modifiers += 'justify-center '
47
- }
48
- // default to top
49
- else {
50
- modifiers += 'justify-start '
51
- }
52
- // right aligned text looks shitty on mobile
53
- if (specified('text-align-right')) {
54
- modifiers += 'text-right '
55
- }
56
- else {
57
- modifiers += 'text-left '
58
- }
59
- }
60
- else {
61
- if (specified('mobile-vert-center')) {
62
- modifiers += 'justify-center '
63
- }
64
- else {
65
- modifiers += 'justify-start '
66
- }
67
- }
68
-
69
- if (agent === 'phone' && specified('mobile-center-headings')) {
70
- modifiers += 'typography-headings:text-center '
71
- }
72
-
73
- /* ContentComponent's parent div needs h-full class in order for vertical alignment with flexbox to work.
74
- * This affects specifiers: bottom, vert-center, mobile-vert-center
75
- */
76
- return (
77
- <div className={cn('flex flex-col justify-center h-full', modifiers, className)} >
78
- <ContentComponent blocks={blocks} agent={agent} />
79
- </div>
80
- )
81
- }
82
-
83
- const Content: React.FC<{
84
- block: ScreenfulBlock
85
- agent?: string
86
- className?: string
87
- }> = ({
88
- block: b,
89
- agent,
90
- className='',
91
- }) => {
92
-
93
- // We need to set h-full when we have more than 1 column too, so the grid takes full height - Firefox and Safari fix.
94
- const layoutClx = 'flex flex-col gap-2 sm:gap-4 h-full ' + ((agent !== 'phone') ? ('md:grid md:gap-8 ' + `md:grid-cols-${b.contentColumns.length} `) : '')
95
-
96
- const orderclx = (columnIndex: number): string => {
97
- const orderIndex = b.mobileOrder?.indexOf(columnIndex)
98
- return (orderIndex && orderIndex >= 0) ? `order-${orderIndex} md:order-none` : '' // one-based in flexbox slec
99
- }
100
-
101
- return b.contentColumns.length == 1 ? (
102
- <ContentColumn
103
- blocks={b.contentColumns[0]}
104
- specifiers={b.columnSpecifiers?.[0]}
105
- agent={agent}
106
- className={cn(className)}
107
- />
108
- ) : (
109
- <div className={cn(layoutClx, className)}>
110
- {b.contentColumns.map((column, index) => (
111
- <ContentColumn
112
- blocks={column}
113
- specifiers={b.columnSpecifiers?.[index]}
114
- agent={agent}
115
- className={orderclx(index)}
116
- key={index}
117
- />
118
- ))}
119
- </div>
120
- )
121
- }
122
-
123
- export default Content
@@ -1,107 +0,0 @@
1
- 'use client'
2
-
3
- import React from 'react'
4
- import dynamic from 'next/dynamic'
5
-
6
- import type { Block, ScreenfulBlock, VideoBlock } from '../../def'
7
- import { containsToken, cn } from '../../../util'
8
- import { ApplyTypography } from '../../../primitives/index-common'
9
-
10
- import Poster from './poster-background'
11
- import Content from './content'
12
- const Video = dynamic(() => (import('./video-background')), {ssr: false, loading: () => (<></>)})
13
-
14
- const ScreenfulComponent: React.FC<{
15
- block: Block
16
- agent?: string
17
- initialInView?: boolean
18
- snapTile?: boolean
19
- clx?: string
20
- contentClx?: string
21
- bottom?: React.ReactNode
22
- }> = ({
23
- block,
24
- agent,
25
- initialInView=false,
26
- snapTile=false,
27
- clx='',
28
- contentClx='',
29
- bottom
30
- }) => {
31
-
32
- if (block.blockType !== 'screenful') {
33
- return <>screenful block required</>
34
- }
35
- const b = block as ScreenfulBlock
36
-
37
- const hasBannerVideo = (): boolean => (!!b.banner && (typeof b.banner === 'object'))
38
-
39
- const tileHeight = (agent === 'desktop') ? 'h-full ' : 'h-[100svh] '
40
-
41
- const specified = (s: string) => (containsToken(b.specifiers, s))
42
- const narrowGutters = specified('narrow-gutters') // eg, for a table object that is large
43
- const noGutters = specified('no-gutters')
44
- const fullScreenWidth = specified('full-screen-width')
45
- const vertCenter = specified('vert-center') // at the main level, it seems only useful w one column
46
- const oneColumn = b.contentColumns.length === 1
47
-
48
- // content wrapper clx:
49
- // [
50
- // positioning,
51
- // p&m,
52
- // p&m-modifiers
53
- // ]
54
- const cwclx = [
55
- 'xl:mx-auto overflow-y-hidden h-full',
56
- fullScreenWidth ? '' : 'max-w-screen-xl',
57
- // desktop header: 80px / pt-20
58
- // mobile header: 44px / pt-11
59
- narrowGutters ?
60
- 'px-6 lg:px-8 2xl:px-2 pb-4 lg:pb-6 xl:pb-8 ' + (snapTile ? 'pt-15 md:pt-26 lg:pt-28 ' : '') // otherwise assume there is a Main
61
- :
62
- noGutters ?
63
- 'px-0 pb-0 ' + (snapTile ? 'pt-11 lg:pt-20 ' : '') // otherwise assume there is a Main
64
- :
65
- 'px-[8vw] xl:px-[1vw] pb-[8vh] pt-[calc(44px+4vh)] md:pt-[calc(80px+6vh)] ',
66
-
67
- (agent && agent !== 'desktop') ? 'pt-15 sm:pt-17 pb-0 px-3 sm:px-8' : ''
68
- ]
69
-
70
- return (
71
- <section {...((b.anchorId) ? {id: b.anchorId} : {})} className={cn(
72
- snapTile ? 'snap-start snap-always h-[100vh]' : 'min-h-screen',
73
- bottom ? 'flex flex-col' : '',
74
- clx
75
- )}>
76
- <ApplyTypography className={cn(
77
- 'w-full flex flex-row justify-center self-stretch',
78
- snapTile ? tileHeight : '',
79
- bottom ? 'grow' : ''
80
- )}>
81
- <Poster banner={b.banner}>
82
- {hasBannerVideo() && (
83
- <Video
84
- block={b.banner! as VideoBlock}
85
- className='absolute top-0 left-0 bottom-0 right-0'
86
- initialInView={initialInView}
87
- />
88
- )}
89
- <div className={cn(
90
- ...cwclx,
91
- snapTile ? 'absolute left-0 right-0 top-0 bottom-0 ' : 'flex min-h-screen w-full',
92
- contentClx,
93
- // TODO :aa py-0 breaks padding for header! Investigate why I would have done this!
94
- vertCenter ? 'self-center ' + (oneColumn ? '!py-0' : '' ) : ''
95
- )}
96
- >
97
- <Content block={b} agent={agent} className='w-full'/>
98
- {b.footer}
99
- </div>
100
- </Poster>
101
- </ApplyTypography>
102
- {bottom}
103
- </section>
104
- )
105
- }
106
-
107
- export default ScreenfulComponent
@@ -1,34 +0,0 @@
1
- import React, { PropsWithChildren } from 'react'
2
-
3
- import type { VideoBlock } from '../../def'
4
- import { cn } from '../../../util'
5
-
6
- const Poster: React.FC<{
7
- banner: VideoBlock | string | undefined,
8
- className?: string
9
- } & PropsWithChildren> = ({
10
- children,
11
- banner,
12
- className=''
13
- }) => (
14
- banner ? (
15
- <div
16
- className={cn('relative', className)}
17
- style={{
18
- height: '100%',
19
- width: '100%',
20
- backgroundImage: `url(${(typeof banner === 'string') ? banner : banner.poster!})`,
21
- backgroundSize: 'cover',
22
- backgroundRepeat: 'no-repeat',
23
- }}
24
- >
25
- {children}
26
- </div>
27
- ) : (
28
- <div className={cn('bg-transparent h-full w-full relative', className)}>
29
- {children}
30
- </div>
31
- )
32
- )
33
-
34
- export default Poster
@@ -1,45 +0,0 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import { useInView } from 'react-intersection-observer'
5
-
6
- import type { VideoBlock } from '../../def'
7
-
8
- const VideoBG: React.FC<{
9
- block: VideoBlock,
10
- className?: string,
11
- initialInView: boolean
12
- }> = ({
13
- block,
14
- className='',
15
- initialInView
16
- }) => {
17
- const { ref, inView } = useInView({
18
- threshold: 0.75,
19
- initialInView,
20
- })
21
-
22
- return block ? (
23
- <div ref={ref} className={className}>
24
- {inView && (
25
- <video
26
- autoPlay
27
- loop
28
- muted
29
- style={{
30
- margin: 0,
31
- height: '100%',
32
- width: '100%',
33
- objectFit: 'cover',
34
- }}
35
- >
36
- {block.sources?.map((src, index) => (
37
- <source key={index} src={src} />
38
- ))}
39
- </video>
40
- )}
41
- </div>
42
- ) : null
43
- }
44
-
45
- export default VideoBG
@@ -1,66 +0,0 @@
1
- import React from 'react'
2
-
3
- import { ldMerge, cn } from '../../util'
4
-
5
- import type { Breakpoint } from '../../types'
6
- import { SPACE_DEFAULTS , type TWSpaceUnit, type HeadingLevel} from '../def/space-block'
7
- import type SpaceBlock from '../def/space-block'
8
- import { ApplyTypography } from '../../primitives/index-common'
9
-
10
- import type BlockComponentProps from './block-component-props'
11
-
12
- const TAGS = [
13
- 'div',
14
- 'h1',
15
- 'h2',
16
- 'h3',
17
- 'h4',
18
- 'h5',
19
- 'h6',
20
- ] satisfies React.ElementType[]
21
-
22
- const SpaceBlockComponent: React.FC<BlockComponentProps> = ({
23
- block,
24
- className=''
25
- }) => {
26
-
27
- if (block && block.blockType !== 'space') {
28
- return <>space block required</>
29
- }
30
-
31
- const b = block as SpaceBlock
32
-
33
- // This code path should handle a undefined or empty sizes field.
34
- if (!b.level) {
35
- if (typeof b.sizes == 'number') {
36
- return <div className={cn(`invisible w-[1px] h-${b.sizes}`, className) } />
37
- }
38
- const _sizes: {
39
- [key in (Breakpoint)]?: TWSpaceUnit
40
- } = {}
41
- ldMerge(_sizes, SPACE_DEFAULTS, b.sizes)
42
-
43
- let clx = ''
44
- for (const [key, value] of Object.entries(_sizes)) {
45
- // ts brain fart!
46
- clx += `${key}:h-${value as TWSpaceUnit} `
47
- }
48
-
49
- if (b.test) {
50
- console.log(clx)
51
- }
52
-
53
- return <div className={cn('invisible w-[1px] ' + clx, className)} />
54
- }
55
-
56
- const Tag = TAGS[b.level]
57
- const heightClx = (b.level === (0 satisfies HeadingLevel as HeadingLevel)) ? 'h-4' : ''
58
-
59
- return (
60
- <ApplyTypography className={className}>
61
- <Tag className={'invisible m-0 ' + heightClx} >&nbsp;</Tag>
62
- </ApplyTypography>
63
- )
64
- }
65
-
66
- export default SpaceBlockComponent