@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.
- package/.editorconfig +12 -0
- package/.prettierrc +8 -0
- package/README.md +59 -0
- package/USAGE.md +263 -0
- package/biome.json +38 -0
- package/bun.lock +1392 -0
- package/docs/block-anatomy.md +73 -0
- package/docs/conventions.md +204 -0
- package/docs/new-block.md +179 -0
- package/package.json +41 -0
- package/src/blocks/column/column-group/edit.tsx +56 -0
- package/src/blocks/column/column-group/editor.scss +7 -0
- package/src/blocks/column/column-group/factory.tsx +29 -0
- package/src/blocks/column/column-group/index.ts +14 -0
- package/src/blocks/column/column-group/types.ts +8 -0
- package/src/blocks/column/column-item/constants.ts +1 -0
- package/src/blocks/column/column-item/edit.tsx +48 -0
- package/src/blocks/column/column-item/editor.scss +34 -0
- package/src/blocks/column/column-item/factory.tsx +25 -0
- package/src/blocks/column/column-item/index.ts +10 -0
- package/src/blocks/column/column-item/types.ts +7 -0
- package/src/blocks/compare/compare-group/constants.ts +1 -0
- package/src/blocks/compare/compare-group/edit.tsx +52 -0
- package/src/blocks/compare/compare-group/factory.tsx +29 -0
- package/src/blocks/compare/compare-group/icon.tsx +7 -0
- package/src/blocks/compare/compare-group/index.ts +13 -0
- package/src/blocks/compare/compare-group/types.ts +12 -0
- package/src/blocks/compare/compare-item/edit.tsx +38 -0
- package/src/blocks/compare/compare-item/editor.scss +15 -0
- package/src/blocks/compare/compare-item/factory.tsx +28 -0
- package/src/blocks/compare/compare-item/icon.tsx +9 -0
- package/src/blocks/compare/compare-item/index.ts +13 -0
- package/src/blocks/compare/compare-item/types.ts +9 -0
- package/src/blocks/compare/compare-option/constants.ts +7 -0
- package/src/blocks/compare/compare-option/edit.tsx +64 -0
- package/src/blocks/compare/compare-option/editor.scss +26 -0
- package/src/blocks/compare/compare-option/factory.tsx +35 -0
- package/src/blocks/compare/compare-option/icon.tsx +7 -0
- package/src/blocks/compare/compare-option/index.ts +8 -0
- package/src/blocks/compare/compare-option/types.ts +12 -0
- package/src/blocks/contact/contact-group/constants.ts +3 -0
- package/src/blocks/contact/contact-group/edit.tsx +57 -0
- package/src/blocks/contact/contact-group/editor.scss +20 -0
- package/src/blocks/contact/contact-group/factory.tsx +35 -0
- package/src/blocks/contact/contact-group/index.ts +12 -0
- package/src/blocks/contact/contact-group/types.ts +12 -0
- package/src/blocks/contact/contact-item/constants.ts +17 -0
- package/src/blocks/contact/contact-item/edit.tsx +93 -0
- package/src/blocks/contact/contact-item/editor.scss +38 -0
- package/src/blocks/contact/contact-item/factory.tsx +35 -0
- package/src/blocks/contact/contact-item/index.ts +23 -0
- package/src/blocks/contact/contact-item/types.ts +21 -0
- package/src/blocks/core/basic-button/constants.ts +17 -0
- package/src/blocks/core/basic-button/edit.tsx +107 -0
- package/src/blocks/core/basic-button/editor.scss +80 -0
- package/src/blocks/core/basic-button/factory.tsx +54 -0
- package/src/blocks/core/basic-button/index.ts +8 -0
- package/src/blocks/core/basic-button/types.ts +29 -0
- package/src/blocks/core/basic-heading/constants.ts +1 -0
- package/src/blocks/core/basic-heading/edit.tsx +76 -0
- package/src/blocks/core/basic-heading/editor.scss +8 -0
- package/src/blocks/core/basic-heading/factory.tsx +40 -0
- package/src/blocks/core/basic-heading/index.ts +8 -0
- package/src/blocks/core/basic-heading/types.ts +20 -0
- package/src/blocks/core/basic-overline/edit.tsx +28 -0
- package/src/blocks/core/basic-overline/editor.scss +14 -0
- package/src/blocks/core/basic-overline/factory.tsx +22 -0
- package/src/blocks/core/basic-overline/index.ts +8 -0
- package/src/blocks/core/basic-overline/types.ts +7 -0
- package/src/blocks/faq/faq-group/constants.ts +11 -0
- package/src/blocks/faq/faq-group/edit.tsx +55 -0
- package/src/blocks/faq/faq-group/editor.scss +11 -0
- package/src/blocks/faq/faq-group/factory.tsx +39 -0
- package/src/blocks/faq/faq-group/index.ts +11 -0
- package/src/blocks/faq/faq-group/types.ts +14 -0
- package/src/blocks/faq/faq-item/edit.tsx +50 -0
- package/src/blocks/faq/faq-item/editor.scss +57 -0
- package/src/blocks/faq/faq-item/factory.tsx +24 -0
- package/src/blocks/faq/faq-item/index.ts +9 -0
- package/src/blocks/faq/faq-item/types.ts +7 -0
- package/src/blocks/form/form-field/constants.ts +14 -0
- package/src/blocks/form/form-field/edit.tsx +178 -0
- package/src/blocks/form/form-field/editor.scss +71 -0
- package/src/blocks/form/form-field/factory.tsx +32 -0
- package/src/blocks/form/form-field/index.ts +10 -0
- package/src/blocks/form/form-field/types.ts +18 -0
- package/src/blocks/form/form-group/constants.ts +16 -0
- package/src/blocks/form/form-group/edit.tsx +190 -0
- package/src/blocks/form/form-group/editor.scss +41 -0
- package/src/blocks/form/form-group/factory.tsx +35 -0
- package/src/blocks/form/form-group/index.ts +18 -0
- package/src/blocks/form/form-group/types.ts +22 -0
- package/src/blocks/groups/banner-group/constants.ts +15 -0
- package/src/blocks/groups/banner-group/edit.tsx +122 -0
- package/src/blocks/groups/banner-group/editor.scss +18 -0
- package/src/blocks/groups/banner-group/factory.tsx +64 -0
- package/src/blocks/groups/banner-group/icon.tsx +13 -0
- package/src/blocks/groups/banner-group/index.ts +11 -0
- package/src/blocks/groups/banner-group/types.ts +30 -0
- package/src/blocks/groups/basic-header-group/constants.ts +9 -0
- package/src/blocks/groups/basic-header-group/edit.tsx +99 -0
- package/src/blocks/groups/basic-header-group/editor.scss +35 -0
- package/src/blocks/groups/basic-header-group/factory.tsx +46 -0
- package/src/blocks/groups/basic-header-group/icon.tsx +17 -0
- package/src/blocks/groups/basic-header-group/index.ts +9 -0
- package/src/blocks/groups/basic-header-group/types.ts +27 -0
- package/src/blocks/groups/button-group/constants.ts +7 -0
- package/src/blocks/groups/button-group/edit.tsx +52 -0
- package/src/blocks/groups/button-group/editor.scss +23 -0
- package/src/blocks/groups/button-group/factory.tsx +34 -0
- package/src/blocks/groups/button-group/index.ts +11 -0
- package/src/blocks/groups/button-group/types.ts +12 -0
- package/src/blocks/groups/text-and-media-group/constants.ts +43 -0
- package/src/blocks/groups/text-and-media-group/edit.tsx +241 -0
- package/src/blocks/groups/text-and-media-group/editor.scss +123 -0
- package/src/blocks/groups/text-and-media-group/factory.tsx +100 -0
- package/src/blocks/groups/text-and-media-group/icon.tsx +37 -0
- package/src/blocks/groups/text-and-media-group/index.ts +18 -0
- package/src/blocks/groups/text-and-media-group/types.ts +60 -0
- package/src/blocks/hero/hero-group/constants.ts +23 -0
- package/src/blocks/hero/hero-group/edit.tsx +85 -0
- package/src/blocks/hero/hero-group/editor.scss +0 -0
- package/src/blocks/hero/hero-group/factory.tsx +45 -0
- package/src/blocks/hero/hero-group/icon.tsx +28 -0
- package/src/blocks/hero/hero-group/index.ts +11 -0
- package/src/blocks/hero/hero-group/types.ts +22 -0
- package/src/blocks/hero/hero-item/constants.ts +15 -0
- package/src/blocks/hero/hero-item/edit.tsx +107 -0
- package/src/blocks/hero/hero-item/editor.scss +87 -0
- package/src/blocks/hero/hero-item/factory.tsx +49 -0
- package/src/blocks/hero/hero-item/index.ts +10 -0
- package/src/blocks/hero/hero-item/types.ts +38 -0
- package/src/blocks/map/map-group/constants.ts +20 -0
- package/src/blocks/map/map-group/edit.tsx +108 -0
- package/src/blocks/map/map-group/editor.scss +24 -0
- package/src/blocks/map/map-group/factory.tsx +51 -0
- package/src/blocks/map/map-group/index.ts +9 -0
- package/src/blocks/map/map-group/types.ts +16 -0
- package/src/blocks/newsletter/newsletter-form/constants.ts +5 -0
- package/src/blocks/newsletter/newsletter-form/edit.tsx +194 -0
- package/src/blocks/newsletter/newsletter-form/editor.scss +68 -0
- package/src/blocks/newsletter/newsletter-form/factory.tsx +59 -0
- package/src/blocks/newsletter/newsletter-form/index.ts +11 -0
- package/src/blocks/newsletter/newsletter-form/types.ts +45 -0
- package/src/blocks/post/post-slider-group/constants.ts +3 -0
- package/src/blocks/post/post-slider-group/edit.tsx +76 -0
- package/src/blocks/post/post-slider-group/factory.tsx +43 -0
- package/src/blocks/post/post-slider-group/icon.tsx +13 -0
- package/src/blocks/post/post-slider-group/index.ts +9 -0
- package/src/blocks/post/post-slider-group/types.ts +20 -0
- package/src/blocks/responsive-grid/responsive-grid-group/edit.tsx +95 -0
- package/src/blocks/responsive-grid/responsive-grid-group/factory.tsx +33 -0
- package/src/blocks/responsive-grid/responsive-grid-group/index.ts +13 -0
- package/src/blocks/responsive-grid/responsive-grid-group/types.ts +9 -0
- package/src/blocks/responsive-grid/responsive-grid-item/edit.tsx +19 -0
- package/src/blocks/responsive-grid/responsive-grid-item/factory.tsx +20 -0
- package/src/blocks/responsive-grid/responsive-grid-item/index.ts +9 -0
- package/src/blocks/responsive-grid/responsive-grid-item/types.ts +5 -0
- package/src/blocks/sections/base-section/attributes.ts +17 -0
- package/src/blocks/sections/base-section/constants.ts +18 -0
- package/src/blocks/sections/base-section/controls.tsx +70 -0
- package/src/blocks/sections/base-section/edit.tsx +34 -0
- package/src/blocks/sections/base-section/editor.scss +24 -0
- package/src/blocks/sections/base-section/factory.tsx +47 -0
- package/src/blocks/sections/base-section/icon.tsx +6 -0
- package/src/blocks/sections/base-section/index.ts +14 -0
- package/src/blocks/sections/base-section/types.ts +26 -0
- package/src/blocks/signpost/signpost-group/constants.ts +3 -0
- package/src/blocks/signpost/signpost-group/edit.tsx +75 -0
- package/src/blocks/signpost/signpost-group/editor.scss +0 -0
- package/src/blocks/signpost/signpost-group/factory.tsx +40 -0
- package/src/blocks/signpost/signpost-group/icon.tsx +19 -0
- package/src/blocks/signpost/signpost-group/index.ts +15 -0
- package/src/blocks/signpost/signpost-group/types.ts +9 -0
- package/src/blocks/signpost/signpost-item/constants.ts +4 -0
- package/src/blocks/signpost/signpost-item/edit.tsx +90 -0
- package/src/blocks/signpost/signpost-item/editor.scss +25 -0
- package/src/blocks/signpost/signpost-item/factory.tsx +29 -0
- package/src/blocks/signpost/signpost-item/icon.tsx +7 -0
- package/src/blocks/signpost/signpost-item/index.ts +10 -0
- package/src/blocks/signpost/signpost-item/types.ts +12 -0
- package/src/blocks/step/step-group/constants.ts +6 -0
- package/src/blocks/step/step-group/edit.tsx +64 -0
- package/src/blocks/step/step-group/editor.scss +19 -0
- package/src/blocks/step/step-group/factory.tsx +36 -0
- package/src/blocks/step/step-group/icon.tsx +27 -0
- package/src/blocks/step/step-group/index.ts +15 -0
- package/src/blocks/step/step-group/types.ts +13 -0
- package/src/blocks/step/step-item/constants.ts +6 -0
- package/src/blocks/step/step-item/edit.tsx +60 -0
- package/src/blocks/step/step-item/editor.scss +18 -0
- package/src/blocks/step/step-item/factory.tsx +27 -0
- package/src/blocks/step/step-item/index.ts +11 -0
- package/src/blocks/step/step-item/types.ts +12 -0
- package/src/blocks/testimonial/testimonial-group/constants.ts +27 -0
- package/src/blocks/testimonial/testimonial-group/edit.tsx +74 -0
- package/src/blocks/testimonial/testimonial-group/editor.scss +38 -0
- package/src/blocks/testimonial/testimonial-group/factory.tsx +44 -0
- package/src/blocks/testimonial/testimonial-group/icon.tsx +33 -0
- package/src/blocks/testimonial/testimonial-group/index.ts +15 -0
- package/src/blocks/testimonial/testimonial-group/types.ts +19 -0
- package/src/blocks/testimonial/testimonial-item/edit.tsx +48 -0
- package/src/blocks/testimonial/testimonial-item/editor.scss +20 -0
- package/src/blocks/testimonial/testimonial-item/factory.tsx +35 -0
- package/src/blocks/testimonial/testimonial-item/index.ts +9 -0
- package/src/blocks/testimonial/testimonial-item/types.ts +9 -0
- package/src/blocks/text-and-form/text-and-form-group/constants.ts +6 -0
- package/src/blocks/text-and-form/text-and-form-group/edit.tsx +59 -0
- package/src/blocks/text-and-form/text-and-form-group/editor.scss +21 -0
- package/src/blocks/text-and-form/text-and-form-group/factory.tsx +38 -0
- package/src/blocks/text-and-form/text-and-form-group/icon.tsx +23 -0
- package/src/blocks/text-and-form/text-and-form-group/index.ts +9 -0
- package/src/blocks/text-and-form/text-and-form-group/types.ts +23 -0
- package/src/blocks/text-and-form/text-and-form-text-column/constants.ts +10 -0
- package/src/blocks/text-and-form/text-and-form-text-column/edit.tsx +94 -0
- package/src/blocks/text-and-form/text-and-form-text-column/editor.scss +29 -0
- package/src/blocks/text-and-form/text-and-form-text-column/factory.tsx +41 -0
- package/src/blocks/text-and-form/text-and-form-text-column/index.ts +18 -0
- package/src/blocks/text-and-form/text-and-form-text-column/types.ts +23 -0
- package/src/blocks/usp/usp-group/constants.ts +54 -0
- package/src/blocks/usp/usp-group/edit.tsx +197 -0
- package/src/blocks/usp/usp-group/editor.scss +24 -0
- package/src/blocks/usp/usp-group/factory.tsx +113 -0
- package/src/blocks/usp/usp-group/icon.tsx +18 -0
- package/src/blocks/usp/usp-group/index.ts +15 -0
- package/src/blocks/usp/usp-group/types.ts +70 -0
- package/src/blocks/usp/usp-item/constants.ts +7 -0
- package/src/blocks/usp/usp-item/edit.tsx +65 -0
- package/src/blocks/usp/usp-item/editor.scss +17 -0
- package/src/blocks/usp/usp-item/factory.tsx +30 -0
- package/src/blocks/usp/usp-item/index.ts +11 -0
- package/src/blocks/usp/usp-item/types.ts +17 -0
- package/src/components/IconControl/IconControl.tsx +55 -0
- package/src/components/IconControl/editor.scss +53 -0
- package/src/components/IconControl/index.ts +2 -0
- package/src/components/IconControl/index.tsx +1 -0
- package/src/components/ImagePicker/ImagePicker.tsx +124 -0
- package/src/components/ImagePicker/editor.scss +79 -0
- package/src/components/ImagePicker/index.ts +2 -0
- package/src/components/ImagePicker/index.tsx +1 -0
- package/src/components/ItemIconControl/ItemIconControl.tsx +72 -0
- package/src/components/ItemIconControl/ItemIconModal.tsx +12 -0
- package/src/components/ItemIconControl/ItemIconPreview.tsx +93 -0
- package/src/components/ItemIconControl/editor.scss +52 -0
- package/src/components/ItemIconControl/index.ts +2 -0
- package/src/components/ItemIconControl/types.d.ts +30 -0
- package/src/constants.ts +20 -0
- package/src/editor.scss +34 -0
- package/src/globals.scss +237 -0
- package/src/hooks/useGroupBlock.ts +53 -0
- package/src/index.ts +122 -0
- package/src/types.ts +33 -0
- package/src/utils/createEditAdapter.ts +11 -0
- 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,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
|
+
}
|