@brilo/base-blocks 0.1.58 → 0.1.61

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 (255) hide show
  1. package/build/.tsbuildinfo +1 -1
  2. package/build/blocks/anchor/anchor-group/icon.js +1 -1
  3. package/build/blocks/career/career-benefits/icon.js +1 -1
  4. package/build/blocks/career/career-header/icon.js +1 -1
  5. package/build/blocks/career/job-position-group/icon.js +1 -1
  6. package/build/blocks/column/column-item/edit.d.ts.map +1 -1
  7. package/build/blocks/column/column-item/index.d.ts.map +1 -1
  8. package/build/blocks/column/column-item/index.js +1 -0
  9. package/build/blocks/compare/compare-option/edit.d.ts +1 -1
  10. package/build/blocks/compare/compare-option/edit.d.ts.map +1 -1
  11. package/build/blocks/compare/compare-option/edit.js +1 -1
  12. package/build/blocks/contact/contact-item/factory.d.ts.map +1 -1
  13. package/build/blocks/document/documents-grid/icon.js +1 -1
  14. package/build/blocks/event/event-detail-content/icon.js +1 -1
  15. package/build/blocks/event/event-detail-header/icon.js +1 -1
  16. package/build/blocks/event/event-list-group/icon.js +1 -1
  17. package/build/blocks/faq/faq-item/edit.d.ts.map +1 -1
  18. package/build/blocks/faq/faq-item/edit.js +2 -2
  19. package/build/blocks/food-menu/food-menu-group/FoodMenuPreview.d.ts.map +1 -1
  20. package/build/blocks/food-menu/food-menu-group/FoodMenuPreview.js +36 -6
  21. package/build/blocks/food-menu/food-menu-group/constants.d.ts +51 -3
  22. package/build/blocks/food-menu/food-menu-group/constants.d.ts.map +1 -1
  23. package/build/blocks/food-menu/food-menu-group/constants.js +32 -6
  24. package/build/blocks/food-menu/food-menu-group/edit.d.ts.map +1 -1
  25. package/build/blocks/food-menu/food-menu-group/edit.js +61 -2
  26. package/build/blocks/food-menu/food-menu-group/factory.d.ts.map +1 -1
  27. package/build/blocks/food-menu/food-menu-group/factory.js +77 -45
  28. package/build/blocks/food-menu/food-menu-group/index.d.ts +1 -1
  29. package/build/blocks/food-menu/food-menu-group/index.d.ts.map +1 -1
  30. package/build/blocks/food-menu/food-menu-group/types.d.ts +12 -5
  31. package/build/blocks/food-menu/food-menu-group/types.d.ts.map +1 -1
  32. package/build/blocks/food-menu/food-reservation/edit.d.ts +7 -0
  33. package/build/blocks/food-menu/food-reservation/edit.d.ts.map +1 -0
  34. package/build/blocks/food-menu/food-reservation/edit.js +69 -0
  35. package/build/blocks/food-menu/food-reservation/factory.d.ts +4 -0
  36. package/build/blocks/food-menu/food-reservation/factory.d.ts.map +1 -0
  37. package/build/blocks/food-menu/food-reservation/factory.js +24 -0
  38. package/build/blocks/food-menu/food-reservation/icon.d.ts +2 -0
  39. package/build/blocks/food-menu/food-reservation/icon.d.ts.map +1 -0
  40. package/build/blocks/food-menu/food-reservation/icon.js +2 -0
  41. package/build/blocks/food-menu/food-reservation/index.d.ts +5 -0
  42. package/build/blocks/food-menu/food-reservation/index.d.ts.map +1 -0
  43. package/build/blocks/food-menu/food-reservation/index.js +6 -0
  44. package/build/blocks/food-menu/food-reservation/types.d.ts +7 -0
  45. package/build/blocks/food-menu/food-reservation/types.d.ts.map +1 -0
  46. package/build/blocks/food-menu/food-reservation/types.js +1 -0
  47. package/build/blocks/form/form-field/types.d.ts +1 -1
  48. package/build/blocks/form/form-field/types.d.ts.map +1 -1
  49. package/build/blocks/form/form-group/index.js +1 -1
  50. package/build/blocks/gallery/gallery-group/constants.d.ts +1 -19
  51. package/build/blocks/gallery/gallery-group/constants.d.ts.map +1 -1
  52. package/build/blocks/gallery/gallery-group/constants.js +1 -8
  53. package/build/blocks/gallery/gallery-group/edit.d.ts.map +1 -1
  54. package/build/blocks/gallery/gallery-group/edit.js +3 -19
  55. package/build/blocks/gallery/gallery-item/index.js +1 -1
  56. package/build/blocks/gallery/gallery-strip-group/constants.d.ts +34 -0
  57. package/build/blocks/gallery/gallery-strip-group/constants.d.ts.map +1 -0
  58. package/build/blocks/gallery/gallery-strip-group/constants.js +17 -0
  59. package/build/blocks/gallery/gallery-strip-group/edit.d.ts +7 -0
  60. package/build/blocks/gallery/gallery-strip-group/edit.d.ts.map +1 -0
  61. package/build/blocks/gallery/gallery-strip-group/edit.js +34 -0
  62. package/build/blocks/gallery/gallery-strip-group/factory.d.ts +5 -0
  63. package/build/blocks/gallery/gallery-strip-group/factory.d.ts.map +1 -0
  64. package/build/blocks/gallery/gallery-strip-group/factory.js +28 -0
  65. package/build/blocks/gallery/gallery-strip-group/index.d.ts +5 -0
  66. package/build/blocks/gallery/gallery-strip-group/index.d.ts.map +1 -0
  67. package/build/blocks/gallery/gallery-strip-group/index.js +7 -0
  68. package/build/blocks/gallery/gallery-strip-group/types.d.ts +18 -0
  69. package/build/blocks/gallery/gallery-strip-group/types.d.ts.map +1 -0
  70. package/build/blocks/gallery/gallery-strip-group/types.js +1 -0
  71. package/build/blocks/groups/banner-group/icon.js +1 -1
  72. package/build/blocks/groups/content-group/icon.js +1 -1
  73. package/build/blocks/groups/text-and-media-group/index.d.ts.map +1 -1
  74. package/build/blocks/groups/text-and-media-group/index.js +2 -0
  75. package/build/blocks/hero/hero-group/edit.js +1 -1
  76. package/build/blocks/hero/hero-group/icon.js +1 -1
  77. package/build/blocks/hero/hero-group/types.d.ts +1 -1
  78. package/build/blocks/hero/hero-group/types.d.ts.map +1 -1
  79. package/build/blocks/hero/hero-item/edit.js +1 -1
  80. package/build/blocks/hero/hero-item/index.js +1 -1
  81. package/build/blocks/layout/box/icon.js +1 -1
  82. package/build/blocks/layout/layout-aside/edit.d.ts +1 -2
  83. package/build/blocks/layout/layout-aside/edit.d.ts.map +1 -1
  84. package/build/blocks/layout/layout-aside/edit.js +1 -1
  85. package/build/blocks/layout/layout-aside/factory.d.ts.map +1 -1
  86. package/build/blocks/layout/layout-aside/icon.d.ts +1 -2
  87. package/build/blocks/layout/layout-aside/icon.d.ts.map +1 -1
  88. package/build/blocks/layout/layout-aside/icon.js +1 -1
  89. package/build/blocks/layout/layout-content/edit.d.ts +1 -2
  90. package/build/blocks/layout/layout-content/edit.d.ts.map +1 -1
  91. package/build/blocks/layout/layout-content/edit.js +1 -1
  92. package/build/blocks/layout/layout-content/factory.d.ts.map +1 -1
  93. package/build/blocks/layout/layout-content/icon.d.ts +1 -2
  94. package/build/blocks/layout/layout-content/icon.d.ts.map +1 -1
  95. package/build/blocks/layout/layout-content/icon.js +1 -1
  96. package/build/blocks/layout/layout-content-w-aside/edit.d.ts +1 -2
  97. package/build/blocks/layout/layout-content-w-aside/edit.d.ts.map +1 -1
  98. package/build/blocks/layout/layout-content-w-aside/factory.d.ts.map +1 -1
  99. package/build/blocks/layout/layout-content-w-aside/icon.d.ts +1 -2
  100. package/build/blocks/layout/layout-content-w-aside/icon.d.ts.map +1 -1
  101. package/build/blocks/layout/layout-content-w-aside/icon.js +1 -1
  102. package/build/blocks/link/link-item/icon.js +1 -1
  103. package/build/blocks/map/map-group/edit.d.ts.map +1 -1
  104. package/build/blocks/map/map-group/edit.js +1 -1
  105. package/build/blocks/map/map-group/factory.d.ts.map +1 -1
  106. package/build/blocks/map/map-group/types.d.ts.map +1 -1
  107. package/build/blocks/newsletter/newsletter-form/edit.d.ts.map +1 -1
  108. package/build/blocks/newsletter/newsletter-form/edit.js +2 -1
  109. package/build/blocks/person/person-group/icon.js +1 -1
  110. package/build/blocks/person/person-item/constants.d.ts.map +1 -1
  111. package/build/blocks/post/post-content/icon.js +1 -1
  112. package/build/blocks/post/post-content/types.d.ts.map +1 -1
  113. package/build/blocks/post/post-slider-group/icon.js +1 -1
  114. package/build/blocks/post/posts-grid/icon.js +1 -1
  115. package/build/blocks/review/review-summary-item/constants.d.ts +3 -0
  116. package/build/blocks/review/review-summary-item/constants.d.ts.map +1 -0
  117. package/build/blocks/review/review-summary-item/constants.js +2 -0
  118. package/build/blocks/review/review-summary-item/edit.d.ts +6 -0
  119. package/build/blocks/review/review-summary-item/edit.d.ts.map +1 -0
  120. package/build/blocks/review/review-summary-item/edit.js +17 -0
  121. package/build/blocks/review/review-summary-item/factory.d.ts +5 -0
  122. package/build/blocks/review/review-summary-item/factory.d.ts.map +1 -0
  123. package/build/blocks/review/review-summary-item/factory.js +23 -0
  124. package/build/blocks/review/review-summary-item/index.d.ts +5 -0
  125. package/build/blocks/review/review-summary-item/index.d.ts.map +1 -0
  126. package/build/blocks/review/review-summary-item/index.js +5 -0
  127. package/build/blocks/review/review-summary-item/types.d.ts +11 -0
  128. package/build/blocks/review/review-summary-item/types.d.ts.map +1 -0
  129. package/build/blocks/review/review-summary-item/types.js +1 -0
  130. package/build/blocks/share/share/icon.js +1 -1
  131. package/build/blocks/signpost/signpost-group/icon.js +1 -1
  132. package/build/blocks/step/step-group/factory.d.ts.map +1 -1
  133. package/build/blocks/step/step-group/icon.js +1 -1
  134. package/build/blocks/testimonial/testimonial-group/icon.js +1 -1
  135. package/build/blocks/urgency/urgency-item/constants.d.ts +56 -0
  136. package/build/blocks/urgency/urgency-item/constants.d.ts.map +1 -0
  137. package/build/blocks/urgency/urgency-item/constants.js +32 -0
  138. package/build/blocks/urgency/urgency-item/edit.d.ts +7 -0
  139. package/build/blocks/urgency/urgency-item/edit.d.ts.map +1 -0
  140. package/build/blocks/urgency/urgency-item/edit.js +83 -0
  141. package/build/blocks/urgency/urgency-item/factory.d.ts +5 -0
  142. package/build/blocks/urgency/urgency-item/factory.d.ts.map +1 -0
  143. package/build/blocks/urgency/urgency-item/factory.js +31 -0
  144. package/build/blocks/urgency/urgency-item/index.d.ts +5 -0
  145. package/build/blocks/urgency/urgency-item/index.d.ts.map +1 -0
  146. package/build/blocks/urgency/urgency-item/index.js +5 -0
  147. package/build/blocks/urgency/urgency-item/types.d.ts +22 -0
  148. package/build/blocks/urgency/urgency-item/types.d.ts.map +1 -0
  149. package/build/blocks/urgency/urgency-item/types.js +1 -0
  150. package/build/components/GalleryImagesAppender/index.d.ts +5 -0
  151. package/build/components/GalleryImagesAppender/index.d.ts.map +1 -0
  152. package/build/components/GalleryImagesAppender/index.js +12 -0
  153. package/build/components/ImagePicker/ImagePicker.d.ts.map +1 -1
  154. package/build/components/ImagePicker/ImagePicker.js +1 -5
  155. package/build/constants.d.ts +19 -0
  156. package/build/constants.d.ts.map +1 -1
  157. package/build/constants.js +8 -0
  158. package/build/hooks/useGroupBlock.d.ts.map +1 -1
  159. package/build/hooks/useGroupBlock.js +10 -3
  160. package/build/index.d.ts +8 -0
  161. package/build/index.d.ts.map +1 -1
  162. package/build/index.js +4 -0
  163. package/package.json +4 -3
  164. package/src/blocks/anchor/anchor-group/icon.tsx +1 -1
  165. package/src/blocks/career/career-benefits/icon.tsx +1 -1
  166. package/src/blocks/career/career-header/icon.tsx +1 -1
  167. package/src/blocks/career/job-position-group/icon.tsx +1 -1
  168. package/src/blocks/column/column-item/edit.tsx +0 -1
  169. package/src/blocks/column/column-item/index.ts +1 -0
  170. package/src/blocks/compare/compare-option/edit.tsx +1 -1
  171. package/src/blocks/contact/contact-item/factory.tsx +1 -2
  172. package/src/blocks/document/documents-grid/icon.tsx +1 -1
  173. package/src/blocks/event/event-detail-content/icon.tsx +1 -1
  174. package/src/blocks/event/event-detail-header/icon.tsx +1 -1
  175. package/src/blocks/event/event-list-group/icon.tsx +1 -1
  176. package/src/blocks/faq/faq-item/edit.tsx +23 -25
  177. package/src/blocks/food-menu/food-menu-group/FoodMenuPreview.tsx +58 -9
  178. package/src/blocks/food-menu/food-menu-group/constants.ts +37 -6
  179. package/src/blocks/food-menu/food-menu-group/edit.tsx +116 -20
  180. package/src/blocks/food-menu/food-menu-group/editor.scss +35 -6
  181. package/src/blocks/food-menu/food-menu-group/factory.tsx +77 -39
  182. package/src/blocks/food-menu/food-menu-group/index.ts +2 -0
  183. package/src/blocks/food-menu/food-menu-group/types.ts +18 -5
  184. package/src/blocks/food-menu/food-reservation/edit.tsx +179 -0
  185. package/src/blocks/food-menu/food-reservation/factory.tsx +28 -0
  186. package/src/blocks/food-menu/food-reservation/icon.tsx +9 -0
  187. package/src/blocks/food-menu/food-reservation/index.ts +10 -0
  188. package/src/blocks/food-menu/food-reservation/types.ts +8 -0
  189. package/src/blocks/form/form-field/types.ts +1 -7
  190. package/src/blocks/form/form-group/index.ts +1 -1
  191. package/src/blocks/gallery/gallery-group/constants.ts +1 -8
  192. package/src/blocks/gallery/gallery-group/edit.tsx +3 -39
  193. package/src/blocks/gallery/gallery-group/editor.scss +0 -12
  194. package/src/blocks/gallery/gallery-item/index.ts +1 -1
  195. package/src/blocks/gallery/gallery-strip-group/constants.ts +22 -0
  196. package/src/blocks/gallery/gallery-strip-group/edit.tsx +112 -0
  197. package/src/blocks/gallery/gallery-strip-group/editor.scss +36 -0
  198. package/src/blocks/gallery/gallery-strip-group/factory.tsx +32 -0
  199. package/src/blocks/gallery/gallery-strip-group/index.ts +11 -0
  200. package/src/blocks/gallery/gallery-strip-group/types.ts +20 -0
  201. package/src/blocks/groups/banner-group/edit.tsx +1 -1
  202. package/src/blocks/groups/banner-group/icon.tsx +1 -1
  203. package/src/blocks/groups/content-group/icon.tsx +1 -1
  204. package/src/blocks/groups/text-and-media-group/index.ts +2 -0
  205. package/src/blocks/hero/hero-group/edit.tsx +3 -3
  206. package/src/blocks/hero/hero-group/icon.tsx +1 -1
  207. package/src/blocks/hero/hero-group/types.ts +1 -1
  208. package/src/blocks/hero/hero-item/edit.tsx +5 -5
  209. package/src/blocks/hero/hero-item/index.ts +1 -1
  210. package/src/blocks/layout/box/icon.tsx +1 -1
  211. package/src/blocks/layout/layout-aside/edit.tsx +2 -3
  212. package/src/blocks/layout/layout-aside/factory.tsx +0 -1
  213. package/src/blocks/layout/layout-aside/icon.tsx +1 -3
  214. package/src/blocks/layout/layout-content/edit.tsx +2 -3
  215. package/src/blocks/layout/layout-content/factory.tsx +0 -1
  216. package/src/blocks/layout/layout-content/icon.tsx +1 -3
  217. package/src/blocks/layout/layout-content-w-aside/edit.tsx +0 -1
  218. package/src/blocks/layout/layout-content-w-aside/factory.tsx +0 -1
  219. package/src/blocks/layout/layout-content-w-aside/icon.tsx +1 -3
  220. package/src/blocks/link/link-item/icon.tsx +1 -1
  221. package/src/blocks/map/map-group/edit.tsx +8 -3
  222. package/src/blocks/map/map-group/factory.tsx +1 -1
  223. package/src/blocks/map/map-group/types.ts +1 -1
  224. package/src/blocks/newsletter/newsletter-form/edit.tsx +5 -2
  225. package/src/blocks/person/person-group/icon.tsx +1 -1
  226. package/src/blocks/person/person-item/constants.ts +1 -1
  227. package/src/blocks/post/post-content/icon.tsx +1 -1
  228. package/src/blocks/post/post-content/types.ts +0 -1
  229. package/src/blocks/post/post-slider-group/icon.tsx +1 -1
  230. package/src/blocks/post/posts-grid/icon.tsx +1 -1
  231. package/src/blocks/review/review-summary-item/constants.ts +2 -0
  232. package/src/blocks/review/review-summary-item/edit.tsx +86 -0
  233. package/src/blocks/review/review-summary-item/editor.scss +44 -0
  234. package/src/blocks/review/review-summary-item/factory.tsx +27 -0
  235. package/src/blocks/review/review-summary-item/index.ts +9 -0
  236. package/src/blocks/review/review-summary-item/types.ts +11 -0
  237. package/src/blocks/share/share/icon.tsx +1 -1
  238. package/src/blocks/signpost/signpost-group/icon.tsx +1 -1
  239. package/src/blocks/step/step-group/factory.tsx +1 -1
  240. package/src/blocks/step/step-group/icon.tsx +1 -1
  241. package/src/blocks/testimonial/testimonial-group/icon.tsx +1 -1
  242. package/src/blocks/urgency/urgency-item/constants.ts +39 -0
  243. package/src/blocks/urgency/urgency-item/edit.tsx +319 -0
  244. package/src/blocks/urgency/urgency-item/editor.scss +99 -0
  245. package/src/blocks/urgency/urgency-item/factory.tsx +36 -0
  246. package/src/blocks/urgency/urgency-item/index.ts +9 -0
  247. package/src/blocks/urgency/urgency-item/types.ts +23 -0
  248. package/src/components/GalleryImagesAppender/editor.scss +15 -0
  249. package/src/components/GalleryImagesAppender/index.tsx +29 -0
  250. package/src/components/ImagePicker/ImagePicker.tsx +6 -6
  251. package/src/components/ItemIconControl/types.d.ts +0 -1
  252. package/src/constants.ts +9 -0
  253. package/src/editor.scss +4 -0
  254. package/src/hooks/useGroupBlock.ts +10 -2
  255. package/src/index.ts +8 -0
