@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,70 +0,0 @@
1
- import React, { ComponentType, type ReactNode} from 'react'
2
-
3
- import type * as B from '../def'
4
-
5
- import AccordianBlockComponent from './accordian-block'
6
- import BulletCardsBlockComponent from './bullet-cards-block'
7
- import CTABlockComponent from './cta-block'
8
- import CardBlockComponent from './card-block'
9
- import CarteBlancheBlockComponent from './carte-blanche-block'
10
- import EnhHeadingBlockComponent from './enh-heading-block'
11
- import HeadingBlockComponent from './heading-block'
12
- import GroupBlockComponent from './group-block'
13
- import GridBlockComponent from './grid-block'
14
- import ImageBlockComponent from './image-block'
15
- import SpaceBlockComponent from './space-block'
16
- import VideoBlockComponent from './video-block'
17
-
18
- import type BlockComponentProps from './block-component-props'
19
-
20
- const map = new Map<string, ComponentType<BlockComponentProps>>()
21
- map.set('accordian', AccordianBlockComponent)
22
- map.set('bullet-cards', BulletCardsBlockComponent)
23
- map.set('card', CardBlockComponent)
24
- map.set('carte-blanche', CarteBlancheBlockComponent)
25
- map.set('cta', CTABlockComponent)
26
- map.set('heading', HeadingBlockComponent)
27
- map.set('enh-heading', EnhHeadingBlockComponent as ComponentType<BlockComponentProps>)
28
- map.set('space', SpaceBlockComponent)
29
- map.set('image', ImageBlockComponent)
30
- map.set('video', VideoBlockComponent)
31
- map.set('group', GroupBlockComponent)
32
- map.set('grid', GridBlockComponent)
33
-
34
- const registerBlockType = (key: string, type: ComponentType<BlockComponentProps>): void => {
35
- map.set(key, type)
36
- }
37
-
38
- const renderBlock = (block: B.Block, className: string, agent?: string, keyStr?: string): ReactNode => {
39
- if (block.blockType === 'element') {
40
- return (block as B.ElementBlock).element
41
- }
42
- const CompType = map.get(block.blockType)
43
- if (!CompType) return null
44
- return <CompType block={block} className={className} agent={agent} key={keyStr ?? ''} />
45
- }
46
-
47
- const ContentComponent: React.FC<{
48
- blocks: B.Block | B.Block[] | undefined
49
- className?: string
50
- agent?: string
51
- }> = ({
52
- blocks,
53
- className='',
54
- agent
55
- }) => {
56
- if (!blocks) return null
57
- if (Array.isArray(blocks)) {
58
- return (
59
- blocks.map((block, index) => (
60
- renderBlock(block, className, agent, `content-block-${block.blockType}-${index}`)
61
- ))
62
- )
63
- }
64
- return renderBlock(blocks, className, agent)
65
- }
66
-
67
- export {
68
- ContentComponent as default,
69
- registerBlockType
70
- }
@@ -1,115 +0,0 @@
1
- import React from 'react'
2
-
3
- import type { LinkDef, ButtonDef} from '../../types'
4
- import { buttonVariants, ActionButton, LinkElement } from '../../primitives/index-next'
5
- import type { CTABlock } from '../def'
6
- import { cn, containsToken, type VariantProps } from '../../util'
7
-
8
- import type BlockComponentProps from './block-component-props'
9
-
10
- const CtaBlockComponent: React.FC<BlockComponentProps & {
11
- itemClasses?: string
12
- itemSize?: VariantProps<typeof buttonVariants>['size'],
13
- renderLink?: (def: LinkDef, key: any) => JSX.Element
14
- renderButton?: (def: ButtonDef, key: any) => JSX.Element
15
- }> = ({
16
- block,
17
- className='', // assigned to each item
18
- itemClasses='',
19
- itemSize, // do not provide default. this is an override to the def
20
- renderLink,
21
- renderButton,
22
- agent
23
- }) => {
24
-
25
- if (block.blockType !== 'cta') {
26
- return <>cta block required</>
27
- }
28
-
29
- const { elements, specifiers } = block as CTABlock
30
- let wrapperClasses = ''
31
- let itemclx = ''
32
- if (containsToken(specifiers, 'fill')) {
33
- wrapperClasses += 'w-full '
34
- itemclx += 'grow shrink !min-w-0'
35
- }
36
- else if (containsToken(specifiers, 'left')) {
37
- wrapperClasses += 'md:justify-start '
38
- }
39
- else if (containsToken(specifiers, 'right')) {
40
- wrapperClasses += 'md:justify-end '
41
- }
42
- else {
43
- wrapperClasses += 'md:justify-center '
44
- }
45
-
46
- const mobile2Columns = containsToken(specifiers, 'mobile-2-columns')
47
- // normally 'default' buttons have a min width only at > lg.
48
- // generally if more than one we don't want this and override it,
49
- // but this specifier asks to observe the default behavior.
50
- const fillEvenly = !containsToken(specifiers, 'desktop-dont-fill')
51
- const mobileCenterFirstIfOdd = containsToken(specifiers, 'mobile-center-first-if-odd')
52
- const mobileOddFullWidth = containsToken(specifiers, 'mobile-odd-full-width')
53
-
54
- let layoutclx: string | undefined = undefined
55
- if (elements.length > 1) {
56
- let resetMinWidth = false
57
- if (mobile2Columns) {
58
- layoutclx = 'grid grid-cols-2 gap-2 self-stretch '
59
- resetMinWidth = true
60
- }
61
- if (fillEvenly) {
62
- layoutclx = (layoutclx ?? 'grid grid-cols-2 gap-2 self-stretch')
63
- resetMinWidth = true
64
- }
65
- else {
66
- layoutclx = layoutclx ? (layoutclx + 'md:flex md:flex-row md:justify-center ') : 'flex flex-row justify-center '
67
- }
68
- itemclx += resetMinWidth ? '!min-w-0 ' : ''
69
- }
70
- layoutclx = layoutclx ?? 'flex flex-col items-stretch gap-2 self-stretch md:flex-row sm:justify-center '
71
-
72
- const getMobileColSpanClx = (index: number, total: number) => {
73
- const indexToCenter = (total % 2 === 0) ? -1 : (mobileCenterFirstIfOdd) ? 0 : total - 1
74
- const widthclx = mobileOddFullWidth ? 'w-full ' : 'w-3/5 mx-auto '
75
- return (
76
- (agent === 'phone' && mobile2Columns && (index === indexToCenter)) ? ('col-span-2 ' + widthclx) : ''
77
- )
78
- }
79
-
80
- return (
81
- <div className={cn(
82
- layoutclx,
83
- wrapperClasses,
84
- className
85
- )}>
86
- {elements.map((element, index) => {
87
- const twoColClx = getMobileColSpanClx(index, elements.length)
88
- if ((element as any).title) {
89
- const def = element as LinkDef
90
- return renderLink ? renderLink(def, index) : (
91
- <LinkElement
92
- def={def}
93
- key={index}
94
- size={itemSize}
95
- className={cn(itemclx, itemClasses, twoColClx)}
96
- />
97
- )
98
- }
99
- else {
100
- const def = element as ButtonDef
101
- return renderButton ? renderButton(def, index) : (
102
- <ActionButton
103
- def={def}
104
- key={index}
105
- size={itemSize}
106
- className={cn(itemclx, itemClasses, twoColClx)}
107
- />
108
- )
109
- }
110
- })}
111
- </div>
112
- )
113
- }
114
-
115
- export default CtaBlockComponent
@@ -1,204 +0,0 @@
1
- import React, {type ElementType} from 'react'
2
-
3
- import type { EnhHeadingBlock } from '../def'
4
- import { ApplyTypography } from '../../primitives/index-common'
5
- import { cn, containsToken } from '../../util'
6
-
7
- import type BlockComponentProps from './block-component-props'
8
- import InlineIcon from '../../primitives/next/inline-icon'
9
-
10
- const DEFAULTS = {
11
- preheading: {
12
- tag: 'h4' as ElementType,
13
- mb: 2
14
- },
15
- heading: {
16
- tag: 'h1' as ElementType,
17
- mb: 2
18
- },
19
- byline: {
20
- tag: 'h6' as ElementType,
21
- }
22
- }
23
-
24
- const tagFromLevel = (level: number): ElementType => {
25
- switch (level) {
26
- case 1: {
27
- return 'h1'
28
- }
29
- case 2: {
30
- return 'h2'
31
- }
32
- case 3: {
33
- return 'h3'
34
- }
35
- case 4: {
36
- return 'h4'
37
- }
38
- case 5: {
39
- return 'h5'
40
- }
41
- case 6: {
42
- return 'h6'
43
- }
44
- }
45
- return 'p'
46
- }
47
-
48
- // TODO Impl icon support
49
- const Element: React.FC<{
50
- asTag: ElementType
51
- text: string
52
- icon?: React.ReactNode
53
- iconLeft?: boolean
54
- className?: string
55
- }> = ({
56
- asTag: Tag,
57
- text,
58
- icon,
59
- iconLeft=true,
60
- className : elClassName=''
61
- }) => (
62
- <Tag className={elClassName}>{text}</Tag>
63
- )
64
-
65
- const getPositionClx = (
66
- specified: (s: string) => boolean,
67
- agent: string | undefined
68
- ): {
69
- preheading: string
70
- heading: string
71
- byline: string
72
- } => {
73
-
74
- const mobileHeadingCentered = specified('mobile-heading-centered')
75
- const mobileHeadingLeft = specified('mobile-heading-left')
76
- const headingCentered = specified('center')
77
- const headingRight = specified('right')
78
- const bylineCentered = specified('byline-center')
79
- const bylineRight = specified('byline-right')
80
- const mobileBylineLeft = specified('mobile-byline-left')
81
-
82
- let headerclx = ''
83
- let bylineclx = (bylineCentered) ?
84
- 'self-center !text-center' : (bylineRight ? 'self-end !text-right' : 'self-start !text-left')
85
-
86
- if (agent === 'phone') {
87
- if (mobileHeadingLeft) {
88
- headerclx = 'self-start text-left'
89
- } else {
90
- headerclx = (mobileHeadingCentered || headingCentered) ?
91
- 'self-center text-center' : (headingRight ? 'self-end text-right' : 'self-start text-left')
92
- }
93
-
94
- if (mobileBylineLeft) {
95
- bylineclx = 'self-start !text-left'
96
- }
97
- }
98
- else {
99
- const largerclx = (headingCentered) ?
100
- 'self-center text-center' : (headingRight ? 'self-end text-right' : 'self-start text-left')
101
-
102
- if (mobileHeadingCentered) {
103
- headerclx = 'self-center text-center md:' + largerclx.split(' ').join(' md:')
104
- }
105
- else {
106
- headerclx = largerclx
107
- }
108
- }
109
-
110
- return {
111
- preheading: headerclx,
112
- heading: headerclx,
113
- byline: bylineclx
114
- }
115
- }
116
-
117
- const EnhHeadingBlockComponent: React.FC<
118
- BlockComponentProps & {
119
- applyTypography?: boolean
120
- extraSpecifiers?: string
121
- }> = ({
122
- block,
123
- className='',
124
- agent,
125
- applyTypography=true,
126
- extraSpecifiers=''
127
- }) => {
128
-
129
- if (block.blockType !== 'enh-heading') {
130
- return <>enhance heading block required</>
131
- }
132
- const b = block as EnhHeadingBlock
133
- const specified = (s: string) => (containsToken(b.specifiers + extraSpecifiers, s))
134
- const preheadingHeadingFont = specified('preheading-heading-font')
135
- const phFontClx = preheadingHeadingFont ? 'font-heading' : ''
136
- const alignMiddleClx = specified('align-middle') ? 'my-auto' : ''
137
-
138
- const positionclx = getPositionClx(specified, agent)
139
-
140
- const Inner: React.FC = () => {
141
- const toRender = [
142
- {
143
- tag: (b.preheading) ?
144
- (b.preheading.level !== undefined ? tagFromLevel(b.preheading.level) : DEFAULTS.preheading.tag)
145
- :
146
- undefined,
147
- clx: (b.preheading) ?
148
- (b.preheading.mb !== undefined ?
149
- `mb-${b.preheading.mb}` : `mb-${DEFAULTS.preheading.mb}`) + ' ' + positionclx.preheading + ' ' + phFontClx
150
- :
151
- positionclx.preheading + ' ' + phFontClx,
152
- text: (b.preheading) ? (b.preheading.text ) : undefined,
153
- },
154
- {
155
- tag: (b.heading.level !== undefined ? tagFromLevel(b.heading.level) : DEFAULTS.heading.tag),
156
- clx: (b.heading.mb !== undefined ? `mb-${b.heading.mb}` : `mb-${DEFAULTS.heading.mb}`) + ' ' + positionclx.heading,
157
- text: b.heading.text,
158
- },
159
- {
160
- tag: (b.byline) ?
161
- (b.byline.level !== undefined ? tagFromLevel(b.byline.level) : DEFAULTS.byline.tag)
162
- :
163
- undefined,
164
- clx: positionclx.byline,
165
- text: (b.byline) ? (b.byline.text ) : undefined,
166
- },
167
- ] as {
168
- tag: ElementType
169
- clx: string
170
- text: string
171
- }[]
172
-
173
- let iconRendered = false
174
- return <>
175
- {toRender.map(({tag, clx, text}, index) => {
176
- if (!tag) return null
177
- if (b.icon && !iconRendered) {
178
- iconRendered = true
179
- return (
180
- <div className={cn('flex flex-row items-center gap-2 sm:gap-4', clx)} key={`div-${index}`}>
181
- <InlineIcon icon={b.icon} size={b.iconSize ?? 32} agent={agent}/>
182
- <Element asTag={tag} text={text} />
183
- </div>
184
- )
185
- }
186
- return (
187
- (<Element asTag={tag} text={text} className={clx} key={`el-${index}`}/>)
188
- )
189
- })}
190
- </>
191
- }
192
-
193
- return applyTypography ? (
194
- <ApplyTypography className={cn('flex flex-col w-full !gap-0', className, alignMiddleClx)}>
195
- <Inner />
196
- </ApplyTypography>
197
- ) : (
198
- <div className={cn('flex flex-col w-full gap-0', className, alignMiddleClx)}>
199
- <Inner />
200
- </div>
201
- )
202
- }
203
-
204
- export default EnhHeadingBlockComponent
@@ -1,12 +0,0 @@
1
- interface GridBlockMutator {
2
- gapClx?: string
3
- getCellClx?: (
4
- cellIndex: number,
5
- cellCount: number,
6
- colCount: number
7
- ) => string
8
- }
9
-
10
- export {
11
- type GridBlockMutator as default
12
- }
@@ -1,83 +0,0 @@
1
- import React, { PropsWithChildren } from 'react'
2
-
3
- import { cn, containsToken } from '../../../util'
4
- import type { GridBlock } from '../../def'
5
- import type { GridColumnSpec } from '../../../types'
6
-
7
- import Content from '../content'
8
- import type BlockComponentProps from '../block-component-props'
9
-
10
- import getMutator from './mutator-registry'
11
-
12
- // These must be / are safelisted in tailwind.config
13
- const gridClx = (d: GridColumnSpec, prefix?: string ): string => (
14
- (typeof d === 'number') ?
15
- `${(prefix ?? '')}grid-cols-${d} `
16
- :
17
- `${(prefix ?? '')}grid-cols-${d.columns} ${(prefix ?? '')}gap-${d.gap} `
18
- )
19
-
20
- /**
21
- * A component that lays out the Blocks in 'cells' on a grid.
22
- * If invoked directly, and children are supplied,
23
- * block.cells is ignore and the children are rendered.
24
- */
25
- const GridBlockComponent: React.FC<
26
- BlockComponentProps & PropsWithChildren
27
- > = ({
28
- block,
29
- className='',
30
- agent,
31
- children
32
- }) => {
33
-
34
- if (block.blockType !== 'grid') {
35
- return <>grid block required</>
36
- }
37
-
38
- const { cells, grid, specifiers } = block as GridBlock
39
- const specified = (s: string) => (containsToken(specifiers, s))
40
- const mutator = specified('style-table-borders') ? getMutator('style-table-borders') : undefined
41
-
42
- // https://tailwindcss.com/docs/content-configuration#dynamic-class-names
43
- // All variants in use MUST be in style/safelist.tailwind.js
44
- let clx = 'grid '
45
- if (agent === 'phone') {
46
- const d = (grid.mobile) ? grid.mobile : (grid.at.xs ? grid.at.xs : (grid.at.sm ?? 1))
47
- clx += gridClx(d)
48
- }
49
- else {
50
- let defaultSet = false
51
- for (const [key, value] of Object.entries(grid.at)) {
52
- if (!defaultSet) {
53
- // ts brain fart!
54
- clx += gridClx(value as GridColumnSpec)
55
- defaultSet = true
56
- }
57
- else {
58
- // ts brain fart!
59
- clx += gridClx(value as GridColumnSpec, `${key}:`)
60
- }
61
- }
62
- }
63
-
64
- let getMutatorCellClx = (ignore: number): string => ('')
65
- if (mutator?.getCellClx) {
66
- const colCount = (typeof grid.at.md! === 'number') ? grid.at.md! as number : grid.at.md!.columns
67
- const cellCount = cells?.length
68
- if (!colCount || !cellCount) {
69
- throw new Error('GridBlockComponent: using mutator, but colCount and / or cellCount is invalid!')
70
- }
71
- getMutatorCellClx = (cellIndex: number) => ( mutator!.getCellClx!(cellIndex, cellCount, colCount) )
72
- }
73
-
74
- return (
75
- <div className={cn('grid gap-2 md:gap-4 xl:gap-6', clx, (mutator?.gapClx ?? ''), className)}>
76
- {React.Children.count(children) > 0 ? children : cells?.map((cell, index) => (
77
- <Content blocks={cell} agent={agent} key={`cell-${index}`} className={getMutatorCellClx(index)}/>
78
- ))}
79
- </div>
80
- )
81
- }
82
-
83
- export default GridBlockComponent
@@ -1,10 +0,0 @@
1
- import type GridBlockMutator from './grid-block-mutator'
2
-
3
- import tableBorders from './table-borders.mutator'
4
-
5
- const map = new Map<string, GridBlockMutator>()
6
- map.set('style-table-borders', tableBorders)
7
-
8
- // get
9
- export default (key: string): GridBlockMutator | undefined => (map.get(key))
10
-
@@ -1,47 +0,0 @@
1
- import type GridBlockMutator from './grid-block-mutator'
2
-
3
- const getCellClx = (
4
- cellIndex: number,
5
- cellCount: number,
6
- colCount: number
7
- ): string => {
8
-
9
- const isFirstRow = (): boolean => (cellIndex < colCount)
10
- const isFirstColumn = (): boolean => (cellIndex % colCount === 0)
11
- const isTLCorner = (): boolean => (cellIndex === 0)
12
- const isTRCorner = (): boolean => (cellIndex === colCount -1 )
13
- const isBLCorner = (): boolean => (cellIndex === cellCount - colCount)
14
- const isBRCorner = (): boolean => (cellIndex === cellCount - 1)
15
-
16
- // all get a right and bottom border and padding,
17
- // other borders are a special base
18
- let clx = 'border-b md:border-r p-4 md:p-8 lg:p-12 '
19
- if (isFirstRow()) {
20
- clx += 'border-t '
21
- }
22
- if (isFirstColumn()) {
23
- clx += 'md:border-l '
24
- }
25
- // on mobile this will be the first (top) cell
26
- if (isTLCorner()) {
27
- clx += 'border-t md:rounded-tl-lg '
28
- }
29
- else if (isTRCorner()) {
30
- clx += 'md:rounded-tr-lg '
31
- }
32
- else if (isBLCorner()) {
33
- clx += 'md:rounded-bl-lg '
34
- }
35
- else if (isBRCorner()) {
36
- clx += 'md:rounded-br-lg '
37
- }
38
-
39
- return clx
40
- }
41
-
42
- const gapClx = 'gap-0 md:gap-0 xl:gap-0'
43
-
44
- export default {
45
- getCellClx,
46
- gapClx
47
- } as GridBlockMutator
@@ -1,83 +0,0 @@
1
- import React from 'react'
2
-
3
- import { Breakpoints} from '../../types'
4
- import { cn } from '../../util'
5
-
6
- import type { Block, GroupBlock } from '../def'
7
- import Content from './content'
8
-
9
- // eg: 'layout-grid-2-starting-md'
10
- // see comments below regarding dynamic classes and the safelist
11
- const getLayoutInfo = (s: string): {
12
- layout: string
13
- spec: any
14
- } | undefined => {
15
- const tokenArray = s.split(' ')
16
- const layoutToken = tokenArray.find((tok) => (tok.startsWith('layout-')))
17
- if (layoutToken) {
18
- const subtokens = layoutToken.split('-')
19
- const layout = subtokens[1]
20
- let spec: any = {}
21
- switch (layout) {
22
- case 'grid': {
23
- const columns = parseInt(subtokens[2], 10)
24
- const starting = subtokens[4]
25
- if (Number.isNaN(columns) || columns < 2 || columns > 6 || !Breakpoints.includes(starting)) {
26
- return undefined
27
- }
28
- spec = {
29
- columns,
30
- starting
31
- }
32
- } break
33
- // no other types supported yet
34
- }
35
- return {
36
- layout,
37
- spec
38
- }
39
- }
40
- return undefined
41
- }
42
-
43
- const GroupBlockComponent: React.FC<{
44
- block: Block
45
- className?: string,
46
- }> = ({
47
- block,
48
- className=''
49
- }) => {
50
-
51
- if (block.blockType !== 'group') {
52
- return <>group block required</>
53
- }
54
-
55
- const group = block as GroupBlock
56
-
57
- // only one supported so fat
58
- if (group.specifiers?.includes('layout')) {
59
- const layoutSpec = getLayoutInfo(group.specifiers)
60
- if (!layoutSpec) {
61
- return <>invalid or missing layout specifier in group block!</>
62
- }
63
-
64
- if (layoutSpec.layout === 'grid') {
65
- const { elements } = group
66
- const { spec: {starting, columns} } = layoutSpec
67
-
68
- // https://tailwindcss.com/docs/content-configuration#dynamic-class-names
69
- // All variants in use MUST be in style/safelist.tailwind.js
70
- const clazzName = cn('grid xs:grid-cols-1 gap-2 sm:gap-3',
71
- `${starting}:grid-cols-${columns} `,
72
- className)
73
- return (
74
- <div className={clazzName}>
75
- <Content blocks={elements} />
76
- </div>
77
- )
78
- }
79
- }
80
- return null
81
- }
82
-
83
- export default GroupBlockComponent