@brilo/base-blocks 0.1.43 → 0.1.45

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 (225) hide show
  1. package/build/.tsbuildinfo +1 -1
  2. package/build/blocks/compare/compare-group/constants.d.ts +27 -0
  3. package/build/blocks/compare/compare-group/constants.d.ts.map +1 -1
  4. package/build/blocks/compare/compare-group/constants.js +23 -0
  5. package/build/blocks/compare/compare-group/edit.d.ts.map +1 -1
  6. package/build/blocks/compare/compare-group/edit.js +12 -7
  7. package/build/blocks/compare/compare-group/factory.d.ts.map +1 -1
  8. package/build/blocks/compare/compare-group/factory.js +10 -1
  9. package/build/blocks/compare/compare-group/index.d.ts +1 -1
  10. package/build/blocks/compare/compare-group/index.d.ts.map +1 -1
  11. package/build/blocks/compare/compare-group/types.d.ts +7 -1
  12. package/build/blocks/compare/compare-group/types.d.ts.map +1 -1
  13. package/build/blocks/compare/compare-item/edit.d.ts.map +1 -1
  14. package/build/blocks/compare/compare-item/edit.js +6 -4
  15. package/build/blocks/compare/compare-item/factory.d.ts.map +1 -1
  16. package/build/blocks/compare/compare-item/factory.js +4 -0
  17. package/build/blocks/compare/compare-item/index.js +1 -1
  18. package/build/blocks/compare/compare-item/types.d.ts +2 -0
  19. package/build/blocks/compare/compare-item/types.d.ts.map +1 -1
  20. package/build/blocks/core/basic-icon/buildPreviewStyle.d.ts +8 -0
  21. package/build/blocks/core/basic-icon/buildPreviewStyle.d.ts.map +1 -0
  22. package/build/blocks/core/basic-icon/buildPreviewStyle.js +22 -0
  23. package/build/blocks/core/basic-icon/constants.d.ts +84 -0
  24. package/build/blocks/core/basic-icon/constants.d.ts.map +1 -0
  25. package/build/blocks/core/basic-icon/constants.js +41 -0
  26. package/build/blocks/core/basic-icon/edit.d.ts +6 -0
  27. package/build/blocks/core/basic-icon/edit.d.ts.map +1 -0
  28. package/build/blocks/core/basic-icon/edit.js +22 -0
  29. package/build/blocks/core/basic-icon/factory.d.ts +5 -0
  30. package/build/blocks/core/basic-icon/factory.d.ts.map +1 -0
  31. package/build/blocks/core/basic-icon/factory.js +38 -0
  32. package/build/blocks/core/basic-icon/index.d.ts +5 -0
  33. package/build/blocks/core/basic-icon/index.d.ts.map +1 -0
  34. package/build/blocks/core/basic-icon/index.js +7 -0
  35. package/build/blocks/core/basic-icon/types.d.ts +30 -0
  36. package/build/blocks/core/basic-icon/types.d.ts.map +1 -0
  37. package/build/blocks/core/basic-icon/types.js +1 -0
  38. package/build/blocks/faq/faq-group/constants.d.ts +29 -0
  39. package/build/blocks/faq/faq-group/constants.d.ts.map +1 -1
  40. package/build/blocks/faq/faq-group/constants.js +15 -0
  41. package/build/blocks/faq/faq-group/edit.d.ts.map +1 -1
  42. package/build/blocks/faq/faq-group/edit.js +14 -5
  43. package/build/blocks/faq/faq-group/factory.d.ts.map +1 -1
  44. package/build/blocks/faq/faq-group/factory.js +37 -17
  45. package/build/blocks/faq/faq-group/index.d.ts +1 -1
  46. package/build/blocks/faq/faq-group/index.d.ts.map +1 -1
  47. package/build/blocks/faq/faq-group/types.d.ts +21 -1
  48. package/build/blocks/faq/faq-group/types.d.ts.map +1 -1
  49. package/build/blocks/gallery/gallery-group/edit.d.ts.map +1 -1
  50. package/build/blocks/gallery/gallery-group/edit.js +4 -2
  51. package/build/blocks/gallery/gallery-group/factory.d.ts.map +1 -1
  52. package/build/blocks/gallery/gallery-group/factory.js +2 -0
  53. package/build/blocks/gallery/gallery-group/types.d.ts +1 -0
  54. package/build/blocks/gallery/gallery-group/types.d.ts.map +1 -1
  55. package/build/blocks/groups/text-and-media-group/index.d.ts.map +1 -1
  56. package/build/blocks/groups/text-and-media-group/index.js +1 -0
  57. package/build/blocks/list/list-group/constants.d.ts +21 -0
  58. package/build/blocks/list/list-group/constants.d.ts.map +1 -0
  59. package/build/blocks/list/list-group/constants.js +12 -0
  60. package/build/blocks/list/list-group/edit.d.ts +6 -0
  61. package/build/blocks/list/list-group/edit.d.ts.map +1 -0
  62. package/build/blocks/list/list-group/edit.js +30 -0
  63. package/build/blocks/list/list-group/factory.d.ts +7 -0
  64. package/build/blocks/list/list-group/factory.d.ts.map +1 -0
  65. package/build/blocks/list/list-group/factory.js +29 -0
  66. package/build/blocks/list/list-group/icon.d.ts +2 -0
  67. package/build/blocks/list/list-group/icon.d.ts.map +1 -0
  68. package/build/blocks/list/list-group/icon.js +2 -0
  69. package/build/blocks/list/list-group/index.d.ts +5 -0
  70. package/build/blocks/list/list-group/index.d.ts.map +1 -0
  71. package/build/blocks/list/list-group/index.js +11 -0
  72. package/build/blocks/list/list-group/types.d.ts +22 -0
  73. package/build/blocks/list/list-group/types.d.ts.map +1 -0
  74. package/build/blocks/list/list-group/types.js +1 -0
  75. package/build/blocks/list/list-item/buildPreviewStyle.d.ts +20 -0
  76. package/build/blocks/list/list-item/buildPreviewStyle.d.ts.map +1 -0
  77. package/build/blocks/list/list-item/buildPreviewStyle.js +18 -0
  78. package/build/blocks/list/list-item/constants.d.ts +36 -0
  79. package/build/blocks/list/list-item/constants.d.ts.map +1 -0
  80. package/build/blocks/list/list-item/constants.js +16 -0
  81. package/build/blocks/list/list-item/edit.d.ts +11 -0
  82. package/build/blocks/list/list-item/edit.d.ts.map +1 -0
  83. package/build/blocks/list/list-item/edit.js +18 -0
  84. package/build/blocks/list/list-item/factory.d.ts +5 -0
  85. package/build/blocks/list/list-item/factory.d.ts.map +1 -0
  86. package/build/blocks/list/list-item/factory.js +29 -0
  87. package/build/blocks/list/list-item/index.d.ts +5 -0
  88. package/build/blocks/list/list-item/index.d.ts.map +1 -0
  89. package/build/blocks/list/list-item/index.js +7 -0
  90. package/build/blocks/list/list-item/types.d.ts +21 -0
  91. package/build/blocks/list/list-item/types.d.ts.map +1 -0
  92. package/build/blocks/list/list-item/types.js +1 -0
  93. package/build/blocks/priceplan/priceplan-group/edit.d.ts +5 -2
  94. package/build/blocks/priceplan/priceplan-group/edit.d.ts.map +1 -1
  95. package/build/blocks/priceplan/priceplan-group/edit.js +7 -3
  96. package/build/blocks/priceplan/priceplan-group/factory.d.ts.map +1 -1
  97. package/build/blocks/priceplan/priceplan-group/factory.js +2 -1
  98. package/build/blocks/priceplan/priceplan-group/types.d.ts +1 -0
  99. package/build/blocks/priceplan/priceplan-group/types.d.ts.map +1 -1
  100. package/build/blocks/review/review-group/constants.d.ts +10 -0
  101. package/build/blocks/review/review-group/constants.d.ts.map +1 -1
  102. package/build/blocks/review/review-group/constants.js +5 -0
  103. package/build/blocks/review/review-group/edit.d.ts.map +1 -1
  104. package/build/blocks/review/review-group/edit.js +10 -6
  105. package/build/blocks/review/review-group/factory.d.ts.map +1 -1
  106. package/build/blocks/review/review-group/factory.js +36 -21
  107. package/build/blocks/review/review-group/index.d.ts +1 -1
  108. package/build/blocks/review/review-group/index.d.ts.map +1 -1
  109. package/build/blocks/review/review-group/types.d.ts +11 -1
  110. package/build/blocks/review/review-group/types.d.ts.map +1 -1
  111. package/build/blocks/sections/base-section/constants.d.ts +35 -0
  112. package/build/blocks/sections/base-section/constants.d.ts.map +1 -1
  113. package/build/blocks/sections/base-section/constants.js +10 -0
  114. package/build/blocks/sections/base-section/controls.d.ts.map +1 -1
  115. package/build/blocks/sections/base-section/controls.js +26 -12
  116. package/build/blocks/sections/base-section/edit.d.ts.map +1 -1
  117. package/build/blocks/sections/base-section/edit.js +12 -4
  118. package/build/blocks/sections/base-section/types.d.ts +9 -1
  119. package/build/blocks/sections/base-section/types.d.ts.map +1 -1
  120. package/build/blocks/signpost/signpost-group/edit.d.ts.map +1 -1
  121. package/build/blocks/signpost/signpost-group/edit.js +4 -2
  122. package/build/blocks/signpost/signpost-group/factory.d.ts.map +1 -1
  123. package/build/blocks/signpost/signpost-group/factory.js +2 -0
  124. package/build/blocks/signpost/signpost-group/types.d.ts +1 -0
  125. package/build/blocks/signpost/signpost-group/types.d.ts.map +1 -1
  126. package/build/blocks/step/step-group/edit.d.ts.map +1 -1
  127. package/build/blocks/step/step-group/edit.js +4 -3
  128. package/build/blocks/step/step-group/factory.d.ts.map +1 -1
  129. package/build/blocks/step/step-group/factory.js +2 -0
  130. package/build/blocks/step/step-group/types.d.ts +1 -0
  131. package/build/blocks/step/step-group/types.d.ts.map +1 -1
  132. package/build/blocks/text-and-form/text-and-form-text-column/index.d.ts.map +1 -1
  133. package/build/blocks/text-and-form/text-and-form-text-column/index.js +1 -0
  134. package/build/blocks/usp/usp-group/edit.d.ts.map +1 -1
  135. package/build/blocks/usp/usp-group/edit.js +4 -3
  136. package/build/blocks/usp/usp-group/factory.d.ts.map +1 -1
  137. package/build/blocks/usp/usp-group/factory.js +2 -0
  138. package/build/blocks/usp/usp-group/types.d.ts +1 -0
  139. package/build/blocks/usp/usp-group/types.d.ts.map +1 -1
  140. package/build/blocks/video/video-group/constants.d.ts +1 -0
  141. package/build/blocks/video/video-group/constants.d.ts.map +1 -1
  142. package/build/blocks/video/video-group/constants.js +1 -0
  143. package/build/blocks/video/video-group/edit.d.ts.map +1 -1
  144. package/build/blocks/video/video-group/edit.js +7 -5
  145. package/build/blocks/video/video-group/factory.d.ts.map +1 -1
  146. package/build/blocks/video/video-group/factory.js +9 -1
  147. package/build/blocks/video/video-group/types.d.ts +2 -0
  148. package/build/blocks/video/video-group/types.d.ts.map +1 -1
  149. package/build/components/ItemSpacingControl/index.d.ts +23 -0
  150. package/build/components/ItemSpacingControl/index.d.ts.map +1 -0
  151. package/build/components/ItemSpacingControl/index.js +32 -0
  152. package/build/index.d.ts +6 -0
  153. package/build/index.d.ts.map +1 -1
  154. package/build/index.js +3 -0
  155. package/package.json +1 -1
  156. package/src/blocks/compare/compare-group/constants.ts +27 -0
  157. package/src/blocks/compare/compare-group/edit.tsx +27 -4
  158. package/src/blocks/compare/compare-group/factory.tsx +10 -1
  159. package/src/blocks/compare/compare-group/index.ts +7 -1
  160. package/src/blocks/compare/compare-group/types.ts +5 -1
  161. package/src/blocks/compare/compare-item/edit.tsx +32 -13
  162. package/src/blocks/compare/compare-item/editor.scss +16 -0
  163. package/src/blocks/compare/compare-item/factory.tsx +4 -0
  164. package/src/blocks/compare/compare-item/index.ts +1 -1
  165. package/src/blocks/compare/compare-item/types.ts +2 -0
  166. package/src/blocks/core/basic-icon/buildPreviewStyle.ts +40 -0
  167. package/src/blocks/core/basic-icon/constants.ts +48 -0
  168. package/src/blocks/core/basic-icon/edit.tsx +170 -0
  169. package/src/blocks/core/basic-icon/editor.scss +119 -0
  170. package/src/blocks/core/basic-icon/factory.tsx +42 -0
  171. package/src/blocks/core/basic-icon/index.ts +17 -0
  172. package/src/blocks/core/basic-icon/types.ts +34 -0
  173. package/src/blocks/faq/faq-group/constants.ts +18 -0
  174. package/src/blocks/faq/faq-group/edit.tsx +121 -4
  175. package/src/blocks/faq/faq-group/factory.tsx +35 -13
  176. package/src/blocks/faq/faq-group/index.ts +9 -1
  177. package/src/blocks/faq/faq-group/types.ts +23 -1
  178. package/src/blocks/gallery/gallery-group/edit.tsx +4 -1
  179. package/src/blocks/gallery/gallery-group/factory.tsx +2 -0
  180. package/src/blocks/gallery/gallery-group/types.ts +1 -0
  181. package/src/blocks/groups/text-and-media-group/index.ts +1 -0
  182. package/src/blocks/list/list-group/constants.ts +15 -0
  183. package/src/blocks/list/list-group/edit.tsx +102 -0
  184. package/src/blocks/list/list-group/editor.scss +14 -0
  185. package/src/blocks/list/list-group/factory.tsx +35 -0
  186. package/src/blocks/list/list-group/icon.tsx +11 -0
  187. package/src/blocks/list/list-group/index.ts +15 -0
  188. package/src/blocks/list/list-group/types.ts +21 -0
  189. package/src/blocks/list/list-item/buildPreviewStyle.ts +52 -0
  190. package/src/blocks/list/list-item/constants.ts +18 -0
  191. package/src/blocks/list/list-item/edit.tsx +108 -0
  192. package/src/blocks/list/list-item/editor.scss +108 -0
  193. package/src/blocks/list/list-item/factory.tsx +33 -0
  194. package/src/blocks/list/list-item/index.ts +11 -0
  195. package/src/blocks/list/list-item/types.ts +23 -0
  196. package/src/blocks/priceplan/priceplan-group/edit.tsx +21 -5
  197. package/src/blocks/priceplan/priceplan-group/factory.tsx +2 -1
  198. package/src/blocks/priceplan/priceplan-group/types.ts +3 -1
  199. package/src/blocks/review/review-group/constants.ts +6 -0
  200. package/src/blocks/review/review-group/edit.tsx +50 -4
  201. package/src/blocks/review/review-group/factory.tsx +33 -16
  202. package/src/blocks/review/review-group/index.ts +10 -1
  203. package/src/blocks/review/review-group/types.ts +12 -1
  204. package/src/blocks/sections/base-section/constants.ts +14 -0
  205. package/src/blocks/sections/base-section/controls.tsx +93 -9
  206. package/src/blocks/sections/base-section/edit.tsx +10 -2
  207. package/src/blocks/sections/base-section/types.ts +14 -1
  208. package/src/blocks/signpost/signpost-group/edit.tsx +4 -1
  209. package/src/blocks/signpost/signpost-group/factory.tsx +2 -0
  210. package/src/blocks/signpost/signpost-group/types.ts +1 -0
  211. package/src/blocks/step/step-group/edit.tsx +4 -2
  212. package/src/blocks/step/step-group/factory.tsx +2 -0
  213. package/src/blocks/step/step-group/types.ts +1 -0
  214. package/src/blocks/text-and-form/text-and-form-text-column/index.ts +1 -0
  215. package/src/blocks/usp/usp-group/edit.tsx +4 -2
  216. package/src/blocks/usp/usp-group/factory.tsx +2 -0
  217. package/src/blocks/usp/usp-group/types.ts +1 -0
  218. package/src/blocks/video/video-group/constants.ts +2 -0
  219. package/src/blocks/video/video-group/edit.tsx +33 -2
  220. package/src/blocks/video/video-group/editor.scss +6 -1
  221. package/src/blocks/video/video-group/factory.tsx +9 -1
  222. package/src/blocks/video/video-group/types.ts +2 -0
  223. package/src/components/ItemSpacingControl/index.tsx +59 -0
  224. package/src/editor.scss +3 -0
  225. package/src/index.ts +11 -0
