@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
package/.editorconfig ADDED
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
package/.prettierrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "printWidth": 140,
3
+ "tabWidth": 2,
4
+ "useTabs": false,
5
+ "singleQuote": false,
6
+ "trailingComma": "all",
7
+ "bracketSpacing": false
8
+ }
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @brilo/base-blocks
2
+
3
+ Shared Gutenberg block factory library. Tenants consume it as a local file dependency — each tenant calls factory functions, registers the result, and owns only block.json + icon files.
4
+
5
+ ## Install (tenant)
6
+
7
+ In tenant `package.json`:
8
+ ```json
9
+ "@brilo/base-blocks": "file:../../../../assets/lib/brilo/base-blocks"
10
+ ```
11
+
12
+ Then run `bun install`. Re-run after adding new files to base-blocks (bun links only files known at install time).
13
+
14
+ ## Structure
15
+
16
+ ```
17
+ src/
18
+ blocks/
19
+ sections/ base-section
20
+ groups/ basic-header-group · button-group · usp-group · text-and-media-group
21
+ core/ basic-button · basic-heading · basic-overline
22
+ items/ usp-item
23
+ components/ IconControl · ImagePicker
24
+ hooks/ useGroupBlock
25
+ utils/ createEditAdapter
26
+ editor.scss SCSS barrel — @forward all block + component + global styles
27
+ globals.scss global editor utility classes (flex, gap-*, u-grid-*, …)
28
+ index.ts JS/TS barrel
29
+ types.ts shared types (BaseBlockAttributes, BaseSectionOptions, …)
30
+ ```
31
+
32
+ ## Styles (tenant)
33
+
34
+ In tenant `index.scss`:
35
+ ```scss
36
+ @use "@brilo/base-blocks/src/editor"; /* all block styles in @layer base */
37
+ @import "@brilo/gutenberg-toolkit/build/index.css";
38
+
39
+ @layer base, tenant; /* tenant layer always wins */
40
+ ```
41
+
42
+ Override any base style in tenant SCSS with `@layer tenant { }`.
43
+
44
+ ## Build
45
+
46
+ ```bash
47
+ # in base-blocks
48
+ bun run build # tsc compile → build/
49
+
50
+ # in tenant (prebuild hook runs tsc automatically)
51
+ bun run build
52
+ bun run start
53
+ ```
54
+
55
+ ## API
56
+
57
+ See [USAGE.md](./USAGE.md) for factory examples.
58
+
59
+ All factories return `BlockConfiguration<Attributes>` — pass directly to `registerBlockType`.
package/USAGE.md ADDED
@@ -0,0 +1,263 @@
1
+ # Usage Examples — @brilo/base-blocks
2
+
3
+ ## createBaseSectionBlock
4
+
5
+ Section container. Holds inner blocks, controls background + spacing.
6
+
7
+ ```tsx
8
+ // src/blocks/sections/base-section/index.tsx
9
+ import { createBaseSectionBlock } from "@brilo/base-blocks"
10
+ import { InnerBlocks } from "@wordpress/block-editor"
11
+ import { registerBlockType } from "@wordpress/blocks"
12
+ import { ToggleControl } from "@wordpress/components"
13
+ import { __ } from "@wordpress/i18n"
14
+ import { icon } from "./icon"
15
+
16
+ type ExtraAttrs = { overlap: boolean }
17
+
18
+ const config = createBaseSectionBlock<ExtraAttrs>({
19
+ name: "my-tenant/base-section",
20
+ title: "Sekce",
21
+ description: "Základní kontejner pro sekce",
22
+ category: "layout",
23
+ allowedBlocks: [
24
+ "my-tenant/basic-header-group",
25
+ "my-tenant/usp-group",
26
+ ],
27
+ blockClassName: "s-base",
28
+ containerClassName: "s-base__inner",
29
+ // optional: add tenant-specific attributes on top of base attrs
30
+ extraAttributes: {
31
+ overlap: { type: "boolean", default: false },
32
+ },
33
+ // optional: extra Inspector panel controls rendered below base controls
34
+ extraControls: ({ attributes, setAttributes }) => (
35
+ <ToggleControl
36
+ label={__("Překrytí sekce", "brilo-blocks")}
37
+ checked={attributes.overlap}
38
+ onChange={(value) => setAttributes({ overlap: value })}
39
+ />
40
+ ),
41
+ // optional: exclude base attributes you don't need
42
+ // exclude: ["background"],
43
+ })
44
+
45
+ registerBlockType(config.name as string, {
46
+ ...config,
47
+ save: () => <InnerBlocks.Content />,
48
+ icon: { src: icon },
49
+ })
50
+ ```
51
+
52
+ **Base attributes always included:** `id`, `background`, `spacing` (position + size). Exclude any with `exclude: ["background"]`.
53
+
54
+ ---
55
+
56
+ ## createBasicHeaderGroupBlock
57
+
58
+ Header group — overline + heading combo, alignment control.
59
+
60
+ ```tsx
61
+ import { createBasicHeaderGroupBlock } from "@brilo/base-blocks"
62
+ import { registerBlockType } from "@wordpress/blocks"
63
+ import metadata from "./block.json"
64
+ import { icon } from "./icon"
65
+
66
+ const config = createBasicHeaderGroupBlock({
67
+ name: metadata.name,
68
+ parent: metadata.parent as string[],
69
+ icon: { src: icon },
70
+ })
71
+
72
+ registerBlockType(config.name as string, config)
73
+ ```
74
+
75
+ ---
76
+
77
+ ## createBasicButtonBlock
78
+
79
+ Single button with variant + size controls.
80
+
81
+ ```tsx
82
+ import { createBasicButtonBlock } from "@brilo/base-blocks"
83
+ import { registerBlockType } from "@wordpress/blocks"
84
+ import metadata from "./block.json"
85
+
86
+ const config = createBasicButtonBlock({
87
+ name: metadata.name,
88
+ parent: metadata.parent as string[],
89
+ })
90
+
91
+ registerBlockType(config.name as string, config)
92
+ ```
93
+
94
+ ---
95
+
96
+ ## createBasicHeadingBlock / createBasicOverlineBlock
97
+
98
+ Minimal blocks — RichText heading or overline text.
99
+
100
+ ```tsx
101
+ import { createBasicHeadingBlock, createBasicOverlineBlock } from "@brilo/base-blocks"
102
+ import { registerBlockType } from "@wordpress/blocks"
103
+ import metadata from "./block.json"
104
+
105
+ const headingConfig = createBasicHeadingBlock({
106
+ name: metadata.name,
107
+ parent: metadata.parent as string[],
108
+ })
109
+ registerBlockType(headingConfig.name as string, headingConfig)
110
+
111
+ const overlineConfig = createBasicOverlineBlock({
112
+ name: metadata.name,
113
+ parent: metadata.parent as string[],
114
+ })
115
+ registerBlockType(overlineConfig.name as string, overlineConfig)
116
+ ```
117
+
118
+ ---
119
+
120
+ ## createButtonGroupBlock
121
+
122
+ Container for buttons — layout + alignment controls.
123
+
124
+ ```tsx
125
+ import { createButtonGroupBlock } from "@brilo/base-blocks"
126
+ import { registerBlockType } from "@wordpress/blocks"
127
+ import metadata from "./block.json"
128
+
129
+ const config = createButtonGroupBlock({
130
+ name: metadata.name,
131
+ parent: metadata.parent as string[],
132
+ allowedBlocks: ["my-tenant/basic-button"],
133
+ })
134
+
135
+ registerBlockType(config.name as string, config)
136
+ ```
137
+
138
+ ---
139
+
140
+ ## createUspGroupBlock
141
+
142
+ USP grid group — columns, direction, card style controls.
143
+
144
+ ```tsx
145
+ import { createUspGroupBlock } from "@brilo/base-blocks"
146
+ import { registerBlockType } from "@wordpress/blocks"
147
+ import metadata from "./block.json"
148
+
149
+ const config = createUspGroupBlock({
150
+ name: metadata.name,
151
+ parent: metadata.parent as string[],
152
+ allowedBlocks: ["my-tenant/usp-item"],
153
+ })
154
+
155
+ registerBlockType(config.name as string, config)
156
+ ```
157
+
158
+ ---
159
+
160
+ ## createUspItemBlock
161
+
162
+ Single USP item — icon (preselected SVG / media / number), title, content, URL.
163
+
164
+ ```tsx
165
+ import { createUspItemBlock } from "@brilo/base-blocks"
166
+ import { registerBlockType } from "@wordpress/blocks"
167
+ import metadata from "./block.json"
168
+ import { ICONS, ICONS_SRC } from "./icons"
169
+
170
+ // icons.ts — export list of available icon slugs + base URL
171
+ // export const ICONS_SRC = "/wp-content/themes/my-tenant/assets/icons/"
172
+ // export const ICONS: IconType[] = [
173
+ // { value: "arrow", label: "Arrow" },
174
+ // { value: "check", label: "Check" },
175
+ // ]
176
+
177
+ const config = createUspItemBlock({
178
+ name: metadata.name,
179
+ parent: metadata.parent as string[],
180
+ icons: ICONS,
181
+ iconsSrc: ICONS_SRC,
182
+ })
183
+
184
+ registerBlockType(config.name as string, config)
185
+ ```
186
+
187
+ ---
188
+
189
+ ## createTextAndMediaGroupBlock
190
+
191
+ Two-column text + media group — image/video, media position, ratios, chip overlay.
192
+
193
+ ```tsx
194
+ import { createTextAndMediaGroupBlock } from "@brilo/base-blocks"
195
+ import { registerBlockType } from "@wordpress/blocks"
196
+ import metadata from "./block.json"
197
+ import { icon } from "./icon"
198
+
199
+ const ALLOWED_INNER_BLOCKS = [
200
+ "my-tenant/basic-button",
201
+ "my-tenant/basic-heading",
202
+ "my-tenant/basic-overline",
203
+ "my-tenant/button-group",
204
+ "core/heading",
205
+ "core/list",
206
+ "core/paragraph",
207
+ ]
208
+
209
+ const config = createTextAndMediaGroupBlock({
210
+ name: metadata.name,
211
+ parent: metadata.parent as string[],
212
+ allowedBlocks: ALLOWED_INNER_BLOCKS,
213
+ icon: { src: icon },
214
+ })
215
+
216
+ registerBlockType(config.name as string, config)
217
+ ```
218
+
219
+ ---
220
+
221
+ ## Components (direct use)
222
+
223
+ When building custom factory blocks, components can be imported directly:
224
+
225
+ ```tsx
226
+ import { IconControl, ImagePickerBody, ImagePickerControl, useMediaUrl } from "@brilo/base-blocks"
227
+
228
+ // ImagePickerControl — sidebar panel with upload + select
229
+ <ImagePickerControl
230
+ value={attributes.img}
231
+ onChange={(val) => setAttributes({ img: val })}
232
+ labels={{ title: "Obrázek", button: "Vybrat" }}
233
+ />
234
+
235
+ // ImagePickerBody — renders the image in the editor canvas
236
+ <ImagePickerBody value={attributes.img} />
237
+
238
+ // useMediaUrl — resolve media ID → URL
239
+ const url = useMediaUrl(attributes.img.id)
240
+
241
+ // IconControl — grid of SVG icon selectors
242
+ <IconControl
243
+ selected={attributes.icon.src}
244
+ icons={ICONS}
245
+ iconsSrc={ICONS_SRC}
246
+ onChange={(src) => setAttributes({ icon: { ...attributes.icon, src } })}
247
+ />
248
+ ```
249
+
250
+ ---
251
+
252
+ ## Tenant SCSS override
253
+
254
+ Base styles live in `@layer base`. Override in `@layer tenant` — no specificity fight needed:
255
+
256
+ ```scss
257
+ // tenant/src/blocks/groups/usp-group/editor.scss
258
+ @layer tenant {
259
+ .g-usp {
260
+ gap: 2rem; // overrides base gap
261
+ }
262
+ }
263
+ ```
package/biome.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
3
+ "linter": {
4
+ "enabled": true,
5
+ "rules": {
6
+ "recommended": true,
7
+ "suspicious": {
8
+ "noExplicitAny": "warn",
9
+ "useIterableCallbackReturn": "off"
10
+ }
11
+ }
12
+ },
13
+ "formatter": {
14
+ "enabled": true,
15
+ "indentStyle": "space",
16
+ "indentWidth": 2,
17
+ "lineWidth": 140
18
+ },
19
+ "javascript": {
20
+ "formatter": {
21
+ "quoteStyle": "single",
22
+ "semicolons": "asNeeded",
23
+ "trailingCommas": "all",
24
+ "bracketSpacing": false
25
+ }
26
+ },
27
+ "files": {
28
+ "includes": ["**", "!build", "!node_modules"]
29
+ },
30
+ "assist": {
31
+ "enabled": true,
32
+ "actions": {
33
+ "source": {
34
+ "organizeImports": "on"
35
+ }
36
+ }
37
+ }
38
+ }