@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,29 @@
1
+ @layer base {
2
+ .g-text-and-form__text {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 8px;
6
+ padding: 8px;
7
+ width: 100%;
8
+ }
9
+
10
+ .g-text-and-form__overline {
11
+ display: block;
12
+ font-size: 12px;
13
+ font-weight: 600;
14
+ text-transform: uppercase;
15
+ letter-spacing: 1px;
16
+ color: #888;
17
+ }
18
+
19
+ .g-text-and-form__heading {
20
+ margin: 0;
21
+ font-weight: 700;
22
+ font-size: var(--heading-size, 24px);
23
+ }
24
+
25
+ .g-text-and-form__inner-blocks {
26
+ margin-top: 8px;
27
+ min-height: 40px;
28
+ }
29
+ }
@@ -0,0 +1,41 @@
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 {DEFAULT_CONTENT_SIZES, DEFAULT_HEADING_STYLES, HEADING_LEVELS} from './constants'
6
+ import {createTextAndFormTextColumnEdit} from './edit'
7
+ import type {TextAndFormTextColumnAttributes, TextAndFormTextColumnOptions} from './types'
8
+
9
+ export type {TextAndFormTextColumnAttributes, TextAndFormTextColumnOptions}
10
+
11
+ export function createTextAndFormTextColumnBlock<
12
+ THeadingStyles extends OptionArray = typeof DEFAULT_HEADING_STYLES,
13
+ TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES,
14
+ >(
15
+ options: TextAndFormTextColumnOptions<THeadingStyles, TContentSizes>,
16
+ ): BlockConfiguration<TextAndFormTextColumnAttributes<THeadingStyles[number]['value'], TContentSizes[number]['value']>> {
17
+ const headingStyles = options.headingStyles ?? DEFAULT_HEADING_STYLES
18
+ const contentSizes = options.contentSizes ?? DEFAULT_CONTENT_SIZES
19
+
20
+ return {
21
+ name: options.name,
22
+ title: options.title ?? __('Textový sloupec', 'brilo-blocks'),
23
+ description: options.description,
24
+ category: options.category ?? 'layout',
25
+ ...(options.parent && {parent: options.parent}),
26
+ icon: options.icon ?? 'text',
27
+ supports: {html: false, customClassName: false},
28
+ attributes: {
29
+ header: {
30
+ type: 'object',
31
+ default: {
32
+ heading: {title: '', level: HEADING_LEVELS[1], style: headingStyles[1]?.value ?? headingStyles[0].value},
33
+ overline: {title: ''},
34
+ },
35
+ },
36
+ content: {type: 'object', default: {size: contentSizes[1]?.value ?? contentSizes[0].value}},
37
+ },
38
+ edit: createTextAndFormTextColumnEdit(options as unknown as TextAndFormTextColumnOptions),
39
+ save: () => <InnerBlocks.Content />,
40
+ } as unknown as BlockConfiguration<TextAndFormTextColumnAttributes<THeadingStyles[number]['value'], TContentSizes[number]['value']>>
41
+ }
@@ -0,0 +1,18 @@
1
+ export type {TextAndFormTextColumnAttributes, TextAndFormTextColumnOptions} from './types'
2
+ export {createTextAndFormTextColumnBlock} from './factory'
3
+
4
+ import type {TextAndFormTextColumnOptions} from './types'
5
+
6
+ export const textAndFormTextColumnDefaults: TextAndFormTextColumnOptions = {
7
+ name: 'brilo/text-and-form-text-column',
8
+ parent: ['brilo/text-and-form-group'],
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,23 @@
1
+ import type {BriloBlockType, OptionArray} from '~/types'
2
+ import type {DEFAULT_CONTENT_SIZES, DEFAULT_HEADING_STYLES, HEADING_LEVELS} from './constants'
3
+
4
+ export type HeadingStyles = (typeof DEFAULT_HEADING_STYLES)[number]['value']
5
+ export type HeadingLevels = (typeof HEADING_LEVELS)[number]
6
+ export type ContentSizes = (typeof DEFAULT_CONTENT_SIZES)[number]['value']
7
+
8
+ export interface TextAndFormTextColumnAttributes<THeadingStyle extends string = HeadingStyles, TContentSize extends string = ContentSizes>
9
+ extends Record<string, unknown> {
10
+ header: {
11
+ heading: {title: string; level: HeadingLevels; style: THeadingStyle}
12
+ overline: {title: string}
13
+ }
14
+ content: {size: TContentSize}
15
+ }
16
+
17
+ export interface TextAndFormTextColumnOptions<
18
+ THeadingStyles extends OptionArray = typeof DEFAULT_HEADING_STYLES,
19
+ TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES,
20
+ > extends BriloBlockType {
21
+ headingStyles?: THeadingStyles
22
+ contentSizes?: TContentSizes
23
+ }
@@ -0,0 +1,54 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export {CONTENT_SIZES as DEFAULT_CONTENT_SIZES} from '~/constants'
4
+
5
+ export const DEFAULT_COLUMNS = [2, 3, 4, 5, 6] as const
6
+
7
+ export const DEFAULT_DIRECTIONS = [
8
+ {value: 'vertical', label: __('Vertikální', 'brilo-blocks')},
9
+ {value: 'horizontal', label: __('Horizontální', 'brilo-blocks')},
10
+ ] as const
11
+
12
+ export const HEADING_LEVELS = [2, 3] as const
13
+
14
+ export const DEFAULT_HEADING_STYLES = [
15
+ {value: 'h1', label: 'L', description: __('48px', 'brilo-blocks')},
16
+ {value: 'h2', label: 'M', description: __('32px', 'brilo-blocks')},
17
+ {value: 'h3', label: 'S', description: __('24px', 'brilo-blocks')},
18
+ {value: 'h4', label: 'XS', description: __('20px', 'brilo-blocks')},
19
+ {value: 'h5', label: 'XXS', description: __('16px', 'brilo-blocks')},
20
+ ] as const
21
+
22
+ export const DEFAULT_SHADOWS = [
23
+ {value: 'none', label: __('Žádný', 'brilo-blocks')},
24
+ {value: 'sm', label: __('Malý', 'brilo-blocks')},
25
+ {value: 'md', label: __('Střední', 'brilo-blocks')},
26
+ ] as const
27
+
28
+ export const DEFAULT_ICON_SIZES = [
29
+ {value: 'xs', label: __('Extra Malá', 'brilo-blocks'), description: __('48px', 'brilo-blocks')},
30
+ {value: 'sm', label: __('Malá', 'brilo-blocks'), description: __('64px', 'brilo-blocks')},
31
+ {value: 'default', label: __('Výchozí', 'brilo-blocks'), description: __('88px', 'brilo-blocks')},
32
+ {value: 'lg', label: __('Velká', 'brilo-blocks'), description: __('104px', 'brilo-blocks')},
33
+ {value: 'xl', label: __('Extra Velká', 'brilo-blocks'), description: __('128px', 'brilo-blocks')},
34
+ ] as const
35
+
36
+ export const DEFAULT_ICON_COLORS = [
37
+ {value: 'none', label: __('Žádná', 'brilo-blocks')},
38
+ {value: 'primary', label: __('Primární', 'brilo-blocks')},
39
+ {value: 'secondary', label: __('Sekundární', 'brilo-blocks')},
40
+ {value: 'neutral', label: __('Neutrální', 'brilo-blocks')},
41
+ {value: 'conversion', label: __('Konverzní', 'brilo-blocks')},
42
+ ] as const
43
+
44
+ export const DEFAULT_ICON_BACKGROUNDS = [
45
+ {value: 'none', label: __('Žádné', 'brilo-blocks')},
46
+ {value: 'primary', label: __('Primární', 'brilo-blocks')},
47
+ {value: 'secondary', label: __('Sekundární', 'brilo-blocks')},
48
+ {value: 'neutral', label: __('Neutrální', 'brilo-blocks')},
49
+ ] as const
50
+
51
+ export const DEFAULT_ALIGNMENTS = [
52
+ {value: 'left', label: __('Vlevo', 'brilo-blocks')},
53
+ {value: 'center', label: __('Na střed', 'brilo-blocks')},
54
+ ] as const
@@ -0,0 +1,197 @@
1
+ import {InspectorControls} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ SelectControl,
5
+ ToggleControl,
6
+ __experimentalToggleGroupControl as ToggleGroupControl,
7
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
8
+ } from '@wordpress/components'
9
+ import {__} from '@wordpress/i18n'
10
+ import clsx from 'clsx'
11
+ import {useGroupBlock} from '~/hooks/useGroupBlock'
12
+ import {
13
+ DEFAULT_ALIGNMENTS,
14
+ DEFAULT_COLUMNS,
15
+ DEFAULT_CONTENT_SIZES,
16
+ DEFAULT_DIRECTIONS,
17
+ DEFAULT_HEADING_STYLES,
18
+ DEFAULT_ICON_BACKGROUNDS,
19
+ DEFAULT_ICON_COLORS,
20
+ DEFAULT_ICON_SIZES,
21
+ DEFAULT_SHADOWS,
22
+ HEADING_LEVELS,
23
+ } from './constants'
24
+ import type {
25
+ UspAlignment,
26
+ UspContentSize,
27
+ UspDirection,
28
+ UspGroupAttributes,
29
+ UspGroupOptions,
30
+ UspHeadingLevel,
31
+ UspHeadingStyle,
32
+ UspIconBackground,
33
+ UspIconColor,
34
+ UspIconSize,
35
+ UspShadow,
36
+ } from './types'
37
+
38
+ export function createUspGroupEdit(options: UspGroupOptions) {
39
+ const COLUMNS = options.columns ?? DEFAULT_COLUMNS
40
+ const DIRECTIONS = options.directions ?? DEFAULT_DIRECTIONS
41
+ const HEADING_STYLES = options.headingStyles ?? DEFAULT_HEADING_STYLES
42
+ const SHADOWS = options.shadows ?? DEFAULT_SHADOWS
43
+ const ICON_SIZES = options.iconSizes ?? DEFAULT_ICON_SIZES
44
+ const ICON_COLORS = options.iconColors ?? DEFAULT_ICON_COLORS
45
+ const ICON_BACKGROUND = options.iconBackgrounds ?? DEFAULT_ICON_BACKGROUNDS
46
+ const ALIGNMENTS = options.alignments ?? DEFAULT_ALIGNMENTS
47
+ const CONTENT_SIZES = options.contentSizes ?? DEFAULT_CONTENT_SIZES
48
+
49
+ return function Edit({
50
+ attributes,
51
+ setAttributes,
52
+ }: {
53
+ attributes: UspGroupAttributes
54
+ setAttributes: (a: Partial<UspGroupAttributes>) => void
55
+ }) {
56
+ const {columns, headingSettings, content, style} = attributes
57
+
58
+ const {blockProps, innerBlocksProps} = useGroupBlock({
59
+ blockClassName: clsx(
60
+ options.blockClassName ?? 'g-usp wp-block-section',
61
+ `--direction-${style.direction}`,
62
+ style.card && '--card',
63
+ style.shadow !== 'none' && `--shadow-${style.shadow}`,
64
+ ),
65
+ containerClassName: [options.containerClassName ?? 'u-grid-responsive', `--cols-${columns}`],
66
+ containerStyle: {'--grid-max-col-count': columns},
67
+ allowedBlocks: options.allowedBlocks,
68
+ orientation: 'horizontal',
69
+ template: options.template,
70
+ layout: {type: 'default'},
71
+ })
72
+
73
+ return (
74
+ <>
75
+ <InspectorControls>
76
+ <PanelBody title={__('Rozložení', 'brilo-blocks')}>
77
+ <ToggleGroupControl
78
+ isBlock
79
+ label={__('Počet sloupců', 'brilo-blocks')}
80
+ value={String(columns)}
81
+ onChange={(v) => setAttributes({columns: Number(v) as UspGroupAttributes['columns']})}
82
+ >
83
+ {COLUMNS.map((c) => (
84
+ <ToggleGroupControlOption key={c} value={String(c)} label={String(c)} />
85
+ ))}
86
+ </ToggleGroupControl>
87
+ <ToggleGroupControl
88
+ isBlock
89
+ label={__('Směr', 'brilo-blocks')}
90
+ value={style.direction}
91
+ onChange={(v) => setAttributes({style: {...style, direction: v as UspDirection}})}
92
+ >
93
+ {DIRECTIONS.map((d) => (
94
+ <ToggleGroupControlOption key={d.value} value={d.value} label={d.label} />
95
+ ))}
96
+ </ToggleGroupControl>
97
+ {style.direction === 'vertical' && (
98
+ <ToggleGroupControl
99
+ isBlock
100
+ label={__('Zarovnání', 'brilo-blocks')}
101
+ value={style.align}
102
+ onChange={(v) => setAttributes({style: {...style, align: v as UspAlignment}})}
103
+ >
104
+ {ALIGNMENTS.map((a) => (
105
+ <ToggleGroupControlOption key={a.value} value={a.value} label={a.label} />
106
+ ))}
107
+ </ToggleGroupControl>
108
+ )}
109
+ <ToggleGroupControl
110
+ isBlock
111
+ label={__('Úroveň nadpisu položek', 'brilo-blocks')}
112
+ value={String(headingSettings.level)}
113
+ onChange={(v) => setAttributes({headingSettings: {...headingSettings, level: Number(v) as UspHeadingLevel}})}
114
+ >
115
+ {HEADING_LEVELS.map((l) => (
116
+ <ToggleGroupControlOption key={l} value={String(l)} label={`H${l}`} />
117
+ ))}
118
+ </ToggleGroupControl>
119
+ <ToggleGroupControl
120
+ isBlock
121
+ label={__('Styl nadpisu položek', 'brilo-blocks')}
122
+ value={headingSettings.style}
123
+ onChange={(v) => setAttributes({headingSettings: {...headingSettings, style: v as UspHeadingStyle}})}
124
+ >
125
+ {HEADING_STYLES.map((s) => (
126
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} aria-label={s.description} showTooltip />
127
+ ))}
128
+ </ToggleGroupControl>
129
+ <ToggleGroupControl
130
+ isBlock
131
+ label={__('Velikost textu', 'brilo-blocks')}
132
+ value={content.size}
133
+ onChange={(v) => setAttributes({content: {size: v as UspContentSize}})}
134
+ >
135
+ {CONTENT_SIZES.map((s) => (
136
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
137
+ ))}
138
+ </ToggleGroupControl>
139
+ </PanelBody>
140
+ <PanelBody title={__('Styl', 'brilo-blocks')}>
141
+ <ToggleControl
142
+ label={__('Karta', 'brilo-blocks')}
143
+ checked={style.card}
144
+ onChange={(v) => setAttributes({style: {...style, card: v}})}
145
+ />
146
+ {style.card && (
147
+ <ToggleGroupControl
148
+ isBlock
149
+ label={__('Stín', 'brilo-blocks')}
150
+ value={style.shadow}
151
+ onChange={(v) => setAttributes({style: {...style, shadow: v as UspShadow}})}
152
+ >
153
+ {SHADOWS.map((s) => (
154
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
155
+ ))}
156
+ </ToggleGroupControl>
157
+ )}
158
+ </PanelBody>
159
+ <PanelBody title={__('Ikona', 'brilo-blocks')} initialOpen={false}>
160
+ <ToggleGroupControl
161
+ isBlock
162
+ label={__('Velikost', 'brilo-blocks')}
163
+ value={style.icon.size}
164
+ onChange={(v) => setAttributes({style: {...style, icon: {...style.icon, size: v as UspIconSize}}})}
165
+ >
166
+ {ICON_SIZES.map((s) => (
167
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} aria-label={s.description} showTooltip />
168
+ ))}
169
+ </ToggleGroupControl>
170
+ <SelectControl<string>
171
+ label={__('Barva', 'brilo-blocks')}
172
+ value={style.icon.color}
173
+ options={[...ICON_COLORS]}
174
+ onChange={(v) => setAttributes({style: {...style, icon: {...style.icon, color: v as UspIconColor}}})}
175
+ />
176
+ <SelectControl<string>
177
+ label={__('Pozadí', 'brilo-blocks')}
178
+ value={style.icon.background}
179
+ options={[...ICON_BACKGROUND]}
180
+ onChange={(v) => setAttributes({style: {...style, icon: {...style.icon, background: v as UspIconBackground}}})}
181
+ />
182
+ {style.icon.background !== 'none' && (
183
+ <ToggleControl
184
+ label={__('Ohraničení ikony', 'brilo-blocks')}
185
+ checked={style.icon.bordered ?? false}
186
+ onChange={(v) => setAttributes({style: {...style, icon: {...style.icon, bordered: v}}})}
187
+ />
188
+ )}
189
+ </PanelBody>
190
+ </InspectorControls>
191
+ <div {...blockProps}>
192
+ <div {...innerBlocksProps} />
193
+ </div>
194
+ </>
195
+ )
196
+ }
197
+ }
@@ -0,0 +1,24 @@
1
+ @layer base {
2
+ .g-usp {
3
+ padding: 8px;
4
+ min-height: 60px;
5
+
6
+ &.--direction-horizontal .i-usp__inner {
7
+ flex-direction: row;
8
+ align-items: flex-start;
9
+ }
10
+
11
+ &.--card .i-usp__inner {
12
+ background: #fff;
13
+ border-color: #d0d5dd;
14
+ }
15
+
16
+ &.--shadow-sm .i-usp__inner {
17
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
18
+ }
19
+
20
+ &.--shadow-md .i-usp__inner {
21
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.14);
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,113 @@
1
+ import {InnerBlocks} from '@wordpress/block-editor'
2
+ import type {BlockConfiguration} from '@wordpress/blocks'
3
+ import {__} from '@wordpress/i18n'
4
+ import type {NumberArray, OptionArray} from '~/types'
5
+ import {
6
+ DEFAULT_ALIGNMENTS,
7
+ DEFAULT_COLUMNS,
8
+ DEFAULT_CONTENT_SIZES,
9
+ DEFAULT_DIRECTIONS,
10
+ DEFAULT_HEADING_STYLES,
11
+ DEFAULT_ICON_BACKGROUNDS,
12
+ DEFAULT_ICON_COLORS,
13
+ DEFAULT_ICON_SIZES,
14
+ DEFAULT_SHADOWS,
15
+ HEADING_LEVELS,
16
+ } from './constants'
17
+ import {createUspGroupEdit} from './edit'
18
+ import {icon as defaultIcon} from './icon'
19
+ import type {UspGroupAttributes, UspGroupOptions} from './types'
20
+
21
+ export type {UspGroupAttributes, UspGroupOptions}
22
+
23
+ export function createUspGroupBlock<
24
+ TColumns extends NumberArray = typeof DEFAULT_COLUMNS,
25
+ TDirections extends OptionArray = typeof DEFAULT_DIRECTIONS,
26
+ THeadingStyles extends OptionArray = typeof DEFAULT_HEADING_STYLES,
27
+ TShadows extends OptionArray = typeof DEFAULT_SHADOWS,
28
+ TIconSizes extends OptionArray = typeof DEFAULT_ICON_SIZES,
29
+ TIconColors extends OptionArray = typeof DEFAULT_ICON_COLORS,
30
+ TIconBackgrounds extends OptionArray = typeof DEFAULT_ICON_BACKGROUNDS,
31
+ TAlignments extends OptionArray = typeof DEFAULT_ALIGNMENTS,
32
+ TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES,
33
+ >(
34
+ options: UspGroupOptions<
35
+ TColumns,
36
+ TDirections,
37
+ THeadingStyles,
38
+ TShadows,
39
+ TIconSizes,
40
+ TIconColors,
41
+ TIconBackgrounds,
42
+ TAlignments,
43
+ TContentSizes
44
+ >,
45
+ ): BlockConfiguration<
46
+ UspGroupAttributes<
47
+ TColumns[number],
48
+ TDirections[number]['value'],
49
+ THeadingStyles[number]['value'],
50
+ TShadows[number]['value'],
51
+ TIconSizes[number]['value'],
52
+ TIconColors[number]['value'],
53
+ TIconBackgrounds[number]['value'],
54
+ TAlignments[number]['value'],
55
+ TContentSizes[number]['value']
56
+ >
57
+ > {
58
+ const columns = options.columns ?? DEFAULT_COLUMNS
59
+ const directions = options.directions ?? DEFAULT_DIRECTIONS
60
+ const headingStyles = options.headingStyles ?? DEFAULT_HEADING_STYLES
61
+ const shadows = options.shadows ?? DEFAULT_SHADOWS
62
+ const iconSizes = options.iconSizes ?? DEFAULT_ICON_SIZES
63
+ const iconColors = options.iconColors ?? DEFAULT_ICON_COLORS
64
+ const iconBackgrounds = options.iconBackgrounds ?? DEFAULT_ICON_BACKGROUNDS
65
+ const alignments = options.alignments ?? DEFAULT_ALIGNMENTS
66
+ const contentSizes = options.contentSizes ?? DEFAULT_CONTENT_SIZES
67
+
68
+ return {
69
+ name: options.name,
70
+ title: options.title ?? __('USP Konkurenční výhody', 'brilo-blocks'),
71
+ description: options.description,
72
+ category: options.category ?? 'layout',
73
+ ...(options.parent && {parent: options.parent}),
74
+ icon: options.icon ?? {src: defaultIcon},
75
+ supports: {html: false, customClassName: false},
76
+ attributes: {
77
+ columns: {
78
+ type: 'number',
79
+ default: columns[1] ?? columns[0],
80
+ enum: [...columns],
81
+ },
82
+ headingSettings: {
83
+ type: 'object',
84
+ default: {level: HEADING_LEVELS[0], style: headingStyles[2]?.value ?? headingStyles[0].value},
85
+ },
86
+ content: {type: 'object', default: {size: contentSizes[1]?.value ?? contentSizes[0].value}},
87
+ style: {
88
+ type: 'object',
89
+ default: {
90
+ shadow: shadows[0].value,
91
+ card: false,
92
+ direction: directions[0].value,
93
+ align: alignments[0].value,
94
+ icon: {size: iconSizes[2]?.value ?? iconSizes[0].value, color: iconColors[0].value, background: iconBackgrounds[0].value},
95
+ },
96
+ },
97
+ },
98
+ edit: createUspGroupEdit(options as unknown as UspGroupOptions),
99
+ save: () => <InnerBlocks.Content />,
100
+ } as unknown as BlockConfiguration<
101
+ UspGroupAttributes<
102
+ TColumns[number],
103
+ TDirections[number]['value'],
104
+ THeadingStyles[number]['value'],
105
+ TShadows[number]['value'],
106
+ TIconSizes[number]['value'],
107
+ TIconColors[number]['value'],
108
+ TIconBackgrounds[number]['value'],
109
+ TAlignments[number]['value'],
110
+ TContentSizes[number]['value']
111
+ >
112
+ >
113
+ }
@@ -0,0 +1,18 @@
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>USP Group</title>
4
+ <path d="M4 6H9V7H4V6Z" fill="black" />
5
+ <path d="M10 6H16V7H10V6Z" fill="black" />
6
+ <path
7
+ d="M12 4C12 3.44772 12.4477 3 13 3H14C14.5523 3 15 3.44772 15 4C15 4.55228 14.5523 5 14 5H13C12.4477 5 12 4.55228 12 4Z"
8
+ fill="black"
9
+ />
10
+ <path d="M5 4C5 3.44772 5.44772 3 6 3H10C10.5523 3 11 3.44772 11 4C11 4.55228 10.5523 5 10 5H6C5.44772 5 5 4.55228 5 4Z" fill="black" />
11
+ <rect x="1.5" y="10.5" width="3" height="3" rx="1.5" stroke="black" fill="none" />
12
+ <rect x="8.5" y="10.5" width="3" height="3" rx="1.5" stroke="black" fill="none" />
13
+ <rect x="15.5" y="10.5" width="3" height="3" rx="1.5" stroke="black" fill="none" />
14
+ <path d="M1 15H5V16H1V15Z" fill="black" />
15
+ <path d="M8 15H12V16H8V15Z" fill="black" />
16
+ <path d="M15 15H19V16H15V15Z" fill="black" />
17
+ </svg>
18
+ )
@@ -0,0 +1,15 @@
1
+ export type {UspGroupAttributes, UspGroupOptions} from './types'
2
+ export {createUspGroupBlock} from './factory'
3
+
4
+ import type {UspGroupOptions} from './types'
5
+
6
+ export const uspGroupDefaults: UspGroupOptions = {
7
+ name: 'brilo/usp-group',
8
+ parent: ['brilo/base-section'],
9
+ allowedBlocks: ['brilo/usp-item'],
10
+ template: [
11
+ ['brilo/usp-item', {}],
12
+ ['brilo/usp-item', {}],
13
+ ['brilo/usp-item', {}],
14
+ ],
15
+ }
@@ -0,0 +1,70 @@
1
+ import type {BriloBlockType, NumberArray, OptionArray} from '~/types'
2
+ import type {
3
+ DEFAULT_ALIGNMENTS,
4
+ DEFAULT_COLUMNS,
5
+ DEFAULT_CONTENT_SIZES,
6
+ DEFAULT_DIRECTIONS,
7
+ DEFAULT_HEADING_STYLES,
8
+ DEFAULT_ICON_BACKGROUNDS,
9
+ DEFAULT_ICON_COLORS,
10
+ DEFAULT_ICON_SIZES,
11
+ DEFAULT_SHADOWS,
12
+ HEADING_LEVELS,
13
+ } from './constants'
14
+
15
+ export type UspColumns = (typeof DEFAULT_COLUMNS)[number]
16
+ export type UspDirection = (typeof DEFAULT_DIRECTIONS)[number]['value']
17
+ export type UspHeadingLevel = (typeof HEADING_LEVELS)[number]
18
+ export type UspHeadingStyle = (typeof DEFAULT_HEADING_STYLES)[number]['value']
19
+ export type UspShadow = (typeof DEFAULT_SHADOWS)[number]['value']
20
+ export type UspAlignment = (typeof DEFAULT_ALIGNMENTS)[number]['value']
21
+ export type UspIconSize = (typeof DEFAULT_ICON_SIZES)[number]['value']
22
+ export type UspIconColor = (typeof DEFAULT_ICON_COLORS)[number]['value']
23
+ export type UspIconBackground = (typeof DEFAULT_ICON_BACKGROUNDS)[number]['value']
24
+ export type UspContentSize = (typeof DEFAULT_CONTENT_SIZES)[number]['value']
25
+
26
+ export interface UspGroupAttributes<
27
+ TColumn extends number = UspColumns,
28
+ TDirection extends string = UspDirection,
29
+ THeadingStyle extends string = UspHeadingStyle,
30
+ TShadow extends string = UspShadow,
31
+ TIconSize extends string = UspIconSize,
32
+ TIconColor extends string = UspIconColor,
33
+ TIconBackground extends string = UspIconBackground,
34
+ TAlignment extends string = UspAlignment,
35
+ TContentSize extends string = UspContentSize,
36
+ > extends Record<string, unknown> {
37
+ columns: TColumn
38
+ headingSettings: {level: UspHeadingLevel; style: THeadingStyle}
39
+ content: {size: TContentSize}
40
+ style: {
41
+ shadow: TShadow
42
+ card: boolean
43
+ direction: TDirection
44
+ align: TAlignment
45
+ icon: {size: TIconSize; color: TIconColor; background: TIconBackground; bordered?: boolean}
46
+ }
47
+ }
48
+
49
+ export interface UspGroupOptions<
50
+ TColumns extends NumberArray = typeof DEFAULT_COLUMNS,
51
+ TDirections extends OptionArray = typeof DEFAULT_DIRECTIONS,
52
+ THeadingStyles extends OptionArray = typeof DEFAULT_HEADING_STYLES,
53
+ TShadows extends OptionArray = typeof DEFAULT_SHADOWS,
54
+ TIconSizes extends OptionArray = typeof DEFAULT_ICON_SIZES,
55
+ TIconColors extends OptionArray = typeof DEFAULT_ICON_COLORS,
56
+ TIconBackgrounds extends OptionArray = typeof DEFAULT_ICON_BACKGROUNDS,
57
+ TAlignments extends OptionArray = typeof DEFAULT_ALIGNMENTS,
58
+ TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES,
59
+ > extends BriloBlockType {
60
+ allowedBlocks: string[]
61
+ columns?: TColumns
62
+ directions?: TDirections
63
+ headingStyles?: THeadingStyles
64
+ shadows?: TShadows
65
+ iconSizes?: TIconSizes
66
+ iconColors?: TIconColors
67
+ iconBackgrounds?: TIconBackgrounds
68
+ alignments?: TAlignments
69
+ contentSizes?: TContentSizes
70
+ }
@@ -0,0 +1,7 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export const ICON_TYPES = [
4
+ {value: 'preselected', label: __('Předvolená', 'brilo-blocks')},
5
+ {value: 'media', label: __('Obrázek', 'brilo-blocks')},
6
+ {value: 'number', label: __('Číslo', 'brilo-blocks')},
7
+ ] as const