@brilo/base-blocks 0.1.1 → 0.1.3

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 (250) hide show
  1. package/build/blocks/form/form-group/edit.d.ts.map +1 -1
  2. package/build/blocks/form/form-group/edit.js +17 -3
  3. package/build/blocks/form/form-group/factory.d.ts.map +1 -1
  4. package/build/blocks/form/form-group/factory.js +1 -0
  5. package/build/blocks/form/form-group/types.d.ts +1 -0
  6. package/build/blocks/form/form-group/types.d.ts.map +1 -1
  7. package/package.json +3 -2
  8. package/src/blocks/column/column-group/edit.tsx +56 -0
  9. package/src/blocks/column/column-group/editor.scss +7 -0
  10. package/src/blocks/column/column-group/factory.tsx +29 -0
  11. package/src/blocks/column/column-group/index.ts +14 -0
  12. package/src/blocks/column/column-group/types.ts +8 -0
  13. package/src/blocks/column/column-item/constants.ts +1 -0
  14. package/src/blocks/column/column-item/edit.tsx +48 -0
  15. package/src/blocks/column/column-item/editor.scss +34 -0
  16. package/src/blocks/column/column-item/factory.tsx +25 -0
  17. package/src/blocks/column/column-item/index.ts +10 -0
  18. package/src/blocks/column/column-item/types.ts +7 -0
  19. package/src/blocks/compare/compare-group/constants.ts +1 -0
  20. package/src/blocks/compare/compare-group/edit.tsx +52 -0
  21. package/src/blocks/compare/compare-group/factory.tsx +29 -0
  22. package/src/blocks/compare/compare-group/icon.tsx +7 -0
  23. package/src/blocks/compare/compare-group/index.ts +13 -0
  24. package/src/blocks/compare/compare-group/types.ts +12 -0
  25. package/src/blocks/compare/compare-item/edit.tsx +38 -0
  26. package/src/blocks/compare/compare-item/editor.scss +15 -0
  27. package/src/blocks/compare/compare-item/factory.tsx +28 -0
  28. package/src/blocks/compare/compare-item/icon.tsx +9 -0
  29. package/src/blocks/compare/compare-item/index.ts +13 -0
  30. package/src/blocks/compare/compare-item/types.ts +9 -0
  31. package/src/blocks/compare/compare-option/constants.ts +7 -0
  32. package/src/blocks/compare/compare-option/edit.tsx +64 -0
  33. package/src/blocks/compare/compare-option/editor.scss +26 -0
  34. package/src/blocks/compare/compare-option/factory.tsx +35 -0
  35. package/src/blocks/compare/compare-option/icon.tsx +7 -0
  36. package/src/blocks/compare/compare-option/index.ts +8 -0
  37. package/src/blocks/compare/compare-option/types.ts +12 -0
  38. package/src/blocks/contact/contact-group/constants.ts +3 -0
  39. package/src/blocks/contact/contact-group/edit.tsx +57 -0
  40. package/src/blocks/contact/contact-group/editor.scss +20 -0
  41. package/src/blocks/contact/contact-group/factory.tsx +35 -0
  42. package/src/blocks/contact/contact-group/index.ts +12 -0
  43. package/src/blocks/contact/contact-group/types.ts +12 -0
  44. package/src/blocks/contact/contact-item/constants.ts +17 -0
  45. package/src/blocks/contact/contact-item/edit.tsx +93 -0
  46. package/src/blocks/contact/contact-item/editor.scss +38 -0
  47. package/src/blocks/contact/contact-item/factory.tsx +35 -0
  48. package/src/blocks/contact/contact-item/index.ts +23 -0
  49. package/src/blocks/contact/contact-item/types.ts +21 -0
  50. package/src/blocks/core/basic-button/constants.ts +17 -0
  51. package/src/blocks/core/basic-button/edit.tsx +107 -0
  52. package/src/blocks/core/basic-button/editor.scss +80 -0
  53. package/src/blocks/core/basic-button/factory.tsx +54 -0
  54. package/src/blocks/core/basic-button/index.ts +8 -0
  55. package/src/blocks/core/basic-button/types.ts +29 -0
  56. package/src/blocks/core/basic-heading/constants.ts +1 -0
  57. package/src/blocks/core/basic-heading/edit.tsx +76 -0
  58. package/src/blocks/core/basic-heading/editor.scss +8 -0
  59. package/src/blocks/core/basic-heading/factory.tsx +40 -0
  60. package/src/blocks/core/basic-heading/index.ts +8 -0
  61. package/src/blocks/core/basic-heading/types.ts +20 -0
  62. package/src/blocks/core/basic-overline/edit.tsx +28 -0
  63. package/src/blocks/core/basic-overline/editor.scss +14 -0
  64. package/src/blocks/core/basic-overline/factory.tsx +22 -0
  65. package/src/blocks/core/basic-overline/index.ts +8 -0
  66. package/src/blocks/core/basic-overline/types.ts +7 -0
  67. package/src/blocks/faq/faq-group/constants.ts +11 -0
  68. package/src/blocks/faq/faq-group/edit.tsx +55 -0
  69. package/src/blocks/faq/faq-group/editor.scss +11 -0
  70. package/src/blocks/faq/faq-group/factory.tsx +39 -0
  71. package/src/blocks/faq/faq-group/index.ts +11 -0
  72. package/src/blocks/faq/faq-group/types.ts +14 -0
  73. package/src/blocks/faq/faq-item/edit.tsx +50 -0
  74. package/src/blocks/faq/faq-item/editor.scss +57 -0
  75. package/src/blocks/faq/faq-item/factory.tsx +24 -0
  76. package/src/blocks/faq/faq-item/index.ts +9 -0
  77. package/src/blocks/faq/faq-item/types.ts +7 -0
  78. package/src/blocks/form/form-field/constants.ts +14 -0
  79. package/src/blocks/form/form-field/edit.tsx +178 -0
  80. package/src/blocks/form/form-field/editor.scss +71 -0
  81. package/src/blocks/form/form-field/factory.tsx +32 -0
  82. package/src/blocks/form/form-field/index.ts +10 -0
  83. package/src/blocks/form/form-field/types.ts +18 -0
  84. package/src/blocks/form/form-group/constants.ts +16 -0
  85. package/src/blocks/form/form-group/edit.tsx +214 -0
  86. package/src/blocks/form/form-group/editor.scss +41 -0
  87. package/src/blocks/form/form-group/factory.tsx +36 -0
  88. package/src/blocks/form/form-group/index.ts +18 -0
  89. package/src/blocks/form/form-group/types.ts +23 -0
  90. package/src/blocks/groups/banner-group/constants.ts +15 -0
  91. package/src/blocks/groups/banner-group/edit.tsx +122 -0
  92. package/src/blocks/groups/banner-group/editor.scss +18 -0
  93. package/src/blocks/groups/banner-group/factory.tsx +64 -0
  94. package/src/blocks/groups/banner-group/icon.tsx +13 -0
  95. package/src/blocks/groups/banner-group/index.ts +11 -0
  96. package/src/blocks/groups/banner-group/types.ts +30 -0
  97. package/src/blocks/groups/basic-header-group/constants.ts +9 -0
  98. package/src/blocks/groups/basic-header-group/edit.tsx +99 -0
  99. package/src/blocks/groups/basic-header-group/editor.scss +35 -0
  100. package/src/blocks/groups/basic-header-group/factory.tsx +46 -0
  101. package/src/blocks/groups/basic-header-group/icon.tsx +17 -0
  102. package/src/blocks/groups/basic-header-group/index.ts +9 -0
  103. package/src/blocks/groups/basic-header-group/types.ts +27 -0
  104. package/src/blocks/groups/button-group/constants.ts +7 -0
  105. package/src/blocks/groups/button-group/edit.tsx +52 -0
  106. package/src/blocks/groups/button-group/editor.scss +23 -0
  107. package/src/blocks/groups/button-group/factory.tsx +34 -0
  108. package/src/blocks/groups/button-group/index.ts +11 -0
  109. package/src/blocks/groups/button-group/types.ts +12 -0
  110. package/src/blocks/groups/text-and-media-group/constants.ts +43 -0
  111. package/src/blocks/groups/text-and-media-group/edit.tsx +241 -0
  112. package/src/blocks/groups/text-and-media-group/editor.scss +123 -0
  113. package/src/blocks/groups/text-and-media-group/factory.tsx +100 -0
  114. package/src/blocks/groups/text-and-media-group/icon.tsx +37 -0
  115. package/src/blocks/groups/text-and-media-group/index.ts +18 -0
  116. package/src/blocks/groups/text-and-media-group/types.ts +60 -0
  117. package/src/blocks/hero/hero-group/constants.ts +23 -0
  118. package/src/blocks/hero/hero-group/edit.tsx +85 -0
  119. package/src/blocks/hero/hero-group/editor.scss +0 -0
  120. package/src/blocks/hero/hero-group/factory.tsx +45 -0
  121. package/src/blocks/hero/hero-group/icon.tsx +28 -0
  122. package/src/blocks/hero/hero-group/index.ts +11 -0
  123. package/src/blocks/hero/hero-group/types.ts +22 -0
  124. package/src/blocks/hero/hero-item/constants.ts +15 -0
  125. package/src/blocks/hero/hero-item/edit.tsx +107 -0
  126. package/src/blocks/hero/hero-item/editor.scss +87 -0
  127. package/src/blocks/hero/hero-item/factory.tsx +49 -0
  128. package/src/blocks/hero/hero-item/index.ts +10 -0
  129. package/src/blocks/hero/hero-item/types.ts +38 -0
  130. package/src/blocks/map/map-group/constants.ts +20 -0
  131. package/src/blocks/map/map-group/edit.tsx +108 -0
  132. package/src/blocks/map/map-group/editor.scss +24 -0
  133. package/src/blocks/map/map-group/factory.tsx +51 -0
  134. package/src/blocks/map/map-group/index.ts +9 -0
  135. package/src/blocks/map/map-group/types.ts +16 -0
  136. package/src/blocks/newsletter/newsletter-form/constants.ts +5 -0
  137. package/src/blocks/newsletter/newsletter-form/edit.tsx +194 -0
  138. package/src/blocks/newsletter/newsletter-form/editor.scss +68 -0
  139. package/src/blocks/newsletter/newsletter-form/factory.tsx +59 -0
  140. package/src/blocks/newsletter/newsletter-form/index.ts +11 -0
  141. package/src/blocks/newsletter/newsletter-form/types.ts +45 -0
  142. package/src/blocks/post/post-slider-group/constants.ts +3 -0
  143. package/src/blocks/post/post-slider-group/edit.tsx +76 -0
  144. package/src/blocks/post/post-slider-group/factory.tsx +43 -0
  145. package/src/blocks/post/post-slider-group/icon.tsx +13 -0
  146. package/src/blocks/post/post-slider-group/index.ts +9 -0
  147. package/src/blocks/post/post-slider-group/types.ts +20 -0
  148. package/src/blocks/responsive-grid/responsive-grid-group/edit.tsx +95 -0
  149. package/src/blocks/responsive-grid/responsive-grid-group/factory.tsx +33 -0
  150. package/src/blocks/responsive-grid/responsive-grid-group/index.ts +13 -0
  151. package/src/blocks/responsive-grid/responsive-grid-group/types.ts +9 -0
  152. package/src/blocks/responsive-grid/responsive-grid-item/edit.tsx +19 -0
  153. package/src/blocks/responsive-grid/responsive-grid-item/factory.tsx +20 -0
  154. package/src/blocks/responsive-grid/responsive-grid-item/index.ts +9 -0
  155. package/src/blocks/responsive-grid/responsive-grid-item/types.ts +5 -0
  156. package/src/blocks/sections/base-section/attributes.ts +17 -0
  157. package/src/blocks/sections/base-section/constants.ts +18 -0
  158. package/src/blocks/sections/base-section/controls.tsx +70 -0
  159. package/src/blocks/sections/base-section/edit.tsx +34 -0
  160. package/src/blocks/sections/base-section/editor.scss +24 -0
  161. package/src/blocks/sections/base-section/factory.tsx +47 -0
  162. package/src/blocks/sections/base-section/icon.tsx +6 -0
  163. package/src/blocks/sections/base-section/index.ts +14 -0
  164. package/src/blocks/sections/base-section/types.ts +26 -0
  165. package/src/blocks/signpost/signpost-group/constants.ts +3 -0
  166. package/src/blocks/signpost/signpost-group/edit.tsx +75 -0
  167. package/src/blocks/signpost/signpost-group/editor.scss +0 -0
  168. package/src/blocks/signpost/signpost-group/factory.tsx +40 -0
  169. package/src/blocks/signpost/signpost-group/icon.tsx +19 -0
  170. package/src/blocks/signpost/signpost-group/index.ts +15 -0
  171. package/src/blocks/signpost/signpost-group/types.ts +9 -0
  172. package/src/blocks/signpost/signpost-item/constants.ts +4 -0
  173. package/src/blocks/signpost/signpost-item/edit.tsx +90 -0
  174. package/src/blocks/signpost/signpost-item/editor.scss +25 -0
  175. package/src/blocks/signpost/signpost-item/factory.tsx +29 -0
  176. package/src/blocks/signpost/signpost-item/icon.tsx +7 -0
  177. package/src/blocks/signpost/signpost-item/index.ts +10 -0
  178. package/src/blocks/signpost/signpost-item/types.ts +12 -0
  179. package/src/blocks/step/step-group/constants.ts +6 -0
  180. package/src/blocks/step/step-group/edit.tsx +64 -0
  181. package/src/blocks/step/step-group/editor.scss +19 -0
  182. package/src/blocks/step/step-group/factory.tsx +36 -0
  183. package/src/blocks/step/step-group/icon.tsx +27 -0
  184. package/src/blocks/step/step-group/index.ts +15 -0
  185. package/src/blocks/step/step-group/types.ts +13 -0
  186. package/src/blocks/step/step-item/constants.ts +6 -0
  187. package/src/blocks/step/step-item/edit.tsx +60 -0
  188. package/src/blocks/step/step-item/editor.scss +18 -0
  189. package/src/blocks/step/step-item/factory.tsx +27 -0
  190. package/src/blocks/step/step-item/index.ts +11 -0
  191. package/src/blocks/step/step-item/types.ts +12 -0
  192. package/src/blocks/testimonial/testimonial-group/constants.ts +27 -0
  193. package/src/blocks/testimonial/testimonial-group/edit.tsx +74 -0
  194. package/src/blocks/testimonial/testimonial-group/editor.scss +38 -0
  195. package/src/blocks/testimonial/testimonial-group/factory.tsx +44 -0
  196. package/src/blocks/testimonial/testimonial-group/icon.tsx +33 -0
  197. package/src/blocks/testimonial/testimonial-group/index.ts +15 -0
  198. package/src/blocks/testimonial/testimonial-group/types.ts +19 -0
  199. package/src/blocks/testimonial/testimonial-item/edit.tsx +48 -0
  200. package/src/blocks/testimonial/testimonial-item/editor.scss +20 -0
  201. package/src/blocks/testimonial/testimonial-item/factory.tsx +35 -0
  202. package/src/blocks/testimonial/testimonial-item/index.ts +9 -0
  203. package/src/blocks/testimonial/testimonial-item/types.ts +9 -0
  204. package/src/blocks/text-and-form/text-and-form-group/constants.ts +6 -0
  205. package/src/blocks/text-and-form/text-and-form-group/edit.tsx +59 -0
  206. package/src/blocks/text-and-form/text-and-form-group/editor.scss +21 -0
  207. package/src/blocks/text-and-form/text-and-form-group/factory.tsx +38 -0
  208. package/src/blocks/text-and-form/text-and-form-group/icon.tsx +23 -0
  209. package/src/blocks/text-and-form/text-and-form-group/index.ts +9 -0
  210. package/src/blocks/text-and-form/text-and-form-group/types.ts +23 -0
  211. package/src/blocks/text-and-form/text-and-form-text-column/constants.ts +10 -0
  212. package/src/blocks/text-and-form/text-and-form-text-column/edit.tsx +94 -0
  213. package/src/blocks/text-and-form/text-and-form-text-column/editor.scss +29 -0
  214. package/src/blocks/text-and-form/text-and-form-text-column/factory.tsx +41 -0
  215. package/src/blocks/text-and-form/text-and-form-text-column/index.ts +18 -0
  216. package/src/blocks/text-and-form/text-and-form-text-column/types.ts +23 -0
  217. package/src/blocks/usp/usp-group/constants.ts +54 -0
  218. package/src/blocks/usp/usp-group/edit.tsx +197 -0
  219. package/src/blocks/usp/usp-group/editor.scss +24 -0
  220. package/src/blocks/usp/usp-group/factory.tsx +113 -0
  221. package/src/blocks/usp/usp-group/icon.tsx +18 -0
  222. package/src/blocks/usp/usp-group/index.ts +15 -0
  223. package/src/blocks/usp/usp-group/types.ts +70 -0
  224. package/src/blocks/usp/usp-item/constants.ts +7 -0
  225. package/src/blocks/usp/usp-item/edit.tsx +65 -0
  226. package/src/blocks/usp/usp-item/editor.scss +17 -0
  227. package/src/blocks/usp/usp-item/factory.tsx +30 -0
  228. package/src/blocks/usp/usp-item/index.ts +11 -0
  229. package/src/blocks/usp/usp-item/types.ts +17 -0
  230. package/src/components/IconControl/IconControl.tsx +55 -0
  231. package/src/components/IconControl/editor.scss +53 -0
  232. package/src/components/IconControl/index.ts +2 -0
  233. package/src/components/IconControl/index.tsx +1 -0
  234. package/src/components/ImagePicker/ImagePicker.tsx +124 -0
  235. package/src/components/ImagePicker/editor.scss +79 -0
  236. package/src/components/ImagePicker/index.ts +2 -0
  237. package/src/components/ImagePicker/index.tsx +1 -0
  238. package/src/components/ItemIconControl/ItemIconControl.tsx +72 -0
  239. package/src/components/ItemIconControl/ItemIconModal.tsx +12 -0
  240. package/src/components/ItemIconControl/ItemIconPreview.tsx +93 -0
  241. package/src/components/ItemIconControl/editor.scss +52 -0
  242. package/src/components/ItemIconControl/index.ts +2 -0
  243. package/src/components/ItemIconControl/types.d.ts +30 -0
  244. package/src/constants.ts +20 -0
  245. package/src/editor.scss +34 -0
  246. package/src/globals.scss +237 -0
  247. package/src/hooks/useGroupBlock.ts +53 -0
  248. package/src/index.ts +122 -0
  249. package/src/types.ts +33 -0
  250. package/src/utils/createEditAdapter.ts +11 -0
