@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
@@ -9,6 +9,7 @@ import {__} from '@wordpress/i18n'
9
9
  import {useDispatch} from '@wordpress/data'
10
10
  import {createBlock} from '@wordpress/blocks'
11
11
  import clsx from 'clsx'
12
+ import {ItemSpacingPanel, itemSpacingStyle} from '~/components/ItemSpacingControl'
12
13
  import {useGroupBlock} from '~/hooks/useGroupBlock'
13
14
  import {DEFAULT_COLUMNS, DEFAULT_RATIOS} from './constants'
14
15
  import type {GalleryGroupAttributes, GalleryGroupOptions, GalleryRatio} from './types'
@@ -31,7 +32,7 @@ export function createGalleryGroupEdit(options: GalleryGroupOptions) {
31
32
  setAttributes: (a: Partial<GalleryGroupAttributes>) => void
32
33
  clientId: string
33
34
  }) {
34
- const {columns, ratio, galleryId} = attributes
35
+ const {columns, ratio, galleryId, spacing} = attributes
35
36
  const {insertBlock} = useDispatch('core/block-editor')
36
37
 
37
38
  const addNewBlock = (imageId: number) => {
@@ -69,6 +70,7 @@ export function createGalleryGroupEdit(options: GalleryGroupOptions) {
69
70
  containerStyle: {
70
71
  '--grid-max-col-count': columns,
71
72
  '--gallery-aspect-ratio': ratio.replace(':', '/'),
73
+ ...itemSpacingStyle(spacing),
72
74
  },
73
75
  allowedBlocks: options.allowedBlocks,
74
76
  renderAppender: CustomAppender,
@@ -107,6 +109,7 @@ export function createGalleryGroupEdit(options: GalleryGroupOptions) {
107
109
  help={__('ID pro oddělení/spojení galerií', 'brilo-blocks')}
108
110
  />
109
111
  </PanelBody>
112
+ <ItemSpacingPanel spacing={spacing} onChange={(v) => setAttributes({spacing: v})} />
110
113
  </InspectorControls>
111
114
  <div {...blockProps}>
112
115
  <div {...innerBlocksProps} />
@@ -1,5 +1,6 @@
1
1
  import type {BlockConfiguration} from '@wordpress/blocks'
2
2
  import {__} from '@wordpress/i18n'
3
+ import {ITEM_SPACING_ATTRIBUTE} from '~/components/ItemSpacingControl'
3
4
  import {createGalleryGroupEdit} from './edit'
4
5
  import {DEFAULT_COLUMNS, DEFAULT_RATIOS} from './constants'
5
6
  import type {GalleryGroupAttributes, GalleryGroupOptions} from './types'
@@ -29,6 +30,7 @@ export function createGalleryGroupBlock(options: GalleryGroupOptions): BlockConf
29
30
  type: 'string',
30
31
  default: 'gallery',
31
32
  },
33
+ ...ITEM_SPACING_ATTRIBUTE,
32
34
  },
33
35
  edit: createGalleryGroupEdit(options),
34
36
  save: () => <InnerBlocks.Content />,
@@ -9,6 +9,7 @@ export interface GalleryGroupAttributes<TColumn extends number = GalleryColumns,
9
9
  columns: TColumn
10
10
  ratio: TRatio
11
11
  galleryId: string
12
+ spacing?: number
12
13
  }
13
14
 
14
15
  export interface GalleryGroupOptions<
@@ -11,6 +11,7 @@ export const textAndMediaGroupDefaults: TextAndMediaGroupOptions = {
11
11
  'brilo/basic-heading',
12
12
  'brilo/basic-overline',
13
13
  'brilo/button-group',
14
+ 'brilo/list-group',
14
15
  'core/heading',
15
16
  'core/list',
16
17
  'core/paragraph',
@@ -0,0 +1,15 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export {CONTENT_SIZES as DEFAULT_CONTENT_SIZES} from '~/constants'
4
+
5
+ export const DEFAULT_BULLET_SIZE = 24
6
+ export const BULLET_SIZE_MIN = 8
7
+ export const BULLET_SIZE_MAX = 96
8
+
9
+ export const DEFAULT_BULLET_SIZE_PRESETS = [
10
+ {value: 16, label: __('XS', 'brilo-blocks')},
11
+ {value: 20, label: __('SM', 'brilo-blocks')},
12
+ {value: 24, label: __('MD', 'brilo-blocks')},
13
+ {value: 32, label: __('LG', 'brilo-blocks')},
14
+ {value: 48, label: __('XL', 'brilo-blocks')},
15
+ ] as const
@@ -0,0 +1,102 @@
1
+ import {InspectorControls} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ Button,
5
+ RangeControl,
6
+ BaseControl,
7
+ __experimentalToggleGroupControl as ToggleGroupControl,
8
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
9
+ } from '@wordpress/components'
10
+ import {__} from '@wordpress/i18n'
11
+ import clsx from 'clsx'
12
+ import {ItemSpacingPanel, itemSpacingStyle} from '~/components/ItemSpacingControl'
13
+ import {useGroupBlock} from '~/hooks/useGroupBlock'
14
+ import {BULLET_SIZE_MAX, BULLET_SIZE_MIN, DEFAULT_BULLET_SIZE_PRESETS, DEFAULT_CONTENT_SIZES} from './constants'
15
+ import type {ListBulletSizePreset, ListContentSize, ListGroupAttributes, ListGroupOptions} from './types'
16
+
17
+ function PresetSizeControl({
18
+ label,
19
+ value,
20
+ presets,
21
+ min,
22
+ max,
23
+ onChange,
24
+ }: {
25
+ label: string
26
+ value: number
27
+ presets: readonly ListBulletSizePreset[]
28
+ min: number
29
+ max: number
30
+ onChange: (v: number) => void
31
+ }) {
32
+ return (
33
+ <BaseControl label={label} id={`list-group-size-${label}`}>
34
+ <div style={{display: 'flex', gap: 4, marginBottom: 8, flexWrap: 'wrap'}}>
35
+ {presets.map((p) => (
36
+ <Button key={p.label} variant={value === p.value ? 'primary' : 'secondary'} size="small" onClick={() => onChange(p.value)}>
37
+ {p.label}
38
+ </Button>
39
+ ))}
40
+ </div>
41
+ <RangeControl value={value} onChange={(v) => onChange(v ?? min)} min={min} max={max} step={1} withInputField />
42
+ </BaseControl>
43
+ )
44
+ }
45
+
46
+ export function createListGroupEdit(options: ListGroupOptions) {
47
+ const CONTENT_SIZES = options.contentSizes ?? DEFAULT_CONTENT_SIZES
48
+ const BULLET_SIZE_PRESETS = options.bulletSizePresets ?? DEFAULT_BULLET_SIZE_PRESETS
49
+
50
+ return function Edit({
51
+ attributes,
52
+ setAttributes,
53
+ }: {
54
+ attributes: ListGroupAttributes
55
+ setAttributes: (a: Partial<ListGroupAttributes>) => void
56
+ }) {
57
+ const {content, bullet, spacing} = attributes
58
+
59
+ const {blockProps, innerBlocksProps} = useGroupBlock({
60
+ blockClassName: clsx(options.blockClassName ?? 'g-list wp-block-section'),
61
+ containerClassName: options.containerClassName ?? 'g-list__items',
62
+ containerStyle: {'--bullet-size': `${bullet.size}px`, ...itemSpacingStyle(spacing)},
63
+ allowedBlocks: options.allowedBlocks,
64
+ orientation: 'vertical',
65
+ template: options.template,
66
+ layout: {type: 'default'},
67
+ })
68
+
69
+ return (
70
+ <>
71
+ <InspectorControls>
72
+ <PanelBody title={__('Rozložení', 'brilo-blocks')}>
73
+ <ToggleGroupControl
74
+ isBlock
75
+ label={__('Velikost textu', 'brilo-blocks')}
76
+ value={content.size}
77
+ onChange={(v) => setAttributes({content: {size: v as ListContentSize}})}
78
+ >
79
+ {CONTENT_SIZES.map((s) => (
80
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
81
+ ))}
82
+ </ToggleGroupControl>
83
+ </PanelBody>
84
+ <PanelBody title={__('Velikost odrážek', 'brilo-blocks')}>
85
+ <PresetSizeControl
86
+ label={__('Velikost', 'brilo-blocks')}
87
+ value={bullet.size}
88
+ presets={BULLET_SIZE_PRESETS}
89
+ min={BULLET_SIZE_MIN}
90
+ max={BULLET_SIZE_MAX}
91
+ onChange={(v) => setAttributes({bullet: {...bullet, size: v}})}
92
+ />
93
+ </PanelBody>
94
+ <ItemSpacingPanel spacing={spacing} onChange={(v) => setAttributes({spacing: v})} />
95
+ </InspectorControls>
96
+ <div {...blockProps}>
97
+ <div {...innerBlocksProps} />
98
+ </div>
99
+ </>
100
+ )
101
+ }
102
+ }
@@ -0,0 +1,14 @@
1
+ @layer base {
2
+ .g-list {
3
+ --bullet-size: 24px;
4
+
5
+ padding: 8px;
6
+ min-height: 40px;
7
+
8
+ .g-list__items {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: 12px;
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,35 @@
1
+ import {InnerBlocks} from '@wordpress/block-editor'
2
+ import type {BlockConfiguration} from '@wordpress/blocks'
3
+ import {__} from '@wordpress/i18n'
4
+ import {ITEM_SPACING_ATTRIBUTE} from '~/components/ItemSpacingControl'
5
+ import type {OptionArray} from '~/types'
6
+ import {DEFAULT_BULLET_SIZE, DEFAULT_CONTENT_SIZES} from './constants'
7
+ import {createListGroupEdit} from './edit'
8
+ import {icon as defaultIcon} from './icon'
9
+ import type {ListGroupAttributes, ListGroupOptions} from './types'
10
+
11
+ export type {ListGroupAttributes, ListGroupOptions}
12
+
13
+ export function createListGroupBlock<TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES>(
14
+ options: ListGroupOptions<TContentSizes>,
15
+ ): BlockConfiguration<ListGroupAttributes<TContentSizes[number]['value']>> {
16
+ const contentSizes = options.contentSizes ?? DEFAULT_CONTENT_SIZES
17
+
18
+ return {
19
+ name: options.name,
20
+ title: options.title ?? __('Seznam s odrážkami', 'brilo-blocks'),
21
+ description: options.description,
22
+ category: options.category ?? 'layout',
23
+ ...(options.parent && {parent: options.parent}),
24
+ icon: options.icon ?? {src: defaultIcon},
25
+ supports: {html: false, customClassName: false},
26
+ providesContext: {'brilo/list-bullet': 'bullet', 'brilo/list-content': 'content'},
27
+ attributes: {
28
+ content: {type: 'object', default: {size: contentSizes[1]?.value ?? contentSizes[0].value}},
29
+ bullet: {type: 'object', default: {size: DEFAULT_BULLET_SIZE}},
30
+ ...ITEM_SPACING_ATTRIBUTE,
31
+ },
32
+ edit: createListGroupEdit(options as unknown as ListGroupOptions),
33
+ save: () => <InnerBlocks.Content />,
34
+ } as unknown as BlockConfiguration<ListGroupAttributes<TContentSizes[number]['value']>>
35
+ }
@@ -0,0 +1,11 @@
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>List Group</title>
4
+ <circle cx="3.5" cy="5" r="1.5" fill="black" />
5
+ <circle cx="3.5" cy="10" r="1.5" fill="black" />
6
+ <circle cx="3.5" cy="15" r="1.5" fill="black" />
7
+ <path d="M7 4H17V6H7V4Z" fill="black" />
8
+ <path d="M7 9H17V11H7V9Z" fill="black" />
9
+ <path d="M7 14H17V16H7V14Z" fill="black" />
10
+ </svg>
11
+ )
@@ -0,0 +1,15 @@
1
+ export type {ListContentSize, ListGroupAttributes, ListGroupOptions} from './types'
2
+ export {createListGroupBlock} from './factory'
3
+
4
+ import type {ListGroupOptions} from './types'
5
+
6
+ export const listGroupDefaults: ListGroupOptions = {
7
+ name: 'brilo/list-group',
8
+ parent: ['brilo/base-section', 'brilo/text-and-media-group', 'brilo/compare-item'],
9
+ allowedBlocks: ['brilo/list-item'],
10
+ template: [
11
+ ['brilo/list-item', {}],
12
+ ['brilo/list-item', {}],
13
+ ['brilo/list-item', {}],
14
+ ],
15
+ }
@@ -0,0 +1,21 @@
1
+ import type {BriloBlockType, OptionArray} from '~/types'
2
+ import type {DEFAULT_CONTENT_SIZES} from './constants'
3
+
4
+ export type ListContentSize = (typeof DEFAULT_CONTENT_SIZES)[number]['value']
5
+
6
+ export interface ListBulletSizePreset {
7
+ value: number
8
+ label: string
9
+ }
10
+
11
+ export interface ListGroupAttributes<TContentSize extends string = ListContentSize> extends Record<string, unknown> {
12
+ content: {size: TContentSize}
13
+ bullet: {size: number}
14
+ spacing?: number
15
+ }
16
+
17
+ export interface ListGroupOptions<TContentSizes extends OptionArray = typeof DEFAULT_CONTENT_SIZES> extends BriloBlockType {
18
+ allowedBlocks: string[]
19
+ contentSizes?: TContentSizes
20
+ bulletSizePresets?: readonly ListBulletSizePreset[]
21
+ }
@@ -0,0 +1,52 @@
1
+ import clsx from 'clsx'
2
+
3
+ export interface ListSharedBullet {
4
+ size?: number
5
+ }
6
+
7
+ export interface ListSharedContent {
8
+ size?: string
9
+ }
10
+
11
+ export interface ListBulletStyle {
12
+ color?: string
13
+ background?: string
14
+ backgroundShape?: string
15
+ borderColor?: string
16
+ borderWidth?: number
17
+ }
18
+
19
+ export interface ListPreviewStyle {
20
+ rootClassName: string
21
+ bulletClassName: string
22
+ cssVars: Record<string, string>
23
+ }
24
+
25
+ export function buildListPreviewStyle(
26
+ sharedBullet: ListSharedBullet | undefined,
27
+ bulletStyle: ListBulletStyle | undefined,
28
+ sharedContent: ListSharedContent | undefined,
29
+ resolveHex: (value: string) => string = (value) => value,
30
+ ): ListPreviewStyle {
31
+ const bullet = bulletStyle ?? {}
32
+
33
+ const rootClassName = clsx(
34
+ sharedContent?.size && `--text-${sharedContent.size}`,
35
+ bullet.background && bullet.background !== 'none' && '--has-bg',
36
+ bullet.color && bullet.color !== 'none' && '--has-color',
37
+ bullet.borderColor && '--bordered',
38
+ )
39
+
40
+ const bulletClassName = clsx(bullet.backgroundShape && bullet.backgroundShape !== 'none' && `--shape --shape-${bullet.backgroundShape}`)
41
+
42
+ const cssVars: Record<string, string> = {}
43
+ if (sharedBullet?.size) cssVars['--bullet-size'] = `${sharedBullet.size}px`
44
+ if (bullet.color && bullet.color !== 'none') cssVars['--bullet-color'] = resolveHex(bullet.color)
45
+ if (bullet.background && bullet.background !== 'none') cssVars['--bullet-bg'] = resolveHex(bullet.background)
46
+ if (bullet.borderColor) {
47
+ cssVars['--bullet-outline-color'] = resolveHex(bullet.borderColor)
48
+ cssVars['--bullet-outline-width'] = `${bullet.borderWidth || 1}px`
49
+ }
50
+
51
+ return {rootClassName, bulletClassName, cssVars}
52
+ }
@@ -0,0 +1,18 @@
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
8
+
9
+ export const DEFAULT_BULLET_SHAPES = [
10
+ {value: 'none', label: __('Žádný', 'brilo-blocks')},
11
+ {value: 'circle', label: __('Kruh', 'brilo-blocks')},
12
+ {value: 'triangle', label: __('Trojúhelník', 'brilo-blocks')},
13
+ {value: 'rhombus', label: __('Kosočtverec', 'brilo-blocks')},
14
+ {value: 'octagon', label: __('Osmiúhelník', 'brilo-blocks')},
15
+ {value: 'bevel', label: __('Zkosený', 'brilo-blocks')},
16
+ {value: 'rabbet', label: __('Drážkovaný', 'brilo-blocks')},
17
+ {value: 'parallelogram', label: __('Rovnoběžník', 'brilo-blocks')},
18
+ ] as const
@@ -0,0 +1,108 @@
1
+ import {InspectorControls, RichText, useBlockProps} from '@wordpress/block-editor'
2
+ import {PanelBody, RangeControl, BaseControl, ColorPalette, SelectControl} from '@wordpress/components'
3
+ import {__} from '@wordpress/i18n'
4
+ import clsx from 'clsx'
5
+ import {ItemIconControl, ItemIconPreview} from '~/components/ItemIconControl'
6
+ import {useTenantColorPalette} from '~/hooks/useTenantColorPalette'
7
+ import {buildListPreviewStyle, type ListBulletStyle, type ListSharedBullet, type ListSharedContent} from './buildPreviewStyle'
8
+ import {DEFAULT_BULLET_SHAPES, ICON_TYPES} from './constants'
9
+ import type {ListBulletShape, ListItemAttributes, ListItemOptions} from './types'
10
+
11
+ export function createListItemEdit(options: ListItemOptions) {
12
+ return function Edit({
13
+ attributes,
14
+ setAttributes,
15
+ context,
16
+ }: {
17
+ attributes: ListItemAttributes
18
+ setAttributes: (a: Partial<ListItemAttributes>) => void
19
+ context?: {'brilo/list-bullet'?: ListSharedBullet; 'brilo/list-content'?: ListSharedContent}
20
+ }) {
21
+ const {text, icon, bulletStyle} = attributes
22
+ const {paletteColors, resolveHex} = useTenantColorPalette()
23
+ const {rootClassName, bulletClassName, cssVars} = buildListPreviewStyle(
24
+ context?.['brilo/list-bullet'],
25
+ bulletStyle as ListBulletStyle,
26
+ context?.['brilo/list-content'],
27
+ resolveHex,
28
+ )
29
+
30
+ const blockProps = useBlockProps({className: clsx('i-list', rootClassName), style: cssVars})
31
+
32
+ return (
33
+ <>
34
+ <InspectorControls>
35
+ <PanelBody title={__('Ikona', 'brilo-blocks')}>
36
+ <ItemIconControl icon={icon} setAttributes={setAttributes} iconTypes={ICON_TYPES} options={options} />
37
+ </PanelBody>
38
+ <PanelBody title={__('Vzhled odrážky', 'brilo-blocks')}>
39
+ <BaseControl label={__('Barva', 'brilo-blocks')} id="list-item-bullet-color">
40
+ <ColorPalette
41
+ colors={paletteColors}
42
+ value={bulletStyle.color || undefined}
43
+ onChange={(value) => setAttributes({bulletStyle: {...bulletStyle, color: value ?? ''}})}
44
+ />
45
+ </BaseControl>
46
+ <BaseControl label={__('Pozadí', 'brilo-blocks')} id="list-item-bullet-background">
47
+ <ColorPalette
48
+ colors={paletteColors}
49
+ value={bulletStyle.background || undefined}
50
+ onChange={(value) => setAttributes({bulletStyle: {...bulletStyle, background: value ?? ''}})}
51
+ />
52
+ </BaseControl>
53
+ {(bulletStyle.background || bulletStyle.borderColor) && (
54
+ <SelectControl<string>
55
+ label={__('Tvar odrážky', 'brilo-blocks')}
56
+ value={bulletStyle.backgroundShape}
57
+ options={[...DEFAULT_BULLET_SHAPES]}
58
+ onChange={(v) => setAttributes({bulletStyle: {...bulletStyle, backgroundShape: v as ListBulletShape}})}
59
+ />
60
+ )}
61
+ <BaseControl
62
+ label={__('Barva ohraničení', 'brilo-blocks')}
63
+ help={__('Bez vybrané barvy se okraj nevykreslí.', 'brilo-blocks')}
64
+ id="list-item-bullet-border-color"
65
+ >
66
+ <ColorPalette
67
+ colors={paletteColors}
68
+ value={bulletStyle.borderColor || undefined}
69
+ onChange={(value) => setAttributes({bulletStyle: {...bulletStyle, borderColor: value ?? ''}})}
70
+ />
71
+ </BaseControl>
72
+ {bulletStyle.borderColor && (
73
+ <RangeControl
74
+ label={__('Šířka ohraničení (px)', 'brilo-blocks')}
75
+ value={bulletStyle.borderWidth}
76
+ onChange={(v) => setAttributes({bulletStyle: {...bulletStyle, borderWidth: v ?? 0}})}
77
+ min={0}
78
+ max={10}
79
+ step={1}
80
+ />
81
+ )}
82
+ </PanelBody>
83
+ </InspectorControls>
84
+
85
+ <div {...blockProps}>
86
+ <div className="i-list__inner wp-block-inner">
87
+ <ItemIconPreview
88
+ icon={icon}
89
+ className="i-list__bullet"
90
+ modifierClassName={bulletClassName}
91
+ style={cssVars}
92
+ setAttributes={setAttributes}
93
+ options={options}
94
+ />
95
+ <RichText
96
+ tagName="p"
97
+ className="i-list__text u-text-editable"
98
+ value={text}
99
+ onChange={(v) => setAttributes({text: v})}
100
+ placeholder={__('Text položky…', 'brilo-blocks')}
101
+ allowedFormats={['core/bold', 'core/italic']}
102
+ />
103
+ </div>
104
+ </div>
105
+ </>
106
+ )
107
+ }
108
+ }
@@ -0,0 +1,108 @@
1
+ .i-list {
2
+ width: 100%;
3
+ margin: 0 !important;
4
+ --bullet-size: 24px;
5
+
6
+ .i-list__inner {
7
+ display: flex;
8
+ flex-direction: row;
9
+ gap: 8px;
10
+ align-items: flex-start;
11
+ }
12
+
13
+ &.--text-sm .i-list__text {
14
+ font-size: 14px;
15
+ }
16
+
17
+ &.--text-lg .i-list__text {
18
+ font-size: 18px;
19
+ }
20
+ }
21
+
22
+ .i-list__text {
23
+ margin: 0;
24
+ line-height: 1.5;
25
+ }
26
+
27
+ .i-list__bullet {
28
+ --bullet-box-size: var(--bullet-size, 24px);
29
+
30
+ width: var(--bullet-box-size);
31
+ height: var(--bullet-box-size);
32
+ flex: 0 0 var(--bullet-box-size);
33
+ display: grid;
34
+ grid-template-areas: "pile";
35
+ place-items: center;
36
+ isolation: isolate;
37
+
38
+ &::before,
39
+ &::after {
40
+ content: "";
41
+ grid-area: pile;
42
+ width: var(--bullet-box-size);
43
+ height: var(--bullet-box-size);
44
+ clip-path: var(--bullet-shape, none);
45
+ }
46
+
47
+ &::before {
48
+ z-index: 0;
49
+ background-color: var(--bullet-outline-color, transparent);
50
+ }
51
+
52
+ &::after {
53
+ z-index: 1;
54
+ width: calc(var(--bullet-box-size) - var(--bullet-outline-width, 0px) * 2);
55
+ height: calc(var(--bullet-box-size) - var(--bullet-outline-width, 0px) * 2);
56
+ background-color: var(--bullet-bg, transparent);
57
+ }
58
+
59
+ img,
60
+ svg,
61
+ span {
62
+ grid-area: pile;
63
+ position: relative;
64
+ z-index: 2;
65
+ width: var(--bullet-size, 24px);
66
+ height: var(--bullet-size, 24px);
67
+ object-fit: contain;
68
+ }
69
+
70
+ svg path {
71
+ fill: var(--bullet-color, currentcolor);
72
+ }
73
+
74
+ span {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ color: var(--bullet-color, currentcolor);
79
+ }
80
+
81
+ &.--shape-circle {
82
+ --bullet-shape: circle(50% at 50% 50%);
83
+ }
84
+
85
+ &.--shape-triangle {
86
+ --bullet-shape: polygon(50% 0%, 0% 100%, 100% 100%);
87
+ }
88
+
89
+ &.--shape-rhombus {
90
+ --bullet-shape: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
91
+ }
92
+
93
+ &.--shape-octagon {
94
+ --bullet-shape: polygon(30% 0%, 70% 0%, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0% 70%, 0% 30%);
95
+ }
96
+
97
+ &.--shape-bevel {
98
+ --bullet-shape: polygon(20% 0%, 80% 0%, 100% 20%, 100% 80%, 80% 100%, 20% 100%, 0% 80%, 0% 20%);
99
+ }
100
+
101
+ &.--shape-rabbet {
102
+ --bullet-shape: polygon(0% 15%, 15% 15%, 15% 0%, 85% 0%, 85% 15%, 100% 15%, 100% 85%, 85% 85%, 85% 100%, 15% 100%, 15% 85%, 0% 85%);
103
+ }
104
+
105
+ &.--shape-parallelogram {
106
+ --bullet-shape: polygon(25% 0%, 100% 0%, 75% 100%, 0% 100%);
107
+ }
108
+ }
@@ -0,0 +1,33 @@
1
+ import type {BlockConfiguration} from '@wordpress/blocks'
2
+ import {__} from '@wordpress/i18n'
3
+ import {ICON_TYPES} from './constants'
4
+ import {createListItemEdit} from './edit'
5
+ import type {ListItemAttributes, ListItemOptions} from './types'
6
+
7
+ export type {ListItemAttributes, ListItemOptions}
8
+
9
+ export function createListItemBlock(options: ListItemOptions): BlockConfiguration<ListItemAttributes> {
10
+ return {
11
+ name: options.name,
12
+ title: options.title ?? __('Položka seznamu', 'brilo-blocks'),
13
+ description: options.description,
14
+ category: options.category ?? 'layout',
15
+ ...(options.parent && {parent: options.parent}),
16
+ icon: options.icon ?? 'editor-ul',
17
+ supports: {html: false, customClassName: false},
18
+ usesContext: ['brilo/list-bullet', 'brilo/list-content'],
19
+ attributes: {
20
+ text: {type: 'string', default: ''},
21
+ icon: {
22
+ type: 'object',
23
+ default: {type: ICON_TYPES[0].value, src: '', media: {id: 0, alt: ''}},
24
+ },
25
+ bulletStyle: {
26
+ type: 'object',
27
+ default: {color: '', background: '', backgroundShape: 'none', borderColor: '', borderWidth: 1},
28
+ },
29
+ },
30
+ edit: createListItemEdit(options),
31
+ save: () => null,
32
+ } as unknown as BlockConfiguration<ListItemAttributes>
33
+ }
@@ -0,0 +1,11 @@
1
+ export type {ListBulletShape, ListItemAttributes, ListItemOptions} from './types'
2
+ export {createListItemBlock} from './factory'
3
+
4
+ import type {ListItemOptions} from './types'
5
+
6
+ export const listItemDefaults: ListItemOptions = {
7
+ name: 'brilo/list-item',
8
+ parent: ['brilo/list-group'],
9
+ icons: [],
10
+ iconsSrc: '',
11
+ }
@@ -0,0 +1,23 @@
1
+ import type {BriloBlockType, Icon} from '~/types'
2
+ import type {IconType} from '~/components/IconControl'
3
+ import type {DEFAULT_BULLET_SHAPES, ICON_TYPES} from './constants'
4
+
5
+ export type ListIconType = (typeof ICON_TYPES)[number]['value']
6
+ export type ListBulletShape = (typeof DEFAULT_BULLET_SHAPES)[number]['value']
7
+
8
+ export interface ListItemAttributes extends Record<string, unknown> {
9
+ text: string
10
+ icon: Icon
11
+ bulletStyle: {
12
+ color: string
13
+ background: string
14
+ backgroundShape: string
15
+ borderColor: string
16
+ borderWidth: number
17
+ }
18
+ }
19
+
20
+ export interface ListItemOptions extends BriloBlockType {
21
+ icons: IconType[]
22
+ iconsSrc: string
23
+ }