@@ -1,11 +1,22 @@
1
+ import {InspectorControls} from '@wordpress/block-editor'
2
+ import {ItemSpacingPanel, itemSpacingStyle} from '~/components/ItemSpacingControl'
1
3
  import {useGroupBlock} from '~/hooks/useGroupBlock'
2
- import type {PriceplanGroupOptions} from './types'
4
+ import type {PriceplanGroupAttributes, PriceplanGroupOptions} from './types'
3
5
 
4
6
  export function createPriceplanGroupEdit(options: PriceplanGroupOptions) {
5
- return function Edit() {
7
+ return function Edit({
8
+ attributes,
9
+ setAttributes,
10
+ }: {
11
+ attributes: PriceplanGroupAttributes
12
+ setAttributes: (a: Partial<PriceplanGroupAttributes>) => void
13
+ }) {
14
+ const {spacing} = attributes
15
+
6
16
  const {blockProps, innerBlocksProps} = useGroupBlock({
7
17
  blockClassName: options.blockClassName ?? 'g-priceplan wp-block-section',
8
18
  containerClassName: [options.containerClassName ?? 'u-grid-responsive-blocks-list --cols-3'],
19
+ containerStyle: itemSpacingStyle(spacing),
9
20
  allowedBlocks: options.allowedBlocks,
10
21
  orientation: 'horizontal',
11
22
  template: options.template,
@@ -13,9 +24,14 @@ export function createPriceplanGroupEdit(options: PriceplanGroupOptions) {
13
24
  })
14
25
 
15
26
  return (
16
- <div {...blockProps}>
17
- <div {...innerBlocksProps} />
18
- </div>
27
+ <>
28
+ <InspectorControls>
29
+ <ItemSpacingPanel spacing={spacing} onChange={(v) => setAttributes({spacing: v})} initialOpen />
30
+ </InspectorControls>
31
+ <div {...blockProps}>
32
+ <div {...innerBlocksProps} />
33
+ </div>
34
+ </>
19
35
  )
20
36
  }
21
37
  }
@@ -1,6 +1,7 @@
1
1
  import {InnerBlocks} from '@wordpress/block-editor'
2
2
  import type {BlockConfiguration} from '@wordpress/blocks'
3
3
  import {__} from '@wordpress/i18n'
4
+ import {ITEM_SPACING_ATTRIBUTE} from '~/components/ItemSpacingControl'
4
5
  import {createPriceplanGroupEdit} from './edit'
5
6
  import {icon as defaultIcon} from './icon'
6
7
  import type {PriceplanGroupAttributes, PriceplanGroupOptions} from './types'
@@ -16,7 +17,7 @@ export function createPriceplanGroupBlock(options: PriceplanGroupOptions): Block
16
17
  ...(options.parent && {parent: options.parent}),
17
18
  icon: options.icon ?? {src: defaultIcon},
18
19
  supports: {html: false, customClassName: false},
19
- attributes: {},
20
+ attributes: {...ITEM_SPACING_ATTRIBUTE},
20
21
  edit: createPriceplanGroupEdit(options),
21
22
  save: () => <InnerBlocks.Content />,
22
23
  } as unknown as BlockConfiguration<PriceplanGroupAttributes>
@@ -1,6 +1,8 @@
1
1
  import type {BriloBlockType} from '~/types'
2
2
 
3
- export interface PriceplanGroupAttributes extends Record<string, unknown> {}
3
+ export interface PriceplanGroupAttributes extends Record<string, unknown> {
4
+ spacing?: number
5
+ }
4
6
 
5
7
  export interface PriceplanGroupOptions extends BriloBlockType {
6
8
  allowedBlocks?: string[]
@@ -13,6 +13,12 @@ export const VARIANTS = [
13
13
 
14
14
  export const COLUMNS = [2, 3, 4] as const
15
15
 
16
+ export const DEFAULT_SHADOWS = [
17
+ {value: 'none', label: __('Žádný', 'brilo-blocks')},
18
+ {value: 'sm', label: __('Malý', 'brilo-blocks')},
19
+ {value: 'md', label: __('Střední', 'brilo-blocks')},
20
+ ] as const
21
+
16
22
  export const IMAGE_MODES = [
17
23
  {value: 'avatar', label: __('Zobrazit', 'brilo-blocks')},
18
24
  {value: 'none', label: __('Skrýt', 'brilo-blocks')},
@@ -1,6 +1,8 @@
1
1
  import {InspectorControls} from '@wordpress/block-editor'
2
2
  import type {BlockEditProps} from '@wordpress/blocks'
3
3
  import {
4
+ BaseControl,
5
+ ColorPalette,
4
6
  PanelBody,
5
7
  SelectControl,
6
8
  ToggleControl,
@@ -9,15 +11,19 @@ import {
9
11
  } from '@wordpress/components'
10
12
  import {__} from '@wordpress/i18n'
11
13
  import clsx from 'clsx'
14
+ import {ItemSpacingPanel, itemSpacingStyle} from '~/components/ItemSpacingControl'
12
15
  import {useGroupBlock} from '~/hooks/useGroupBlock'
13
- import {COLUMNS, VARIANTS} from './constants'
14
- import type {ReviewColumns, ReviewGroupAttributes, ReviewGroupOptions, ReviewImageMode, Variant} from './types'
16
+ import {useTenantColorPalette} from '~/hooks/useTenantColorPalette'
17
+ import {COLUMNS, DEFAULT_SHADOWS, VARIANTS} from './constants'
18
+ import type {ReviewColumns, ReviewGroupAttributes, ReviewGroupOptions, ReviewImageMode, ReviewShadow, Variant} from './types'
15
19
 
16
20
  export function createReviewGroupEdit(options: ReviewGroupOptions) {
17
21
  const VARIANTS_OPTIONS = options.variants ?? VARIANTS
22
+ const exclude = options.exclude ?? []
18
23
 
19
24
  return function ReviewGroupEdit({attributes, setAttributes}: BlockEditProps<ReviewGroupAttributes>) {
20
- const {columns, image, variant} = attributes
25
+ const {columns, image, variant, style, spacing} = attributes
26
+ const {paletteColors} = useTenantColorPalette()
21
27
 
22
28
  const {blockProps, innerBlocksProps} = useGroupBlock({
23
29
  blockClassName: clsx(
@@ -26,7 +32,7 @@ export function createReviewGroupEdit(options: ReviewGroupOptions) {
26
32
  image === 'none' && '--image-none',
27
33
  ),
28
34
  containerClassName: [options.containerClassName ?? 'u-grid-responsive-blocks-list', `--col-${columns}`],
29
- containerStyle: {'--grid-max-col-count': columns},
35
+ containerStyle: {'--grid-max-col-count': columns, ...itemSpacingStyle(spacing)},
30
36
  allowedBlocks: options.allowedBlocks ?? ['brilo/review-item'],
31
37
  template: options.template ?? [
32
38
  ['brilo/review-item', {}],
@@ -62,6 +68,46 @@ export function createReviewGroupEdit(options: ReviewGroupOptions) {
62
68
  onChange={(checked) => setAttributes({image: (checked ? 'avatar' : 'none') as ReviewImageMode})}
63
69
  />
64
70
  </PanelBody>
71
+ {!exclude.includes('colors') && style && (
72
+ <PanelBody title={__('Styl', 'brilo-blocks')}>
73
+ <ToggleGroupControl
74
+ isBlock
75
+ label={__('Stín', 'brilo-blocks')}
76
+ value={style.shadow}
77
+ onChange={(v) => setAttributes({style: {...style, shadow: v as ReviewShadow}})}
78
+ >
79
+ {DEFAULT_SHADOWS.map((s) => (
80
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
81
+ ))}
82
+ </ToggleGroupControl>
83
+ <BaseControl
84
+ label={__('Barva okraje', 'brilo-blocks')}
85
+ help={__('Bez vybrané barvy se okraj nevykreslí.', 'brilo-blocks')}
86
+ id="review-group-border-color"
87
+ >
88
+ <ColorPalette
89
+ colors={paletteColors}
90
+ value={style.borderColor || undefined}
91
+ onChange={(value) => setAttributes({style: {...style, borderColor: value ?? ''}})}
92
+ />
93
+ </BaseControl>
94
+ <BaseControl label={__('Barva pozadí', 'brilo-blocks')} id="review-group-background-color">
95
+ <ColorPalette
96
+ colors={paletteColors}
97
+ value={style.backgroundColor || undefined}
98
+ onChange={(value) => setAttributes({style: {...style, backgroundColor: value ?? ''}})}
99
+ />
100
+ </BaseControl>
101
+ <BaseControl label={__('Barva textu', 'brilo-blocks')} id="review-group-text-color">
102
+ <ColorPalette
103
+ colors={paletteColors}
104
+ value={style.textColor || undefined}
105
+ onChange={(value) => setAttributes({style: {...style, textColor: value ?? ''}})}
106
+ />
107
+ </BaseControl>
108
+ </PanelBody>
109
+ )}
110
+ <ItemSpacingPanel spacing={spacing} onChange={(v) => setAttributes({spacing: v})} />
65
111
  </InspectorControls>
66
112
  <div {...blockProps}>
67
113
  <div {...innerBlocksProps} />
@@ -1,8 +1,9 @@
1
1
  import {InnerBlocks} from '@wordpress/block-editor'
2
2
  import type {BlockConfiguration} from '@wordpress/blocks'
3
3
  import {__} from '@wordpress/i18n'
4
+ import {ITEM_SPACING_ATTRIBUTE} from '~/components/ItemSpacingControl'
4
5
  import type {OptionArray} from '~/types'
5
- import {COLUMNS, VARIANTS} from './constants'
6
+ import {COLUMNS, DEFAULT_SHADOWS, VARIANTS} from './constants'
6
7
  import {createReviewGroupEdit} from './edit'
7
8
  import {icon as defaultIcon} from './icon'
8
9
  import type {ReviewGroupAttributes, ReviewGroupOptions} from './types'
@@ -13,6 +14,36 @@ export function createReviewGroupBlock<TVariants extends OptionArray = typeof VA
13
14
  options: ReviewGroupOptions<TVariants>,
14
15
  ): BlockConfiguration<ReviewGroupAttributes<TVariants[number]['value']>> {
15
16
  const variants = options.variants ?? VARIANTS
17
+ const exclude = options.exclude ?? []
18
+
19
+ const attributes: Record<string, unknown> = {
20
+ variant: {
21
+ type: 'string',
22
+ default: variants[0].value,
23
+ enum: variants.map((v) => v.value),
24
+ },
25
+ columns: {
26
+ type: 'number',
27
+ default: COLUMNS[1],
28
+ },
29
+ image: {
30
+ type: 'string',
31
+ default: 'none',
32
+ },
33
+ ...ITEM_SPACING_ATTRIBUTE,
34
+ }
35
+
36
+ if (!exclude.includes('colors')) {
37
+ attributes.style = {
38
+ type: 'object',
39
+ default: {
40
+ shadow: DEFAULT_SHADOWS[0].value,
41
+ borderColor: '',
42
+ backgroundColor: '',
43
+ textColor: '',
44
+ },
45
+ }
46
+ }
16
47
 
17
48
  return {
18
49
  name: options.name,
@@ -22,21 +53,7 @@ export function createReviewGroupBlock<TVariants extends OptionArray = typeof VA
22
53
  ...(options.parent && {parent: options.parent}),
23
54
  icon: options.icon ?? {src: defaultIcon},
24
55
  supports: {html: false, customClassName: false},
25
- attributes: {
26
- variant: {
27
- type: 'string',
28
- default: variants[0].value,
29
- enum: variants.map((v) => v.value),
30
- },
31
- columns: {
32
- type: 'number',
33
- default: COLUMNS[1],
34
- },
35
- image: {
36
- type: 'string',
37
- default: 'none',
38
- },
39
- },
56
+ attributes,
40
57
  edit: createReviewGroupEdit(options as unknown as ReviewGroupOptions),
41
58
  save: () => <InnerBlocks.Content />,
42
59
  } as unknown as BlockConfiguration<ReviewGroupAttributes<TVariants[number]['value']>>
@@ -1,6 +1,15 @@
1
1
  import type {ReviewGroupOptions} from './types'
2
2
 
3
- export type {ReviewColumns, ReviewGroupAttributes, ReviewGroupOptions, ReviewImageMode, ReviewVariant, Variant} from './types'
3
+ export type {
4
+ ExcludableReviewAttr,
5
+ ReviewColumns,
6
+ ReviewGroupAttributes,
7
+ ReviewGroupOptions,
8
+ ReviewImageMode,
9
+ ReviewShadow,
10
+ ReviewVariant,
11
+ Variant,
12
+ } from './types'
4
13
  export {createReviewGroupBlock} from './factory'
5
14
 
6
15
  export const reviewGroupDefaults: ReviewGroupOptions = {
@@ -1,17 +1,28 @@
1
1
  import type {BriloBlockType, OptionArray} from '~/types'
2
- import type {COLUMNS, IMAGE_MODES, VARIANTS} from './constants'
2
+ import type {COLUMNS, DEFAULT_SHADOWS, IMAGE_MODES, VARIANTS} from './constants'
3
3
 
4
4
  export type Variant = (typeof VARIANTS)[number]['value']
5
5
  export type ReviewVariant = Variant
6
6
  export type ReviewColumns = (typeof COLUMNS)[number]
7
7
  export type ReviewImageMode = (typeof IMAGE_MODES)[number]['value']
8
+ export type ReviewShadow = (typeof DEFAULT_SHADOWS)[number]['value']
9
+
10
+ export type ExcludableReviewAttr = 'colors'
8
11
 
9
12
  export interface ReviewGroupAttributes<TVariant extends string = Variant> extends Record<string, unknown> {
10
13
  variant: TVariant
11
14
  columns: ReviewColumns
12
15
  image: ReviewImageMode
16
+ style: {
17
+ shadow: ReviewShadow
18
+ borderColor: string
19
+ backgroundColor: string
20
+ textColor: string
21
+ }
22
+ spacing?: number
13
23
  }
14
24
 
15
25
  export interface ReviewGroupOptions<TVariants extends OptionArray = typeof VARIANTS> extends BriloBlockType {
16
26
  variants?: TVariants
27
+ exclude?: ExcludableReviewAttr[]
17
28
  }
@@ -58,6 +58,20 @@ export const DECORATION_OFFSET_UNITS = [
58
58
  export const BACKGROUND_IMAGE_FITS = [
59
59
  {value: 'cover', label: __('Vyplnit (cover)', 'brilo-blocks')},
60
60
  {value: 'contain', label: __('Celý obrázek (contain)', 'brilo-blocks')},
61
+ {value: 'custom', label: __('Vlastní (px)', 'brilo-blocks')},
62
+ ] as const
63
+
64
+ export const FLUID_DECORATION_FITS = [{value: 'auto', label: __('Automaticky (výška)', 'brilo-blocks')}, ...BACKGROUND_IMAGE_FITS] as const
65
+
66
+ export const BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT = '32px'
67
+
68
+ export const BACKGROUND_IMAGE_SIZE_UNITS = [{value: 'px', label: 'px', default: 32}]
69
+
70
+ export const BACKGROUND_IMAGE_REPEATS = [
71
+ {value: 'no-repeat', label: __('Žádné', 'brilo-blocks')},
72
+ {value: 'repeat-x', label: __('Vodorovně (X)', 'brilo-blocks')},
73
+ {value: 'repeat-y', label: __('Svisle (Y)', 'brilo-blocks')},
74
+ {value: 'repeat', label: __('Obojí', 'brilo-blocks')},
61
75
  ] as const
62
76
 
63
77
  export const BACKGROUND_IMAGE_POSITIONS = [
@@ -18,6 +18,7 @@ import type {
18
18
  BackgroundImage,
19
19
  BackgroundImageFit,
20
20
  BackgroundImagePosition,
21
+ BackgroundImageRepeat,
21
22
  BaseBlockAttributes,
22
23
  Border,
23
24
  Decoration,
@@ -27,12 +28,16 @@ import type {
27
28
  DecorationTranslate,
28
29
  ExcludableBaseAttr,
29
30
  FluidDecoration,
31
+ FluidDecorationFit,
30
32
  FluidDecorationImage,
31
33
  } from './types'
32
34
  import {
33
35
  BACKGROUND_IMAGE_FITS,
34
36
  BACKGROUND_IMAGE_OVERLAY_OPACITY_DEFAULT,
35
37
  BACKGROUND_IMAGE_POSITIONS,
38
+ BACKGROUND_IMAGE_REPEATS,
39
+ BACKGROUND_IMAGE_SIZE_UNITS,
40
+ BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT,
36
41
  DECORATION_DEPTHS,
37
42
  DECORATION_MAX_WIDTH_DEFAULT,
38
43
  DECORATION_MAX_WIDTH_UNITS,
@@ -41,25 +46,41 @@ import {
41
46
  DECORATION_POSITIONS,
42
47
  DECORATION_TRANSLATES,
43
48
  FLUID_DECORATION_DEFAULT_HEIGHT,
49
+ FLUID_DECORATION_FITS,
44
50
  FLUID_DECORATION_HEIGHT_PRESETS,
45
51
  FLUID_DECORATION_UNITS,
46
52
  SPACING_POSITIONS,
47
53
  SPACING_SIZES,
48
54
  } from './constants'
49
55
 
56
+ // Shared shape behind every control's `update(patch)`: fill in defaults, layer the current
57
+ // value on top, then the patch — so a patch only needs to name the field(s) actually changing.
58
+ function mergeUpdate<T>(defaults: T, value: T | undefined, patch: Partial<T>): T {
59
+ return {...defaults, ...value, ...patch}
60
+ }
61
+
50
62
  interface FluidDecorationControlProps {
51
63
  label: string
64
+ placement: 'top' | 'bottom'
52
65
  value?: FluidDecoration
53
66
  onChange: (value: FluidDecoration | undefined) => void
54
67
  }
55
68
 
56
- function FluidDecorationControl({label, value, onChange}: FluidDecorationControlProps) {
69
+ function FluidDecorationControl({label, placement, value, onChange}: FluidDecorationControlProps) {
57
70
  const img = value?.img
58
71
  const height = value?.height ?? FLUID_DECORATION_DEFAULT_HEIGHT
72
+ const fit = value?.fit ?? 'auto'
73
+ const sizeValue = value?.sizeValue ?? BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT
74
+ // Matches the twig template's per-side default (top/bottom left) so the field only starts
75
+ // overriding the frontend once the editor actually writes an explicit value.
76
+ const bgPosition = value?.bgPosition ?? (placement === 'bottom' ? 'left bottom' : 'left top')
77
+ const repeat = value?.repeat ?? 'repeat-x'
78
+
79
+ const update = (patch: Partial<FluidDecoration>) => onChange(mergeUpdate({img, height, fit, bgPosition, repeat}, value, patch))
59
80
 
60
81
  const handleSelect = (media: {id: number; url: string; alt: string; width?: number; height?: number}) => {
61
82
  const nextImg: FluidDecorationImage = {id: media.id, src: media.url, alt: media.alt ?? '', width: media.width, height: media.height}
62
- onChange({img: nextImg, height})
83
+ update({img: nextImg})
63
84
  }
64
85
 
65
86
  const handleRemove = () => onChange(undefined)
@@ -93,15 +114,49 @@ function FluidDecorationControl({label, value, onChange}: FluidDecorationControl
93
114
  label={__('Výška', 'brilo-blocks')}
94
115
  value={height}
95
116
  units={FLUID_DECORATION_UNITS}
96
- onChange={(next) => onChange({img, height: (next as string) ?? FLUID_DECORATION_DEFAULT_HEIGHT})}
117
+ onChange={(next) => update({height: (next as string) ?? FLUID_DECORATION_DEFAULT_HEIGHT})}
97
118
  />
98
119
  <ButtonGroup>
99
120
  {FLUID_DECORATION_HEIGHT_PRESETS.map((preset) => (
100
- <Button key={preset} variant="secondary" size="small" onClick={() => onChange({img, height: `${preset}px`})}>
121
+ <Button key={preset} variant="secondary" size="small" onClick={() => update({height: `${preset}px`})}>
101
122
  {preset}
102
123
  </Button>
103
124
  ))}
104
125
  </ButtonGroup>
126
+
127
+ <ToggleGroupControl
128
+ label={__('Přizpůsobení', 'brilo-blocks')}
129
+ value={fit}
130
+ onChange={(next) => update({fit: next as FluidDecorationFit})}
131
+ isBlock
132
+ >
133
+ {FLUID_DECORATION_FITS.map((f) => (
134
+ <ToggleGroupControlOption key={f.value} value={f.value} label={f.label} />
135
+ ))}
136
+ </ToggleGroupControl>
137
+
138
+ {fit === 'custom' && (
139
+ <UnitControl
140
+ label={__('Velikost', 'brilo-blocks')}
141
+ value={sizeValue}
142
+ units={BACKGROUND_IMAGE_SIZE_UNITS}
143
+ onChange={(next) => update({sizeValue: (next as string) ?? BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT})}
144
+ />
145
+ )}
146
+
147
+ <SelectControl<string>
148
+ label={__('Pozice obrázku', 'brilo-blocks')}
149
+ value={bgPosition}
150
+ options={[...BACKGROUND_IMAGE_POSITIONS]}
151
+ onChange={(next) => update({bgPosition: next as BackgroundImagePosition})}
152
+ />
153
+
154
+ <SelectControl<string>
155
+ label={__('Opakování', 'brilo-blocks')}
156
+ value={repeat}
157
+ options={[...BACKGROUND_IMAGE_REPEATS]}
158
+ onChange={(next) => update({repeat: next as BackgroundImageRepeat})}
159
+ />
105
160
  </>
106
161
  )}
107
162
  </BaseControl>
@@ -122,7 +177,8 @@ function DecorationControl({value, onChange}: DecorationControlProps) {
122
177
  const offsetX = value?.offsetX ?? DECORATION_OFFSET_DEFAULT
123
178
  const offsetY = value?.offsetY ?? DECORATION_OFFSET_DEFAULT
124
179
 
125
- const update = (patch: Partial<Decoration>) => onChange({img, position, depth, translate, maxWidth, offsetX, offsetY, ...value, ...patch})
180
+ const update = (patch: Partial<Decoration>) =>
181
+ onChange(mergeUpdate({img, position, depth, translate, maxWidth, offsetX, offsetY}, value, patch))
126
182
 
127
183
  const handleSelect = (media: {id: number; url: string; alt: string; width?: number; height?: number}) => {
128
184
  const nextImg: DecorationImage = {id: media.id, src: media.url, alt: media.alt ?? '', width: media.width, height: media.height}
@@ -234,11 +290,14 @@ function BackgroundImageControl({value, onChange}: BackgroundImageControlProps)
234
290
  const {paletteColors} = useTenantColorPalette()
235
291
  const img = value?.img
236
292
  const fit = value?.fit ?? 'cover'
293
+ const sizeValue = value?.sizeValue ?? BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT
237
294
  const position = value?.position ?? 'center center'
295
+ const repeat = value?.repeat ?? 'no-repeat'
238
296
  const overlayColor = value?.overlay?.color
239
297
  const overlayOpacity = value?.overlay?.opacity ?? BACKGROUND_IMAGE_OVERLAY_OPACITY_DEFAULT
240
298
 
241
- const update = (patch: Partial<BackgroundImage>) => onChange({img, fit, position, overlay: value?.overlay, ...value, ...patch})
299
+ const update = (patch: Partial<BackgroundImage>) =>
300
+ onChange(mergeUpdate({img, fit, position, repeat, overlay: value?.overlay}, value, patch))
242
301
 
243
302
  const handleSelect = (media: {id: number; url: string; alt: string; width?: number; height?: number}) => {
244
303
  const nextImg: FluidDecorationImage = {id: media.id, src: media.url, alt: media.alt ?? '', width: media.width, height: media.height}
@@ -283,6 +342,15 @@ function BackgroundImageControl({value, onChange}: BackgroundImageControlProps)
283
342
  ))}
284
343
  </ToggleGroupControl>
285
344
 
345
+ {fit === 'custom' && (
346
+ <UnitControl
347
+ label={__('Velikost', 'brilo-blocks')}
348
+ value={sizeValue}
349
+ units={BACKGROUND_IMAGE_SIZE_UNITS}
350
+ onChange={(next) => update({sizeValue: (next as string) ?? BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT})}
351
+ />
352
+ )}
353
+
286
354
  <SelectControl<string>
287
355
  label={__('Pozice', 'brilo-blocks')}
288
356
  value={position}
@@ -290,9 +358,15 @@ function BackgroundImageControl({value, onChange}: BackgroundImageControlProps)
290
358
  onChange={(next) => update({position: next as BackgroundImagePosition})}
291
359
  />
292
360
 
361
+ <SelectControl<string>
362
+ label={__('Opakování', 'brilo-blocks')}
363
+ value={repeat}
364
+ options={[...BACKGROUND_IMAGE_REPEATS]}
365
+ onChange={(next) => update({repeat: next as BackgroundImageRepeat})}
366
+ />
367
+
293
368
  <BaseControl
294
369
  label={__('Překryv barvou', 'brilo-blocks')}
295
- __nextHasNoMarginBottom
296
370
  help={__('Ztmavení/zabarvení obrázku pro lepší čitelnost textu.', 'brilo-blocks')}
297
371
  >
298
372
  <ColorPalette
@@ -463,8 +537,18 @@ export function BaseControls({attributes, setAttributes, exclude}: BaseControlsP
463
537
 
464
538
  {!exclude.includes('decorations') && (
465
539
  <PanelBody title={__('Fluidní dekorace', 'brilo-blocks')} initialOpen={false}>
466
- <FluidDecorationControl label={__('Nahoře', 'brilo-blocks')} value={fluid.top} onChange={(value) => setFluid('top', value)} />
467
- <FluidDecorationControl label={__('Dole', 'brilo-blocks')} value={fluid.bottom} onChange={(value) => setFluid('bottom', value)} />
540
+ <FluidDecorationControl
541
+ label={__('Nahoře', 'brilo-blocks')}
542
+ placement="top"
543
+ value={fluid.top}
544
+ onChange={(value) => setFluid('top', value)}
545
+ />
546
+ <FluidDecorationControl
547
+ label={__('Dole', 'brilo-blocks')}
548
+ placement="bottom"
549
+ value={fluid.bottom}
550
+ onChange={(value) => setFluid('bottom', value)}
551
+ />
468
552
  </PanelBody>
469
553
  )}
470
554
 
@@ -3,6 +3,7 @@ import type {BlockEditProps} from '@wordpress/blocks'
3
3
  import type {CSSProperties} from 'react'
4
4
  import type {BaseBlockAttributes, BaseSectionOptions} from './types'
5
5
  import {BaseControls} from './controls'
6
+ import {BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT} from './constants'
6
7
 
7
8
  export function createBaseSectionEdit<TExtra extends Record<string, unknown> = Record<string, never>>(options: BaseSectionOptions<TExtra>) {
8
9
  const EXCLUDE = options.exclude ?? []
@@ -25,11 +26,18 @@ export function createBaseSectionEdit<TExtra extends Record<string, unknown> = R
25
26
  ...(bgImageSrc
26
27
  ? {
27
28
  backgroundImage: [tintLayer, `url(${bgImageSrc})`].filter(Boolean).join(', '),
28
- backgroundSize: [tintLayer ? '100% 100%' : null, backgroundImage?.fit ?? 'cover'].filter(Boolean).join(', '),
29
+ backgroundSize: [
30
+ tintLayer ? '100% 100%' : null,
31
+ backgroundImage?.fit === 'custom'
32
+ ? (backgroundImage?.sizeValue ?? BACKGROUND_IMAGE_SIZE_VALUE_DEFAULT)
33
+ : (backgroundImage?.fit ?? 'cover'),
34
+ ]
35
+ .filter(Boolean)
36
+ .join(', '),
29
37
  backgroundPosition: [tintLayer ? 'center center' : null, backgroundImage?.position ?? 'center center']
30
38
  .filter(Boolean)
31
39
  .join(', '),
32
- backgroundRepeat: 'no-repeat',
40
+ backgroundRepeat: [tintLayer ? 'no-repeat' : null, backgroundImage?.repeat ?? 'no-repeat'].filter(Boolean).join(', '),
33
41
  padding: '16px',
34
42
  }
35
43
  : {}),
@@ -13,6 +13,12 @@ export interface FluidDecorationImage {
13
13
  export interface FluidDecoration {
14
14
  img?: FluidDecorationImage
15
15
  height: string
16
+ fit?: FluidDecorationFit
17
+ sizeValue?: string
18
+ // Named bgPosition (not "position") — the twig include merges its own top/bottom placement
19
+ // key as "position" on top of this object, which would silently clobber a same-named field.
20
+ bgPosition?: BackgroundImagePosition
21
+ repeat?: BackgroundImageRepeat
16
22
  }
17
23
 
18
24
  export type DecorationImage = FluidDecorationImage
@@ -31,7 +37,12 @@ export interface Decoration {
31
37
  offsetY?: string
32
38
  }
33
39
 
34
- export type BackgroundImageFit = 'cover' | 'contain'
40
+ export type BackgroundImageFit = 'cover' | 'contain' | 'custom'
41
+
42
+ // Fluid decorations additionally support 'auto' (original height-driven sizing, no crop/fit).
43
+ export type FluidDecorationFit = BackgroundImageFit | 'auto'
44
+
45
+ export type BackgroundImageRepeat = 'no-repeat' | 'repeat' | 'repeat-x' | 'repeat-y'
35
46
 
36
47
  export type BackgroundImagePosition =
37
48
  | 'left top'
@@ -52,7 +63,9 @@ export interface BackgroundImageOverlay {
52
63
  export interface BackgroundImage {
53
64
  img?: FluidDecorationImage
54
65
  fit?: BackgroundImageFit
66
+ sizeValue?: string
55
67
  position?: BackgroundImagePosition
68
+ repeat?: BackgroundImageRepeat
56
69
  overlay?: BackgroundImageOverlay
57
70
  }
58
71
 
@@ -10,6 +10,7 @@ import {
10
10
  } from '@wordpress/components'
11
11
  import {__} from '@wordpress/i18n'
12
12
  import clsx from 'clsx'
13
+ import {ItemSpacingPanel, itemSpacingStyle} from '~/components/ItemSpacingControl'
13
14
  import {useGroupBlock} from '~/hooks/useGroupBlock'
14
15
  import {useTenantColorPalette} from '~/hooks/useTenantColorPalette'
15
16
  import {
@@ -34,7 +35,7 @@ export function createSignpostGroupEdit(options: SignpostGroupOptions) {
34
35
  attributes: SignpostGroupAttributes
35
36
  setAttributes: (a: Partial<SignpostGroupAttributes>) => void
36
37
  }) {
37
- const {columns, headingLevel, ratio, img, style, padding} = attributes
38
+ const {columns, headingLevel, ratio, img, style, padding, spacing} = attributes
38
39
  const clipPath = img?.clipPath ?? 'none'
39
40
  const {paletteColors} = useTenantColorPalette()
40
41
 
@@ -45,6 +46,7 @@ export function createSignpostGroupEdit(options: SignpostGroupOptions) {
45
46
  '--grid-max-col-count': columns,
46
47
  // Inherited by every signpost item inside the container.
47
48
  ...(IMAGE_CLIP_PATH_VALUES[clipPath] && {'--signpost-image-clip-path': IMAGE_CLIP_PATH_VALUES[clipPath]}),
49
+ ...itemSpacingStyle(spacing),
48
50
  },
49
51
  allowedBlocks: options.allowedBlocks,
50
52
  orientation: 'horizontal',
@@ -162,6 +164,7 @@ export function createSignpostGroupEdit(options: SignpostGroupOptions) {
162
164
  />
163
165
  </PanelBody>
164
166
  )}
167
+ <ItemSpacingPanel spacing={spacing} onChange={(v) => setAttributes({spacing: v})} />
165
168
  </InspectorControls>
166
169
  <div {...blockProps}>
167
170
  <div {...innerBlocksProps} />
@@ -1,6 +1,7 @@
1
1
  import {InnerBlocks} from '@wordpress/block-editor'
2
2
  import type {BlockConfiguration} from '@wordpress/blocks'
3
3
  import {__} from '@wordpress/i18n'
4
+ import {ITEM_SPACING_ATTRIBUTE} from '~/components/ItemSpacingControl'
4
5
  import {COLUMNS, DEFAULT_IMAGE_CLIP_PATHS, DEFAULT_SHADOWS, HEADING_LEVELS, RATIOS, TEXT_ALIGNS} from './constants'
5
6
  import {createSignpostGroupEdit} from './edit'
6
7
  import {icon as defaultIcon} from './icon'
@@ -31,6 +32,7 @@ export function createSignpostGroupBlock(options: SignpostGroupOptions): BlockCo
31
32
  type: 'object',
32
33
  default: {clipPath: DEFAULT_IMAGE_CLIP_PATHS[0].value},
33
34
  },
35
+ ...ITEM_SPACING_ATTRIBUTE,
34
36
  }
35
37
 
36
38
  if (!exclude.includes('colors')) {
@@ -23,6 +23,7 @@ export interface SignpostGroupAttributes extends Record<string, unknown> {
23
23
  textAlign: SignpostTextAlign
24
24
  }
25
25
  padding: {value: number}
26
+ spacing?: number
26
27
  }
27
28
 
28
29
  export interface SignpostGroupOptions extends BriloBlockType {