@brilo/base-blocks 0.1.0

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 (254) hide show
  1. package/.editorconfig +12 -0
  2. package/.prettierrc +8 -0
  3. package/README.md +59 -0
  4. package/USAGE.md +263 -0
  5. package/biome.json +38 -0
  6. package/bun.lock +1392 -0
  7. package/docs/block-anatomy.md +73 -0
  8. package/docs/conventions.md +204 -0
  9. package/docs/new-block.md +179 -0
  10. package/package.json +41 -0
  11. package/src/blocks/column/column-group/edit.tsx +56 -0
  12. package/src/blocks/column/column-group/editor.scss +7 -0
  13. package/src/blocks/column/column-group/factory.tsx +29 -0
  14. package/src/blocks/column/column-group/index.ts +14 -0
  15. package/src/blocks/column/column-group/types.ts +8 -0
  16. package/src/blocks/column/column-item/constants.ts +1 -0
  17. package/src/blocks/column/column-item/edit.tsx +48 -0
  18. package/src/blocks/column/column-item/editor.scss +34 -0
  19. package/src/blocks/column/column-item/factory.tsx +25 -0
  20. package/src/blocks/column/column-item/index.ts +10 -0
  21. package/src/blocks/column/column-item/types.ts +7 -0
  22. package/src/blocks/compare/compare-group/constants.ts +1 -0
  23. package/src/blocks/compare/compare-group/edit.tsx +52 -0
  24. package/src/blocks/compare/compare-group/factory.tsx +29 -0
  25. package/src/blocks/compare/compare-group/icon.tsx +7 -0
  26. package/src/blocks/compare/compare-group/index.ts +13 -0
  27. package/src/blocks/compare/compare-group/types.ts +12 -0
  28. package/src/blocks/compare/compare-item/edit.tsx +38 -0
  29. package/src/blocks/compare/compare-item/editor.scss +15 -0
  30. package/src/blocks/compare/compare-item/factory.tsx +28 -0
  31. package/src/blocks/compare/compare-item/icon.tsx +9 -0
  32. package/src/blocks/compare/compare-item/index.ts +13 -0
  33. package/src/blocks/compare/compare-item/types.ts +9 -0
  34. package/src/blocks/compare/compare-option/constants.ts +7 -0
  35. package/src/blocks/compare/compare-option/edit.tsx +64 -0
  36. package/src/blocks/compare/compare-option/editor.scss +26 -0
  37. package/src/blocks/compare/compare-option/factory.tsx +35 -0
  38. package/src/blocks/compare/compare-option/icon.tsx +7 -0
  39. package/src/blocks/compare/compare-option/index.ts +8 -0
  40. package/src/blocks/compare/compare-option/types.ts +12 -0
  41. package/src/blocks/contact/contact-group/constants.ts +3 -0
  42. package/src/blocks/contact/contact-group/edit.tsx +57 -0
  43. package/src/blocks/contact/contact-group/editor.scss +20 -0
  44. package/src/blocks/contact/contact-group/factory.tsx +35 -0
  45. package/src/blocks/contact/contact-group/index.ts +12 -0
  46. package/src/blocks/contact/contact-group/types.ts +12 -0
  47. package/src/blocks/contact/contact-item/constants.ts +17 -0
  48. package/src/blocks/contact/contact-item/edit.tsx +93 -0
  49. package/src/blocks/contact/contact-item/editor.scss +38 -0
  50. package/src/blocks/contact/contact-item/factory.tsx +35 -0
  51. package/src/blocks/contact/contact-item/index.ts +23 -0
  52. package/src/blocks/contact/contact-item/types.ts +21 -0
  53. package/src/blocks/core/basic-button/constants.ts +17 -0
  54. package/src/blocks/core/basic-button/edit.tsx +107 -0
  55. package/src/blocks/core/basic-button/editor.scss +80 -0
  56. package/src/blocks/core/basic-button/factory.tsx +54 -0
  57. package/src/blocks/core/basic-button/index.ts +8 -0
  58. package/src/blocks/core/basic-button/types.ts +29 -0
  59. package/src/blocks/core/basic-heading/constants.ts +1 -0
  60. package/src/blocks/core/basic-heading/edit.tsx +76 -0
  61. package/src/blocks/core/basic-heading/editor.scss +8 -0
  62. package/src/blocks/core/basic-heading/factory.tsx +40 -0
  63. package/src/blocks/core/basic-heading/index.ts +8 -0
  64. package/src/blocks/core/basic-heading/types.ts +20 -0
  65. package/src/blocks/core/basic-overline/edit.tsx +28 -0
  66. package/src/blocks/core/basic-overline/editor.scss +14 -0
  67. package/src/blocks/core/basic-overline/factory.tsx +22 -0
  68. package/src/blocks/core/basic-overline/index.ts +8 -0
  69. package/src/blocks/core/basic-overline/types.ts +7 -0
  70. package/src/blocks/faq/faq-group/constants.ts +11 -0
  71. package/src/blocks/faq/faq-group/edit.tsx +55 -0
  72. package/src/blocks/faq/faq-group/editor.scss +11 -0
  73. package/src/blocks/faq/faq-group/factory.tsx +39 -0
  74. package/src/blocks/faq/faq-group/index.ts +11 -0
  75. package/src/blocks/faq/faq-group/types.ts +14 -0
  76. package/src/blocks/faq/faq-item/edit.tsx +50 -0
  77. package/src/blocks/faq/faq-item/editor.scss +57 -0
  78. package/src/blocks/faq/faq-item/factory.tsx +24 -0
  79. package/src/blocks/faq/faq-item/index.ts +9 -0
  80. package/src/blocks/faq/faq-item/types.ts +7 -0
  81. package/src/blocks/form/form-field/constants.ts +14 -0
  82. package/src/blocks/form/form-field/edit.tsx +178 -0
  83. package/src/blocks/form/form-field/editor.scss +71 -0
  84. package/src/blocks/form/form-field/factory.tsx +32 -0
  85. package/src/blocks/form/form-field/index.ts +10 -0
  86. package/src/blocks/form/form-field/types.ts +18 -0
  87. package/src/blocks/form/form-group/constants.ts +16 -0
  88. package/src/blocks/form/form-group/edit.tsx +190 -0
  89. package/src/blocks/form/form-group/editor.scss +41 -0
  90. package/src/blocks/form/form-group/factory.tsx +35 -0
  91. package/src/blocks/form/form-group/index.ts +18 -0
  92. package/src/blocks/form/form-group/types.ts +22 -0
  93. package/src/blocks/groups/banner-group/constants.ts +15 -0
  94. package/src/blocks/groups/banner-group/edit.tsx +122 -0
  95. package/src/blocks/groups/banner-group/editor.scss +18 -0
  96. package/src/blocks/groups/banner-group/factory.tsx +64 -0
  97. package/src/blocks/groups/banner-group/icon.tsx +13 -0
  98. package/src/blocks/groups/banner-group/index.ts +11 -0
  99. package/src/blocks/groups/banner-group/types.ts +30 -0
  100. package/src/blocks/groups/basic-header-group/constants.ts +9 -0
  101. package/src/blocks/groups/basic-header-group/edit.tsx +99 -0
  102. package/src/blocks/groups/basic-header-group/editor.scss +35 -0
  103. package/src/blocks/groups/basic-header-group/factory.tsx +46 -0
  104. package/src/blocks/groups/basic-header-group/icon.tsx +17 -0
  105. package/src/blocks/groups/basic-header-group/index.ts +9 -0
  106. package/src/blocks/groups/basic-header-group/types.ts +27 -0
  107. package/src/blocks/groups/button-group/constants.ts +7 -0
  108. package/src/blocks/groups/button-group/edit.tsx +52 -0
  109. package/src/blocks/groups/button-group/editor.scss +23 -0
  110. package/src/blocks/groups/button-group/factory.tsx +34 -0
  111. package/src/blocks/groups/button-group/index.ts +11 -0
  112. package/src/blocks/groups/button-group/types.ts +12 -0
  113. package/src/blocks/groups/text-and-media-group/constants.ts +43 -0
  114. package/src/blocks/groups/text-and-media-group/edit.tsx +241 -0
  115. package/src/blocks/groups/text-and-media-group/editor.scss +123 -0
  116. package/src/blocks/groups/text-and-media-group/factory.tsx +100 -0
  117. package/src/blocks/groups/text-and-media-group/icon.tsx +37 -0
  118. package/src/blocks/groups/text-and-media-group/index.ts +18 -0
  119. package/src/blocks/groups/text-and-media-group/types.ts +60 -0
  120. package/src/blocks/hero/hero-group/constants.ts +23 -0
  121. package/src/blocks/hero/hero-group/edit.tsx +85 -0
  122. package/src/blocks/hero/hero-group/editor.scss +0 -0
  123. package/src/blocks/hero/hero-group/factory.tsx +45 -0
  124. package/src/blocks/hero/hero-group/icon.tsx +28 -0
  125. package/src/blocks/hero/hero-group/index.ts +11 -0
  126. package/src/blocks/hero/hero-group/types.ts +22 -0
  127. package/src/blocks/hero/hero-item/constants.ts +15 -0
  128. package/src/blocks/hero/hero-item/edit.tsx +107 -0
  129. package/src/blocks/hero/hero-item/editor.scss +87 -0
  130. package/src/blocks/hero/hero-item/factory.tsx +49 -0
  131. package/src/blocks/hero/hero-item/index.ts +10 -0
  132. package/src/blocks/hero/hero-item/types.ts +38 -0
  133. package/src/blocks/map/map-group/constants.ts +20 -0
  134. package/src/blocks/map/map-group/edit.tsx +108 -0
  135. package/src/blocks/map/map-group/editor.scss +24 -0
  136. package/src/blocks/map/map-group/factory.tsx +51 -0
  137. package/src/blocks/map/map-group/index.ts +9 -0
  138. package/src/blocks/map/map-group/types.ts +16 -0
  139. package/src/blocks/newsletter/newsletter-form/constants.ts +5 -0
  140. package/src/blocks/newsletter/newsletter-form/edit.tsx +194 -0
  141. package/src/blocks/newsletter/newsletter-form/editor.scss +68 -0
  142. package/src/blocks/newsletter/newsletter-form/factory.tsx +59 -0
  143. package/src/blocks/newsletter/newsletter-form/index.ts +11 -0
  144. package/src/blocks/newsletter/newsletter-form/types.ts +45 -0
  145. package/src/blocks/post/post-slider-group/constants.ts +3 -0
  146. package/src/blocks/post/post-slider-group/edit.tsx +76 -0
  147. package/src/blocks/post/post-slider-group/factory.tsx +43 -0
  148. package/src/blocks/post/post-slider-group/icon.tsx +13 -0
  149. package/src/blocks/post/post-slider-group/index.ts +9 -0
  150. package/src/blocks/post/post-slider-group/types.ts +20 -0
  151. package/src/blocks/responsive-grid/responsive-grid-group/edit.tsx +95 -0
  152. package/src/blocks/responsive-grid/responsive-grid-group/factory.tsx +33 -0
  153. package/src/blocks/responsive-grid/responsive-grid-group/index.ts +13 -0
  154. package/src/blocks/responsive-grid/responsive-grid-group/types.ts +9 -0
  155. package/src/blocks/responsive-grid/responsive-grid-item/edit.tsx +19 -0
  156. package/src/blocks/responsive-grid/responsive-grid-item/factory.tsx +20 -0
  157. package/src/blocks/responsive-grid/responsive-grid-item/index.ts +9 -0
  158. package/src/blocks/responsive-grid/responsive-grid-item/types.ts +5 -0
  159. package/src/blocks/sections/base-section/attributes.ts +17 -0
  160. package/src/blocks/sections/base-section/constants.ts +18 -0
  161. package/src/blocks/sections/base-section/controls.tsx +70 -0
  162. package/src/blocks/sections/base-section/edit.tsx +34 -0
  163. package/src/blocks/sections/base-section/editor.scss +24 -0
  164. package/src/blocks/sections/base-section/factory.tsx +47 -0
  165. package/src/blocks/sections/base-section/icon.tsx +6 -0
  166. package/src/blocks/sections/base-section/index.ts +14 -0
  167. package/src/blocks/sections/base-section/types.ts +26 -0
  168. package/src/blocks/signpost/signpost-group/constants.ts +3 -0
  169. package/src/blocks/signpost/signpost-group/edit.tsx +75 -0
  170. package/src/blocks/signpost/signpost-group/editor.scss +0 -0
  171. package/src/blocks/signpost/signpost-group/factory.tsx +40 -0
  172. package/src/blocks/signpost/signpost-group/icon.tsx +19 -0
  173. package/src/blocks/signpost/signpost-group/index.ts +15 -0
  174. package/src/blocks/signpost/signpost-group/types.ts +9 -0
  175. package/src/blocks/signpost/signpost-item/constants.ts +4 -0
  176. package/src/blocks/signpost/signpost-item/edit.tsx +90 -0
  177. package/src/blocks/signpost/signpost-item/editor.scss +25 -0
  178. package/src/blocks/signpost/signpost-item/factory.tsx +29 -0
  179. package/src/blocks/signpost/signpost-item/icon.tsx +7 -0
  180. package/src/blocks/signpost/signpost-item/index.ts +10 -0
  181. package/src/blocks/signpost/signpost-item/types.ts +12 -0
  182. package/src/blocks/step/step-group/constants.ts +6 -0
  183. package/src/blocks/step/step-group/edit.tsx +64 -0
  184. package/src/blocks/step/step-group/editor.scss +19 -0
  185. package/src/blocks/step/step-group/factory.tsx +36 -0
  186. package/src/blocks/step/step-group/icon.tsx +27 -0
  187. package/src/blocks/step/step-group/index.ts +15 -0
  188. package/src/blocks/step/step-group/types.ts +13 -0
  189. package/src/blocks/step/step-item/constants.ts +6 -0
  190. package/src/blocks/step/step-item/edit.tsx +60 -0
  191. package/src/blocks/step/step-item/editor.scss +18 -0
  192. package/src/blocks/step/step-item/factory.tsx +27 -0
  193. package/src/blocks/step/step-item/index.ts +11 -0
  194. package/src/blocks/step/step-item/types.ts +12 -0
  195. package/src/blocks/testimonial/testimonial-group/constants.ts +27 -0
  196. package/src/blocks/testimonial/testimonial-group/edit.tsx +74 -0
  197. package/src/blocks/testimonial/testimonial-group/editor.scss +38 -0
  198. package/src/blocks/testimonial/testimonial-group/factory.tsx +44 -0
  199. package/src/blocks/testimonial/testimonial-group/icon.tsx +33 -0
  200. package/src/blocks/testimonial/testimonial-group/index.ts +15 -0
  201. package/src/blocks/testimonial/testimonial-group/types.ts +19 -0
  202. package/src/blocks/testimonial/testimonial-item/edit.tsx +48 -0
  203. package/src/blocks/testimonial/testimonial-item/editor.scss +20 -0
  204. package/src/blocks/testimonial/testimonial-item/factory.tsx +35 -0
  205. package/src/blocks/testimonial/testimonial-item/index.ts +9 -0
  206. package/src/blocks/testimonial/testimonial-item/types.ts +9 -0
  207. package/src/blocks/text-and-form/text-and-form-group/constants.ts +6 -0
  208. package/src/blocks/text-and-form/text-and-form-group/edit.tsx +59 -0
  209. package/src/blocks/text-and-form/text-and-form-group/editor.scss +21 -0
  210. package/src/blocks/text-and-form/text-and-form-group/factory.tsx +38 -0
  211. package/src/blocks/text-and-form/text-and-form-group/icon.tsx +23 -0
  212. package/src/blocks/text-and-form/text-and-form-group/index.ts +9 -0
  213. package/src/blocks/text-and-form/text-and-form-group/types.ts +23 -0
  214. package/src/blocks/text-and-form/text-and-form-text-column/constants.ts +10 -0
  215. package/src/blocks/text-and-form/text-and-form-text-column/edit.tsx +94 -0
  216. package/src/blocks/text-and-form/text-and-form-text-column/editor.scss +29 -0
  217. package/src/blocks/text-and-form/text-and-form-text-column/factory.tsx +41 -0
  218. package/src/blocks/text-and-form/text-and-form-text-column/index.ts +18 -0
  219. package/src/blocks/text-and-form/text-and-form-text-column/types.ts +23 -0
  220. package/src/blocks/usp/usp-group/constants.ts +54 -0
  221. package/src/blocks/usp/usp-group/edit.tsx +197 -0
  222. package/src/blocks/usp/usp-group/editor.scss +24 -0
  223. package/src/blocks/usp/usp-group/factory.tsx +113 -0
  224. package/src/blocks/usp/usp-group/icon.tsx +18 -0
  225. package/src/blocks/usp/usp-group/index.ts +15 -0
  226. package/src/blocks/usp/usp-group/types.ts +70 -0
  227. package/src/blocks/usp/usp-item/constants.ts +7 -0
  228. package/src/blocks/usp/usp-item/edit.tsx +65 -0
  229. package/src/blocks/usp/usp-item/editor.scss +17 -0
  230. package/src/blocks/usp/usp-item/factory.tsx +30 -0
  231. package/src/blocks/usp/usp-item/index.ts +11 -0
  232. package/src/blocks/usp/usp-item/types.ts +17 -0
  233. package/src/components/IconControl/IconControl.tsx +55 -0
  234. package/src/components/IconControl/editor.scss +53 -0
  235. package/src/components/IconControl/index.ts +2 -0
  236. package/src/components/IconControl/index.tsx +1 -0
  237. package/src/components/ImagePicker/ImagePicker.tsx +124 -0
  238. package/src/components/ImagePicker/editor.scss +79 -0
  239. package/src/components/ImagePicker/index.ts +2 -0
  240. package/src/components/ImagePicker/index.tsx +1 -0
  241. package/src/components/ItemIconControl/ItemIconControl.tsx +72 -0
  242. package/src/components/ItemIconControl/ItemIconModal.tsx +12 -0
  243. package/src/components/ItemIconControl/ItemIconPreview.tsx +93 -0
  244. package/src/components/ItemIconControl/editor.scss +52 -0
  245. package/src/components/ItemIconControl/index.ts +2 -0
  246. package/src/components/ItemIconControl/types.d.ts +30 -0
  247. package/src/constants.ts +20 -0
  248. package/src/editor.scss +34 -0
  249. package/src/globals.scss +237 -0
  250. package/src/hooks/useGroupBlock.ts +53 -0
  251. package/src/index.ts +122 -0
  252. package/src/types.ts +33 -0
  253. package/src/utils/createEditAdapter.ts +11 -0
  254. package/tsconfig.json +21 -0