@@ -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
+ }
@@ -0,0 +1,51 @@
1
+ import type {BlockConfiguration} from '@wordpress/blocks'
2
+ import {__} from '@wordpress/i18n'
3
+ import {createMapGroupEdit} from './edit'
4
+ import type {MapGroupAttributes, MapGroupOptions} from './types'
5
+ import {MAP_TYPES} from './constants'
6
+
7
+ export type {MapGroupAttributes, MapGroupOptions}
8
+
9
+ export function createMapGroupBlock(options: MapGroupOptions): BlockConfiguration<MapGroupAttributes> {
10
+ return {
11
+ name: options.name,
12
+ title: options.title ?? __('Mapa', 'brilo-blocks'),
13
+ description: options.description,
14
+ category: options.category ?? 'layout',
15
+ ...(options.parent && {parent: options.parent}),
16
+ icon: options.icon ?? 'location-alt',
17
+ supports: {html: false, customClassName: false},
18
+ attributes: {
19
+ mapType: {
20
+ type: 'string',
21
+ default: MAP_TYPES[0].value,
22
+ },
23
+ iframeSrc: {
24
+ type: 'string',
25
+ default: '',
26
+ },
27
+ iframeElement: {
28
+ type: 'string',
29
+ default: '',
30
+ },
31
+ img: {
32
+ type: 'object',
33
+ default: {id: 0, url: '', alt: ''},
34
+ },
35
+ url: {
36
+ type: 'string',
37
+ default: '',
38
+ },
39
+ lat: {
40
+ type: 'string',
41
+ default: '',
42
+ },
43
+ long: {
44
+ type: 'string',
45
+ default: '',
46
+ },
47
+ },
48
+ edit: createMapGroupEdit(options),
49
+ save: () => null,
50
+ } as unknown as BlockConfiguration<MapGroupAttributes>
51
+ }
@@ -0,0 +1,9 @@
1
+ export type {MapGroupAttributes, MapGroupOptions} from './types'
2
+ export {createMapGroupBlock} from './factory'
3
+
4
+ import type {MapGroupOptions} from './types'
5
+
6
+ export const mapGroupDefaults: MapGroupOptions = {
7
+ name: 'brilo/map-group',
8
+ parent: ['brilo/base-section'],
9
+ }
@@ -0,0 +1,16 @@
1
+ import {BriloBlockType, Media} from '~/types'
2
+ import {MAP_TYPES} from './constants'
3
+
4
+ export type MapType = (typeof MAP_TYPES)[number]['value']
5
+
6
+ export interface MapGroupAttributes extends Record<string, unknown> {
7
+ mapType: MapType
8
+ iframeSrc: string
9
+ iframeElement: string
10
+ img: Media
11
+ url: string
12
+ lat: string
13
+ long: string
14
+ }
15
+
16
+ export interface MapGroupOptions extends BriloBlockType {}
@@ -0,0 +1,5 @@
1
+ import {HEADING_STYLES} from '~/constants'
2
+
3
+ export const DEFAULT_HEADING_STYLES = HEADING_STYLES
4
+
5
+ export const NEWSLETTER_LEVELS = [1, 2, 3] as const
@@ -0,0 +1,194 @@
1
+ import {InspectorControls, RichText, useBlockProps} from '@wordpress/block-editor'
2
+ import {
3
+ Button,
4
+ PanelBody,
5
+ SelectControl,
6
+ TextControl,
7
+ ToggleControl,
8
+ __experimentalToggleGroupControl as ToggleGroupControl,
9
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
10
+ } from '@wordpress/components'
11
+ import {__} from '@wordpress/i18n'
12
+ import clsx from 'clsx'
13
+ import {IconControl} from '~/components/IconControl'
14
+ import {DEFAULT_HEADING_STYLES, NEWSLETTER_LEVELS} from './constants'
15
+ import type {HeadingLevels, HeadingStyles, NewsletterFormAttributes, NewsletterFormOptions} from './types'
16
+
17
+ export function createNewsletterFormEdit(options: NewsletterFormOptions) {
18
+ const HEADING_STYLES = options.headingStyles ?? DEFAULT_HEADING_STYLES
19
+
20
+ return function Edit({
21
+ attributes,
22
+ setAttributes,
23
+ }: {
24
+ attributes: NewsletterFormAttributes
25
+ setAttributes: (a: Partial<NewsletterFormAttributes>) => void
26
+ }) {
27
+ const {heading, description, form} = attributes
28
+ const {email, submit, terms} = form.fields
29
+
30
+ const setForm = (patch: Partial<NewsletterFormAttributes['form']>) => setAttributes({form: {...form, ...patch}})
31
+ const setFields = (patch: Partial<NewsletterFormAttributes['form']['fields']>) => setForm({fields: {...form.fields, ...patch}})
32
+
33
+ const blockProps = useBlockProps({className: 'f-newsletter'})
34
+
35
+ const iconUrl = email.icon.src ? `${options.iconsSrc}${email.icon.src}.svg` : ''
36
+
37
+ return (
38
+ <>
39
+ <InspectorControls>
40
+ <PanelBody title={__('Nadpis', 'brilo-blocks')}>
41
+ <ToggleGroupControl
42
+ label={__('Úroveň nadpisu', 'brilo-blocks')}
43
+ value={String(heading.level)}
44
+ onChange={(v) => setAttributes({heading: {...heading, level: Number(v) as HeadingLevels}})}
45
+ isBlock
46
+ >
47
+ {NEWSLETTER_LEVELS.map((l) => (
48
+ <ToggleGroupControlOption key={l} value={String(l)} label={`H${l}`} />
49
+ ))}
50
+ </ToggleGroupControl>
51
+ <ToggleGroupControl
52
+ label={__('Styl nadpisu', 'brilo-blocks')}
53
+ value={heading.style}
54
+ onChange={(v) => setAttributes({heading: {...heading, style: v as HeadingStyles}})}
55
+ isBlock
56
+ >
57
+ {HEADING_STYLES.map((s) => (
58
+ <ToggleGroupControlOption key={s} value={s} label={s} />
59
+ ))}
60
+ </ToggleGroupControl>
61
+ </PanelBody>
62
+
63
+ <PanelBody title={__('Formulář', 'brilo-blocks')} initialOpen={false}>
64
+ <TextControl label={__('ID formuláře', 'brilo-blocks')} value={form.id} onChange={(v) => setForm({id: v})} />
65
+ <TextControl label={__('Akce (URL)', 'brilo-blocks')} value={form.action} onChange={(v) => setForm({action: v})} />
66
+ <SelectControl
67
+ label={__('Metoda', 'brilo-blocks')}
68
+ value={form.method as 'post' | 'get'}
69
+ options={[
70
+ {value: 'post', label: 'POST'},
71
+ {value: 'get', label: 'GET'},
72
+ ]}
73
+ onChange={(v) => setForm({method: v})}
74
+ />
75
+ <TextControl label={__('Název formuláře', 'brilo-blocks')} value={form.name} onChange={(v) => setForm({name: v})} />
76
+ </PanelBody>
77
+
78
+ <PanelBody title={__('Skrytá pole', 'brilo-blocks')} initialOpen={false}>
79
+ {form.hiddenFields.map((field, i) => (
80
+ <div key={i} className="f-newsletter__hidden-field">
81
+ <TextControl
82
+ label={__('Název', 'brilo-blocks')}
83
+ value={field.name}
84
+ onChange={(v) => setForm({hiddenFields: form.hiddenFields.map((f, idx) => (idx === i ? {...f, name: v} : f))})}
85
+ />
86
+ <TextControl
87
+ label={__('Hodnota', 'brilo-blocks')}
88
+ value={field.value}
89
+ onChange={(v) => setForm({hiddenFields: form.hiddenFields.map((f, idx) => (idx === i ? {...f, value: v} : f))})}
90
+ />
91
+ <Button
92
+ isDestructive
93
+ variant="secondary"
94
+ onClick={() => setForm({hiddenFields: form.hiddenFields.filter((_, idx) => idx !== i)})}
95
+ >
96
+ {__('Odebrat', 'brilo-blocks')}
97
+ </Button>
98
+ </div>
99
+ ))}
100
+ <Button variant="secondary" onClick={() => setForm({hiddenFields: [...form.hiddenFields, {name: '', value: ''}]})}>
101
+ {__('Přidat pole', 'brilo-blocks')}
102
+ </Button>
103
+ </PanelBody>
104
+
105
+ <PanelBody title={__('E-mailové pole', 'brilo-blocks')} initialOpen={false}>
106
+ <TextControl
107
+ label={__('Název (name)', 'brilo-blocks')}
108
+ value={email.name}
109
+ onChange={(v) => setFields({email: {...email, name: v}})}
110
+ />
111
+ <TextControl
112
+ label={__('Popisek', 'brilo-blocks')}
113
+ value={email.label}
114
+ onChange={(v) => setFields({email: {...email, label: v}})}
115
+ />
116
+ <TextControl
117
+ label={__('Placeholder', 'brilo-blocks')}
118
+ value={email.placeholder}
119
+ onChange={(v) => setFields({email: {...email, placeholder: v}})}
120
+ />
121
+ <IconControl
122
+ label={__('Ikona', 'brilo-blocks')}
123
+ value={email.icon.src}
124
+ icons={options.icons}
125
+ iconsSrc={options.iconsSrc}
126
+ onChange={(ic) => setFields({email: {...email, icon: {...email.icon, type: 'preselected', src: ic.value}}})}
127
+ />
128
+ </PanelBody>
129
+
130
+ <PanelBody title={__('Tlačítko', 'brilo-blocks')} initialOpen={false}>
131
+ <TextControl
132
+ label={__('Text tlačítka', 'brilo-blocks')}
133
+ value={submit.title}
134
+ onChange={(v) => setFields({submit: {...submit, title: v}})}
135
+ />
136
+ </PanelBody>
137
+
138
+ <PanelBody title={__('Souhlas', 'brilo-blocks')} initialOpen={false}>
139
+ <TextControl
140
+ label={__('Název (name)', 'brilo-blocks')}
141
+ value={terms.name}
142
+ onChange={(v) => setFields({terms: {...terms, name: v}})}
143
+ />
144
+ <ToggleControl
145
+ label={__('Zobrazit jako checkbox', 'brilo-blocks')}
146
+ checked={terms.isCheckbox}
147
+ onChange={(v) => setFields({terms: {...terms, isCheckbox: v}})}
148
+ />
149
+ </PanelBody>
150
+ </InspectorControls>
151
+
152
+ <div {...blockProps}>
153
+ <RichText
154
+ tagName={`h${heading.level}` as HeadingStyles}
155
+ className={clsx('f-newsletter__heading', `--heading-style-${heading.style}`, 'u-text-editable')}
156
+ value={heading.title}
157
+ onChange={(v: string) => setAttributes({heading: {...heading, title: v}})}
158
+ placeholder={__('Nadpis...', 'brilo-blocks')}
159
+ allowedFormats={['core/bold', 'core/italic']}
160
+ />
161
+ <RichText
162
+ tagName="div"
163
+ className="f-newsletter__description u-text-editable"
164
+ value={description}
165
+ onChange={(v: string) => setAttributes({description: v})}
166
+ placeholder={__('Popis...', 'brilo-blocks')}
167
+ />
168
+
169
+ <div className="f-newsletter__form" aria-hidden="true">
170
+ <div className="f-newsletter__field">
171
+ {iconUrl && <img src={iconUrl} alt="" className="f-newsletter__field-icon" width={24} height={24} />}
172
+ <input type="email" className="f-newsletter__input" placeholder={email.placeholder} disabled />
173
+ </div>
174
+ <button type="button" className="f-newsletter__submit" disabled>
175
+ {submit.title || __('Odebírat', 'brilo-blocks')}
176
+ </button>
177
+ </div>
178
+
179
+ <label className="f-newsletter__terms">
180
+ {terms.isCheckbox && <input type="checkbox" disabled />}
181
+ <RichText
182
+ tagName="span"
183
+ className="f-newsletter__terms-text u-text-editable"
184
+ value={terms.title}
185
+ onChange={(v: string) => setFields({terms: {...terms, title: v}})}
186
+ placeholder={__('Souhlas se zpracováním...', 'brilo-blocks')}
187
+ allowedFormats={['core/bold', 'core/italic', 'core/link']}
188
+ />
189
+ </label>
190
+ </div>
191
+ </>
192
+ )
193
+ }
194
+ }
@@ -0,0 +1,68 @@
1
+ @layer base {
2
+ .f-newsletter {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 12px;
6
+ }
7
+
8
+ .f-newsletter__heading {
9
+ margin: 0;
10
+ }
11
+
12
+ .f-newsletter__description {
13
+ margin: 0;
14
+ color: #555;
15
+ }
16
+
17
+ .f-newsletter__form {
18
+ display: flex;
19
+ flex-wrap: wrap;
20
+ gap: 8px;
21
+ align-items: stretch;
22
+ }
23
+
24
+ .f-newsletter__field {
25
+ display: flex;
26
+ flex-grow: 1;
27
+ align-items: center;
28
+ gap: 8px;
29
+ padding: 0 12px;
30
+ background: #fff;
31
+ border: 1px solid #ddd;
32
+ border-radius: 4px;
33
+ }
34
+
35
+ .f-newsletter__field-icon {
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ .f-newsletter__input {
40
+ flex-grow: 1;
41
+ padding: 10px 0;
42
+ border: 0;
43
+ background: transparent;
44
+ }
45
+
46
+ .f-newsletter__submit {
47
+ padding: 10px 20px;
48
+ border: 0;
49
+ border-radius: 4px;
50
+ background: #222;
51
+ color: #fff;
52
+ cursor: default;
53
+ }
54
+
55
+ .f-newsletter__terms {
56
+ display: flex;
57
+ align-items: flex-start;
58
+ gap: 8px;
59
+ font-size: 13px;
60
+ color: #555;
61
+ }
62
+
63
+ .f-newsletter__hidden-field {
64
+ padding-bottom: 12px;
65
+ margin-bottom: 12px;
66
+ border-bottom: 1px solid #eee;
67
+ }
68
+ }
@@ -0,0 +1,59 @@
1
+ import type {BlockConfiguration} from '@wordpress/blocks'
2
+ import {__} from '@wordpress/i18n'
3
+ import {DEFAULT_HEADING_STYLES, NEWSLETTER_LEVELS} from './constants'
4
+ import {createNewsletterFormEdit} from './edit'
5
+ import type {NewsletterFormAttributes, NewsletterFormOptions} from './types'
6
+
7
+ export type {NewsletterFormAttributes, NewsletterFormOptions}
8
+
9
+ export function createNewsletterFormBlock(options: NewsletterFormOptions): BlockConfiguration<NewsletterFormAttributes> {
10
+ const headingStyles = options.headingStyles ?? DEFAULT_HEADING_STYLES
11
+
12
+ return {
13
+ name: options.name,
14
+ title: options.title ?? __('Newsletter', 'brilo-blocks'),
15
+ description: options.description,
16
+ category: options.category ?? 'text',
17
+ icon: options.icon ?? 'email',
18
+ ...(options.parent && {parent: options.parent}),
19
+ supports: {html: false, customClassName: false},
20
+ attributes: {
21
+ heading: {
22
+ type: 'object',
23
+ default: {title: '', level: NEWSLETTER_LEVELS[1], style: headingStyles[1] ?? headingStyles[0]},
24
+ },
25
+ description: {
26
+ type: 'string',
27
+ default: '',
28
+ },
29
+ form: {
30
+ type: 'object',
31
+ default: {
32
+ id: '',
33
+ action: '',
34
+ method: 'post',
35
+ name: '',
36
+ hiddenFields: [],
37
+ fields: {
38
+ email: {
39
+ name: 'email',
40
+ label: __('E-mail', 'brilo-blocks'),
41
+ placeholder: __('Váš e-mail', 'brilo-blocks'),
42
+ icon: {type: 'preselected', src: '', media: {id: 0, alt: ''}},
43
+ },
44
+ submit: {
45
+ title: __('Odebírat', 'brilo-blocks'),
46
+ },
47
+ terms: {
48
+ title: '',
49
+ name: 'terms',
50
+ isCheckbox: true,
51
+ },
52
+ },
53
+ },
54
+ },
55
+ },
56
+ edit: createNewsletterFormEdit(options),
57
+ save: () => null,
58
+ } as unknown as BlockConfiguration<NewsletterFormAttributes>
59
+ }
@@ -0,0 +1,11 @@
1
+ export type {NewsletterFormAttributes, NewsletterFormOptions} from './types'
2
+ export {createNewsletterFormBlock} from './factory'
3
+
4
+ import type {NewsletterFormOptions} from './types'
5
+
6
+ export const newsletterFormDefaults: NewsletterFormOptions = {
7
+ name: 'brilo/newsletter-form',
8
+ parent: ['brilo/base-section'],
9
+ icons: [],
10
+ iconsSrc: '',
11
+ }
@@ -0,0 +1,45 @@
1
+ import type {BriloBlockType, Icon, StringArray} from '~/types'
2
+ import type {IconType} from '~/components/IconControl'
3
+ import {DEFAULT_HEADING_STYLES, NEWSLETTER_LEVELS} from './constants'
4
+
5
+ export type HeadingLevels = (typeof NEWSLETTER_LEVELS)[number]
6
+ export type HeadingStyles = (typeof DEFAULT_HEADING_STYLES)[number]
7
+
8
+ export interface HiddenField {
9
+ name: string
10
+ value: string
11
+ }
12
+
13
+ export interface NewsletterFormAttributes extends Record<string, unknown> {
14
+ heading: {title: string; level: HeadingLevels; style: HeadingStyles}
15
+ description: string // Rich text
16
+ form: {
17
+ id: string
18
+ action: string
19
+ method: string
20
+ name: string
21
+ hiddenFields: HiddenField[]
22
+ fields: {
23
+ email: {
24
+ name: string
25
+ label: string
26
+ placeholder: string
27
+ icon: Icon
28
+ }
29
+ submit: {
30
+ title: string
31
+ }
32
+ terms: {
33
+ title: string // Rich text
34
+ name: string
35
+ isCheckbox: boolean
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ export interface NewsletterFormOptions extends BriloBlockType {
42
+ icons: IconType[]
43
+ iconsSrc: string
44
+ headingStyles?: StringArray
45
+ }
@@ -0,0 +1,3 @@
1
+ export const MAX_ITEMS_MIN = 2
2
+ export const MAX_ITEMS_MAX = 32
3
+ export const MAX_ITEMS_DEFAULT = 6
@@ -0,0 +1,76 @@
1
+ import {InspectorControls, useBlockProps} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ RangeControl,
5
+ __experimentalToggleGroupControl as ToggleGroupControl,
6
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
7
+ } from '@wordpress/components'
8
+ import {__} from '@wordpress/i18n'
9
+ import {MAX_ITEMS_DEFAULT, MAX_ITEMS_MAX, MAX_ITEMS_MIN} from './constants'
10
+ import type {PostSliderGroupAttributes, PostSliderGroupOptions} from './types'
11
+
12
+ export function createPostSliderGroupEdit(options: PostSliderGroupOptions) {
13
+ return function Edit({
14
+ attributes,
15
+ setAttributes,
16
+ }: {
17
+ attributes: PostSliderGroupAttributes
18
+ setAttributes: (a: Partial<PostSliderGroupAttributes>) => void
19
+ }) {
20
+ const {mode, maxItems, selectedCategories, selectedPosts} = attributes
21
+
22
+ const blockProps = useBlockProps({className: 'wp-block-section'})
23
+
24
+ return (
25
+ <>
26
+ <InspectorControls>
27
+ <PanelBody title={__('Nastavení slideru', 'brilo-blocks')} initialOpen>
28
+ <ToggleGroupControl
29
+ label={__('Režim výběru', 'brilo-blocks')}
30
+ value={mode}
31
+ onChange={(value) => setAttributes({mode: value as PostSliderGroupAttributes['mode']})}
32
+ isBlock
33
+ >
34
+ <ToggleGroupControlOption value="default" label={__('Výchozí', 'brilo-blocks')} />
35
+ <ToggleGroupControlOption value="category" label={__('Dle kategorie', 'brilo-blocks')} />
36
+ <ToggleGroupControlOption value="selected" label={__('Vybrané', 'brilo-blocks')} />
37
+ </ToggleGroupControl>
38
+
39
+ {mode !== 'selected' && (
40
+ <RangeControl
41
+ label={__('Max. počet příspěvků', 'brilo-blocks')}
42
+ value={maxItems}
43
+ onChange={(value) => setAttributes({maxItems: value ?? MAX_ITEMS_DEFAULT})}
44
+ min={MAX_ITEMS_MIN}
45
+ max={MAX_ITEMS_MAX}
46
+ />
47
+ )}
48
+ </PanelBody>
49
+ </InspectorControls>
50
+
51
+ <div {...blockProps}>
52
+ {mode === 'category' &&
53
+ options.renderCategoryControl?.({
54
+ selectedItems: selectedCategories,
55
+ onChange: (ids: number[]) => setAttributes({selectedCategories: ids}),
56
+ })}
57
+
58
+ {mode === 'selected' &&
59
+ options.renderPostsControl?.({
60
+ selectedItems: selectedPosts,
61
+ onChange: (ids: number[]) => setAttributes({selectedPosts: ids}),
62
+ })}
63
+
64
+ {mode === 'default' && (
65
+ <div className="components-placeholder">
66
+ <div className="components-placeholder__label">{__('Post Slider', 'brilo-blocks')}</div>
67
+ <div className="components-placeholder__instructions">
68
+ {`${__('Zobrazí', 'brilo-blocks')} ${maxItems} ${__('nejnovějších příspěvků.', 'brilo-blocks')}`}
69
+ </div>
70
+ </div>
71
+ )}
72
+ </div>
73
+ </>
74
+ )
75
+ }
76
+ }