@@ -34,6 +34,14 @@ $warn: #9a6700;
34
34
  padding: 10px 0 14px;
35
35
  }
36
36
 
37
+ // The block's own style (see `previewStyle`) overrides the admin palette
38
+ // through these properties; unset, the card looks as before.
39
+ .brilo-food-menu-preview__card {
40
+ color: var(--food-menu-preview-text, $fg);
41
+ border-radius: 4px;
42
+ box-shadow: var(--food-menu-preview-shadow, none);
43
+ }
44
+
37
45
  .brilo-food-menu-preview__head {
38
46
  display: flex;
39
47
  flex-wrap: wrap;
@@ -41,8 +49,8 @@ $warn: #9a6700;
41
49
  align-items: center;
42
50
  justify-content: space-between;
43
51
  padding: 10px 14px;
44
- background: $surface;
45
- border: 1px solid $line;
52
+ background: var(--food-menu-preview-background, $surface);
53
+ border: 1px solid var(--food-menu-preview-border, $line);
46
54
  border-bottom: 0;
47
55
  border-radius: 4px 4px 0 0;
48
56
  }
@@ -105,7 +113,8 @@ $warn: #9a6700;
105
113
  }
106
114
 
107
115
  .brilo-food-menu-preview__body {
108
- border: 1px solid $line;
116
+ background: var(--food-menu-preview-background, transparent);
117
+ border: 1px solid var(--food-menu-preview-border, $line);
109
118
  border-radius: 0 0 4px 4px;
110
119
  }