@@ -0,0 +1,93 @@
1
+ import {InspectorControls} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ RangeControl,
5
+ __experimentalToggleGroupControl as ToggleGroupControl,
6
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
7
+ } from '@wordpress/components'
8
+ import {__} from '@wordpress/i18n'
9
+ import clsx from 'clsx'
10
+ import type {CSSProperties} from 'react'
11
+ import {ItemIconControl, ItemIconPreview} from '~/components/ItemIconControl'
12
+ import {useGroupBlock} from '~/hooks/useGroupBlock'
13
+ import {CONTACT_COLUMNS_CONTEXT} from '../contact-group/constants'
14
+ import {CONTACT_ICON_SIZE_DEFAULT, CONTACT_ICON_SIZE_RANGE, CONTACT_ICON_SIZES, CONTACT_ICON_TYPES} from './constants'
15
+ import type {ContactIconSizeVariant, ContactItemAttributes, ContactItemOptions} from './types'
16
+
17
+ export function createContactItemEdit(options: ContactItemOptions) {
18
+ const iconOptions = {icons: options.icons ?? [], iconsSrc: options.iconsSrc ?? ''}
19
+
20
+ return function Edit({
21
+ attributes,
22
+ setAttributes,
23
+ context,
24
+ }: {
25
+ attributes: ContactItemAttributes
26
+ setAttributes: (a: Partial<ContactItemAttributes>) => void
27
+ context: Record<string, unknown>
28
+ }) {
29
+ const {colSpan, icon, iconSize} = attributes
30
+ const columns = Number(context[CONTACT_COLUMNS_CONTEXT] ?? 3)
31
+ const span = Math.min(colSpan, columns)
32
+
33
+ const sizePreset = CONTACT_ICON_SIZES.find((s) => s.value === iconSize.variant)
34
+ const iconPx =
35
+ iconSize.variant === 'custom' ? iconSize.custom : sizePreset && 'size' in sizePreset ? sizePreset.size : CONTACT_ICON_SIZE_DEFAULT
36
+
37
+ const {blockProps, innerBlocksProps} = useGroupBlock({
38
+ blockClassName: clsx(options.blockClassName ?? 'i-contact'),
39
+ containerClassName: [options.containerClassName ?? 'i-contact__inner'],
40
+ allowedBlocks: options.allowedBlocks,
41
+ template: options.template,
42
+ orientation: 'vertical',
43
+ layout: {type: 'default'},
44
+ })
45
+
46
+ return (
47
+ <>
48
+ <InspectorControls>
49
+ <PanelBody title={__('Šířka', 'brilo-blocks')}>
50
+ <ToggleGroupControl
51
+ isBlock
52
+ label={__('Počet sloupců', 'brilo-blocks')}
53
+ value={String(span)}
54
+ onChange={(v) => setAttributes({colSpan: Number(v)})}
55
+ >
56
+ {Array.from({length: columns}, (_, i) => i + 1).map((c) => (
57
+ <ToggleGroupControlOption key={c} value={String(c)} label={String(c)} />
58
+ ))}
59
+ </ToggleGroupControl>
60
+ </PanelBody>
61
+ <PanelBody title={__('Ikona', 'brilo-blocks')}>
62
+ <ItemIconControl icon={icon} setAttributes={setAttributes} iconTypes={CONTACT_ICON_TYPES} options={iconOptions} />
63
+ <ToggleGroupControl
64
+ isBlock
65
+ label={__('Velikost ikony', 'brilo-blocks')}
66
+ value={iconSize.variant}
67
+ onChange={(v) => setAttributes({iconSize: {...iconSize, variant: v as ContactIconSizeVariant}})}
68
+ >
69
+ {CONTACT_ICON_SIZES.map((s) => (
70
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
71
+ ))}
72
+ </ToggleGroupControl>
73
+ {iconSize.variant === 'custom' && (
74
+ <RangeControl
75
+ label={__('Vlastní velikost (px)', 'brilo-blocks')}
76
+ value={iconSize.custom}
77
+ min={CONTACT_ICON_SIZE_RANGE.min}
78
+ max={CONTACT_ICON_SIZE_RANGE.max}
79
+ onChange={(v) => setAttributes({iconSize: {...iconSize, custom: v ?? CONTACT_ICON_SIZE_RANGE.min}})}
80
+ />
81
+ )}
82
+ </PanelBody>
83
+ </InspectorControls>
84
+ <div {...blockProps} style={{...(blockProps.style as CSSProperties), '--col-span': span} as CSSProperties}>
85
+ <div className="i-contact__icon-wrap" style={{'--icon-size': `${iconPx}px`} as CSSProperties}>
86
+ <ItemIconPreview icon={icon} className="i-contact__icon" setAttributes={setAttributes} options={iconOptions} />
87
+ </div>
88
+ <div {...innerBlocksProps} />
89
+ </div>
90
+ </>
91
+ )
92
+ }
93
+ }
@@ -0,0 +1,38 @@
1
+ // WP core centers `.wp-block` children (`margin-left/right: auto`) and caps their
2
+ // `max-width` when the parent isn't is-layout-flex/grid. The item content lives in
3
+ // `.i-contact__inner` (plain `display:flex`, no WP layout class), so kill it here.
4
+ // Unlayered + (0,3,0) to beat core's unlayered (0,2,0) rule.
5
+ .editor-styles-wrapper .i-contact__inner > .wp-block {
6
+ margin-left: 0;
7
+ margin-right: 0;
8
+ max-width: none;
9
+ }
10
+
11
+ .i-contact {
12
+ grid-column: span var(--col-span, 1);
13
+ margin-inline: 0;
14
+ width: 100%;
15
+
16
+ .i-contact__inner {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: 8px;
20
+
21
+ p,
22
+ h3,
23
+ h2,
24
+ h4 {
25
+ margin-block: 4px;
26
+ }
27
+ }
28
+
29
+ .i-contact__icon-wrap {
30
+ --icon-size: 32px;
31
+ }
32
+
33
+ .i-contact__icon img {
34
+ width: var(--icon-size);
35
+ height: var(--icon-size);
36
+ object-fit: contain;
37
+ }
38
+ }
@@ -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 {CONTACT_COLUMNS_CONTEXT} from '../contact-group/constants'
5
+ import {CONTACT_ICON_SIZE_DEFAULT, CONTACT_ICON_TYPES} from './constants'
6
+ import {createContactItemEdit} from './edit'
7
+ import type {ContactItemAttributes, ContactItemOptions} from './types'
8
+
9
+ export type {ContactItemAttributes, ContactItemOptions}
10
+
11
+ export function createContactItemBlock(options: ContactItemOptions): BlockConfiguration<ContactItemAttributes> {
12
+ return {
13
+ name: options.name,
14
+ title: options.title ?? __('Kontaktní položka', 'brilo-blocks'),
15
+ description: options.description,
16
+ category: options.category ?? 'layout',
17
+ ...(options.parent && {parent: options.parent}),
18
+ icon: options.icon ?? 'id-alt',
19
+ supports: {html: false, customClassName: false},
20
+ usesContext: [CONTACT_COLUMNS_CONTEXT],
21
+ attributes: {
22
+ colSpan: {type: 'number', default: 1},
23
+ icon: {
24
+ type: 'object',
25
+ default: {type: CONTACT_ICON_TYPES[0].value, src: '', media: {id: 0, alt: ''}},
26
+ },
27
+ iconSize: {
28
+ type: 'object',
29
+ default: {variant: 'md', custom: CONTACT_ICON_SIZE_DEFAULT},
30
+ },
31
+ },
32
+ edit: createContactItemEdit(options),
33
+ save: () => <InnerBlocks.Content />,
34
+ } as unknown as BlockConfiguration<ContactItemAttributes>
35
+ }
@@ -0,0 +1,23 @@
1
+ export type {ContactIconSize, ContactIconSizeVariant, ContactItemAttributes, ContactItemOptions} from './types'
2
+ export {createContactItemBlock} from './factory'
3
+ export {CONTACT_ICON_SIZE_RANGE, CONTACT_ICON_SIZES, CONTACT_ICON_TYPES} from './constants'
4
+
5
+ import type {ContactItemOptions} from './types'
6
+
7
+ export const contactItemDefaults: ContactItemOptions = {
8
+ name: 'brilo/contact-item',
9
+ parent: ['brilo/contact-group'],
10
+ allowedBlocks: [
11
+ 'core/heading',
12
+ 'core/paragraph',
13
+ 'core/list',
14
+ 'core/image',
15
+ 'core/table',
16
+ 'brilo/column-group',
17
+ 'brilo/responsive-grid-group',
18
+ ],
19
+ template: [
20
+ ['core/heading', {level: 3}],
21
+ ['core/paragraph', {}],
22
+ ],
23
+ }
@@ -0,0 +1,21 @@
1
+ import type {BriloBlockType, Icon} from '~/types'
2
+ import type {IconType} from '~/components/IconControl'
3
+ import type {CONTACT_ICON_SIZES} from './constants'
4
+
5
+ export type ContactIconSizeVariant = (typeof CONTACT_ICON_SIZES)[number]['value']
6
+
7
+ export interface ContactIconSize {
8
+ variant: ContactIconSizeVariant
9
+ custom: number
10
+ }
11
+
12
+ export interface ContactItemAttributes extends Record<string, unknown> {
13
+ colSpan: number
14
+ icon: Icon
15
+ iconSize: ContactIconSize
16
+ }
17
+
18
+ export interface ContactItemOptions extends BriloBlockType {
19
+ icons?: IconType[]
20
+ iconsSrc?: string
21
+ }
@@ -0,0 +1,17 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export const DEFAULT_VARIANTS = [
4
+ {value: 'primary', label: __('Primární', 'brilo-blocks')},
5
+ {value: 'secondary', label: __('Sekundární', 'brilo-blocks')},
6
+ ] as const
7
+
8
+ export const DEFAULT_SIZES = [
9
+ {value: 'default', label: __('Výchozí', 'brilo-blocks')},
10
+ {value: 'sm', label: __('Malá', 'brilo-blocks')},
11
+ ] as const
12
+
13
+ export const DEFAULT_FULL_WIDTH_OPTIONS = [
14
+ {value: 'false', label: __('Ne', 'brilo-blocks')},
15
+ {value: 'mobile', label: __('Mobil', 'brilo-blocks')},
16
+ {value: 'true', label: __('Vždy', 'brilo-blocks')},
17
+ ] as const
@@ -0,0 +1,107 @@
1
+ import {InspectorControls, RichText, useBlockProps} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ TextControl,
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 {DEFAULT_FULL_WIDTH_OPTIONS, DEFAULT_SIZES, DEFAULT_VARIANTS} from './constants'
12
+ import type {BasicButtonAttributes, BasicButtonOptions, ButtonFullWidth, ButtonSize, ButtonVariant} from './types'
13
+
14
+ export function createBasicButtonEdit(options: BasicButtonOptions) {
15
+ const VARIANTS = options.variants ?? DEFAULT_VARIANTS
16
+ const SIZES = options.sizes ?? DEFAULT_SIZES
17
+ const FULL_WIDTH_OPTIONS = options.fullWidthOptions ?? DEFAULT_FULL_WIDTH_OPTIONS
18
+
19
+ return function Edit({
20
+ attributes,
21
+ setAttributes,
22
+ }: {
23
+ attributes: BasicButtonAttributes
24
+ setAttributes: (a: Partial<BasicButtonAttributes>) => void
25
+ }) {
26
+ const {title, variant, outline, fullWidth, size, url} = attributes
27
+ const blockProps = useBlockProps({
28
+ className: clsx(
29
+ options.blockClassName ?? 'i-button',
30
+ `--variant-${variant}`,
31
+ `--size-${size}`,
32
+ outline && '--outline',
33
+ fullWidth !== 'false' && `--full-width-${fullWidth}`,
34
+ ),
35
+ })
36
+
37
+ return (
38
+ <>
39
+ <InspectorControls>
40
+ <PanelBody title={__('Tlačítko', 'brilo-blocks')}>
41
+ <TextControl
42
+ label={__('Text tlačítka', 'brilo-blocks')}
43
+ value={title}
44
+ onChange={(value) => setAttributes({title: value})}
45
+ placeholder={__('Text tlačítka...', 'brilo-blocks')}
46
+ />
47
+ <ToggleGroupControl
48
+ label={__('Varianta', 'brilo-blocks')}
49
+ value={variant}
50
+ onChange={(value) => setAttributes({variant: value as ButtonVariant})}
51
+ isBlock
52
+ >
53
+ {VARIANTS.map((v) => (
54
+ <ToggleGroupControlOption key={v.value} value={v.value} label={v.label} />
55
+ ))}
56
+ </ToggleGroupControl>
57
+ <ToggleControl label={__('Outline', 'brilo-blocks')} checked={outline} onChange={(value) => setAttributes({outline: value})} />
58
+ <ToggleGroupControl
59
+ label={__('Velikost', 'brilo-blocks')}
60
+ value={size}
61
+ onChange={(value) => setAttributes({size: value as ButtonSize})}
62
+ isBlock
63
+ >
64
+ {SIZES.map((s) => (
65
+ <ToggleGroupControlOption key={s.value} value={s.value} label={s.label} />
66
+ ))}
67
+ </ToggleGroupControl>
68
+ <ToggleGroupControl
69
+ label={__('Celá šířka', 'brilo-blocks')}
70
+ value={fullWidth}
71
+ onChange={(value) => setAttributes({fullWidth: value as ButtonFullWidth})}
72
+ isBlock
73
+ >
74
+ {FULL_WIDTH_OPTIONS.map((o) => (
75
+ <ToggleGroupControlOption key={o.value} value={o.value} label={o.label} />
76
+ ))}
77
+ </ToggleGroupControl>
78
+ </PanelBody>
79
+ <PanelBody title={__('Odkaz', 'brilo-blocks')}>
80
+ <TextControl
81
+ label={__('URL', 'brilo-blocks')}
82
+ value={url.src}
83
+ onChange={(value) => setAttributes({url: {...url, src: value}})}
84
+ />
85
+ <ToggleControl
86
+ label={__('Otevřít v nové záložce', 'brilo-blocks')}
87
+ checked={url.blank}
88
+ onChange={(value) => setAttributes({url: {...url, blank: value}})}
89
+ />
90
+ </PanelBody>
91
+ </InspectorControls>
92
+ <div {...blockProps}>
93
+ <div className="i-button__inner">
94
+ <RichText
95
+ tagName="span"
96
+ className="i-button__label"
97
+ value={title}
98
+ onChange={(value) => setAttributes({title: value})}
99
+ placeholder={__('Text tlačítka...', 'brilo-blocks')}
100
+ allowedFormats={[]}
101
+ />
102
+ </div>
103
+ </div>
104
+ </>
105
+ )
106
+ }
107
+ }
@@ -0,0 +1,80 @@
1
+ @layer base {
2
+ .i-button {
3
+ --background: transparent;
4
+ --font-color: inherit;
5
+ --border-color: transparent;
6
+ --padding-y: 10px;
7
+ --padding-x: 20px;
8
+ --font-size: 14px;
9
+ --font-weight: 600;
10
+ --border-radius: 4px;
11
+
12
+ display: contents;
13
+
14
+ &.--variant-primary {
15
+ --background: #0073aa;
16
+ --font-color: #fff;
17
+ --border-color: #0073aa;
18
+
19
+ &.--outline {
20
+ --background: transparent;
21
+ --font-color: #0073aa;
22
+ --border-color: #0073aa;
23
+ }
24
+ }
25
+
26
+ &.--variant-secondary {
27
+ --background: #5a6e8b;
28
+ --font-color: #fff;
29
+ --border-color: #5a6e8b;
30
+
31
+ &.--outline {
32
+ --background: transparent;
33
+ --font-color: #5a6e8b;
34
+ --border-color: #5a6e8b;
35
+ }
36
+ }
37
+
38
+ &.--variant-neutral {
39
+ --background: #e2e8f0;
40
+ --font-color: #1a202c;
41
+ --border-color: transparent;
42
+
43
+ &.--outline {
44
+ --background: transparent;
45
+ --font-color: #1a202c;
46
+ --border-color: #1a202c;
47
+ }
48
+ }
49
+
50
+ &.--variant-ghost {
51
+ --background: transparent;
52
+ --font-color: #1a202c;
53
+ --border-color: transparent;
54
+ }
55
+
56
+ &.--size-sm {
57
+ --padding-y: 6px;
58
+ --padding-x: 14px;
59
+ --font-size: 12px;
60
+ }
61
+ }
62
+
63
+ .i-button__inner {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ padding: var(--padding-y) var(--padding-x);
67
+ border-radius: var(--border-radius);
68
+ background-color: var(--background);
69
+ color: var(--font-color);
70
+ border: 1px solid var(--border-color);
71
+ font-size: var(--font-size);
72
+ font-weight: var(--font-weight);
73
+ cursor: pointer;
74
+ text-decoration: none;
75
+ }
76
+
77
+ .i-button__label {
78
+ pointer-events: auto;
79
+ }
80
+ }
@@ -0,0 +1,54 @@
1
+ import type {BlockConfiguration} from '@wordpress/blocks'
2
+ import {__} from '@wordpress/i18n'
3
+ import type {OptionArray} from '~/types'
4
+ import {DEFAULT_FULL_WIDTH_OPTIONS, DEFAULT_SIZES, DEFAULT_VARIANTS} from './constants'
5
+ import {createBasicButtonEdit} from './edit'
6
+ import type {BasicButtonAttributes, BasicButtonOptions} from './types'
7
+
8
+ export type {BasicButtonAttributes, BasicButtonOptions}
9
+
10
+ export function createBasicButtonBlock<
11
+ TVariants extends OptionArray = typeof DEFAULT_VARIANTS,
12
+ TSizes extends OptionArray = typeof DEFAULT_SIZES,
13
+ TFullWidthOptions extends OptionArray = typeof DEFAULT_FULL_WIDTH_OPTIONS,
14
+ >(
15
+ options: BasicButtonOptions<TVariants, TSizes, TFullWidthOptions>,
16
+ ): BlockConfiguration<BasicButtonAttributes<TVariants[number]['value'], TSizes[number]['value'], TFullWidthOptions[number]['value']>> {
17
+ const variants = options.variants ?? DEFAULT_VARIANTS
18
+ const sizes = options.sizes ?? DEFAULT_SIZES
19
+ const fullWidthOptions = options.fullWidthOptions ?? DEFAULT_FULL_WIDTH_OPTIONS
20
+
21
+ return {
22
+ name: options.name,
23
+ title: options.title ?? __('Tlačítko', 'brilo-blocks'),
24
+ description: options.description,
25
+ category: options.category ?? 'common',
26
+ ...(options.parent && {parent: options.parent}),
27
+ icon: options.icon ?? 'button',
28
+ supports: {html: false, customClassName: false},
29
+ attributes: {
30
+ title: {type: 'string', default: ''},
31
+ variant: {
32
+ type: 'string',
33
+ default: variants[0].value,
34
+ enum: variants.map((v) => v.value),
35
+ },
36
+ outline: {type: 'boolean', default: false},
37
+ fullWidth: {
38
+ type: 'string',
39
+ default: fullWidthOptions[0].value,
40
+ enum: fullWidthOptions.map((o) => o.value),
41
+ },
42
+ size: {
43
+ type: 'string',
44
+ default: sizes[0].value,
45
+ enum: sizes.map((s) => s.value),
46
+ },
47
+ url: {type: 'object', default: {src: '', blank: false}},
48
+ },
49
+ edit: createBasicButtonEdit(options as unknown as BasicButtonOptions),
50
+ save: () => null,
51
+ } as unknown as BlockConfiguration<
52
+ BasicButtonAttributes<TVariants[number]['value'], TSizes[number]['value'], TFullWidthOptions[number]['value']>
53
+ >
54
+ }
@@ -0,0 +1,8 @@
1
+ export type {BasicButtonAttributes, BasicButtonOptions} from './types'
2
+ export {createBasicButtonBlock} from './factory'
3
+
4
+ import type {BasicButtonOptions} from './types'
5
+
6
+ export const basicButtonDefaults: BasicButtonOptions = {
7
+ name: 'brilo/basic-button',
8
+ }
@@ -0,0 +1,29 @@
1
+ import type {BriloBlockType, OptionArray} from '~/types'
2
+ import type {DEFAULT_FULL_WIDTH_OPTIONS, DEFAULT_SIZES, DEFAULT_VARIANTS} from './constants'
3
+
4
+ export type ButtonVariant = (typeof DEFAULT_VARIANTS)[number]['value']
5
+ export type ButtonSize = (typeof DEFAULT_SIZES)[number]['value']
6
+ export type ButtonFullWidth = (typeof DEFAULT_FULL_WIDTH_OPTIONS)[number]['value']
7
+
8
+ export interface BasicButtonAttributes<
9
+ TVariant extends string = ButtonVariant,
10
+ TSize extends string = ButtonSize,
11
+ TFullWidth extends string = ButtonFullWidth,
12
+ > extends Record<string, unknown> {
13
+ title: string
14
+ variant: TVariant
15
+ outline: boolean
16
+ fullWidth: TFullWidth
17
+ size: TSize
18
+ url: {src: string; blank: boolean}
19
+ }
20
+
21
+ export interface BasicButtonOptions<
22
+ TVariants extends OptionArray = typeof DEFAULT_VARIANTS,
23
+ TSizes extends OptionArray = typeof DEFAULT_SIZES,
24
+ TFullWidthOptions extends OptionArray = typeof DEFAULT_FULL_WIDTH_OPTIONS,
25
+ > extends BriloBlockType {
26
+ variants?: TVariants
27
+ sizes?: TSizes
28
+ fullWidthOptions?: TFullWidthOptions
29
+ }
@@ -0,0 +1 @@
1
+ export {HEADING_LEVELS as DEFAULT_LEVELS, HEADING_STYLES as DEFAULT_STYLES} from '~/constants'
@@ -0,0 +1,76 @@
1
+ import {BlockControls, InspectorControls, RichText, useBlockProps} from '@wordpress/block-editor'
2
+ import {
3
+ PanelBody,
4
+ __experimentalToggleGroupControl as ToggleGroupControl,
5
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
6
+ ToolbarButton,
7
+ ToolbarGroup,
8
+ } from '@wordpress/components'
9
+ import {__} from '@wordpress/i18n'
10
+ import clsx from 'clsx'
11
+ import {DEFAULT_LEVELS, DEFAULT_STYLES} from './constants'
12
+ import type {BasicHeadingAttributes, BasicHeadingOptions, HeadingStyle} from './types'
13
+
14
+ export function createBasicHeadingEdit(options: BasicHeadingOptions) {
15
+ const LEVELS = options.levels ?? DEFAULT_LEVELS
16
+ const STYLES = options.styles ?? DEFAULT_STYLES
17
+
18
+ return function Edit({
19
+ attributes,
20
+ setAttributes,
21
+ }: {
22
+ attributes: BasicHeadingAttributes
23
+ setAttributes: (a: Partial<BasicHeadingAttributes>) => void
24
+ }) {
25
+ const {title, level, style} = attributes
26
+ const blockProps = useBlockProps({
27
+ className: clsx(options.blockClassName ?? 'i-heading', `--heading-style-${style}`),
28
+ })
29
+
30
+ return (
31
+ <>
32
+ <BlockControls>
33
+ <ToolbarGroup>
34
+ {LEVELS.map((l) => (
35
+ <ToolbarButton key={l} isActive={level === l} onClick={() => setAttributes({level: l as BasicHeadingAttributes['level']})}>
36
+ {`H${l}`}
37
+ </ToolbarButton>
38
+ ))}
39
+ </ToolbarGroup>
40
+ </BlockControls>
41
+ <InspectorControls>
42
+ <PanelBody title={__('Nadpis', 'brilo-blocks')}>
43
+ <ToggleGroupControl
44
+ label={__('Úroveň', 'brilo-blocks')}
45
+ value={String(level)}
46
+ onChange={(value) => setAttributes({level: Number(value) as BasicHeadingAttributes['level']})}
47
+ isBlock
48
+ >
49
+ {LEVELS.map((l) => (
50
+ <ToggleGroupControlOption key={l} value={String(l)} label={`H${l}`} />
51
+ ))}
52
+ </ToggleGroupControl>
53
+ <ToggleGroupControl
54
+ label={__('Styl', 'brilo-blocks')}
55
+ value={style}
56
+ onChange={(value) => setAttributes({style: value as HeadingStyle})}
57
+ isBlock
58
+ >
59
+ {STYLES.map((s) => (
60
+ <ToggleGroupControlOption key={s} value={s} label={s.toUpperCase()} />
61
+ ))}
62
+ </ToggleGroupControl>
63
+ </PanelBody>
64
+ </InspectorControls>
65
+ <RichText
66
+ {...blockProps}
67
+ tagName={`h${level}` as 'h1' | 'h2' | 'h3' | 'h4'}
68
+ value={title}
69
+ onChange={(value) => setAttributes({title: value})}
70
+ placeholder={__('Nadpis...', 'brilo-blocks')}
71
+ allowedFormats={['core/bold', 'core/italic']}
72
+ />
73
+ </>
74
+ )
75
+ }
76
+ }
@@ -0,0 +1,8 @@
1
+ @layer base {
2
+ .i-heading {
3
+ font-weight: 700;
4
+ font-size: var(--heading-size, 24px);
5
+ margin: 0;
6
+ padding: 4px;
7
+ }
8
+ }
@@ -0,0 +1,40 @@
1
+ import type {BlockConfiguration} from '@wordpress/blocks'
2
+ import {__} from '@wordpress/i18n'
3
+ import type {NumberArray, StringArray} from '~/types'
4
+ import {DEFAULT_LEVELS, DEFAULT_STYLES} from './constants'
5
+ import {createBasicHeadingEdit} from './edit'
6
+ import type {BasicHeadingAttributes, BasicHeadingOptions} from './types'
7
+
8
+ export type {BasicHeadingAttributes, BasicHeadingOptions}
9
+
10
+ export function createBasicHeadingBlock<
11
+ TLevels extends NumberArray = typeof DEFAULT_LEVELS,
12
+ TStyles extends StringArray = typeof DEFAULT_STYLES,
13
+ >(options: BasicHeadingOptions<TLevels, TStyles>): BlockConfiguration<BasicHeadingAttributes<TLevels[number], TStyles[number]>> {
14
+ const levels = options.levels ?? DEFAULT_LEVELS
15
+ const styles = options.styles ?? DEFAULT_STYLES
16
+
17
+ return {
18
+ name: options.name,
19
+ title: options.title ?? __('Nadpis', 'brilo-blocks'),
20
+ description: options.description,
21
+ category: options.category ?? 'text',
22
+ supports: {html: false, customClassName: false},
23
+ icon: options.icon ?? 'heading',
24
+ attributes: {
25
+ title: {type: 'string', default: ''},
26
+ level: {
27
+ type: 'number',
28
+ default: levels[1] ?? levels[0],
29
+ enum: [...levels],
30
+ },
31
+ style: {
32
+ type: 'string',
33
+ default: styles[1] ?? styles[0],
34
+ enum: [...styles],
35
+ },
36
+ },
37
+ edit: createBasicHeadingEdit(options as unknown as BasicHeadingOptions),
38
+ save: () => null,
39
+ } as unknown as BlockConfiguration<BasicHeadingAttributes<TLevels[number], TStyles[number]>>
40
+ }
@@ -0,0 +1,8 @@
1
+ export type {BasicHeadingAttributes, BasicHeadingOptions} from './types'
2
+ export {createBasicHeadingBlock} from './factory'
3
+
4
+ import type {BasicHeadingOptions} from './types'
5
+
6
+ export const basicHeadingDefaults: BasicHeadingOptions = {
7
+ name: 'brilo/basic-heading',
8
+ }
@@ -0,0 +1,20 @@
1
+ import type {BriloBlockType, NumberArray, StringArray} from '~/types'
2
+ import type {DEFAULT_LEVELS, DEFAULT_STYLES} from './constants'
3
+
4
+ export type HeadingLevel = (typeof DEFAULT_LEVELS)[number]
5
+ export type HeadingStyle = (typeof DEFAULT_STYLES)[number]
6
+
7
+ export interface BasicHeadingAttributes<TLevel extends number = HeadingLevel, TStyle extends string = HeadingStyle>
8
+ extends Record<string, unknown> {
9
+ title: string
10
+ level: TLevel
11
+ style: TStyle
12
+ }
13
+
14
+ export interface BasicHeadingOptions<
15
+ TLevels extends NumberArray = typeof DEFAULT_LEVELS,
16
+ TStyles extends StringArray = typeof DEFAULT_STYLES,
17
+ > extends BriloBlockType {
18
+ levels?: TLevels
19
+ styles?: TStyles
20
+ }