@brilo/base-blocks 0.1.1 → 0.1.2

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 (244) hide show
  1. package/package.json +3 -2
  2. package/src/blocks/column/column-group/edit.tsx +56 -0
  3. package/src/blocks/column/column-group/editor.scss +7 -0
  4. package/src/blocks/column/column-group/factory.tsx +29 -0
  5. package/src/blocks/column/column-group/index.ts +14 -0
  6. package/src/blocks/column/column-group/types.ts +8 -0
  7. package/src/blocks/column/column-item/constants.ts +1 -0
  8. package/src/blocks/column/column-item/edit.tsx +48 -0
  9. package/src/blocks/column/column-item/editor.scss +34 -0
  10. package/src/blocks/column/column-item/factory.tsx +25 -0
  11. package/src/blocks/column/column-item/index.ts +10 -0
  12. package/src/blocks/column/column-item/types.ts +7 -0
  13. package/src/blocks/compare/compare-group/constants.ts +1 -0
  14. package/src/blocks/compare/compare-group/edit.tsx +52 -0
  15. package/src/blocks/compare/compare-group/factory.tsx +29 -0
  16. package/src/blocks/compare/compare-group/icon.tsx +7 -0
  17. package/src/blocks/compare/compare-group/index.ts +13 -0
  18. package/src/blocks/compare/compare-group/types.ts +12 -0
  19. package/src/blocks/compare/compare-item/edit.tsx +38 -0
  20. package/src/blocks/compare/compare-item/editor.scss +15 -0
  21. package/src/blocks/compare/compare-item/factory.tsx +28 -0
  22. package/src/blocks/compare/compare-item/icon.tsx +9 -0
  23. package/src/blocks/compare/compare-item/index.ts +13 -0
  24. package/src/blocks/compare/compare-item/types.ts +9 -0
  25. package/src/blocks/compare/compare-option/constants.ts +7 -0
  26. package/src/blocks/compare/compare-option/edit.tsx +64 -0
  27. package/src/blocks/compare/compare-option/editor.scss +26 -0
  28. package/src/blocks/compare/compare-option/factory.tsx +35 -0
  29. package/src/blocks/compare/compare-option/icon.tsx +7 -0
  30. package/src/blocks/compare/compare-option/index.ts +8 -0
  31. package/src/blocks/compare/compare-option/types.ts +12 -0
  32. package/src/blocks/contact/contact-group/constants.ts +3 -0
  33. package/src/blocks/contact/contact-group/edit.tsx +57 -0
  34. package/src/blocks/contact/contact-group/editor.scss +20 -0
  35. package/src/blocks/contact/contact-group/factory.tsx +35 -0
  36. package/src/blocks/contact/contact-group/index.ts +12 -0
  37. package/src/blocks/contact/contact-group/types.ts +12 -0
  38. package/src/blocks/contact/contact-item/constants.ts +17 -0
  39. package/src/blocks/contact/contact-item/edit.tsx +93 -0
  40. package/src/blocks/contact/contact-item/editor.scss +38 -0
  41. package/src/blocks/contact/contact-item/factory.tsx +35 -0
  42. package/src/blocks/contact/contact-item/index.ts +23 -0
  43. package/src/blocks/contact/contact-item/types.ts +21 -0
  44. package/src/blocks/core/basic-button/constants.ts +17 -0
  45. package/src/blocks/core/basic-button/edit.tsx +107 -0
  46. package/src/blocks/core/basic-button/editor.scss +80 -0
  47. package/src/blocks/core/basic-button/factory.tsx +54 -0
  48. package/src/blocks/core/basic-button/index.ts +8 -0
  49. package/src/blocks/core/basic-button/types.ts +29 -0
  50. package/src/blocks/core/basic-heading/constants.ts +1 -0
  51. package/src/blocks/core/basic-heading/edit.tsx +76 -0
  52. package/src/blocks/core/basic-heading/editor.scss +8 -0
  53. package/src/blocks/core/basic-heading/factory.tsx +40 -0
  54. package/src/blocks/core/basic-heading/index.ts +8 -0
  55. package/src/blocks/core/basic-heading/types.ts +20 -0
  56. package/src/blocks/core/basic-overline/edit.tsx +28 -0
  57. package/src/blocks/core/basic-overline/editor.scss +14 -0
  58. package/src/blocks/core/basic-overline/factory.tsx +22 -0
  59. package/src/blocks/core/basic-overline/index.ts +8 -0
  60. package/src/blocks/core/basic-overline/types.ts +7 -0
  61. package/src/blocks/faq/faq-group/constants.ts +11 -0
  62. package/src/blocks/faq/faq-group/edit.tsx +55 -0
  63. package/src/blocks/faq/faq-group/editor.scss +11 -0
  64. package/src/blocks/faq/faq-group/factory.tsx +39 -0
  65. package/src/blocks/faq/faq-group/index.ts +11 -0
  66. package/src/blocks/faq/faq-group/types.ts +14 -0
  67. package/src/blocks/faq/faq-item/edit.tsx +50 -0
  68. package/src/blocks/faq/faq-item/editor.scss +57 -0
  69. package/src/blocks/faq/faq-item/factory.tsx +24 -0
  70. package/src/blocks/faq/faq-item/index.ts +9 -0
  71. package/src/blocks/faq/faq-item/types.ts +7 -0
  72. package/src/blocks/form/form-field/constants.ts +14 -0
  73. package/src/blocks/form/form-field/edit.tsx +178 -0
  74. package/src/blocks/form/form-field/editor.scss +71 -0
  75. package/src/blocks/form/form-field/factory.tsx +32 -0
  76. package/src/blocks/form/form-field/index.ts +10 -0
  77. package/src/blocks/form/form-field/types.ts +18 -0
  78. package/src/blocks/form/form-group/constants.ts +16 -0
  79. package/src/blocks/form/form-group/edit.tsx +190 -0
  80. package/src/blocks/form/form-group/editor.scss +41 -0
  81. package/src/blocks/form/form-group/factory.tsx +35 -0
  82. package/src/blocks/form/form-group/index.ts +18 -0
  83. package/src/blocks/form/form-group/types.ts +22 -0
  84. package/src/blocks/groups/banner-group/constants.ts +15 -0
  85. package/src/blocks/groups/banner-group/edit.tsx +122 -0
  86. package/src/blocks/groups/banner-group/editor.scss +18 -0
  87. package/src/blocks/groups/banner-group/factory.tsx +64 -0
  88. package/src/blocks/groups/banner-group/icon.tsx +13 -0
  89. package/src/blocks/groups/banner-group/index.ts +11 -0
  90. package/src/blocks/groups/banner-group/types.ts +30 -0
  91. package/src/blocks/groups/basic-header-group/constants.ts +9 -0
  92. package/src/blocks/groups/basic-header-group/edit.tsx +99 -0
  93. package/src/blocks/groups/basic-header-group/editor.scss +35 -0
  94. package/src/blocks/groups/basic-header-group/factory.tsx +46 -0
  95. package/src/blocks/groups/basic-header-group/icon.tsx +17 -0
  96. package/src/blocks/groups/basic-header-group/index.ts +9 -0
  97. package/src/blocks/groups/basic-header-group/types.ts +27 -0
  98. package/src/blocks/groups/button-group/constants.ts +7 -0
  99. package/src/blocks/groups/button-group/edit.tsx +52 -0
  100. package/src/blocks/groups/button-group/editor.scss +23 -0
  101. package/src/blocks/groups/button-group/factory.tsx +34 -0
  102. package/src/blocks/groups/button-group/index.ts +11 -0
  103. package/src/blocks/groups/button-group/types.ts +12 -0
  104. package/src/blocks/groups/text-and-media-group/constants.ts +43 -0
  105. package/src/blocks/groups/text-and-media-group/edit.tsx +241 -0
  106. package/src/blocks/groups/text-and-media-group/editor.scss +123 -0
  107. package/src/blocks/groups/text-and-media-group/factory.tsx +100 -0
  108. package/src/blocks/groups/text-and-media-group/icon.tsx +37 -0
  109. package/src/blocks/groups/text-and-media-group/index.ts +18 -0
  110. package/src/blocks/groups/text-and-media-group/types.ts +60 -0
  111. package/src/blocks/hero/hero-group/constants.ts +23 -0
  112. package/src/blocks/hero/hero-group/edit.tsx +85 -0
  113. package/src/blocks/hero/hero-group/editor.scss +0 -0
  114. package/src/blocks/hero/hero-group/factory.tsx +45 -0
  115. package/src/blocks/hero/hero-group/icon.tsx +28 -0
  116. package/src/blocks/hero/hero-group/index.ts +11 -0
  117. package/src/blocks/hero/hero-group/types.ts +22 -0
  118. package/src/blocks/hero/hero-item/constants.ts +15 -0
  119. package/src/blocks/hero/hero-item/edit.tsx +107 -0
  120. package/src/blocks/hero/hero-item/editor.scss +87 -0
  121. package/src/blocks/hero/hero-item/factory.tsx +49 -0
  122. package/src/blocks/hero/hero-item/index.ts +10 -0
  123. package/src/blocks/hero/hero-item/types.ts +38 -0
  124. package/src/blocks/map/map-group/constants.ts +20 -0
  125. package/src/blocks/map/map-group/edit.tsx +108 -0
  126. package/src/blocks/map/map-group/editor.scss +24 -0
  127. package/src/blocks/map/map-group/factory.tsx +51 -0
  128. package/src/blocks/map/map-group/index.ts +9 -0
  129. package/src/blocks/map/map-group/types.ts +16 -0
  130. package/src/blocks/newsletter/newsletter-form/constants.ts +5 -0
  131. package/src/blocks/newsletter/newsletter-form/edit.tsx +194 -0
  132. package/src/blocks/newsletter/newsletter-form/editor.scss +68 -0
  133. package/src/blocks/newsletter/newsletter-form/factory.tsx +59 -0
  134. package/src/blocks/newsletter/newsletter-form/index.ts +11 -0
  135. package/src/blocks/newsletter/newsletter-form/types.ts +45 -0
  136. package/src/blocks/post/post-slider-group/constants.ts +3 -0
  137. package/src/blocks/post/post-slider-group/edit.tsx +76 -0
  138. package/src/blocks/post/post-slider-group/factory.tsx +43 -0
  139. package/src/blocks/post/post-slider-group/icon.tsx +13 -0
  140. package/src/blocks/post/post-slider-group/index.ts +9 -0
  141. package/src/blocks/post/post-slider-group/types.ts +20 -0
  142. package/src/blocks/responsive-grid/responsive-grid-group/edit.tsx +95 -0
  143. package/src/blocks/responsive-grid/responsive-grid-group/factory.tsx +33 -0
  144. package/src/blocks/responsive-grid/responsive-grid-group/index.ts +13 -0
  145. package/src/blocks/responsive-grid/responsive-grid-group/types.ts +9 -0
  146. package/src/blocks/responsive-grid/responsive-grid-item/edit.tsx +19 -0
  147. package/src/blocks/responsive-grid/responsive-grid-item/factory.tsx +20 -0
  148. package/src/blocks/responsive-grid/responsive-grid-item/index.ts +9 -0
  149. package/src/blocks/responsive-grid/responsive-grid-item/types.ts +5 -0
  150. package/src/blocks/sections/base-section/attributes.ts +17 -0
  151. package/src/blocks/sections/base-section/constants.ts +18 -0
  152. package/src/blocks/sections/base-section/controls.tsx +70 -0
  153. package/src/blocks/sections/base-section/edit.tsx +34 -0
  154. package/src/blocks/sections/base-section/editor.scss +24 -0
  155. package/src/blocks/sections/base-section/factory.tsx +47 -0
  156. package/src/blocks/sections/base-section/icon.tsx +6 -0
  157. package/src/blocks/sections/base-section/index.ts +14 -0
  158. package/src/blocks/sections/base-section/types.ts +26 -0
  159. package/src/blocks/signpost/signpost-group/constants.ts +3 -0
  160. package/src/blocks/signpost/signpost-group/edit.tsx +75 -0
  161. package/src/blocks/signpost/signpost-group/editor.scss +0 -0
  162. package/src/blocks/signpost/signpost-group/factory.tsx +40 -0
  163. package/src/blocks/signpost/signpost-group/icon.tsx +19 -0
  164. package/src/blocks/signpost/signpost-group/index.ts +15 -0
  165. package/src/blocks/signpost/signpost-group/types.ts +9 -0
  166. package/src/blocks/signpost/signpost-item/constants.ts +4 -0
  167. package/src/blocks/signpost/signpost-item/edit.tsx +90 -0
  168. package/src/blocks/signpost/signpost-item/editor.scss +25 -0
  169. package/src/blocks/signpost/signpost-item/factory.tsx +29 -0
  170. package/src/blocks/signpost/signpost-item/icon.tsx +7 -0
  171. package/src/blocks/signpost/signpost-item/index.ts +10 -0
  172. package/src/blocks/signpost/signpost-item/types.ts +12 -0
  173. package/src/blocks/step/step-group/constants.ts +6 -0
  174. package/src/blocks/step/step-group/edit.tsx +64 -0
  175. package/src/blocks/step/step-group/editor.scss +19 -0
  176. package/src/blocks/step/step-group/factory.tsx +36 -0
  177. package/src/blocks/step/step-group/icon.tsx +27 -0
  178. package/src/blocks/step/step-group/index.ts +15 -0
  179. package/src/blocks/step/step-group/types.ts +13 -0
  180. package/src/blocks/step/step-item/constants.ts +6 -0
  181. package/src/blocks/step/step-item/edit.tsx +60 -0
  182. package/src/blocks/step/step-item/editor.scss +18 -0
  183. package/src/blocks/step/step-item/factory.tsx +27 -0
  184. package/src/blocks/step/step-item/index.ts +11 -0
  185. package/src/blocks/step/step-item/types.ts +12 -0
  186. package/src/blocks/testimonial/testimonial-group/constants.ts +27 -0
  187. package/src/blocks/testimonial/testimonial-group/edit.tsx +74 -0
  188. package/src/blocks/testimonial/testimonial-group/editor.scss +38 -0
  189. package/src/blocks/testimonial/testimonial-group/factory.tsx +44 -0
  190. package/src/blocks/testimonial/testimonial-group/icon.tsx +33 -0
  191. package/src/blocks/testimonial/testimonial-group/index.ts +15 -0
  192. package/src/blocks/testimonial/testimonial-group/types.ts +19 -0
  193. package/src/blocks/testimonial/testimonial-item/edit.tsx +48 -0
  194. package/src/blocks/testimonial/testimonial-item/editor.scss +20 -0
  195. package/src/blocks/testimonial/testimonial-item/factory.tsx +35 -0
  196. package/src/blocks/testimonial/testimonial-item/index.ts +9 -0
  197. package/src/blocks/testimonial/testimonial-item/types.ts +9 -0
  198. package/src/blocks/text-and-form/text-and-form-group/constants.ts +6 -0
  199. package/src/blocks/text-and-form/text-and-form-group/edit.tsx +59 -0
  200. package/src/blocks/text-and-form/text-and-form-group/editor.scss +21 -0
  201. package/src/blocks/text-and-form/text-and-form-group/factory.tsx +38 -0
  202. package/src/blocks/text-and-form/text-and-form-group/icon.tsx +23 -0
  203. package/src/blocks/text-and-form/text-and-form-group/index.ts +9 -0
  204. package/src/blocks/text-and-form/text-and-form-group/types.ts +23 -0
  205. package/src/blocks/text-and-form/text-and-form-text-column/constants.ts +10 -0
  206. package/src/blocks/text-and-form/text-and-form-text-column/edit.tsx +94 -0
  207. package/src/blocks/text-and-form/text-and-form-text-column/editor.scss +29 -0
  208. package/src/blocks/text-and-form/text-and-form-text-column/factory.tsx +41 -0
  209. package/src/blocks/text-and-form/text-and-form-text-column/index.ts +18 -0
  210. package/src/blocks/text-and-form/text-and-form-text-column/types.ts +23 -0
  211. package/src/blocks/usp/usp-group/constants.ts +54 -0
  212. package/src/blocks/usp/usp-group/edit.tsx +197 -0
  213. package/src/blocks/usp/usp-group/editor.scss +24 -0
  214. package/src/blocks/usp/usp-group/factory.tsx +113 -0
  215. package/src/blocks/usp/usp-group/icon.tsx +18 -0
  216. package/src/blocks/usp/usp-group/index.ts +15 -0
  217. package/src/blocks/usp/usp-group/types.ts +70 -0
  218. package/src/blocks/usp/usp-item/constants.ts +7 -0
  219. package/src/blocks/usp/usp-item/edit.tsx +65 -0
  220. package/src/blocks/usp/usp-item/editor.scss +17 -0
  221. package/src/blocks/usp/usp-item/factory.tsx +30 -0
  222. package/src/blocks/usp/usp-item/index.ts +11 -0
  223. package/src/blocks/usp/usp-item/types.ts +17 -0
  224. package/src/components/IconControl/IconControl.tsx +55 -0
  225. package/src/components/IconControl/editor.scss +53 -0
  226. package/src/components/IconControl/index.ts +2 -0
  227. package/src/components/IconControl/index.tsx +1 -0
  228. package/src/components/ImagePicker/ImagePicker.tsx +124 -0
  229. package/src/components/ImagePicker/editor.scss +79 -0
  230. package/src/components/ImagePicker/index.ts +2 -0
  231. package/src/components/ImagePicker/index.tsx +1 -0
  232. package/src/components/ItemIconControl/ItemIconControl.tsx +72 -0
  233. package/src/components/ItemIconControl/ItemIconModal.tsx +12 -0
  234. package/src/components/ItemIconControl/ItemIconPreview.tsx +93 -0
  235. package/src/components/ItemIconControl/editor.scss +52 -0
  236. package/src/components/ItemIconControl/index.ts +2 -0
  237. package/src/components/ItemIconControl/types.d.ts +30 -0
  238. package/src/constants.ts +20 -0
  239. package/src/editor.scss +34 -0
  240. package/src/globals.scss +237 -0
  241. package/src/hooks/useGroupBlock.ts +53 -0
  242. package/src/index.ts +122 -0
  243. package/src/types.ts +33 -0
  244. package/src/utils/createEditAdapter.ts +11 -0