111
120
 
@@ -164,9 +173,29 @@ $warn: #9a6700;
164
173
  }
165
174
  }
166
175
 
176
+ // Paired half sections of a standing lístek, side by side as on the page.
177
+ .brilo-food-menu-preview__sections--split {
178
+ display: grid;
179
+ grid-template-columns: repeat(2, minmax(0, 1fr));
180
+
181
+ .brilo-food-menu-preview__section:not(.brilo-food-menu-preview__section--half) {
182
+ grid-column: 1 / -1;
183
+ }
184
+
185
+ .brilo-food-menu-preview__section--half:not(.brilo-food-menu-preview__section--first-half) {
186
+ border-left: 1px solid var(--food-menu-preview-border, $line);
187
+ }
188
+
189
+ // A pair opening the lístek has no line above either half.
190
+ .brilo-food-menu-preview__section--first-half:first-child + .brilo-food-menu-preview__section--half {
191
+ border-top: 0;
192
+ }
193
+ }
194
+
167
195
  .brilo-food-menu-preview__section-title {
168
196
  margin: 0 0 4px;
169
- color: $muted;
197
+ color: var(--food-menu-preview-text, $muted);
198
+ text-align: var(--food-menu-preview-align, center);
170
199
  font-weight: 600;
171
200
  font-size: 11px;
172
201
  letter-spacing: 0.08em;
@@ -234,8 +263,8 @@ $warn: #9a6700;
234
263
  padding: 8px 14px;
235
264
  color: $muted;
236
265
  font-size: 12px;
237
- background: $surface;
238
- border-top: 1px solid $line;
266
+ background: var(--food-menu-preview-background, $surface);
267
+ border-top: 1px solid var(--food-menu-preview-border, $line);
239
268
  border-radius: 0 0 4px 4px;
240
269
  }
