@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,85 @@
1
+ import {InspectorControls} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ SelectControl,
5
+ ToggleControl,
6
+ __experimentalNumberControl as NumberControl,
7
+ __experimentalToggleGroupControl as ToggleGroupControl,
8
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
9
+ } from '@wordpress/components'
10
+ import {__} from '@wordpress/i18n'
11
+ import clsx from 'clsx'
12
+ import {useGroupBlock} from '~/hooks/useGroupBlock'
13
+ import {EFFECTS, VARIANTS} from './constants'
14
+ import type {Effect, HeroGroupAttributes, HeroGroupOptions, Variant} from './types'
15
+
16
+ export function createHeroGroupEdit(options: HeroGroupOptions) {
17
+ const VARIANTS_OPTIONS = options.variants ?? VARIANTS
18
+ const EFFECTS_OPTIONS = options.effects ?? EFFECTS
19
+
20
+ return function Edit({
21
+ attributes,
22
+ setAttributes,
23
+ }: {
24
+ attributes: HeroGroupAttributes
25
+ setAttributes: (a: Partial<HeroGroupAttributes>) => void
26
+ }) {
27
+ const {variant, effect, autoplay, autoplaySpeed, pauseOnHover} = attributes
28
+
29
+ const {blockProps, innerBlocksProps} = useGroupBlock({
30
+ blockClassName: clsx(options.blockClassName ?? 'g-hero wp-block-section', `--variant-${variant}`, `--effect-${effect}`),
31
+ containerClassName: [options.containerClassName ?? 'g-hero__container'],
32
+ allowedBlocks: options.allowedBlocks,
33
+ orientation: 'horizontal',
34
+ template: options.template,
35
+ layout: {type: 'default'},
36
+ })
37
+
38
+ return (
39
+ <>
40
+ <InspectorControls>
41
+ <PanelBody title={__('Rozložení a efekty', 'brilo-blocks')}>
42
+ <ToggleGroupControl
43
+ isBlock
44
+ label={__('Varianta', 'brilo-blocks')}
45
+ value={variant}
46
+ onChange={(v) => setAttributes({variant: v as Variant})}
47
+ >
48
+ {VARIANTS_OPTIONS.map((v) => (
49
+ <ToggleGroupControlOption key={v.value} value={v.value} label={v.label} />
50
+ ))}
51
+ </ToggleGroupControl>
52
+ <SelectControl
53
+ label={__('Efekt přechodu', 'brilo-blocks')}
54
+ value={effect}
55
+ options={EFFECTS_OPTIONS as any}
56
+ onChange={(v) => setAttributes({effect: v as Effect})}
57
+ />
58
+ </PanelBody>
59
+ <PanelBody title={__('Nastavení slideru', 'brilo-blocks')}>
60
+ <ToggleControl
61
+ label={__('Automatické přehrávání', 'brilo-blocks')}
62
+ checked={autoplay}
63
+ onChange={(v) => setAttributes({autoplay: v})}
64
+ />
65
+ {autoplay && (
66
+ <NumberControl
67
+ label={__('Rychlost přehrávání (ms)', 'brilo-blocks')}
68
+ value={autoplaySpeed}
69
+ onChange={(v) => setAttributes({autoplaySpeed: parseInt(v ?? '3000')})}
70
+ />
71
+ )}
72
+ <ToggleControl
73
+ label={__('Pozastavit při najetí myší', 'brilo-blocks')}
74
+ checked={pauseOnHover}
75
+ onChange={(v) => setAttributes({pauseOnHover: v})}
76
+ />
77
+ </PanelBody>
78
+ </InspectorControls>
79
+ <div {...blockProps}>
80
+ <div {...innerBlocksProps} />
81
+ </div>
82
+ </>
83
+ )
84
+ }
85
+ }
File without changes
@@ -0,0 +1,45 @@
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 {EFFECTS, VARIANTS} from './constants'
6
+ import {createHeroGroupEdit} from './edit'
7
+ import type {HeroGroupAttributes, HeroGroupOptions} from './types'
8
+ import {icon} from './icon'
9
+
10
+ export type {HeroGroupAttributes, HeroGroupOptions}
11
+
12
+ export function createHeroGroupBlock<TVariants extends OptionArray = typeof VARIANTS, TEffects extends OptionArray = typeof EFFECTS>(
13
+ options: HeroGroupOptions<TVariants, TEffects>,
14
+ ): BlockConfiguration<HeroGroupAttributes<TVariants[number]['value'], TEffects[number]['value']>> {
15
+ const variants = options.variants ?? VARIANTS
16
+ const effects = options.effects ?? EFFECTS
17
+
18
+ return {
19
+ name: options.name,
20
+ title: options.title ?? __('Hero Slider', 'brilo-blocks'),
21
+ description: options.description,
22
+ category: options.category ?? 'layout',
23
+ ...(options.parent && {parent: options.parent}),
24
+ icon: options.icon ?? icon,
25
+ supports: {html: false, customClassName: false},
26
+ attributes: {
27
+ items: {type: 'array', default: []},
28
+ variant: {
29
+ type: 'string',
30
+ default: variants[0].value,
31
+ enum: variants.map((v) => v.value),
32
+ },
33
+ autoplay: {type: 'boolean', default: false},
34
+ autoplaySpeed: {type: 'number', default: 3000},
35
+ pauseOnHover: {type: 'boolean', default: true},
36
+ effect: {
37
+ type: 'string',
38
+ default: effects[0].value,
39
+ enum: effects.map((e) => e.value),
40
+ },
41
+ },
42
+ edit: createHeroGroupEdit(options as unknown as HeroGroupOptions),
43
+ save: () => <InnerBlocks.Content />,
44
+ } as unknown as BlockConfiguration<HeroGroupAttributes<TVariants[number]['value'], TEffects[number]['value']>>
45
+ }
@@ -0,0 +1,28 @@
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
+ <path d="M4 4H8V5H4V4Z" fill="black" />
4
+ <path d="M7 19H9V20H7V19Z" fill="black" />
5
+ <path d="M10 19H11V20H10V19Z" fill="black" />
6
+ <path d="M12 19H13V20H12V19Z" fill="black" />
7
+ <path d="M9 4H16V5H9V4Z" fill="black" />
8
+ <path
9
+ d="M12 2C12 1.44772 12.4477 1 13 1H14C14.5523 1 15 1.44772 15 2C15 2.55228 14.5523 3 14 3H13C12.4477 3 12 2.55228 12 2Z"
10
+ fill="black"
11
+ />
12
+ <path d="M5 2C5 1.44772 5.44772 1 6 1H10C10.5523 1 11 1.44772 11 2C11 2.55228 10.5523 3 10 3H6C5.44772 3 5 2.55228 5 2Z" fill="black" />
13
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M9.5 11L6 15L13 15L9.5 11Z" fill="black" />
14
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M1 10L1 7H19V10H18V8H2V10H1ZM19 15V18H1L1 15H2V17H18V15H19Z" fill="black" />
15
+ <path
16
+ d="M14 11C14 11.5523 13.5523 12 13 12C12.4477 12 12 11.5523 12 11C12 10.4477 12.4477 10 13 10C13.5523 10 14 10.4477 14 11Z"
17
+ fill="black"
18
+ />
19
+ <path
20
+ d="M0 12.5C0 11.6716 0.671573 11 1.5 11C2.32843 11 3 11.6716 3 12.5C3 13.3284 2.32843 14 1.5 14C0.671573 14 0 13.3284 0 12.5Z"
21
+ fill="#357AB5"
22
+ />
23
+ <path
24
+ d="M17 12.5C17 11.6716 17.6716 11 18.5 11C19.3284 11 20 11.6716 20 12.5C20 13.3284 19.3284 14 18.5 14C17.6716 14 17 13.3284 17 12.5Z"
25
+ fill="#357AB5"
26
+ />
27
+ </svg>
28
+ )
@@ -0,0 +1,11 @@
1
+ export type {HeroGroupAttributes, HeroGroupOptions} from './types'
2
+ export {createHeroGroupBlock} from './factory'
3
+
4
+ import type {HeroGroupOptions} from './types'
5
+
6
+ export const heroGroupDefaults: HeroGroupOptions = {
7
+ name: 'brilo/hero-group',
8
+ parent: ['brilo/base-section'],
9
+ allowedBlocks: ['brilo/hero-item'],
10
+ template: [['brilo/hero-item', {}]],
11
+ }
@@ -0,0 +1,22 @@
1
+ import type {BriloBlockType, OptionArray} from '~/types'
2
+ import type {HeroSliderItem} from '../hero-item/types'
3
+ import type {EFFECTS, VARIANTS} from './constants'
4
+
5
+ export type Variant = (typeof VARIANTS)[number]['value']
6
+ export type Effect = (typeof EFFECTS)[number]['value']
7
+
8
+ export interface HeroGroupAttributes<TVariant extends string = Variant, TEffect extends string = Effect> extends Record<string, unknown> {
9
+ items: HeroSliderItem[]
10
+ variant: TVariant
11
+ autoplay: boolean
12
+ autoplaySpeed: number
13
+ pauseOnHover: boolean
14
+ effect: TEffect
15
+ }
16
+
17
+ export interface HeroGroupOptions<TVariants extends OptionArray = typeof VARIANTS, TEffects extends OptionArray = typeof EFFECTS>
18
+ extends BriloBlockType {
19
+ allowedBlocks: string[]
20
+ variants?: TVariants
21
+ effects?: TEffects
22
+ }
@@ -0,0 +1,15 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export const CONTENT_POSITIONS = [
4
+ {value: 'top left', label: __('Vlevo nahoře', 'brilo-blocks')},
5
+ {value: 'top center', label: __('Uprostřed nahoře', 'brilo-blocks')},
6
+ {value: 'top right', label: __('Vpravo nahoře', 'brilo-blocks')},
7
+ {value: 'center left', label: __('Vlevo uprostřed', 'brilo-blocks')},
8
+ {value: 'center center', label: __('Uprostřed', 'brilo-blocks')},
9
+ {value: 'center right', label: __('Vpravo uprostřed', 'brilo-blocks')},
10
+ {value: 'bottom left', label: __('Vlevo dole', 'brilo-blocks')},
11
+ {value: 'bottom center', label: __('Uprostřed dole', 'brilo-blocks')},
12
+ {value: 'bottom right', label: __('Vpravo dole', 'brilo-blocks')},
13
+ ] as const
14
+
15
+ export const HEADING_LEVELS = [1, 2, 3] as const
@@ -0,0 +1,107 @@
1
+ import {InspectorControls, RichText, useBlockProps, useInnerBlocksProps} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
5
+ AlignmentMatrixControl,
6
+ __experimentalToggleGroupControl as ToggleGroupControl,
7
+ BaseControl,
8
+ TextControl,
9
+ ToggleControl,
10
+ } from '@wordpress/components'
11
+ import {__} from '@wordpress/i18n'
12
+ import {ImagePickerBody, ImagePickerControl} from '~/components/ImagePicker'
13
+ import {CONTENT_POSITIONS, HEADING_LEVELS} from './constants'
14
+ import type {ContentPosition, HeroItemAttributes, HeroItemOptions} from './types'
15
+ import {useGroupBlock} from '~/hooks/useGroupBlock'
16
+ import clsx from 'clsx'
17
+
18
+ export function createHeroItemEdit(options: HeroItemOptions) {
19
+ return function Edit({
20
+ attributes,
21
+ setAttributes,
22
+ }: {
23
+ attributes: HeroItemAttributes
24
+ setAttributes: (a: Partial<HeroItemAttributes>) => void
25
+ }) {
26
+ const {title, img, headingLevel, contentPosition, url, focalPoint} = attributes
27
+
28
+ const {blockProps, innerBlocksProps} = useGroupBlock({
29
+ blockClassName: clsx(options.blockClassName ?? 'i-hero'),
30
+ containerClassName: [options.containerClassName ?? 'i-hero__content wp-block-inner-content'],
31
+ allowedBlocks: options.allowedBlocks,
32
+ orientation: 'vertical',
33
+ template: options.template,
34
+ layout: {type: 'default'},
35
+ })
36
+
37
+ return (
38
+ <>
39
+ <InspectorControls>
40
+ <PanelBody title={__('Nastavení položky', 'brilo-blocks')}>
41
+ <ImagePickerControl value={{id: img.id, alt: img.alt}} onChange={(v) => setAttributes({img: {...img, ...v}})} />
42
+
43
+ <BaseControl label={__('Focal point (desktop)', 'brilo-blocks')}>
44
+ <AlignmentMatrixControl
45
+ value={focalPoint.point as any}
46
+ onChange={(v) => setAttributes({focalPoint: {...focalPoint, point: (v ?? 'center center') as ContentPosition}})}
47
+ />
48
+ </BaseControl>
49
+
50
+ <BaseControl label={__('Focal point (mobil)', 'brilo-blocks')}>
51
+ <AlignmentMatrixControl
52
+ value={(focalPoint.sm?.point ?? 'center center') as any}
53
+ onChange={(v) => setAttributes({focalPoint: {...focalPoint, sm: {point: (v ?? 'center center') as ContentPosition}}})}
54
+ />
55
+ </BaseControl>
56
+
57
+ <ToggleGroupControl
58
+ isBlock
59
+ label={__('Úroveň nadpisu položek', 'brilo-blocks')}
60
+ value={String(headingLevel)}
61
+ onChange={(v) => setAttributes({headingLevel: Number(v ?? HEADING_LEVELS[1])})}
62
+ >
63
+ {HEADING_LEVELS.map((l) => (
64
+ <ToggleGroupControlOption key={l} value={String(l)} label={`H${l}`} />
65
+ ))}
66
+ </ToggleGroupControl>
67
+
68
+ <BaseControl label={__('Pozice obsahu', 'brilo-blocks')}>
69
+ <AlignmentMatrixControl value={contentPosition} onChange={(v) => setAttributes({contentPosition: v as ContentPosition})} />
70
+ </BaseControl>
71
+
72
+ <TextControl
73
+ label={__('URL odkazu', 'brilo-blocks')}
74
+ value={url.src}
75
+ onChange={(v) => setAttributes({url: {...url, src: v}})}
76
+ />
77
+ <ToggleControl
78
+ label={__('Otevřít v novém okně', 'brilo-blocks')}
79
+ checked={url.blank}
80
+ onChange={(v) => setAttributes({url: {...url, blank: v}})}
81
+ />
82
+ </PanelBody>
83
+ </InspectorControls>
84
+
85
+ <div {...blockProps}>
86
+ <div className="i-hero__image-wrap">
87
+ <ImagePickerBody
88
+ value={{id: img.id, alt: img.alt}}
89
+ onChange={(v) => setAttributes({img: {...img, ...v}})}
90
+ placeholder={__('Vyberte obrázek', 'brilo-blocks')}
91
+ />
92
+ </div>
93
+ <div className={`i-hero__overlay --${contentPosition.replace(' ', '-')}`}>
94
+ <RichText
95
+ tagName={`h${headingLevel}` as any}
96
+ className="i-hero__title u-text-editable"
97
+ value={title}
98
+ onChange={(v) => setAttributes({title: v})}
99
+ placeholder={__('Nadpis...', 'brilo-blocks')}
100
+ />
101
+ <div {...innerBlocksProps} />
102
+ </div>
103
+ </div>
104
+ </>
105
+ )
106
+ }
107
+ }
@@ -0,0 +1,87 @@
1
+ .i-hero {
2
+ position: relative;
3
+ overflow: hidden;
4
+ }
5
+
6
+ .i-hero__title {
7
+ margin-top: 0;
8
+ }
9
+
10
+ .i-hero__overlay {
11
+ position: absolute;
12
+ padding: 2rem;
13
+ background: rgba(255, 255, 255, 0.95);
14
+ max-width: 80%;
15
+ z-index: 1;
16
+
17
+ &.--top-left {
18
+ top: 2rem;
19
+ left: 2rem;
20
+ }
21
+
22
+ &.--top-center {
23
+ top: 2rem;
24
+ left: 50%;
25
+ transform: translateX(-50%);
26
+ }
27
+
28
+ &.--top-right {
29
+ top: 2rem;
30
+ right: 2rem;
31
+ }
32
+
33
+ &.--center-left {
34
+ top: 50%;
35
+ left: 2rem;
36
+ transform: translateY(-50%);
37
+ }
38
+
39
+ &.--center-center {
40
+ top: 50%;
41
+ left: 50%;
42
+ transform: translate(-50%, -50%);
43
+ }
44
+
45
+ &.--center-right {
46
+ top: 50%;
47
+ right: 2rem;
48
+ transform: translateY(-50%);
49
+ }
50
+
51
+ &.--bottom-left {
52
+ bottom: 2rem;
53
+ left: 2rem;
54
+ }
55
+
56
+ &.--bottom-center {
57
+ bottom: 2rem;
58
+ left: 50%;
59
+ transform: translateX(-50%);
60
+ }
61
+
62
+ &.--bottom-right {
63
+ bottom: 2rem;
64
+ right: 2rem;
65
+ }
66
+ }
67
+
68
+ .i-hero__image-wrap {
69
+ position: relative;
70
+ width: 100%;
71
+ aspect-ratio: 2 / 1;
72
+
73
+ button {
74
+ height: 100%;
75
+ }
76
+
77
+ img,
78
+ .components-placeholder,
79
+ .image-picker-body {
80
+ position: absolute;
81
+ top: 0;
82
+ left: 0;
83
+ width: 100%;
84
+ height: 100%;
85
+ object-fit: cover;
86
+ }
87
+ }
@@ -0,0 +1,49 @@
1
+ import type {BlockConfiguration} from '@wordpress/blocks'
2
+ import {__} from '@wordpress/i18n'
3
+ import {CONTENT_POSITIONS, HEADING_LEVELS} from './constants'
4
+ import {createHeroItemEdit} from './edit'
5
+ import type {HeroItemAttributes, HeroItemOptions} from './types'
6
+ import {InnerBlocks} from '@wordpress/block-editor'
7
+
8
+ export type {HeroItemAttributes, HeroItemOptions}
9
+
10
+ export function createHeroItemBlock(options: HeroItemOptions): BlockConfiguration<HeroItemAttributes> {
11
+ const contentPositions = options.contentPositions ?? CONTENT_POSITIONS
12
+
13
+ return {
14
+ name: options.name,
15
+ title: options.title ?? __('Hero položka', 'brilo-blocks'),
16
+ description: options.description,
17
+ category: options.category ?? 'layout',
18
+ ...(options.parent && {parent: options.parent}),
19
+ icon: options.icon ?? 'cover-image',
20
+ supports: {html: false, customClassName: false},
21
+ attributes: {
22
+ title: {type: 'string', default: ''},
23
+ img: {
24
+ type: 'object',
25
+ default: {id: 0, url: '', alt: ''},
26
+ },
27
+ headingLevel: {
28
+ type: 'number',
29
+ default: HEADING_LEVELS[0],
30
+ enum: [...HEADING_LEVELS],
31
+ },
32
+ contentPosition: {
33
+ type: 'string',
34
+ default: contentPositions[4].value,
35
+ enum: contentPositions.map((p) => p.value),
36
+ },
37
+ url: {
38
+ type: 'object',
39
+ default: {src: '', blank: false},
40
+ },
41
+ focalPoint: {
42
+ type: 'object',
43
+ default: {point: 'center center', sm: {point: 'center center'}},
44
+ },
45
+ },
46
+ edit: createHeroItemEdit(options),
47
+ save: () => <InnerBlocks.Content />,
48
+ } as unknown as BlockConfiguration<HeroItemAttributes>
49
+ }
@@ -0,0 +1,10 @@
1
+ export type {HeroItemAttributes, HeroItemOptions} from './types'
2
+ export {createHeroItemBlock} from './factory'
3
+
4
+ import type {HeroItemOptions} from './types'
5
+
6
+ export const heroItemDefaults: HeroItemOptions = {
7
+ name: 'brilo/hero-item',
8
+ parent: ['brilo/hero-group'],
9
+ allowedBlocks: ['core/list', 'core/paragraph', 'brilo/button-group'],
10
+ }
@@ -0,0 +1,38 @@
1
+ import {BriloBlockType, Media, OptionArray} from '~/types'
2
+ import {CONTENT_POSITIONS, HEADING_LEVELS} from './constants'
3
+
4
+ export type ContentPosition = (typeof CONTENT_POSITIONS)[number]['value']
5
+ export type HeadingLevel = (typeof HEADING_LEVELS)[number]
6
+
7
+ export type HeroItemUrl = {
8
+ src: string
9
+ blank: boolean
10
+ }
11
+
12
+ export type HeroSliderItem = {
13
+ title: string
14
+ img: Media
15
+ headingLevel: number
16
+ contentPosition: ContentPosition
17
+ url: HeroItemUrl
18
+ }
19
+
20
+ export type HeroItemFocalPoint = {
21
+ point: ContentPosition
22
+ sm?: {
23
+ point: ContentPosition
24
+ }
25
+ }
26
+
27
+ export interface HeroItemAttributes extends Record<string, unknown> {
28
+ title: string
29
+ img: Media
30
+ headingLevel: number
31
+ contentPosition: ContentPosition
32
+ url: HeroItemUrl
33
+ focalPoint: HeroItemFocalPoint
34
+ }
35
+
36
+ export interface HeroItemOptions extends BriloBlockType {
37
+ contentPositions?: OptionArray
38
+ }
@@ -0,0 +1,20 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export const MAP_TYPES = [
4
+ {
5
+ value: 'gps',
6
+ label: __('GPS', 'brilo-blocks'),
7
+ },
8
+ {
9
+ value: 'element',
10
+ label: __('Element', 'brilo-blocks'),
11
+ },
12
+ {
13
+ value: 'url',
14
+ label: __('URL', 'brilo-blocks'),
15
+ },
16
+ {
17
+ value: 'image',
18
+ label: __('Obrázek', 'brilo-blocks'),
19
+ },
20
+ ] as const
@@ -0,0 +1,108 @@
1
+ import {InspectorControls, useBlockProps} from '@wordpress/block-editor'
2
+ import {PanelBody, BaseControl, TextControl, SelectControl, TextareaControl} from '@wordpress/components'
3
+ import {__} from '@wordpress/i18n'
4
+ import {ImagePickerControl} from '~/components/ImagePicker'
5
+ import {MAP_TYPES} from './constants'
6
+ import type {MapGroupAttributes, MapGroupOptions} from './types'
7
+ import {Icon, mapMarker} from '@wordpress/icons'
8
+
9
+ export function createMapGroupEdit(options: MapGroupOptions) {
10
+ return function Edit({
11
+ attributes,
12
+ setAttributes,
13
+ }: {
14
+ attributes: MapGroupAttributes
15
+ setAttributes: (a: Partial<MapGroupAttributes>) => void
16
+ }) {
17
+ const {mapType, iframeSrc, iframeElement, img, url, lat, long} = attributes
18
+
19
+ const blockProps = useBlockProps({
20
+ className: options.blockClassName ?? 'g-map wp-block-section',
21
+ })
22
+
23
+ return (
24
+ <>
25
+ <InspectorControls>
26
+ <PanelBody title={__('Nastavení mapy', 'brilo-blocks')}>
27
+ <SelectControl
28
+ label={__('Typ mapy', 'brilo-blocks')}
29
+ value={mapType}
30
+ options={[...MAP_TYPES]}
31
+ onChange={(v) => setAttributes({mapType: v as MapGroupAttributes['mapType']})}
32
+ />
33
+
34
+ {mapType === 'gps' && (
35
+ <BaseControl label={__('GPS', 'brilo-blocks')}>
36
+ <TextControl
37
+ label={__('Zeměpisná šířka:', 'brilo-blocks')}
38
+ value={lat || ''}
39
+ onChange={(value: string) => setAttributes({lat: value})}
40
+ />
41
+ <TextControl
42
+ label={__('Zeměpisná délka:', 'brilo-blocks')}
43
+ value={long || ''}
44
+ onChange={(value: string) => setAttributes({long: value})}
45
+ />
46
+ </BaseControl>
47
+ )}
48
+
49
+ {mapType === 'url' && (
50
+ <BaseControl label={__('Iframe', 'brilo-blocks')}>
51
+ <TextControl
52
+ label={__('URL:', 'brilo-blocks')}
53
+ value={iframeSrc || ''}
54
+ onChange={(value: string) => setAttributes({iframeSrc: value})}
55
+ />
56
+ </BaseControl>
57
+ )}
58
+
59
+ {mapType === 'element' && (
60
+ <BaseControl label={__('Iframe', 'brilo-blocks')}>
61
+ <TextareaControl
62
+ label={__('Zdrojový kód:', 'brilo-blocks')}
63
+ value={iframeElement || ''}
64
+ onChange={(value: string) => setAttributes({iframeElement: value})}
65
+ />
66
+ </BaseControl>
67
+ )}
68
+
69
+ {mapType === 'image' && (
70
+ <>
71
+ <ImagePickerControl value={img} onChange={(v) => setAttributes({img: v})} />
72
+ <TextControl
73
+ label={__('URL:', 'brilo-blocks')}
74
+ value={url || ''}
75
+ onChange={(value: string) => setAttributes({url: value})}
76
+ />
77
+ </>
78
+ )}
79
+ </PanelBody>
80
+ </InspectorControls>
81
+
82
+ <div {...blockProps}>
83
+ <div className="g-map__map">
84
+ {mapType === 'gps' && (lat || long) && (
85
+ <div>
86
+ <Icon icon={mapMarker} />
87
+ <p>{[lat, long].filter(Boolean).join(', ')}</p>
88
+ </div>
89
+ )}
90
+ {mapType === 'url' && iframeSrc && <iframe src={iframeSrc} width={640} height={320}></iframe>}
91
+ {mapType === 'element' && iframeElement && <div dangerouslySetInnerHTML={{__html: iframeElement}} />}
92
+ {mapType === 'image' && img && <ImagePickerControl value={img} onChange={(v) => setAttributes({img: v})} size={[640, 320]} />}
93
+ {(!mapType ||
94
+ (mapType === 'gps' && !lat && !long) ||
95
+ (mapType === 'url' && !iframeSrc) ||
96
+ (mapType === 'element' && !iframeElement) ||
97
+ (mapType === 'image' && !img)) && (
98
+ <>
99
+ <Icon icon={mapMarker} />
100
+ {__('Zde je prostor pro vaši mapu.', 'brilo-blocks')}
101
+ </>
102
+ )}
103
+ </div>
104
+ </div>
105
+ </>
106
+ )
107
+ }
108
+ }
@@ -0,0 +1,24 @@
1
+ @layer base {
2
+ .g-map__map {
3
+ min-height: 200px;
4
+ padding: 16px;
5
+ border: 1px dashed #ccc;
6
+ border-radius: 4px;
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ flex-direction: column;
11
+ text-align: center;
12
+ gap: 16px;
13
+
14
+ .c-image-picker-control__row {
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+
19
+ img {
20
+ object-fit: contain;
21
+ }
22
+ }
23
+ }
24
+ }