@@ -0,0 +1,43 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export {CONTENT_SIZES as DEFAULT_CONTENT_SIZES, HEADING_LEVELS} from '~/constants'
4
+
5
+ export const DEFAULT_RATIOS = [
6
+ {value: '3:2', label: '3:2'},
7
+ {value: '4:3', label: '4:3'},
8
+ {value: '16:9', label: '16:9'},
9
+ {value: '1:1', label: '1:1'},
10
+ {value: '2:1', label: '2:1'},
11
+ {value: '3:4', label: '3:4'},
12
+ {value: 'auto', label: 'Auto'},
13
+ ] as const
14
+
15
+ export const CHIP_POSITIONS = [
16
+ {value: 'top-left', label: __('Vlevo nahoře', 'brilo-blocks')},
17
+ {value: 'top-right', label: __('Vpravo nahoře', 'brilo-blocks')},
18
+ {value: 'bottom-left', label: __('Vlevo dole', 'brilo-blocks')},
19
+ {value: 'bottom-right', label: __('Vpravo dole', 'brilo-blocks')},
20
+ ] as const
21
+
22
+ export const DEFAULT_CHIP_VARIANTS = [
23
+ {value: 'primary', label: __('Primární', 'brilo-blocks')},
24
+ {value: 'secondary', label: __('Sekundární', 'brilo-blocks')},
25
+ {value: 'neutral', label: __('Neutrální', 'brilo-blocks')},
26
+ ] as const
27
+
28
+ export const DEFAULT_MEDIA_POSITIONS = [
29
+ {value: 'left', label: __('Vlevo', 'brilo-blocks')},
30
+ {value: 'right', label: __('Vpravo', 'brilo-blocks')},
31
+ ] as const
32
+
33
+ export const DEFAULT_HEADING_STYLES = [
34
+ {value: 'h1', label: 'H1 styl'},
35
+ {value: 'h2', label: 'H2 styl'},
36
+ {value: 'h3', label: 'H3 styl'},
37
+ {value: 'h4', label: 'H4 styl'},
38
+ ] as const
39
+
40
+ export const DEFAULT_GRID_STYLES = [
41
+ {value: '1-1', label: __('Půl na půl', 'brilo-blocks')},
42
+ {value: '2-1', label: __('2/3 + 1/3', 'brilo-blocks')},
43
+ ] as const
@@ -0,0 +1,241 @@
1
+ import {BlockControls, InspectorControls, RichText} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ TextControl,
5
+ __experimentalToggleGroupControl as ToggleGroupControl,
6
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
7
+ ToolbarButton,
8
+ ToolbarGroup,
9
+ } from '@wordpress/components'
10
+ import {__} from '@wordpress/i18n'
11
+ import clsx from 'clsx'
12
+ import {ImagePickerBody, ImagePickerControl} from '~/components/ImagePicker'
13
+ import {useGroupBlock} from '~/hooks/useGroupBlock'
14
+ import {
15
+ CHIP_POSITIONS,
16
+ DEFAULT_CHIP_VARIANTS,
17
+ DEFAULT_CONTENT_SIZES,
18
+ DEFAULT_GRID_STYLES,
19
+ DEFAULT_HEADING_STYLES,
20
+ DEFAULT_MEDIA_POSITIONS,
21
+ DEFAULT_RATIOS,
22
+ HEADING_LEVELS,
23
+ } from './constants'
24
+ import type {
25
+ ChipPositions,
26
+ ChipVariants,
27
+ ContentSizes,
28
+ GridStyles,
29
+ HeadingLevels,
30
+ HeadingStyles,
31
+ MediaPositions,
32
+ Ratios,
33
+ TextAndMediaGroupAttributes,
34
+ TextAndMediaGroupOptions,
35
+ } from './types'
36
+
37
+ export function createTextAndMediaGroupEdit(options: TextAndMediaGroupOptions) {
38
+ const RATIOS = options.ratios ?? DEFAULT_RATIOS
39
+ const MEDIA_POSITIONS = options.mediaPositions ?? DEFAULT_MEDIA_POSITIONS
40
+ const GRID_STYLES = options.gridStyles ?? DEFAULT_GRID_STYLES
41
+ const HEADING_STYLES = options.headingStyles ?? DEFAULT_HEADING_STYLES
42
+ const CONTENT_SIZES = options.contentSizes ?? DEFAULT_CONTENT_SIZES
43
+ const CHIP_VARIANTS = options.chipVariants ?? DEFAULT_CHIP_VARIANTS
44
+
45
+ return function Edit({
46
+ attributes,
47
+ setAttributes,
48
+ }: {
49
+ attributes: TextAndMediaGroupAttributes
50
+ setAttributes: (a: Partial<TextAndMediaGroupAttributes>) => void
51
+ }) {
52
+ const {header, mediaPosition, img, ratio, gridStyle, content} = attributes
53
+ const isMediaLeft = mediaPosition === 'left'
54
+
55
+ const {blockProps, innerBlocksProps} = useGroupBlock({
56
+ blockClassName: [
57
+ options.blockClassName ?? 'g-text-and-media wp-block-section',
58
+ `--media-${mediaPosition}`,
59
+ ratio && `--ratio-${ratio}`,
60
+ `--content-${content.size}`,
61
+ ],
62
+ containerClassName: options.containerClassName ?? 'g-text-and-media__inner-blocks',
63
+ allowedBlocks: options.allowedBlocks,
64
+ template: options.template,
65
+ })
66
+
67
+ const mediaColumn = (
68
+ <div className="g-text-and-media__media">
69
+ <ImagePickerBody
70
+ value={{id: img.id, alt: img.alt}}
71
+ onChange={(val) => setAttributes({img: {...img, ...val}})}
72
+ placeholder={__('Vybrat obrázek', 'brilo-blocks')}
73
+ />
74
+ {img.id > 0 && img.chip.title && (
75
+ <span className={clsx('g-text-and-media__chip', `--${img.chip.position}`, `--${img.chip.variant}`)}>{img.chip.title}</span>
76
+ )}
77
+ </div>
78
+ )
79
+
80
+ const textColumn = (
81
+ <div className="g-text-and-media__text">
82
+ <RichText
83
+ tagName="span"
84
+ className="g-text-and-media__overline u-text-editable"
85
+ value={header.overline.title}
86
+ onChange={(value: string) => setAttributes({header: {...header, overline: {title: value}}})}
87
+ placeholder={__('Overline...', 'brilo-blocks')}
88
+ allowedFormats={[]}
89
+ />
90
+ <RichText
91
+ tagName={`h${header.heading.level}` as 'h1' | 'h2' | 'h3' | 'h4'}
92
+ className={clsx('g-text-and-media__heading', `--heading-style-${header.heading.style}`, 'u-text-editable')}
93
+ value={header.heading.title}
94
+ onChange={(value: string) => setAttributes({header: {...header, heading: {...header.heading, title: value}}})}
95
+ placeholder={__('Nadpis...', 'brilo-blocks')}
96
+ allowedFormats={['core/bold', 'core/italic']}
97
+ />
98
+ <div {...innerBlocksProps} />
99
+ </div>
100
+ )
101
+
102
+ return (
103
+ <>
104
+ <BlockControls>
105
+ <ToolbarGroup>
106
+ <ToolbarButton
107
+ icon="align-pull-left"
108
+ label={__('Média vlevo', 'brilo-blocks')}
109
+ isActive={isMediaLeft}
110
+ onClick={() => setAttributes({mediaPosition: 'left'})}
111
+ />
112
+ <ToolbarButton
113
+ icon="align-pull-right"
114
+ label={__('Média vpravo', 'brilo-blocks')}
115
+ isActive={!isMediaLeft}
116
+ onClick={() => setAttributes({mediaPosition: 'right'})}
117
+ />
118
+ </ToolbarGroup>
119
+ </BlockControls>
120
+ <InspectorControls>
121
+ <PanelBody title={__('Obrázek', 'brilo-blocks')}>
122
+ <ImagePickerControl value={{id: img.id, alt: img.alt}} onChange={(val) => setAttributes({img: {...img, ...val}})} />
123
+ <ToggleGroupControl
124
+ label={__('Poměr stran', 'brilo-blocks')}
125
+ value={ratio}
126
+ onChange={(value) => setAttributes({ratio: value as Ratios})}
127
+ isBlock
128
+ >
129
+ {RATIOS.map((r) => (
130
+ <ToggleGroupControlOption key={r.value} value={r.value} label={r.label} />
131
+ ))}
132
+ </ToggleGroupControl>
133
+ <TextControl
134
+ label={__('URL videa', 'brilo-blocks')}
135
+ value={img.video.src}
136
+ onChange={(value: string) => setAttributes({img: {...img, video: {src: value}}})}
137
+ />
138
+ </PanelBody>
139
+ <PanelBody title={__('Chip', 'brilo-blocks')} initialOpen={false}>
140
+ <TextControl
141
+ label={__('Text chipu', 'brilo-blocks')}
142
+ value={img.chip.title}
143
+ onChange={(value: string) => setAttributes({img: {...img, chip: {...img.chip, title: value}}})}
144
+ />
145
+ <ToggleGroupControl
146
+ label={__('Pozice chipu', 'brilo-blocks')}
147
+ value={img.chip.position}
148
+ onChange={(value) => setAttributes({img: {...img, chip: {...img.chip, position: value as ChipPositions}}})}
149
+ isBlock
150
+ >
151
+ {CHIP_POSITIONS.map((p) => (
152
+ <ToggleGroupControlOption key={p.value} value={p.value} label={p.label} />
153
+ ))}
154
+ </ToggleGroupControl>
155
+ <ToggleGroupControl
156
+ label={__('Varianta chipu', 'brilo-blocks')}
157
+ value={img.chip.variant}
158
+ onChange={(value) => setAttributes({img: {...img, chip: {...img.chip, variant: value as ChipVariants}}})}
159
+ isBlock
160
+ >
161
+ {CHIP_VARIANTS.map((v) => (
162
+ <ToggleGroupControlOption key={v.value} value={v.value} label={v.label} />
163
+ ))}
164
+ </ToggleGroupControl>
165
+ </PanelBody>
166
+ <PanelBody title={__('Rozložení', 'brilo-blocks')}>
167
+ <ToggleGroupControl
168
+ label={__('Pozice médií', 'brilo-blocks')}
169
+ value={mediaPosition}
170
+ onChange={(value) => setAttributes({mediaPosition: value as MediaPositions})}
171
+ isBlock
172
+ >
173
+ {MEDIA_POSITIONS.map((p) => (
174
+ <ToggleGroupControlOption key={p.value} value={p.value} label={p.label} />
175
+ ))}
176
+ </ToggleGroupControl>
177
+ <ToggleGroupControl
178
+ label={__('Styl mřížky', 'brilo-blocks')}
179
+ value={gridStyle}
180
+ onChange={(value) => setAttributes({gridStyle: value as GridStyles})}
181
+ isBlock
182
+ >
183
+ {GRID_STYLES.map((s) => (
184
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
185
+ ))}
186
+ </ToggleGroupControl>
187
+ <ToggleGroupControl
188
+ label={__('Velikost textu', 'brilo-blocks')}
189
+ value={content.size}
190
+ onChange={(value) => setAttributes({content: {size: value as ContentSizes}})}
191
+ isBlock
192
+ >
193
+ {CONTENT_SIZES.map((s) => (
194
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
195
+ ))}
196
+ </ToggleGroupControl>
197
+ </PanelBody>
198
+ <PanelBody title={__('Nadpis', 'brilo-blocks')} initialOpen={false}>
199
+ <ToggleGroupControl
200
+ label={__('Úroveň nadpisu', 'brilo-blocks')}
201
+ value={String(header.heading.level)}
202
+ onChange={(value) =>
203
+ setAttributes({header: {...header, heading: {...header.heading, level: Number(value) as HeadingLevels}}})
204
+ }
205
+ isBlock
206
+ >
207
+ {HEADING_LEVELS.map((l) => (
208
+ <ToggleGroupControlOption key={l} value={String(l)} label={`H${l}`} />
209
+ ))}
210
+ </ToggleGroupControl>
211
+ <ToggleGroupControl
212
+ label={__('Styl nadpisu', 'brilo-blocks')}
213
+ value={header.heading.style}
214
+ onChange={(value) => setAttributes({header: {...header, heading: {...header.heading, style: value as HeadingStyles}}})}
215
+ isBlock
216
+ >
217
+ {HEADING_STYLES.map((s) => (
218
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
219
+ ))}
220
+ </ToggleGroupControl>
221
+ </PanelBody>
222
+ </InspectorControls>
223
+ <div {...blockProps}>
224
+ <div className={clsx('u-grid-responsive --col-2 g-text-and-media__grid', `--grid-style-${gridStyle}`)}>
225
+ {isMediaLeft ? (
226
+ <>
227
+ {mediaColumn}
228
+ {textColumn}
229
+ </>
230
+ ) : (
231
+ <>
232
+ {textColumn}
233
+ {mediaColumn}
234
+ </>
235
+ )}
236
+ </div>
237
+ </div>
238
+ </>
239
+ )
240
+ }
241
+ }
@@ -0,0 +1,123 @@
1
+ @layer base {
2
+ .g-text-and-media {
3
+ padding: 8px;
4
+
5
+ &.--media-right .g-text-and-media__grid.--grid-style-2-1 {
6
+ grid-template-columns: 2fr 1fr;
7
+ }
8
+ &.--media-left .g-text-and-media__grid.--grid-style-2-1 {
9
+ grid-template-columns: 1fr 2fr;
10
+ }
11
+
12
+ &.--ratio-3\:2 {
13
+ --ratio: 3/2;
14
+ }
15
+ &.--ratio-4\:3 {
16
+ --ratio: 4/3;
17
+ }
18
+ &.--ratio-16\:9 {
19
+ --ratio: 16/9;
20
+ }
21
+ &.--ratio-1\:1 {
22
+ --ratio: 1/1;
23
+ }
24
+ &.--ratio-2\:1 {
25
+ --ratio: 2/1;
26
+ }
27
+ &.--ratio-3\:4 {
28
+ --ratio: 3/4;
29
+ }
30
+ }
31
+
32
+ .g-text-and-media__grid {
33
+ --grid-gap: 24px;
34
+ --grid-min-col-size: 240px;
35
+ align-items: center;
36
+ }
37
+
38
+ .g-text-and-media__media {
39
+ background: #f5f5f5;
40
+ border-radius: 4px;
41
+ min-height: 200px;
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ overflow: hidden;
46
+
47
+ .c-image-picker-body {
48
+ width: 100%;
49
+ }
50
+
51
+ .c-image-picker-body__preview img {
52
+ aspect-ratio: var(--ratio);
53
+ object-fit: cover;
54
+ }
55
+
56
+ .c-image-picker-body__placeholder {
57
+ min-height: 200px;
58
+ }
59
+ }
60
+
61
+ .g-text-and-media__text {
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: 8px;
65
+ }
66
+
67
+ .g-text-and-media__overline {
68
+ display: block;
69
+ font-size: 12px;
70
+ font-weight: 600;
71
+ text-transform: uppercase;
72
+ letter-spacing: 1px;
73
+ color: #888;
74
+ }
75
+
76
+ .g-text-and-media__heading {
77
+ margin: 0;
78
+ font-weight: 700;
79
+ font-size: var(--heading-size, 24px);
80
+ }
81
+
82
+ .g-text-and-media__inner-blocks {
83
+ margin-top: 8px;
84
+ min-height: 40px;
85
+ }
86
+
87
+ .g-text-and-media__chip {
88
+ position: absolute;
89
+ padding: 4px 10px;
90
+ border-radius: 20px;
91
+ font-size: 11px;
92
+ font-weight: 600;
93
+ background: #0073aa;
94
+ color: #fff;
95
+ white-space: nowrap;
96
+ pointer-events: none;
97
+
98
+ &.--top-left {
99
+ top: 8px;
100
+ left: 8px;
101
+ }
102
+ &.--top-right {
103
+ top: 8px;
104
+ right: 8px;
105
+ }
106
+ &.--bottom-left {
107
+ bottom: 8px;
108
+ left: 8px;
109
+ }
110
+ &.--bottom-right {
111
+ bottom: 40px;
112
+ right: 8px;
113
+ }
114
+
115
+ &.--secondary {
116
+ background: #555d6e;
117
+ }
118
+ &.--neutral {
119
+ background: #e0e0e0;
120
+ color: #333;
121
+ }
122
+ }
123
+ }
@@ -0,0 +1,100 @@
1
+ import {InnerBlocks} from '@wordpress/block-editor'
2
+ import type {BlockConfiguration} from '@wordpress/blocks'
3
+ import {__} from '@wordpress/i18n'
4
+ import type {OptionArray} from '~/types'
5
+ import {
6
+ DEFAULT_CHIP_VARIANTS,
7
+ DEFAULT_CONTENT_SIZES,
8
+ DEFAULT_GRID_STYLES,
9
+ DEFAULT_HEADING_STYLES,
10
+ DEFAULT_MEDIA_POSITIONS,
11
+ DEFAULT_RATIOS,
12
+ HEADING_LEVELS,
13
+ } from './constants'
14
+ import {createTextAndMediaGroupEdit} from './edit'
15
+ import {icon as defaultIcon} from './icon'
16
+ import type {TextAndMediaGroupAttributes, TextAndMediaGroupOptions} from './types'
17
+
18
+ export type {TextAndMediaGroupAttributes, TextAndMediaGroupOptions}
19
+
20
+ export function createTextAndMediaGroupBlock<
21
+ TRatios extends OptionArray = typeof DEFAULT_RATIOS,
22
+ TMediaPositions extends OptionArray = typeof DEFAULT_MEDIA_POSITIONS,
23
+ TGridStyles extends OptionArray = typeof DEFAULT_GRID_STYLES,
24
+ THeadingStyles extends OptionArray = typeof DEFAULT_HEADING_STYLES,
25
+ TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES,
26
+ TChipVariants extends OptionArray = typeof DEFAULT_CHIP_VARIANTS,
27
+ >(
28
+ options: TextAndMediaGroupOptions<TRatios, TMediaPositions, TGridStyles, THeadingStyles, TContentSizes, TChipVariants>,
29
+ ): BlockConfiguration<
30
+ TextAndMediaGroupAttributes<
31
+ TRatios[number]['value'],
32
+ TMediaPositions[number]['value'],
33
+ TGridStyles[number]['value'],
34
+ THeadingStyles[number]['value'],
35
+ TContentSizes[number]['value'],
36
+ TChipVariants[number]['value']
37
+ >
38
+ > {
39
+ const ratios = options.ratios ?? DEFAULT_RATIOS
40
+ const mediaPositions = options.mediaPositions ?? DEFAULT_MEDIA_POSITIONS
41
+ const gridStyles = options.gridStyles ?? DEFAULT_GRID_STYLES
42
+ const headingStyles = options.headingStyles ?? DEFAULT_HEADING_STYLES
43
+ const contentSizes = options.contentSizes ?? DEFAULT_CONTENT_SIZES
44
+ const chipVariants = options.chipVariants ?? DEFAULT_CHIP_VARIANTS
45
+
46
+ return {
47
+ name: options.name,
48
+ title: options.title ?? __('Text a média', 'brilo-blocks'),
49
+ description: options.description,
50
+ category: options.category ?? 'layout',
51
+ ...(options.parent && {parent: options.parent}),
52
+ icon: options.icon ?? {src: defaultIcon},
53
+ supports: {html: false, customClassName: false},
54
+ attributes: {
55
+ header: {
56
+ type: 'object',
57
+ default: {
58
+ heading: {title: '', level: HEADING_LEVELS[1], style: headingStyles[1]?.value ?? headingStyles[0].value},
59
+ overline: {title: ''},
60
+ },
61
+ },
62
+ mediaPosition: {
63
+ type: 'string',
64
+ default: mediaPositions[1]?.value ?? mediaPositions[0].value,
65
+ enum: mediaPositions.map((p) => p.value),
66
+ },
67
+ img: {
68
+ type: 'object',
69
+ default: {
70
+ id: 0,
71
+ alt: '',
72
+ video: {src: ''},
73
+ chip: {title: '', position: 'bottom-right', variant: chipVariants[0].value},
74
+ },
75
+ },
76
+ ratio: {
77
+ type: 'string',
78
+ default: ratios[2]?.value ?? ratios[0].value,
79
+ enum: ratios.map((r) => r.value),
80
+ },
81
+ gridStyle: {
82
+ type: 'string',
83
+ default: gridStyles[0].value,
84
+ enum: gridStyles.map((g) => g.value),
85
+ },
86
+ content: {type: 'object', default: {size: contentSizes[1]?.value ?? contentSizes[0].value}},
87
+ },
88
+ edit: createTextAndMediaGroupEdit(options as unknown as TextAndMediaGroupOptions),
89
+ save: () => <InnerBlocks.Content />,
90
+ } as unknown as BlockConfiguration<
91
+ TextAndMediaGroupAttributes<
92
+ TRatios[number]['value'],
93
+ TMediaPositions[number]['value'],
94
+ TGridStyles[number]['value'],
95
+ THeadingStyles[number]['value'],
96
+ TContentSizes[number]['value'],
97
+ TChipVariants[number]['value']
98
+ >
99
+ >
100
+ }
@@ -0,0 +1,37 @@
1
+ export const icon = (
2
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <title>Text and Media Group</title>
4
+ <g clipPath="url(#clip0_24_1038)">
5
+ <rect x="0.5" y="0.5" width="10" height="8" stroke="black" fill="none" />
6
+ <path fillRule="evenodd" clipRule="evenodd" d="M4.5 4L2 7L7 7L4.5 4Z" fill="black" />
7
+ <path d="M9 3C9 3.55228 8.55228 4 8 4C7.44772 4 7 3.55228 7 3C7 2.44772 7.44772 2 8 2C8.55228 2 9 2.44772 9 3Z" fill="black" />
8
+ <path d="M13 1H18V2H13V1Z" fill="black" />
9
+ <path d="M13 3H20V4H13V3Z" fill="black" />
10
+ <path
11
+ fillRule="evenodd"
12
+ clipRule="evenodd"
13
+ d="M14.5 5C13.6716 5 13 5.67157 13 6.5C13 7.32843 13.6716 8 14.5 8H18.5C19.3284 8 20 7.32843 20 6.5C20 5.67157 19.3284 5 18.5 5H14.5ZM18 6H15V7H18V6Z"
14
+ fill="#357AB5"
15
+ />
16
+ <rect x="9.5" y="11.5" width="10" height="8" stroke="black" fill="none" />
17
+ <path fillRule="evenodd" clipRule="evenodd" d="M13.5 15L11 18L16 18L13.5 15Z" fill="black" />
18
+ <path
19
+ d="M18 14C18 14.5523 17.5523 15 17 15C16.4477 15 16 14.5523 16 14C16 13.4477 16.4477 13 17 13C17.5523 13 18 13.4477 18 14Z"
20
+ fill="black"
21
+ />
22
+ <path d="M0 12H5V13H0V12Z" fill="black" />
23
+ <path d="M0 14H7V15H0V14Z" fill="black" />
24
+ <path
25
+ fillRule="evenodd"
26
+ clipRule="evenodd"
27
+ d="M1.5 16C0.671573 16 0 16.6716 0 17.5C0 18.3284 0.671573 19 1.5 19H5.5C6.32843 19 7 18.3284 7 17.5C7 16.6716 6.32843 16 5.5 16H1.5ZM5 17H2V18H5V17Z"
28
+ fill="#357AB5"
29
+ />
30
+ </g>
31
+ <defs>
32
+ <clipPath id="clip0_24_1038">
33
+ <rect width="20" height="20" fill="white" />
34
+ </clipPath>
35
+ </defs>
36
+ </svg>
37
+ )
@@ -0,0 +1,18 @@
1
+ export type {TextAndMediaGroupAttributes, TextAndMediaGroupOptions} from './types'
2
+ export {createTextAndMediaGroupBlock} from './factory'
3
+
4
+ import type {TextAndMediaGroupOptions} from './types'
5
+
6
+ export const textAndMediaGroupDefaults: TextAndMediaGroupOptions = {
7
+ name: 'brilo/text-and-media-group',
8
+ parent: ['brilo/base-section'],
9
+ allowedBlocks: [
10
+ 'brilo/basic-button',
11
+ 'brilo/basic-heading',
12
+ 'brilo/basic-overline',
13
+ 'brilo/button-group',
14
+ 'core/heading',
15
+ 'core/list',
16
+ 'core/paragraph',
17
+ ],
18
+ }
@@ -0,0 +1,60 @@
1
+ import type {BriloBlockType, OptionArray} from '~/types'
2
+ import type {
3
+ CHIP_POSITIONS,
4
+ DEFAULT_CHIP_VARIANTS,
5
+ DEFAULT_CONTENT_SIZES,
6
+ DEFAULT_GRID_STYLES,
7
+ DEFAULT_HEADING_STYLES,
8
+ DEFAULT_MEDIA_POSITIONS,
9
+ DEFAULT_RATIOS,
10
+ HEADING_LEVELS,
11
+ } from './constants'
12
+
13
+ export type MediaPositions = (typeof DEFAULT_MEDIA_POSITIONS)[number]['value']
14
+ export type Ratios = (typeof DEFAULT_RATIOS)[number]['value']
15
+ export type GridStyles = (typeof DEFAULT_GRID_STYLES)[number]['value']
16
+ export type HeadingStyles = (typeof DEFAULT_HEADING_STYLES)[number]['value']
17
+ export type HeadingLevels = (typeof HEADING_LEVELS)[number]
18
+ export type ContentSizes = (typeof DEFAULT_CONTENT_SIZES)[number]['value']
19
+ export type ChipPositions = (typeof CHIP_POSITIONS)[number]['value']
20
+ export type ChipVariants = (typeof DEFAULT_CHIP_VARIANTS)[number]['value']
21
+
22
+ export interface TextAndMediaGroupAttributes<
23
+ TRatio extends string = Ratios,
24
+ TMediaPosition extends string = MediaPositions,
25
+ TGridStyle extends string = GridStyles,
26
+ THeadingStyle extends string = HeadingStyles,
27
+ TContentSize extends string = ContentSizes,
28
+ TChipVariant extends string = ChipVariants,
29
+ > extends Record<string, unknown> {
30
+ header: {
31
+ heading: {title: string; level: HeadingLevels; style: THeadingStyle}
32
+ overline: {title: string}
33
+ }
34
+ mediaPosition: TMediaPosition
35
+ img: {
36
+ id: number
37
+ alt: string
38
+ video: {src: string}
39
+ chip: {title: string; position: ChipPositions; variant: TChipVariant}
40
+ }
41
+ ratio: TRatio
42
+ gridStyle: TGridStyle
43
+ content: {size: TContentSize}
44
+ }
45
+
46
+ export interface TextAndMediaGroupOptions<
47
+ TRatios extends OptionArray = typeof DEFAULT_RATIOS,
48
+ TMediaPositions extends OptionArray = typeof DEFAULT_MEDIA_POSITIONS,
49
+ TGridStyles extends OptionArray = typeof DEFAULT_GRID_STYLES,
50
+ THeadingStyles extends OptionArray = typeof DEFAULT_HEADING_STYLES,
51
+ TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES,
52
+ TChipVariants extends OptionArray = typeof DEFAULT_CHIP_VARIANTS,
53
+ > extends BriloBlockType {
54
+ ratios?: TRatios
55
+ mediaPositions?: TMediaPositions
56
+ gridStyles?: TGridStyles
57
+ headingStyles?: THeadingStyles
58
+ contentSizes?: TContentSizes
59
+ chipVariants?: TChipVariants
60
+ }
@@ -0,0 +1,23 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export const VARIANTS = [
4
+ {
5
+ value: 'default',
6
+ label: __('Výchozí', 'brilo-blocks'),
7
+ },
8
+ {
9
+ value: 'full-width',
10
+ label: __('Na plnou šířku', 'brilo-blocks'),
11
+ },
12
+ ] as const
13
+
14
+ export const EFFECTS = [
15
+ {
16
+ value: 'creative',
17
+ label: __('Slide', 'brilo-blocks'),
18
+ },
19
+ {
20
+ value: 'fade',
21
+ label: __('Fade', 'brilo-blocks'),
22
+ },
23
+ ] as const