241
270
 
@@ -1,5 +1,7 @@
1
1
  import type {BlockConfiguration} from '@wordpress/blocks'
2
2
  import {__} from '@wordpress/i18n'
3
+ import {DEFAULT_SURFACE_SHADOWS, surfaceStyleAttribute} from '~/components/SurfaceStyleControl'
4
+ import {withObjectDefaults} from '~/utils/withObjectDefaults'
3
5
  import {
4
6
  FOOD_MENU_GROUP_EMPTY_BEHAVIOUR,
5
7
  FOOD_MENU_GROUP_EMPTY_BEHAVIOURS,
@@ -7,12 +9,65 @@ import {
7
9
  FOOD_MENU_GROUP_LAYOUTS,
8
10
  FOOD_MENU_GROUP_MODE,
9
11
  FOOD_MENU_GROUP_MODES,
12
+ FOOD_MENU_GROUP_RESERVATION_MODE,
13
+ FOOD_MENU_GROUP_RESERVATION_MODES,
14
+ FOOD_MENU_GROUP_TEXT_ALIGN,
15
+ FOOD_MENU_GROUP_TEXT_ALIGNS,
10
16
  } from './constants'
11
17
  import {createFoodMenuGroupEdit} from './edit'
12
18
  import {icon as defaultIcon} from './icon'
13
19
  import type {FoodMenuGroupAttributes, FoodMenuGroupOptions} from './types'
14
20
 
15
21
  export function createFoodMenuGroupBlock(options: FoodMenuGroupOptions): BlockConfiguration<FoodMenuGroupAttributes> {
22
+ const attributes = {
23
+ mode: {
24
+ type: 'string',
25
+ default: FOOD_MENU_GROUP_MODE,
26
+ enum: FOOD_MENU_GROUP_MODES.map((option) => option.value),
27
+ },
28
+ layout: {
29
+ type: 'string',
30
+ default: FOOD_MENU_GROUP_LAYOUT,
31
+ enum: FOOD_MENU_GROUP_LAYOUTS.map((option) => option.value),
32
+ },
33
+ menuIds: {
34
+ type: 'array',
35
+ default: [],
36
+ items: {type: 'number'},
37
+ },
38
+ showPrices: {
39
+ type: 'boolean',
40
+ default: true,
41
+ },
42
+ showAllergens: {
43
+ type: 'boolean',
44
+ default: true,
45
+ },
46
+ reservationMode: {
47
+ type: 'string',
48
+ default: FOOD_MENU_GROUP_RESERVATION_MODE,
49
+ enum: FOOD_MENU_GROUP_RESERVATION_MODES.map((option) => option.value),
50
+ },
51
+ emptyBehaviour: {
52
+ type: 'string',
53
+ default: FOOD_MENU_GROUP_EMPTY_BEHAVIOUR,
54
+ enum: FOOD_MENU_GROUP_EMPTY_BEHAVIOURS.map((option) => option.value),
55
+ },
56
+ // Empty means "use the wording the server picks for this mode".
57
+ emptyText: {
58
+ type: 'string',
59
+ default: '',
60
+ },
61
+ style: surfaceStyleAttribute(options.shadows ?? DEFAULT_SURFACE_SHADOWS),
62
+ textAlign: {
63
+ type: 'string',
64
+ default: FOOD_MENU_GROUP_TEXT_ALIGN,
65
+ enum: FOOD_MENU_GROUP_TEXT_ALIGNS.map((align) => align.value),
66
+ },
67
+ }
68
+
69
+ const {reservationMode: _reservationMode, ...withoutReservationMode} = attributes
70
+
16
71
  return {
17
72
  name: options.name,
18
73
  title: options.title ?? __('Jídelní lístek', 'brilo-blocks'),
@@ -21,46 +76,29 @@ export function createFoodMenuGroupBlock(options: FoodMenuGroupOptions): BlockCo
21
76
  ...(options.parent && {parent: options.parent}),
22
77
  icon: options.icon ?? {src: defaultIcon},
23
78
  supports: {html: false, customClassName: false},
24
- attributes: {
25
- mode: {
26
- type: 'string',
27
- default: FOOD_MENU_GROUP_MODE,
28
- enum: [...FOOD_MENU_GROUP_MODES],
29
- },
30
- layout: {
31
- type: 'string',
32
- default: FOOD_MENU_GROUP_LAYOUT,
33
- enum: [...FOOD_MENU_GROUP_LAYOUTS],
34
- },
35
- menuIds: {
36
- type: 'array',
37
- default: [],
38
- items: {type: 'number'},
39
- },
40
- showPrices: {
41
- type: 'boolean',
42
- default: true,
43
- },
44
- showAllergens: {
45
- type: 'boolean',
46
- default: true,
79
+ attributes,
80
+ // The on/off "Umožnit rezervaci obědu" toggle became a three-way choice.
81
+ // A dynamic block is always valid, so the migration opts in through
82
+ // `isEligible`, which sees the raw comment attributes. Blocks that never
83
+ // stored the toggle had it on, which is the new default too.
84
+ deprecated: [
85
+ {
86
+ attributes: {
87
+ ...withoutReservationMode,
88
+ showReservation: {
89
+ type: 'boolean',
90
+ default: true,
91
+ },
92
+ },
93
+ isEligible: (raw: Record<string, unknown>) => 'showReservation' in raw && !('reservationMode' in raw),
94
+ migrate: ({showReservation, ...rest}: Record<string, unknown>) => ({
95
+ ...rest,
96
+ reservationMode: false === showReservation ? 'off' : 'modal',
97
+ }),
98
+ save: () => null,
47
99
  },
48
- showReservation: {
49
- type: 'boolean',
50
- default: true,
51
- },
52
- emptyBehaviour: {
53
- type: 'string',
54
- default: FOOD_MENU_GROUP_EMPTY_BEHAVIOUR,
55
- enum: [...FOOD_MENU_GROUP_EMPTY_BEHAVIOURS],
56
- },
57
- // Empty means "use the wording the server picks for this mode".
58
- emptyText: {
59
- type: 'string',
60
- default: '',
61
- },
62
- },
63
- edit: createFoodMenuGroupEdit(options),
100
+ ],
101
+ edit: withObjectDefaults(createFoodMenuGroupEdit(options)),
64
102
  save: () => null,
65
103
  } as unknown as BlockConfiguration<FoodMenuGroupAttributes>
66
104
  }
@@ -4,6 +4,8 @@ export type {
4
4
  FoodMenuGroupLayout,
5
5
  FoodMenuGroupMode,
6
6
  FoodMenuGroupOptions,
7
+ FoodMenuGroupReservationMode,
8
+ FoodMenuGroupTextAlign,
7
9
  } from './types'
8
10
  export {createFoodMenuGroupBlock} from './factory'
9
11
  export {FoodMenuSelectModal} from './FoodMenuSelectModal'
@@ -1,9 +1,18 @@
1
+ import type {SurfaceShadowOption, SurfaceStyle} from '~/components/SurfaceStyleControl'
1
2
  import type {BriloBlockType, SelectControlProps} from '~/types'
2
- import type {FOOD_MENU_GROUP_EMPTY_BEHAVIOURS, FOOD_MENU_GROUP_LAYOUTS, FOOD_MENU_GROUP_MODES} from './constants'
3
+ import type {
4
+ FOOD_MENU_GROUP_EMPTY_BEHAVIOURS,
5
+ FOOD_MENU_GROUP_LAYOUTS,
6
+ FOOD_MENU_GROUP_MODES,
7
+ FOOD_MENU_GROUP_RESERVATION_MODES,
8
+ FOOD_MENU_GROUP_TEXT_ALIGNS,
9
+ } from './constants'
3
10
 
4
- export type FoodMenuGroupMode = (typeof FOOD_MENU_GROUP_MODES)[number]
5
- export type FoodMenuGroupLayout = (typeof FOOD_MENU_GROUP_LAYOUTS)[number]
6
- export type FoodMenuGroupEmptyBehaviour = (typeof FOOD_MENU_GROUP_EMPTY_BEHAVIOURS)[number]
11
+ export type FoodMenuGroupMode = (typeof FOOD_MENU_GROUP_MODES)[number]['value']
12
+ export type FoodMenuGroupLayout = (typeof FOOD_MENU_GROUP_LAYOUTS)[number]['value']
13
+ export type FoodMenuGroupEmptyBehaviour = (typeof FOOD_MENU_GROUP_EMPTY_BEHAVIOURS)[number]['value']
14
+ export type FoodMenuGroupReservationMode = (typeof FOOD_MENU_GROUP_RESERVATION_MODES)[number]['value']
15
+ export type FoodMenuGroupTextAlign = (typeof FOOD_MENU_GROUP_TEXT_ALIGNS)[number]['value']
7
16
 
8
17
  export interface FoodMenuGroupAttributes extends Record<string, unknown> {
9
18
  mode: FoodMenuGroupMode
@@ -11,11 +20,15 @@ export interface FoodMenuGroupAttributes extends Record<string, unknown> {
11
20
  menuIds: number[]
12
21
  showPrices: boolean
13
22
  showAllergens: boolean
14
- showReservation: boolean
23
+ reservationMode: FoodMenuGroupReservationMode
15
24
  emptyBehaviour: FoodMenuGroupEmptyBehaviour
16
25
  emptyText: string
26
+ style: SurfaceStyle<string>
27
+ textAlign: FoodMenuGroupTextAlign
17
28
  }
18
29
 
19
30
  export interface FoodMenuGroupOptions extends BriloBlockType {
20
31
  renderMenusControl?: (props: SelectControlProps) => JSX.Element
32
+ /** Overrides the shared shadow presets — see `DEFAULT_SURFACE_SHADOWS`. */
33
+ shadows?: readonly SurfaceShadowOption[]
21
34
  }
@@ -0,0 +1,179 @@
1
+ import apiFetch from '@wordpress/api-fetch'
2
+ import {InspectorControls, useBlockProps} from '@wordpress/block-editor'
3
+ import {Button, ExternalLink, Notice, PanelBody, Spinner, TextareaControl} from '@wordpress/components'
4
+ import {__, sprintf} from '@wordpress/i18n'
5
+ import clsx from 'clsx'
6
+ import type React from 'react'
7
+ import {useEffect, useState} from 'react'
8
+ import {icon as reservationIcon} from './icon'
9
+ import type {FoodReservationAttributes, FoodReservationOptions} from './types'
10
+
11
+ type PreviewDay = {
12
+ menuId: number
13
+ date: string
14
+ label: string
15
+ deadline: string
16
+ }
17
+
18
+ type PreviewResponse = {
19
+ enabled: boolean
20
+ settingsUrl: string
21
+ anchor: string
22
+ days: PreviewDay[]
23
+ emptyMessage: string
24
+ }
25
+
26
+ // Shares the menu block's preview card styles (food-menu-group/editor.scss).
27
+ const BASE = 'brilo-food-menu-preview'
28
+
29
+ /**
30
+ * Which days the form would offer is decided on the server (deadlines,
31
+ * sold-out dishes, the site's time zone), so the preview asks the block's
32
+ * own endpoint. It describes the form instead of drawing it.
33
+ */
34
+ function useReservationPreview() {
35
+ const [data, setData] = useState<PreviewResponse | null>(null)
36
+ const [hasError, setHasError] = useState(false)
37
+ const [attempt, setAttempt] = useState(0)
38
+
39
+ // biome-ignore lint/correctness/useExhaustiveDependencies: attempt re-runs the effect on retry
40
+ useEffect(() => {
41
+ let cancelled = false
42
+ setHasError(false)
43
+
44
+ apiFetch<PreviewResponse>({path: '/brilo/v1/food-reservation/preview'})
45
+ .then((result) => {
46
+ if (!cancelled) {
47
+ setData(result)
48
+ }
49
+ })
50
+ .catch(() => {
51
+ if (!cancelled) {
52
+ setHasError(true)
53
+ }
54
+ })
55
+
56
+ return () => {
57
+ cancelled = true
58
+ }
59
+ }, [attempt])
60
+
61
+ return {data, hasError, retry: () => setAttempt((value) => value + 1)}
62
+ }
63
+
64
+ function DisabledNotice({settingsUrl}: {settingsUrl: string}) {
65
+ return (
66
+ <Notice status="warning" isDismissible={false}>
67
+ {__('Rezervace obědů jsou v nastavení modulu vypnuté, blok se na webu nezobrazí.', 'brilo-blocks')}{' '}
68
+ {settingsUrl && <ExternalLink href={settingsUrl}>{__('Nastavení jídelního lístku', 'brilo-blocks')}</ExternalLink>}
69
+ </Notice>
70
+ )
71
+ }
72
+
73
+ function PreviewCard({data, emptyText}: {data: PreviewResponse; emptyText: string}) {
74
+ const [first] = data.days
75
+
76
+ return (
77
+ <div className={`${BASE}__card`}>
78
+ <div className={`${BASE}__head`}>
79
+ <div className={`${BASE}__title`}>
80
+ {reservationIcon}
81
+ <span>{__('Rezervace obědu', 'brilo-blocks')}</span>
82
+ </div>
83
+
84
+ <div className={`${BASE}__meta`}>
85
+ <span className={clsx(`${BASE}__pill`, `${BASE}__pill--muted`)}>{`#${data.anchor}`}</span>
86
+ {first && <span className={clsx(`${BASE}__pill`, `${BASE}__pill--ok`)}>{__('Rezervace otevřené', 'brilo-blocks')}</span>}
87
+ </div>
88
+ </div>
89
+
90
+ <div className={`${BASE}__body`}>
91
+ {first ? (
92
+ <div className={`${BASE}__section`}>
93
+ <div className={`${BASE}__section-title`}>{__('Formulář nabídne dny', 'brilo-blocks')}</div>
94
+
95
+ {data.days.map((day, index) => (
96
+ <div className={clsx(`${BASE}__row`, `${BASE}__row--no-price`)} key={day.menuId}>
97
+ <span className={`${BASE}__unit`}>{0 === index ? __('výchozí', 'brilo-blocks') : ''}</span>
98
+ <span className={`${BASE}__name`}>
99
+ {day.label}
100
+ {day.deadline && <small className={`${BASE}__note`}>{sprintf(__('Uzávěrka: %s', 'brilo-blocks'), day.deadline)}</small>}
101
+ </span>
102
+ </div>
103
+ ))}
104
+ </div>
105
+ ) : (
106
+ <div className={`${BASE}__empty`}>
107
+ <div>
108
+ <b>{__('Teď není na který den rezervovat', 'brilo-blocks')}</b>
109
+ {sprintf(__('Na webu se ukáže věta „%s“', 'brilo-blocks'), emptyText.trim() || data.emptyMessage)}
110
+ </div>
111
+ </div>
112
+ )}
113
+
114
+ <div className={`${BASE}__foot`}>
115
+ <span>{sprintf(__('Odkaz se stránkou?menu=ID#%s předvybere den daného lístku.', 'brilo-blocks'), data.anchor)}</span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ )
120
+ }
121
+
122
+ export function createFoodReservationEdit(options: FoodReservationOptions) {
123
+ return function Edit({
124
+ attributes,
125
+ setAttributes,
126
+ }: {
127
+ attributes: FoodReservationAttributes
128
+ setAttributes: (a: Partial<FoodReservationAttributes>) => void
129
+ }) {
130
+ const {emptyText} = attributes
131
+ const blockProps = useBlockProps({className: clsx(options.blockClassName ?? 'g-food-reservation')})
132
+ const {data, hasError, retry} = useReservationPreview()
133
+
134
+ let content: React.ReactNode
135
+
136
+ if (hasError) {
137
+ content = (
138
+ <div className={`${BASE}__empty`}>
139
+ <div>
140
+ <b>{__('Náhled se nepodařilo načíst.', 'brilo-blocks')}</b>
141
+ <Button variant="secondary" size="small" className={`${BASE}__retry`} onClick={retry}>
142
+ {__('Zkusit znovu', 'brilo-blocks')}
143
+ </Button>
144
+ </div>
145
+ </div>
146
+ )
147
+ } else if (!data) {
148
+ content = <Spinner />
149
+ } else if (!data.enabled) {
150
+ content = <DisabledNotice settingsUrl={data.settingsUrl} />
151
+ } else {
152
+ content = <PreviewCard data={data} emptyText={emptyText} />
153
+ }
154
+
155
+ return (
156
+ <>
157
+ <InspectorControls>
158
+ <PanelBody title={__('Když není co rezervovat', 'brilo-blocks')}>
159
+ <TextareaControl
160
+ __nextHasNoMarginBottom
161
+ label={__('Vlastní text zprávy', 'brilo-blocks')}
162
+ help={__('Když zůstane prázdné, použije se výchozí věta.', 'brilo-blocks')}
163
+ rows={2}
164
+ value={emptyText}
165
+ onChange={(value) => setAttributes({emptyText: value})}
166
+ />
167
+ </PanelBody>
168
+ </InspectorControls>
169
+
170
+ <div {...blockProps}>
171
+ {/* Left-aligned headings: the menu block's centre default is about the menu, not this list. */}
172
+ <div className={BASE} style={{'--food-menu-preview-align': 'left'} as React.CSSProperties}>
173
+ {content}
174
+ </div>
175
+ </div>
176
+ </>
177
+ )
178
+ }
179
+ }
@@ -0,0 +1,28 @@
1
+ import type {BlockConfiguration} from '@wordpress/blocks'
2
+ import {__} from '@wordpress/i18n'
3
+ import {createFoodReservationEdit} from './edit'
4
+ import {icon as defaultIcon} from './icon'
5
+ import type {FoodReservationAttributes, FoodReservationOptions} from './types'
6
+
7
+ export function createFoodReservationBlock(options: FoodReservationOptions): BlockConfiguration<FoodReservationAttributes> {
8
+ return {
9
+ name: options.name,
10
+ title: options.title ?? __('Rezervace obědu', 'brilo-blocks'),
11
+ description:
12
+ options.description ??
13
+ __('Rezervační formulář přímo na stránce. Tlačítka „Rezervovat oběd“ na něj vedou přes kotvu #rezervace.', 'brilo-blocks'),
14
+ category: options.category ?? 'widgets',
15
+ ...(options.parent && {parent: options.parent}),
16
+ icon: options.icon ?? {src: defaultIcon},
17
+ // The anchor is fixed (`rezervace`), so the block takes no own HTML anchor.
18
+ supports: {html: false, customClassName: false, multiple: false},
19
+ attributes: {
20
+ emptyText: {
21
+ type: 'string',
22
+ default: '',
23
+ },
24
+ },
25
+ edit: createFoodReservationEdit(options),
26
+ save: () => null,
27
+ } as unknown as BlockConfiguration<FoodReservationAttributes>
28
+ }
@@ -0,0 +1,9 @@
1
+ export const icon = (
2
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Rezervace obědu">
3
+ <rect x="3" y="4" width="14" height="13" stroke="currentColor" fill="none" />
4
+ <line x1="3" y1="8" x2="17" y2="8" stroke="currentColor" />
5
+ <line x1="7" y1="2" x2="7" y2="6" stroke="currentColor" />
6
+ <line x1="13" y1="2" x2="13" y2="6" stroke="currentColor" />
7
+ <polyline points="7,12.5 9,14.5 13,10.5" stroke="currentColor" fill="none" />
8
+ </svg>
9
+ )
@@ -0,0 +1,10 @@
1
+ export type {FoodReservationAttributes, FoodReservationOptions} from './types'
2
+ export {createFoodReservationBlock} from './factory'
3
+
4
+ import type {FoodReservationOptions} from './types'
5
+
6
+ export const foodReservationDefaults: FoodReservationOptions = {
7
+ name: 'brilo/food-reservation',
8
+ // A section of its own, or a column next to the day's menu.
9
+ parent: ['brilo/base-section', 'brilo/column-item'],
10
+ }
@@ -0,0 +1,8 @@
1
+ import type {BriloBlockType} from '~/types'
2
+
3
+ export interface FoodReservationAttributes extends Record<string, unknown> {
4
+ /** Empty means "use the server's sentence". */
5
+ emptyText: string
6
+ }
7
+
8
+ export type FoodReservationOptions = BriloBlockType
@@ -1,10 +1,4 @@
1
- import {
2
- type FIELD_SELECT_MODE_VALUES,
3
- FIELD_TEXT_TYPES,
4
- type FIELD_TEXT_TYPE_VALUES,
5
- type FIELD_TYPE_VALUES,
6
- type FILE_BUTTON_VARIANT_VALUES,
7
- } from './constants'
1
+ import type {FIELD_SELECT_MODE_VALUES, FIELD_TEXT_TYPE_VALUES, FIELD_TYPE_VALUES, FILE_BUTTON_VARIANT_VALUES} from './constants'
8
2
  import type {BriloBlockType} from '~/types'
9
3
 
10
4
  export type FormFieldType = (typeof FIELD_TYPE_VALUES)[number]
@@ -12,7 +12,7 @@ import type {FormGroupOptions} from './types'
12
12
 
13
13
  export const formGroupDefaults: FormGroupOptions = {
14
14
  name: 'brilo/form-group',
15
- parent: ['brilo/base-section'],
15
+ parent: ['brilo/base-section', 'brilo/column-item', 'brilo/responsive-grid-item'],
16
16
  allowedBlocks: ['brilo/form-field'],
17
17
  template: [['brilo/form-field', {type: 'text'}]],
18
18
  }
@@ -1,10 +1,3 @@
1
1
  export const DEFAULT_COLUMNS = [2, 3, 4, 6] as const
2
2
 
3
- export const DEFAULT_RATIOS = [
4
- {value: '4:3', label: '4:3'},
5
- {value: '16:9', label: '16:9'},
6
- {value: '3:2', label: '3:2'},
7
- {value: '1:1', label: '1:1'},
8
- {value: '2:1', label: '2:1'},
9
- {value: '3:4', label: '3:4'},
10
- ] as const
3
+ export {GALLERY_RATIOS as DEFAULT_RATIOS} from '~/constants'
@@ -1,4 +1,4 @@
1
- import {InspectorControls, MediaUpload} from '@wordpress/block-editor'
1
+ import {InspectorControls} from '@wordpress/block-editor'
2
2
  import {
3
3
  PanelBody,
4
4
  TextControl,
@@ -6,19 +6,13 @@ import {
6
6
  __experimentalToggleGroupControlOption as ToggleGroupControlOption,
7
7
  } from '@wordpress/components'
8
8
  import {__} from '@wordpress/i18n'
9
- import {useDispatch} from '@wordpress/data'
10
- import {createBlock} from '@wordpress/blocks'
11
9
  import clsx from 'clsx'
10
+ import {GalleryImagesAppender} from '~/components/GalleryImagesAppender'
12
11
  import {ItemSpacingPanel, itemSpacingStyle} from '~/components/ItemSpacingControl'
13
12
  import {useGroupBlock} from '~/hooks/useGroupBlock'
14
13
  import {DEFAULT_COLUMNS, DEFAULT_RATIOS} from './constants'
15
14
  import type {GalleryGroupAttributes, GalleryGroupOptions, GalleryRatio} from './types'
16
15
 
17
- type Media = {
18
- id: number
19
- url: string
20
- }
21
-
22
16
  export function createGalleryGroupEdit(options: GalleryGroupOptions) {
23
17
  const COLUMNS = options.columns ?? DEFAULT_COLUMNS
24
18
  const RATIOS = options.ratios ?? DEFAULT_RATIOS
@@ -33,36 +27,6 @@ export function createGalleryGroupEdit(options: GalleryGroupOptions) {
33
27
  clientId: string
34
28
  }) {
35
29
  const {columns, ratio, galleryId, spacing} = attributes
36
- const {insertBlock} = useDispatch('core/block-editor')
37
-
38
- const addNewBlock = (imageId: number) => {
39
- const newBlock = createBlock(options.allowedBlocks[0], {
40
- img: {
41
- id: imageId,
42
- },
43
- })
44
-
45
- insertBlock(newBlock, undefined, clientId)
46
- }
47
-
48
- const onSelectImages = (media: Media[]) => {
49
- media.forEach((item) => addNewBlock(item.id))
50
- }
51
-
52
- const CustomAppender = () => {
53
- return (
54
- <MediaUpload
55
- onSelect={onSelectImages}
56
- multiple="add"
57
- allowedTypes={['image']}
58
- render={({open}) => (
59
- <div onClick={open} className="g-gallery__appender">
60
- {__('Přidat obrázky', 'brilo-blocks')}
61
- </div>
62
- )}
63
- />
64
- )
65
- }
66
30
 
67
31
  const {blockProps, innerBlocksProps} = useGroupBlock({
68
32
  blockClassName: clsx(options.blockClassName ?? 'g-gallery wp-block-section'),
@@ -73,7 +37,7 @@ export function createGalleryGroupEdit(options: GalleryGroupOptions) {
73
37
  ...itemSpacingStyle(spacing),
74
38
  },
75
39
  allowedBlocks: options.allowedBlocks,
76
- renderAppender: CustomAppender,
40
+ renderAppender: () => <GalleryImagesAppender clientId={clientId} itemBlock={options.allowedBlocks[0]} />,
77
41
  template: options.template,
78
42
  layout: {type: 'default'},
79
43
  })
@@ -1,15 +1,3 @@
1
- .g-gallery__appender {
2
- padding: 16px;
3
- display: flex;
4
- align-items: center;
5
- justify-content: center;
6
- border: 2px dashed lightblue;
7
- height: 100%;
8
- cursor: pointer;
9
- box-sizing: border-box;
10
- min-height: 256px;
11
- }
12
-
13
1
  .g-gallery {
14
2
  .block-list-appender {
15
3
  width: 100%;
@@ -5,6 +5,6 @@ export {createGalleryItemBlock} from './factory'
5
5
 
6
6
  export const galleryItemDefaults: GalleryItemOptions = {
7
7
  name: 'brilo/gallery-item',
8
- parent: ['brilo/gallery-group'],
8
+ parent: ['brilo/gallery-group', 'brilo/gallery-strip-group'],
9
9
  template: [],
10
10
  }
@@ -0,0 +1,22 @@
1
+ import {__} from '@wordpress/i18n'
2
+
3
+ export const HEIGHTS = [
4
+ {value: 'sm', label: __('Malá', 'brilo-blocks')},
5
+ {value: 'md', label: __('Střední', 'brilo-blocks')},
6
+ {value: 'lg', label: __('Velká', 'brilo-blocks')},
7
+ ] as const
8
+
9
+ export const SPEEDS = [
10
+ {value: 'slow', label: __('Pomalu', 'brilo-blocks')},
11
+ {value: 'medium', label: __('Středně', 'brilo-blocks')},
12
+ {value: 'fast', label: __('Rychle', 'brilo-blocks')},
13
+ ] as const
14
+
15
+ export const DIRECTIONS = [
16
+ {value: 'left', label: __('Doleva', 'brilo-blocks')},
17
+ {value: 'right', label: __('Doprava', 'brilo-blocks')},
18
+ ] as const
19
+
20
+ export {GALLERY_RATIOS as DEFAULT_RATIOS} from '~/constants'
21
+
22
+ export const HEIGHT_PIXELS = {sm: 160, md: 240, lg: 320} as const