From 35a4c04215a7d85f41edc1ece2df25ee5c05094b Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 18 Feb 2026 12:03:16 +0200 Subject: [PATCH 01/34] LHJ-149: Implement PHP rendering, block to dynamic --- src/Blocks/contact-form/block.json | 146 ++++++----------------------- src/Blocks/contact-form/edit.tsx | 2 +- src/Blocks/contact-form/render.php | 120 ++++++++++++++++++++++++ src/Blocks/contact-form/save.tsx | 59 +----------- 4 files changed, 153 insertions(+), 174 deletions(-) create mode 100644 src/Blocks/contact-form/render.php diff --git a/src/Blocks/contact-form/block.json b/src/Blocks/contact-form/block.json index 7f81f17..e01a563 100644 --- a/src/Blocks/contact-form/block.json +++ b/src/Blocks/contact-form/block.json @@ -9,130 +9,42 @@ "parent": ["famehelsinki/donation-form"], "example": {}, "attributes": { - "showLegend": { - "type": "boolean", - "default": true - }, - "legend": { - "type": "string", - "source": "text", - "selector": "legend.fame-form__legend", - "default": "Contacts" - }, - "contact": { - "type": "boolean", - "source": "attribute", - "selector": ".fame-form__group--required:has(input[name=\"email\"])", - "attribute": "class", - "default": false - }, - "showAddress": { - "type": "boolean", - "source": "attribute", - "selector": "input[name=\"address\"]", - "attribute": "name", - "default": true - }, - "showPhone": { - "type": "boolean", - "source": "attribute", - "selector": "input[name=\"phone\"]", - "attribute": "name", - "default": true - }, - "first_name_label": { - "type": "string", - "source": "html", - "selector": ".fame-form__label[for=\"contact-first_name\"]", - "default": "First name" - }, - "last_name_label": { - "type": "string", - "source": "html", - "selector": ".fame-form__label[for=\"contact-last_name\"]", - "default": "Last name" - }, - "name_help": { - "type": "string", - "source": "html", - "selector": "#contact-name-help", - "default": "" - }, - "email_label": { - "type": "string", - "source": "html", - "selector": ".fame-form__label[for=\"contact-email\"]", - "default": "Email" - }, - "email_help": { - "type": "string", - "source": "html", - "selector": "#contact-email-help", - "default": "" - }, - "address_label": { - "type": "string", - "source": "html", - "selector": ".fame-form__label[for=\"contact-address\"]", - "default": "Address" - }, - "address_help": { - "type": "string", - "source": "html", - "selector": "#contact-address-help", - "default": "" - }, - "city_label": { - "type": "string", - "source": "html", - "selector": ".fame-form__label[for=\"contact-city\"]", - "default": "City" - }, - "city_postal_code_help": { - "type": "string", - "source": "html", - "selector": "#contact-city_postal_code-help", - "default": "City" - }, - "postal_code_label": { - "type": "string", - "source": "html", - "selector": ".fame-form__label[for=\"contact-postal_code\"]", - "default": "Postal code" - }, - "postal_code_help": { - "type": "string", - "source": "html", - "selector": "#contact-postal_code-help", - "default": "Postal code" - }, - "phone_label": { - "type": "string", - "source": "html", - "selector": ".fame-form__label[for=\"contact-phone\"]", - "default": "Phone" - }, - "phone_help": { - "type": "string", - "source": "html", - "selector": "#contact-phone-help", - "default": "" - } + "showLegend": { "type": "boolean", "default": true }, + "legend": { "type": "string", "default": "Contacts" }, + + "contact": { "type": "boolean", "default": false }, + "showAddress": { "type": "boolean", "default": true }, + "showPhone": { "type": "boolean", "default": true }, + + "first_name_label": { "type": "string", "default": "First name" }, + "last_name_label": { "type": "string", "default": "Last name" }, + "name_help": { "type": "string", "default": "" }, + + "email_label": { "type": "string", "default": "Email" }, + "email_help": { "type": "string", "default": "" }, + + "address_label": { "type": "string", "default": "Address" }, + "address_help": { "type": "string", "default": "" }, + + "city_label": { "type": "string", "default": "City" }, + "city_postal_code_help": { "type": "string", "default": "City" }, + + "postal_code_label": { "type": "string", "default": "Postal code" }, + "postal_code_help": { "type": "string", "default": "Postal code" }, + + "phone_label": { "type": "string", "default": "Phone" }, + "phone_help": { "type": "string", "default": "" } }, "supports": { "multiple": false, - "color": { - "background": false, - "text": true - }, + "color": { "background": false, "text": true }, "html": false, - "typography": { - "fontSize": true - } + "typography": { "fontSize": true } }, "icon": "id", "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", - "style": "file:./style-index.css" + "style": "file:./style-index.css", + "render": "file:./render.php" } diff --git a/src/Blocks/contact-form/edit.tsx b/src/Blocks/contact-form/edit.tsx index 16f2774..f7f4d30 100644 --- a/src/Blocks/contact-form/edit.tsx +++ b/src/Blocks/contact-form/edit.tsx @@ -56,7 +56,7 @@ export default function Edit({ attributes, setAttributes }: EditProps): React.JS multiline={false} className="fame-form__legend" aria-label={__('Legend', 'fame_lahjoitukset')} - placeholder={__('Amount', 'fame_lahjoitukset')} + placeholder={__('Contacts', 'fame_lahjoitukset')} allowedFormats={[]} value={legend} onChange={value => setAttributes({ legend: value })} diff --git a/src/Blocks/contact-form/render.php b/src/Blocks/contact-form/render.php new file mode 100644 index 0000000..c04eac4 --- /dev/null +++ b/src/Blocks/contact-form/render.php @@ -0,0 +1,120 @@ +|null $attributes */ +$attributes = $attributes ?? []; + +$showLegend = array_key_exists('showLegend', $attributes) ? (bool) $attributes['showLegend'] : true; +$legend = isset($attributes['legend']) && trim((string) $attributes['legend']) !== '' + ? (string) $attributes['legend'] + : __('Contacts', 'fame_lahjoitukset'); + +$contact = array_key_exists('contact', $attributes) ? (bool) $attributes['contact'] : false; +$showAddress = array_key_exists('showAddress', $attributes) ? (bool) $attributes['showAddress'] : true; +$showPhone = array_key_exists('showPhone', $attributes) ? (bool) $attributes['showPhone'] : true; + +$wrapper_attrs = get_block_wrapper_attributes([ + 'class' => 'fame-form__fieldset', +]); + +$get = static function (array $attrs, string $key, string $fallback = ''): string { + return isset($attrs[$key]) ? (string) $attrs[$key] : $fallback; +}; + +$render_input = static function ( + array $attrs, + string $name, + string $type, + bool $required = false, + ?string $ariaDescribedBy = null +) use ($get): void { + $label = $get($attrs, "{$name}_label", ''); + $help = $get($attrs, "{$name}_help", ''); + + $aria_id = $ariaDescribedBy ?: ($help !== '' ? "contact-{$name}-help" : ''); +?> +
+ + + + class="fame-form__input" + id="" + + aria-describedby="" + /> + + + " class="fame-form__help"> + + + +
+ +
+ + + + + + + +
+ +
> + + + + + 'first_name', 'type' => 'text', 'required' => $contact], + ['name' => 'last_name', 'type' => 'text', 'required' => $contact], + ]); + + $render_input($attributes, 'email', 'email', $contact, null); + + if ($showAddress) { + $render_input($attributes, 'address', 'text', false, null); + + $render_group($attributes, 'city_postal_code', [ + ['name' => 'city', 'type' => 'text', 'required' => false], + ['name' => 'postal_code', 'type' => 'text', 'required' => false], + ]); + } + + if ($showPhone) { + $render_input($attributes, 'phone', 'tel', false, null); + } + ?> +
\ No newline at end of file diff --git a/src/Blocks/contact-form/save.tsx b/src/Blocks/contact-form/save.tsx index 95699e6..af2f1fd 100644 --- a/src/Blocks/contact-form/save.tsx +++ b/src/Blocks/contact-form/save.tsx @@ -1,59 +1,6 @@ -import { useBlockProps } from '@wordpress/block-editor' -import React from 'react' -import { ContactInputContent } from './ContactInputControl.tsx' -import { ContactGroupContent } from './ContactInputGroup.tsx' -import { SaveProps } from '../common/types.ts' - /** - * The save function defines the way in which the different attributes should - * be combined into the final markup, which is then serialized by the block - * editor into `post_content`. + * Dynamic block – rendering happens in PHP (render.php). */ -export default function save({ attributes }: SaveProps): React.JSX.Element { - const { contact, showAddress, showPhone, showLegend, legend } = attributes - - return ( -
- {showLegend && {legend}} - - - {showAddress && ( - <> - - - - )} - {showPhone && } -
- ) +export default function save() { + return null } From 02594cc8c413a20f584a3c177d44a61b812c84f0 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 18 Feb 2026 12:46:56 +0200 Subject: [PATCH 02/34] LHJ-149: Refactor donation amounts block to use dynamic rendering and remove deprecated files --- src/Blocks/donation-amounts/block.json | 104 +++------- .../donation-amounts/deprecated/block-v1.json | 69 ------- .../donation-amounts/deprecated/save-v1.tsx | 111 ---------- src/Blocks/donation-amounts/index.ts | 24 --- src/Blocks/donation-amounts/render.php | 189 ++++++++++++++++++ src/Blocks/donation-amounts/save.tsx | 137 +------------ 6 files changed, 217 insertions(+), 417 deletions(-) delete mode 100644 src/Blocks/donation-amounts/deprecated/block-v1.json delete mode 100644 src/Blocks/donation-amounts/deprecated/save-v1.tsx create mode 100644 src/Blocks/donation-amounts/render.php diff --git a/src/Blocks/donation-amounts/block.json b/src/Blocks/donation-amounts/block.json index b781053..e51e524 100644 --- a/src/Blocks/donation-amounts/block.json +++ b/src/Blocks/donation-amounts/block.json @@ -12,94 +12,42 @@ "attributes": { "settings": { "type": "array", - "source": "query", - "selector": ".donation-amounts", - "query": { - "type": { - "type": "string", - "source": "attribute", - "attribute": "data-type" + "default": [ + { + "type": "single", + "default": true, + "defaultAmount": 10, + "minAmount": 10, + "maxAmount": 10000, + "unit": "€", + "amounts": [{ "value": 10 }, { "value": 20 }, { "value": 30 }] }, - "default": { - "type": "boolean", - "source": "attribute", - "attribute": "data-default" - }, - "defaultAmount": { - "type": "integer", - "source": "attribute", - "attribute": "data-default-amount" - }, - "minAmount": { - "type": "integer", - "source": "attribute", - "attribute": "data-min-amount" - }, - "maxAmount": { - "type": "integer", - "source": "attribute", - "attribute": "data-max-amount" - }, - "unit": { - "type": "string", - "selector": ".donation-amounts__unit", - "source": "text" - }, - "amounts": { - "type": "array", - "source": "query", - "selector": "input[type=\"radio\"]", - "query": { - "value": { - "type": "string", - "source": "attribute", - "attribute": "value" - } - } + { + "type": "recurring", + "default": false, + "defaultAmount": 10, + "minAmount": 10, + "maxAmount": 10000, + "unit": "€", + "amounts": [{ "value": 10 }, { "value": 20 }, { "value": 30 }] } - } + ] }, - "showLegend": { - "type": "boolean", - "source": "attribute", - "selector": ".fame-form__legend:not(.screen-reader-text)", - "attribute": "class", - "default": true - }, - "legend": { - "type": "string", - "source": "text", - "selector": ".fame-form__legend", - "default": "Donation amount" - }, - "other": { - "type": "boolean", - "source": "attribute", - "selector": ".donation-amounts__other", - "attribute": "class", - "default": false - }, - "otherLabel": { - "type": "string", - "source": "text", - "selector": ".donation-amounts__other label", - "default": "Other amount" - } + "showLegend": { "type": "boolean", "default": true }, + "legend": { "type": "string", "default": "Donation amount" }, + "other": { "type": "boolean", "default": false }, + "otherLabel": { "type": "string", "default": "Other amount" } }, "supports": { "multiple": false, - "color": { - "background": false, - "text": true - }, + "color": { "background": false, "text": true }, "html": false, - "typography": { - "fontSize": true - } + "typography": { "fontSize": true } }, "icon": "database", "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", - "style": "file:./style-index.css" + "style": "file:./style-index.css", + "render": "file:./render.php" } diff --git a/src/Blocks/donation-amounts/deprecated/block-v1.json b/src/Blocks/donation-amounts/deprecated/block-v1.json deleted file mode 100644 index fa9e9a4..0000000 --- a/src/Blocks/donation-amounts/deprecated/block-v1.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "attributes": { - "settings": { - "type": "array", - "source": "query", - "selector": ".donation-amounts", - "query": { - "type": { - "type": "string", - "source": "attribute", - "attribute": "data-type" - }, - "default": { - "type": "boolean", - "source": "attribute", - "attribute": "data-default" - }, - "defaultAmount": { - "type": "integer", - "source": "attribute", - "attribute": "data-default-amount" - }, - "unit": { - "type": "string", - "selector": ".donation-amounts__unit", - "source": "text" - }, - "amounts": { - "type": "array", - "source": "query", - "selector": "input[type=\"radio\"]", - "query": { - "value": { - "type": "string", - "source": "attribute", - "attribute": "value" - } - } - } - } - }, - "showLegend": { - "type": "boolean", - "source": "attribute", - "selector": ".fame-form__legend:not(.screen-reader-text)", - "attribute": "class", - "default": true - }, - "legend": { - "type": "string", - "source": "text", - "selector": ".fame-form__legend", - "default": "Donation amount" - }, - "other": { - "type": "boolean", - "source": "attribute", - "selector": ".donation-amounts__other", - "attribute": "class", - "default": false - }, - "otherLabel": { - "type": "string", - "source": "text", - "selector": ".donation-amounts__other label", - "default": "Other amount" - } - } -} diff --git a/src/Blocks/donation-amounts/deprecated/save-v1.tsx b/src/Blocks/donation-amounts/deprecated/save-v1.tsx deleted file mode 100644 index 2056d3f..0000000 --- a/src/Blocks/donation-amounts/deprecated/save-v1.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { RichText, useBlockProps } from '@wordpress/block-editor' -import React from 'react' -import { SaveProps } from '../../common/types.ts' -import { DEFAULT_AMOUNT, DEFAULT_LEGEND } from '../../common/donation-amount.ts' -import { Attributes } from '../edit.tsx' -import { __ } from '@wordpress/i18n' - -type SaveAttributes = Attributes & { - type?: boolean -} - -/** - * The save function defines the way in which the different attributes should - * be combined into the final markup, which is then serialized by the block - * editor into `post_content`. - */ -export default function save({ attributes }: SaveProps): React.JSX.Element { - const { settings, other, otherLabel, showLegend, legend } = attributes - - // Visible if other amount is shown or amount buttons is not empty. - const visible = other || settings?.some(type => type?.amounts?.length) - const blockProps = useBlockProps.save({ - className: visible - ? 'fame-form__fieldset fame-form__fieldset--amounts' - : 'fame-form__hidden', - }) - - // Amount must be in cents. - const defaultAmount = - parseInt( - (settings?.find(type => type.default)?.defaultAmount || DEFAULT_AMOUNT).toString() - ) * 100 - - if (!visible) { - return ( -
- -
- ) - } - - return ( -
- - - {settings?.map(type => ( -
- {type.amounts?.map(({ value }, idx) => ( -
- -
- ))} - {other && ( -
-
- {type.unit} - -
- -
- )} -
- ))} - - {/* - The server only cares about `name` field. This hidden - input field must be kept up to date with radio buttons - and free amount field with javascript. - */} - -
- ) -} diff --git a/src/Blocks/donation-amounts/index.ts b/src/Blocks/donation-amounts/index.ts index f13e3d4..0d21cbd 100644 --- a/src/Blocks/donation-amounts/index.ts +++ b/src/Blocks/donation-amounts/index.ts @@ -12,9 +12,6 @@ import Edit from './edit' import save from './save' import metadata from './block.json' import './edit.css' -import SaveV1 from './deprecated/save-v1' -import BlockV1 from './deprecated/block-v1.json' -import { MAX_AMOUNT, MIN_AMOUNT } from '../common/donation-amount' /** * Every block starts by registering a new block type definition. @@ -24,25 +21,4 @@ import { MAX_AMOUNT, MIN_AMOUNT } from '../common/donation-amount' registerBlockType(metadata.name, { edit: Edit, save, - - deprecated: [ - { - attributes: BlockV1.attributes, - save: SaveV1, - migrate: (attrs: any) => { - const settings = Array.isArray(attrs?.settings) - ? attrs.settings.map((t: any) => ({ - ...t, - minAmount: t?.minAmount ?? MIN_AMOUNT, - maxAmount: t?.maxAmount ?? MAX_AMOUNT, - })) - : attrs?.settings - - return { - ...attrs, - settings, - } - }, - }, - ], } as any) diff --git a/src/Blocks/donation-amounts/render.php b/src/Blocks/donation-amounts/render.php new file mode 100644 index 0000000..55d9519 --- /dev/null +++ b/src/Blocks/donation-amounts/render.php @@ -0,0 +1,189 @@ +|null $attributes */ +$attributes = $attributes ?? []; + +$settings = isset($attributes['settings']) && is_array($attributes['settings']) ? $attributes['settings'] : []; +$other = array_key_exists('other', $attributes) ? (bool) $attributes['other'] : false; +$otherLabel = isset($attributes['otherLabel']) ? (string) $attributes['otherLabel'] : __('Other amount', 'fame_lahjoitukset'); +$showLegend = array_key_exists('showLegend', $attributes) ? (bool) $attributes['showLegend'] : true; +$legend = isset($attributes['legend']) && trim((string)$attributes['legend']) !== '' + ? (string) $attributes['legend'] + : __('Donation amount', 'fame_lahjoitukset'); + +/** + * Safe int helper. + */ +$int = static function ($value, int $fallback): int { + if (is_int($value)) return $value; + if (is_string($value) && $value !== '' && is_numeric($value)) return (int) $value; + if (is_float($value)) return (int) $value; + return $fallback; +}; + +/** + * Safe string helper. + */ +$str = static function ($value, string $fallback = ''): string { + return isset($value) ? (string) $value : $fallback; +}; + +/** + * Find default type setting. + */ +$defaultSetting = null; +foreach ($settings as $s) { + if (is_array($s) && !empty($s['default'])) { + $defaultSetting = $s; + break; + } +} +if (!$defaultSetting && !empty($settings) && is_array($settings[0])) { + $defaultSetting = $settings[0]; +} + +$DEFAULT_AMOUNT = 10; +$MIN_AMOUNT = 10; +$MAX_AMOUNT = 10000; +$DEFAULT_UNIT = '€'; + +$defaultAmountEuros = $defaultSetting ? $int($defaultSetting['defaultAmount'] ?? null, $DEFAULT_AMOUNT) : $DEFAULT_AMOUNT; +$defaultAmountCents = $defaultAmountEuros * 100; + +// Visible if "other" or any type has amount buttons +$hasButtons = false; +foreach ($settings as $s) { + if (is_array($s) && !empty($s['amounts']) && is_array($s['amounts'])) { + foreach ($s['amounts'] as $a) { + if (is_array($a) && !empty($a['value'])) { + $hasButtons = true; + break 2; + } + } + } +} +$visible = $other || $hasButtons; + +$wrapper_class = $visible + ? 'fame-form__fieldset fame-form__fieldset--amounts' + : 'fame-form__hidden'; + +$wrapper_attrs = get_block_wrapper_attributes(['class' => $wrapper_class]); + +if (!$visible) : ?> +
> + +
+ + +
> + + + + + + +
" + data-type="" + + data-default-amount="" + data-min-amount="" + data-max-amount="" + style=""> + +
+ +
+ +
+ + +
+
+ + +
+ +
+ " + type="number" + min="" + max="" + value="" + aria-describedby="" /> + + + +
+
+ + + + + + +
\ No newline at end of file diff --git a/src/Blocks/donation-amounts/save.tsx b/src/Blocks/donation-amounts/save.tsx index ea660c4..25c9d31 100644 --- a/src/Blocks/donation-amounts/save.tsx +++ b/src/Blocks/donation-amounts/save.tsx @@ -1,136 +1,3 @@ -import { RichText, useBlockProps } from '@wordpress/block-editor' -import React from 'react' -import { SaveProps } from '../common/types.ts' -import { - DEFAULT_AMOUNT, - DEFAULT_LEGEND, - MAX_AMOUNT, - MIN_AMOUNT, -} from '../common/donation-amount.ts' -import { Attributes } from './edit.tsx' -import { __ } from '@wordpress/i18n' - -type SaveAttributes = Attributes & { - type?: boolean -} - -/** - * The save function defines the way in which the different attributes should - * be combined into the final markup, which is then serialized by the block - * editor into `post_content`. - */ -export default function save({ attributes }: SaveProps): React.JSX.Element { - const { settings, other, otherLabel, showLegend, legend } = attributes - - // Visible if other amount is shown or amount buttons is not empty. - const visible = other || settings?.some(type => type?.amounts?.length) - const blockProps = useBlockProps.save({ - className: visible - ? 'fame-form__fieldset fame-form__fieldset--amounts' - : 'fame-form__hidden', - }) - - // Amount must be in cents. - const defaultAmount = - parseInt( - (settings?.find(type => type.default)?.defaultAmount || DEFAULT_AMOUNT).toString() - ) * 100 - - if (!visible) { - return ( -
- -
- ) - } - - return ( -
- - - {settings?.map(type => ( - <> -
- {type.amounts?.map(({ value }, idx) => ( -
- -
- ))} -
- {other && ( -
-
- - {type.unit} -
-
- - - {__('Min', 'fame_lahjoitukset')} {type.minAmount ?? MIN_AMOUNT} - {type.unit ?? ''} – {__('Max', 'fame_lahjoitukset')}{' '} - {type.maxAmount ?? MAX_AMOUNT} - {type.unit ?? ''} - -
-
- )} - - ))} - - {/* - The server only cares about `name` field. This hidden - input field must be kept up to date with radio buttons - and free amount field with javascript. - */} - -
- ) +export default function save() { + return null } From 010260cf20235af88799dcdb2c1826ff6239b5f4 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 18 Feb 2026 14:02:47 +0200 Subject: [PATCH 03/34] LHJ-149: Refactor donation providers block to use dynamic rendering and remove deprecated save function --- src/Blocks/donation-providers/block.json | 60 ++------- .../donation-providers/deprecated/save-v1.tsx | 90 -------------- src/Blocks/donation-providers/edit.tsx | 2 +- src/Blocks/donation-providers/index.ts | 22 ---- src/Blocks/donation-providers/render.php | 117 ++++++++++++++++++ src/Blocks/donation-providers/save.tsx | 112 +---------------- 6 files changed, 130 insertions(+), 273 deletions(-) delete mode 100644 src/Blocks/donation-providers/deprecated/save-v1.tsx create mode 100644 src/Blocks/donation-providers/render.php diff --git a/src/Blocks/donation-providers/block.json b/src/Blocks/donation-providers/block.json index b2ab5ba..d02d1d2 100644 --- a/src/Blocks/donation-providers/block.json +++ b/src/Blocks/donation-providers/block.json @@ -9,65 +9,23 @@ "parent": ["famehelsinki/donation-form"], "usesContext": ["famehelsinki/donation-types"], "attributes": { - "showLegend": { - "type": "boolean", - "default": true - }, - "showLegendSingle": { - "type": "boolean", - "default": true - }, - "showLegendRecurring": { - "type": "boolean", - "default": true - }, - "legend": { - "type": "string", - "source": "text", - "selector": "legend.fame-form__legend", - "default": "Payment provider" - }, - "providers": { - "type": "array", - "source": "query", - "selector": ".payment-method-selector > div", - "query": { - "value": { - "type": "string", - "source": "attribute", - "selector": "input", - "attribute": "value" - }, - "label": { - "type": "string", - "source": "text", - "selector": ".provider-type__label" - }, - "type": { - "type": "string", - "source": "attribute", - "selector": "input", - "attribute": "data-type" - } - }, - "default": [] - } + "showLegend": { "type": "boolean", "default": true }, + "showLegendSingle": { "type": "boolean", "default": true }, + "showLegendRecurring": { "type": "boolean", "default": true }, + "legend": { "type": "string", "default": "Payment provider" }, + "providers": { "type": "array", "default": [] } }, "supports": { "multiple": false, - "color": { - "background": false, - "text": true - }, + "color": { "background": false, "text": true }, "html": false, - "typography": { - "fontSize": true - } + "typography": { "fontSize": true } }, "icon": "bank", "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", "script": "file:./view.js", - "style": "file:./style-index.css" + "style": "file:./style-index.css", + "render": "file:./render.php" } diff --git a/src/Blocks/donation-providers/deprecated/save-v1.tsx b/src/Blocks/donation-providers/deprecated/save-v1.tsx deleted file mode 100644 index f3c9539..0000000 --- a/src/Blocks/donation-providers/deprecated/save-v1.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react' -import { RichText, useBlockProps } from '@wordpress/block-editor' -import { SaveProps } from '../../common/types.ts' - -type Provider = { value: string; label: string; type: string } - -type Attrs = { - providers?: Provider[] - legend?: string - showLegend?: boolean -} - -/** - * The save function defines the way in which the different attributes should - * be combined into the final markup, which is then serialized by the block - * editor into `post_content`. - * - * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save - */ -export default function Save({ attributes }: SaveProps): React.JSX.Element { - const { providers = [], legend = 'Payment provider', showLegend = true } = attributes - const blockProps = useBlockProps.save() - - const grouped = providers.reduce>((acc, p) => { - ;(acc[p.type] ||= []).push(p) - return acc - }, {}) - - return ( -
- {Object.entries(grouped).map(([type, list]) => { - const single = list.length === 1 - - return ( -
- {showLegend && ( - - )} - - {single && ( - - )} - - {list.map(provider => ( -
- -
- ))} -
- ) - })} -
- ) -} diff --git a/src/Blocks/donation-providers/edit.tsx b/src/Blocks/donation-providers/edit.tsx index 176156e..9b87090 100644 --- a/src/Blocks/donation-providers/edit.tsx +++ b/src/Blocks/donation-providers/edit.tsx @@ -192,7 +192,7 @@ export default function Edit({ multiline={false} className="fame-form__legend" aria-label={__('Legend', 'fame_lahjoitukset')} - placeholder={__('Donation type', 'fame_lahjoitukset')} + placeholder={__('Donation provider', 'fame_lahjoitukset')} allowedFormats={[]} value={attributes.legend ?? ''} onChange={le => setAttributes({ legend: le })} diff --git a/src/Blocks/donation-providers/index.ts b/src/Blocks/donation-providers/index.ts index 52aace5..df77d72 100644 --- a/src/Blocks/donation-providers/index.ts +++ b/src/Blocks/donation-providers/index.ts @@ -12,7 +12,6 @@ import Edit from './edit' import save from './save' import metadata from './block.json' import './edit.css' -import SaveV1 from './deprecated/save-v1' /** * Every block starts by registering a new block type definition. @@ -28,25 +27,4 @@ registerBlockType(metadata.name, { * @see ./save.js */ save, - /** - * Support old saved content - */ - deprecated: [ - { - attributes: { - providers: { type: 'array' }, - legend: { type: 'string' }, - showLegend: { type: 'boolean', default: true }, - }, - - // Migrate old attribute to new ones - migrate: (attrs: any) => ({ - ...attrs, - showLegendSingle: attrs.showLegend, - showLegendRecurring: attrs.showLegend, - }), - - save: SaveV1, - }, - ], } as any) diff --git a/src/Blocks/donation-providers/render.php b/src/Blocks/donation-providers/render.php new file mode 100644 index 0000000..3a838ea --- /dev/null +++ b/src/Blocks/donation-providers/render.php @@ -0,0 +1,117 @@ + $attributes + * @var string $content + * @var WP_Block $block + */ + + +/** @var array|null $attributes */ +$attributes = $attributes ?? []; + +$providers = (isset($attributes['providers']) && is_array($attributes['providers'])) + ? $attributes['providers'] + : []; + +$legend = (isset($attributes['legend']) && trim((string) $attributes['legend']) !== '') + ? (string) $attributes['legend'] + : __('Payment provider', 'fame_lahjoitukset'); + +$showLegend = array_key_exists('showLegend', $attributes) ? (bool) $attributes['showLegend'] : true; +$showLegendSingle = array_key_exists('showLegendSingle', $attributes) ? (bool) $attributes['showLegendSingle'] : null; +$showLegendRecurring = array_key_exists('showLegendRecurring', $attributes) ? (bool) $attributes['showLegendRecurring'] : null; + +$grouped = []; +foreach ($providers as $p) { + if (!is_array($p)) { + continue; + } + + $type = isset($p['type']) ? (string) $p['type'] : ''; + $value = isset($p['value']) ? (string) $p['value'] : ''; + $label = isset($p['label']) ? (string) $p['label'] : ''; + + if ($type === '' || $value === '') { + continue; + } + + if (!isset($grouped[$type])) { + $grouped[$type] = []; + } + + $grouped[$type][] = ['type' => $type, 'value' => $value, 'label' => $label]; +} + +$isLegendShownForType = static function (string $type) use ($showLegend, $showLegendSingle, $showLegendRecurring): bool { + if ($type === 'single') { + return $showLegendSingle ?? $showLegend; + } + if ($type === 'recurring') { + return $showLegendRecurring ?? $showLegend; + } + return $showLegend; +}; + +$wrapper_attrs = get_block_wrapper_attributes(); + +?> +
> + $list) : + $single = count($list) === 1; + $showForType = $isLegendShownForType((string) $type); + + $legend_class = 'fame-form__legend' . ($showForType ? '' : ' screen-reader-text'); + ?> +
+ + + + + + + + + +
+ +
+ +
+ +
\ No newline at end of file diff --git a/src/Blocks/donation-providers/save.tsx b/src/Blocks/donation-providers/save.tsx index 96a603c..af2f1fd 100644 --- a/src/Blocks/donation-providers/save.tsx +++ b/src/Blocks/donation-providers/save.tsx @@ -1,112 +1,6 @@ -import React from 'react' -import { RichText, useBlockProps } from '@wordpress/block-editor' -import { SaveProps } from '../common/types.ts' - -type Provider = { value: string; label: string; type: string } - -type Attrs = { - providers?: Provider[] - legend?: string - // old (fallback) - showLegend?: boolean - showLegendSingle?: boolean - showLegendRecurring?: boolean -} - /** - * The save function defines the way in which the different attributes should - * be combined into the final markup, which is then serialized by the block - * editor into `post_content`. - * - * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save + * Dynamic block – rendering happens in PHP (render.php). */ -export default function Save({ attributes }: SaveProps): React.JSX.Element { - const { - providers = [], - legend = 'Payment provider', - showLegend = true, - showLegendSingle, - showLegendRecurring, - } = attributes - - const blockProps = useBlockProps.save() - - const grouped = providers.reduce>((acc, p) => { - ;(acc[p.type] ||= []).push(p) - return acc - }, {}) - - const isLegendShownForType = (type: string) => { - if (type === 'single') return showLegendSingle ?? showLegend ?? true - if (type === 'recurring') return showLegendRecurring ?? showLegend ?? true - return showLegend ?? true - } - - return ( -
- {Object.entries(grouped).map(([type, list]) => { - const single = list.length === 1 - const showForType = isLegendShownForType(type) - - return ( -
- - - {single && ( - - )} - - {list.map(provider => { - const hideSingleLabel = single && !showForType - - return ( -
- -
- ) - })} -
- ) - })} -
- ) +export default function save() { + return null } From af2503b8ad60361603f3a2cc33f7e397ee2becd1 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 18 Feb 2026 14:05:35 +0200 Subject: [PATCH 04/34] LHJ-149: Refactor form controls block to use dynamic rendering, remove deprecated save function --- src/Blocks/form-controls/block.json | 15 ++++-- .../form-controls/deprecated/save-v1.tsx | 27 ---------- src/Blocks/form-controls/edit.tsx | 2 +- src/Blocks/form-controls/index.ts | 24 --------- src/Blocks/form-controls/render.php | 47 +++++++++++++++++ src/Blocks/form-controls/save.tsx | 50 +++---------------- 6 files changed, 64 insertions(+), 101 deletions(-) delete mode 100644 src/Blocks/form-controls/deprecated/save-v1.tsx create mode 100644 src/Blocks/form-controls/render.php diff --git a/src/Blocks/form-controls/block.json b/src/Blocks/form-controls/block.json index 37a73d2..0a71bb2 100644 --- a/src/Blocks/form-controls/block.json +++ b/src/Blocks/form-controls/block.json @@ -10,12 +10,16 @@ "attributes": { "submitLabel": { "type": "string", - "source": "text", - "selector": ".fame-form__controls [type=\"submit\"]", "default": "Donate" }, - "submitLabelSingle": { "type": "string", "default": "Donate" }, - "submitLabelRecurring": { "type": "string", "default": "Donate" } + "submitLabelSingle": { + "type": "string", + "default": "Donate" + }, + "submitLabelRecurring": { + "type": "string", + "default": "Donate" + } }, "supports": { "multiple": false, @@ -30,5 +34,6 @@ }, "icon": "button", "textdomain": "fame_lahjoitukset", - "editorScript": "file:./index.js" + "editorScript": "file:./index.js", + "render": "file:./render.php" } diff --git a/src/Blocks/form-controls/deprecated/save-v1.tsx b/src/Blocks/form-controls/deprecated/save-v1.tsx deleted file mode 100644 index 8253436..0000000 --- a/src/Blocks/form-controls/deprecated/save-v1.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { __ } from '@wordpress/i18n' -import { RichText, useBlockProps } from '@wordpress/block-editor' -import React from 'react' -import { SaveProps } from '../../common/types.ts' - -type AttributesV1 = { - submitLabel?: string -} - -export default function SaveV1({ - attributes: { submitLabel = __('Donate', 'fame_lahjoitukset') }, -}: SaveProps): React.JSX.Element { - return ( -
- - -
- ) -} diff --git a/src/Blocks/form-controls/edit.tsx b/src/Blocks/form-controls/edit.tsx index 871504e..09e8e97 100644 --- a/src/Blocks/form-controls/edit.tsx +++ b/src/Blocks/form-controls/edit.tsx @@ -75,7 +75,7 @@ export default function Edit({
setLabelForType(currentType, value)} diff --git a/src/Blocks/form-controls/index.ts b/src/Blocks/form-controls/index.ts index c084afc..6cc909e 100644 --- a/src/Blocks/form-controls/index.ts +++ b/src/Blocks/form-controls/index.ts @@ -11,7 +11,6 @@ import { registerBlockType } from '@wordpress/blocks' import Edit from './edit' import save from './save' import metadata from './block.json' -import SaveV1 from './deprecated/save-v1' /** * Every block starts by registering a new block type definition. @@ -28,27 +27,4 @@ registerBlockType(metadata.name, { * @see ./save.js */ save, - - /** - * Support old saved content (before submitLabelSingle/Recurring - * and before switching from RichText.Content to + + +
\ No newline at end of file diff --git a/src/Blocks/form-controls/save.tsx b/src/Blocks/form-controls/save.tsx index 6a5149d..9e8345e 100644 --- a/src/Blocks/form-controls/save.tsx +++ b/src/Blocks/form-controls/save.tsx @@ -1,46 +1,8 @@ -import { __ } from '@wordpress/i18n' -import { useBlockProps } from '@wordpress/block-editor' -import React from 'react' -import { SaveProps } from '../common/types.ts' +/** + * Dynamic block – rendering happens in PHP (render.php). + * Nothing is saved to post_content. + */ -type Attributes = { - submitLabel?: string // legacy - submitLabelSingle?: string - submitLabelRecurring?: string +export default function save() { + return null } - -const Save = ({ - attributes: { - submitLabel = __('Donate', 'fame_lahjoitukset'), - submitLabelSingle, - submitLabelRecurring, - }, -}: SaveProps): React.JSX.Element => { - // What text should be placed directly inside the button? - // if single/recurring same -> ok - // otherwise use legacy and give data attributes to JS for replacement - const resolved = - submitLabelSingle && submitLabelRecurring && submitLabelSingle === submitLabelRecurring - ? submitLabelSingle - : submitLabel - - return ( -
- - - -
- ) -} - -export default Save From 937be27a0be7949dc899320f479c092e2787394a Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 18 Feb 2026 14:54:17 +0200 Subject: [PATCH 05/34] LHJ-149: Refactor donation type block to use dynamic rendering, add PHP render file, and remove deprecated save function --- src/Blocks/donation-type/block.json | 54 ++------------ src/Blocks/donation-type/edit.tsx | 15 +++- src/Blocks/donation-type/render.php | 111 ++++++++++++++++++++++++++++ src/Blocks/donation-type/save.tsx | 59 +-------------- 4 files changed, 134 insertions(+), 105 deletions(-) create mode 100644 src/Blocks/donation-type/render.php diff --git a/src/Blocks/donation-type/block.json b/src/Blocks/donation-type/block.json index 08d71b1..1cae612 100644 --- a/src/Blocks/donation-type/block.json +++ b/src/Blocks/donation-type/block.json @@ -7,61 +7,23 @@ "category": "widgets", "description": "Allows selecting donation type.", "parent": ["famehelsinki/donation-form"], - "example": {}, "attributes": { - "showLegend": { - "type": "boolean", - "source": "attribute", - "selector": ".fame-form__legend:not(.screen-reader-text)", - "attribute": "class", - "default": true - }, - "legend": { - "type": "string", - "source": "text", - "selector": ".fame-form__legend", - "default": "Donation type" - }, - "value": { - "type": "string", - "source": "attribute", - "selector": "input[name=\"type\"]:checked", - "attribute": "value" - }, - "types": { - "type": "array", - "source": "query", - "selector": ".fame-form__group,.fame-form__hidden", - "query": { - "value": { - "type": "string", - "source": "attribute", - "selector": "input[name=\"type\"]", - "attribute": "value" - }, - "label": { - "type": "string", - "source": "text", - "selector": ".fame-form__label" - } - } - } + "showLegend": { "type": "boolean", "default": true }, + "legend": { "type": "string", "default": "Donation type" }, + "value": { "type": "string", "default": "" }, + "types": { "type": "array", "default": [] } }, "usesContext": ["famehelsinki/donation-types"], "supports": { "multiple": false, - "color": { - "background": false, - "text": true - }, + "color": { "background": false, "text": true }, "html": false, - "typography": { - "fontSize": true - } + "typography": { "fontSize": true } }, "icon": "edit-page", "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", - "style": "file:./style-index.css" + "style": "file:./style-index.css", + "render": "file:./render.php" } diff --git a/src/Blocks/donation-type/edit.tsx b/src/Blocks/donation-type/edit.tsx index 0d3f466..c6d6313 100644 --- a/src/Blocks/donation-type/edit.tsx +++ b/src/Blocks/donation-type/edit.tsx @@ -28,19 +28,26 @@ export default function Edit({ const { types, value } = attributes useEffect(() => { + const enabled = + Array.isArray(enabledTypes) && enabledTypes.length > 0 + ? enabledTypes + : DONATION_TYPES.map(t => t.value) + // Calculate updated types. // - enabled types might have changed. // - enabled types might have been removed. const update = DONATION_TYPES // Filter all enabled types. - .filter(({ value }) => enabledTypes?.includes(value)) + .filter(({ value }) => enabled.includes(value)) // Use existing type from if it exists, otherwise add // new with default label from DONATION_TYPES array. .map(t => types?.find(({ value }) => t.value === value) ?? t) - // Check if update includes current default value. - // If not, set first element as the new default value. - const defaultValue = update?.find(type => type.value === value)?.value || update?.[0]?.value + // Calculate default value. Use existing if it exists in updated list, otherwise use first from updated list or fallback to default. + const defaultValue = + update?.find(type => type.value === value)?.value ?? + update?.[0]?.value ?? + DEFAULT_DONATION_TYPE.value // Update if the list has changed. Calling setAttributes // without this check leads to infinite recursion. diff --git a/src/Blocks/donation-type/render.php b/src/Blocks/donation-type/render.php new file mode 100644 index 0000000..e8e7e8a --- /dev/null +++ b/src/Blocks/donation-type/render.php @@ -0,0 +1,111 @@ +|null $attributes Block attributes. + * @var string|null $content Inner content (unused here). + * @var WP_Block $block Block instance. + */ + +$attributes = $attributes ?? []; + +$show_legend = array_key_exists('showLegend', $attributes) ? (bool) $attributes['showLegend'] : true; + +$legend = (isset($attributes['legend']) && trim((string) $attributes['legend']) !== '') + ? (string) $attributes['legend'] + : __('Donation type', 'fame_lahjoitukset'); + +$saved_types = (isset($attributes['types']) && is_array($attributes['types'])) ? $attributes['types'] : []; +$saved_value = isset($attributes['value']) ? (string) $attributes['value'] : ''; + +// Context: enabled donation types from parent (providesContext). +$enabled_types = []; +if (array_key_exists('famehelsinki/donation-types', $block->context)) { + $raw = $block->context['famehelsinki/donation-types']; + if (is_array($raw)) { + $enabled_types = array_values(array_map('strval', $raw)); + } +} + +// Types comes from attributes (saved) or context (enabled) or fallback (default). +$types = !empty($saved_types) + ? $saved_types + : [ + ['value' => 'single', 'label' => __('Single', 'fame_lahjoitukset')], + ['value' => 'recurring', 'label' => __('Recurring', 'fame_lahjoitukset')], + ]; + +$types = array_values(array_filter( + $types, + static fn($t) => + is_array($t) && isset($t['value']) && (string) $t['value'] !== '' +)); + +if (!empty($enabled_types)) { + $types = array_values(array_filter( + $types, + static fn($t) => in_array((string) $t['value'], $enabled_types, true) + )); +} + +// Fallback +if (empty($types)) { + $types = [ + ['value' => 'single', 'label' => __('Single', 'fame_lahjoitukset')], + ]; +} + +$values = array_map(static fn($t) => (string) ($t['value'] ?? ''), $types); + +$default_value = + ($saved_value !== '' && in_array($saved_value, $values, true)) + ? $saved_value + : (string) ($types[0]['value'] ?? ''); + +$is_hidden = count($types) <= 1; + +$classes = $is_hidden + ? 'fame-form__hidden' + : 'fame-form__fieldset fame-form__fieldset--donation-type'; + +$wrapper_attrs = get_block_wrapper_attributes(['class' => $classes]); + +?> + + +
> + +
+ +
> + + + + + +
+ +
+ +
+ \ No newline at end of file diff --git a/src/Blocks/donation-type/save.tsx b/src/Blocks/donation-type/save.tsx index 4d2aa1f..9e8345e 100644 --- a/src/Blocks/donation-type/save.tsx +++ b/src/Blocks/donation-type/save.tsx @@ -1,59 +1,8 @@ -import { RichText, useBlockProps } from '@wordpress/block-editor' -import React from 'react' -import { DEFAULT_DONATION_TYPE } from '../common/donation-type.ts' -import { SaveProps } from '../common/types.ts' -import { Attributes } from './edit.tsx' - /** - * The save function defines the way in which the different attributes should - * be combined into the final markup, which is then serialized by the block - * editor into `post_content`. - * - * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save + * Dynamic block – rendering happens in PHP (render.php). + * Nothing is saved to post_content. */ -export default function save({ attributes }: SaveProps): React.JSX.Element { - const { legend, showLegend, types, value: defaultValue } = attributes - const isHidden = !Array.isArray(types) || types.length <= 1 - const blockProps = useBlockProps.save({ - className: isHidden - ? 'fame-form__hidden' - : 'fame-form__fieldset fame-form__fieldset--donation-type', - }) - - if (isHidden) { - return ( -
- -
- ) - } - return ( -
- - {types.map(({ value, label }) => ( -
- -
- ))} -
- ) +export default function save() { + return null } From 36f19e626e7c845a194d347e50dc389eeceb462d Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 18 Feb 2026 14:57:34 +0200 Subject: [PATCH 06/34] LHJ-149: Refactor AmountHandler to improve type selection logic and handle fallback cases --- .../donation-form/view/AmountHandler.ts | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Blocks/donation-form/view/AmountHandler.ts b/src/Blocks/donation-form/view/AmountHandler.ts index e469eff..3cf7f94 100644 --- a/src/Blocks/donation-form/view/AmountHandler.ts +++ b/src/Blocks/donation-form/view/AmountHandler.ts @@ -325,16 +325,36 @@ export default class AmountHandler { }) const types = form.elements.namedItem('type') + + // RadioNodeList (normal case) if (types instanceof RadioNodeList) { types.forEach(radio => radio.addEventListener('change', onChangeType)) // Ensure that state is up to date. - const selected = Array.prototype.find.call(types, type => type.checked) - if (selected) { + const selected = Array.prototype.find.call(types, (t: any) => t?.checked) as + | HTMLInputElement + | undefined + + if (selected?.value) { this.#updateType(selected.value) + } else { + // Fallback: if nothing checked, still try first value if exists + const first = types[0] as any as HTMLInputElement | undefined + if (first?.value) this.#updateType(first.value) } } + // Hidden input for single-type forms. + else if (types instanceof HTMLInputElement && types.value) { + this.#updateType(types.value) + } + + // No type field at all: if there is exactly one wrapper, initialize it + else if (this.#wrappers.length === 1) { + const selectedAmount = this.#wrappers[0].ensureSelection() + this.#onChangeAmount(selectedAmount) + } + // Extra safety: if submit is attempted while invalid, block it. form.addEventListener( 'submit', From c4f0809671474b8bfadc830b122ff4bac9f71c72 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 18 Feb 2026 14:58:02 +0200 Subject: [PATCH 07/34] LHJ-149: Bump version to 1.1.2 in plugin header --- fame-lahjoitukset.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fame-lahjoitukset.php b/fame-lahjoitukset.php index 4755382..c3203d3 100644 --- a/fame-lahjoitukset.php +++ b/fame-lahjoitukset.php @@ -7,7 +7,7 @@ /** * Plugin Name: Lahjoitin * Description: Wordpress plugin for Fame lahjoitukset system. - * Version: 1.1 + * Version: 1.1.2 * Requires at least: 6.7 * Requires PHP: 8.3 * Author: Fame Helsinki From 3410c3b45f8faa18818e4d39d6e828fa6f9a8781 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Tue, 24 Feb 2026 14:33:08 +0200 Subject: [PATCH 08/34] LHJ-140: Refactor contact form block to support toggle visibility of contact fields --- src/Blocks/contact-form/block.json | 5 +- src/Blocks/contact-form/edit.tsx | 170 +++++++++++++++++------------ src/Blocks/contact-form/render.php | 5 + 3 files changed, 107 insertions(+), 73 deletions(-) diff --git a/src/Blocks/contact-form/block.json b/src/Blocks/contact-form/block.json index e01a563..9a31c26 100644 --- a/src/Blocks/contact-form/block.json +++ b/src/Blocks/contact-form/block.json @@ -33,7 +33,9 @@ "postal_code_help": { "type": "string", "default": "Postal code" }, "phone_label": { "type": "string", "default": "Phone" }, - "phone_help": { "type": "string", "default": "" } + "phone_help": { "type": "string", "default": "" }, + + "show": { "type": "boolean", "default": true } }, "supports": { "multiple": false, @@ -45,6 +47,5 @@ "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", - "style": "file:./style-index.css", "render": "file:./render.php" } diff --git a/src/Blocks/contact-form/edit.tsx b/src/Blocks/contact-form/edit.tsx index f7f4d30..f93f45a 100644 --- a/src/Blocks/contact-form/edit.tsx +++ b/src/Blocks/contact-form/edit.tsx @@ -14,96 +14,124 @@ import { EditProps } from '../common/types.ts' */ export default function Edit({ attributes, setAttributes }: EditProps): React.JSX.Element { const { contact, showAddress, showPhone, showLegend, legend } = attributes + const { show = true } = attributes as { show?: boolean } return ( <> setAttributes({ contact })} - /> - setAttributes({ showAddress })} - /> - setAttributes({ showPhone })} - /> - setAttributes({ showLegend: checked })} - /> - setAttributes({ legend: value })} + label={__('Show contact fields', 'fame_lahjoitukset')} + checked={attributes.show} + onChange={value => setAttributes({ show: value })} /> + + {show && ( + <> + setAttributes({ contact: value })} + /> + setAttributes({ showAddress: value })} + /> + setAttributes({ showPhone: value })} + /> + setAttributes({ showLegend: checked })} + /> + setAttributes({ legend: value })} + /> + + )}
- {showLegend && ( - setAttributes({ legend: value })} - /> - )} - - - {showAddress && ( + {show ? ( <> - setAttributes({ legend: value })} + /> + )} + - + {showAddress && ( + <> + + + + )} + {showPhone && ( + + )} - )} - {showPhone && ( - + ) : ( +
+ {__( + 'The contact form is not in use. Use the toggle in the sidebar to enable it.', + 'fame_lahjoitukset' + )} +
)}
diff --git a/src/Blocks/contact-form/render.php b/src/Blocks/contact-form/render.php index c04eac4..0748935 100644 --- a/src/Blocks/contact-form/render.php +++ b/src/Blocks/contact-form/render.php @@ -15,6 +15,11 @@ /** @var array|null $attributes */ $attributes = $attributes ?? []; +$show = array_key_exists('show', $attributes) ? (bool) $attributes['show'] : true; +if (!$show) { + return; +} + $showLegend = array_key_exists('showLegend', $attributes) ? (bool) $attributes['showLegend'] : true; $legend = isset($attributes['legend']) && trim((string) $attributes['legend']) !== '' ? (string) $attributes['legend'] From d8f65a4d94fe46aa50c9ef14792cf3be7e74d20d Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Tue, 24 Feb 2026 14:33:36 +0200 Subject: [PATCH 09/34] LHJ-149: Remove unused style reference --- src/Blocks/donation-amounts/block.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Blocks/donation-amounts/block.json b/src/Blocks/donation-amounts/block.json index e51e524..aeea4c8 100644 --- a/src/Blocks/donation-amounts/block.json +++ b/src/Blocks/donation-amounts/block.json @@ -48,6 +48,5 @@ "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", - "style": "file:./style-index.css", "render": "file:./render.php" } From af54da2808004bb91a8290683ccc25e34edc6134 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Tue, 24 Feb 2026 15:20:57 +0200 Subject: [PATCH 10/34] LHJ-149: Refactor donation form block to support dynamic rendering, add render.php, and update attributes for improved functionality --- src/Blocks/donation-form/block.json | 27 +-- src/Blocks/donation-form/edit.tsx | 333 +++++++++++++++++++++++----- src/Blocks/donation-form/render.php | 126 +++++++++++ src/Blocks/donation-form/save.tsx | 66 +----- 4 files changed, 424 insertions(+), 128 deletions(-) create mode 100644 src/Blocks/donation-form/render.php diff --git a/src/Blocks/donation-form/block.json b/src/Blocks/donation-form/block.json index 7a4554b..3bc0b15 100644 --- a/src/Blocks/donation-form/block.json +++ b/src/Blocks/donation-form/block.json @@ -7,31 +7,28 @@ "category": "widgets", "description": "Gutenberg block for Fame donation system.", "example": {}, - "allowedBlocks": ["core/paragraph", "core/group"], "providesContext": { "famehelsinki/donation-types": "types" }, "attributes": { "types": { - "type": "array" + "type": "array", + "default": [] + }, + "colsDesktop": { + "type": "number", + "default": 3 }, "token": { "type": "boolean", - "source": "attribute", - "selector": ".fame-form", - "attribute": "data-token" + "default": false }, "campaign": { "type": "string", - "source": "attribute", - "selector": ".fame-form input[name=\"campaign\"]", - "attribute": "value" + "default": "" }, "returnAddress": { "type": "string", - "source": "attribute", - "selector": ".fame-form input[name=\"return_address\"]", - "attribute": "value", "default": "/" }, "primaryColor": { @@ -57,10 +54,6 @@ "borderWidth": { "type": "string", "default": "1px" - }, - "useModernStyle": { - "type": "boolean", - "default": true } }, "supports": { @@ -77,10 +70,12 @@ "fontSize": true } }, + "allowedBlocks": ["core/columns"], "icon": "money", "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", "viewScript": "file:./view.js", - "style": "file:./view.css" + "style": "file:./view.css", + "render": "file:./render.php" } diff --git a/src/Blocks/donation-form/edit.tsx b/src/Blocks/donation-form/edit.tsx index e18390f..c8e36e7 100644 --- a/src/Blocks/donation-form/edit.tsx +++ b/src/Blocks/donation-form/edit.tsx @@ -1,5 +1,11 @@ +import React, { useEffect } from 'react' import { __ } from '@wordpress/i18n' -import { InspectorControls, useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor' +import { + InspectorControls, + InnerBlocks, + useBlockProps, + store as blockEditorStore, +} from '@wordpress/block-editor' import { PanelBody, TextControl, @@ -7,29 +13,181 @@ import { CheckboxControl, ColorPicker, BaseControl, + RangeControl, } from '@wordpress/components' -import React, { useEffect } from 'react' +import { useInstanceId } from '@wordpress/compose' +import { useDispatch, useSelect } from '@wordpress/data' +import { createBlock, type BlockInstance } from '@wordpress/blocks' + import { DEFAULT_DONATION_TYPE, getDonationLabel, DONATION_TYPES } from '../common/donation-type.ts' import { EditProps } from '../common/types.ts' -import { useInstanceId } from '@wordpress/compose' -const TEMPLATE_LOCK = { lock: { remove: 'true' } } -const TEMPLATE = [ - 'famehelsinki/donation-type', - 'famehelsinki/donation-amounts', - 'famehelsinki/donation-providers', - 'famehelsinki/form-controls', -].map(block => [block, TEMPLATE_LOCK, []] as const) +const TOP_ALLOWED_BLOCKS = ['core/columns'] as const + +const DEFAULT_TERMS_TEXT = __( + 'Lahjoittamalla hyväksyt tietosuojakäytännön ja tilaus- ja peruutusehdot', + 'fame_lahjoitukset' +) + +const TERMS_ANCHOR = 'fame-terms' + +function buildInitialLayout(colsDesktop: 1 | 2 | 3): BlockInstance[] { + const group = (inner: BlockInstance[] = []) => createBlock('core/group', {}, inner) + + const donationType = createBlock('famehelsinki/donation-type') + const donationAmounts = createBlock('famehelsinki/donation-amounts') + const contactForm = createBlock('famehelsinki/contact-form') + const donationProviders = createBlock('famehelsinki/donation-providers') + const formControls = createBlock('famehelsinki/form-controls') + + const termsParagraph = createBlock('core/paragraph', { + anchor: TERMS_ANCHOR, + content: DEFAULT_TERMS_TEXT, + }) + + const g1 = group([donationType, donationAmounts]) + const g2 = group([contactForm]) + const g3 = group([donationProviders, termsParagraph, formControls]) + + const columns = buildColumnsFromGroups(colsDesktop, [g1, g2, g3]) + return [columns] +} + +function buildColumnsFromGroups(colsDesktop: 1 | 2 | 3, groups: BlockInstance[]): BlockInstance { + let columnsContent: BlockInstance[][] + if (colsDesktop === 1) { + columnsContent = [[groups[0], groups[1], groups[2]]] + } else if (colsDesktop === 2) { + columnsContent = [[groups[0], groups[1]], [groups[2]]] + } else { + columnsContent = [[groups[0]], [groups[1]], [groups[2]]] + } + + return createBlock( + 'core/columns', + {}, + columnsContent.map(inner => createBlock('core/column', {}, inner)) + ) +} + +/** + * Read the 3 core/group blocks inside the top columns, in visual order. + * If not exactly 3 groups, return null (structure unexpected). + */ +function readTopGroups(blocks: BlockInstance[]): BlockInstance[] | null { + const top = blocks?.[0] + if (!top || top.name !== 'core/columns') return null + + const groups: BlockInstance[] = [] + for (const col of top.innerBlocks ?? []) { + for (const child of col.innerBlocks ?? []) { + if (child.name === 'core/group') groups.push(child as BlockInstance) + } + } + return groups.length === 3 ? groups : null +} -const ALLOWED_BLOCKS = ['core/group', 'core/paragraph'] +function findGroupContainingFormControls(groups: BlockInstance[]): BlockInstance | null { + for (const g of groups) { + const inner = (g.innerBlocks ?? []) as BlockInstance[] + if (inner.some(b => b.name === 'famehelsinki/form-controls')) return g + } + return null +} + +function isTermsParagraph(b: BlockInstance): boolean { + return b.name === 'core/paragraph' && (b.attributes as any)?.anchor === TERMS_ANCHOR +} /** - * The edit function describes the structure of your block in the context of the - * editor. This represents what the editor will render when the block is used. + * Ensure: + * - exactly one terms paragraph (anchor=fame-terms) + * - positioned right before famehelsinki/form-controls * - * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#edit + * Returns SAME array reference if no changes are needed. + */ +function ensureTermsBeforeFormControls(children: BlockInstance[]): BlockInstance[] { + const idxForm = children.findIndex(b => b.name === 'famehelsinki/form-controls') + if (idxForm === -1) return children + + const termsIdxs: number[] = [] + for (let i = 0; i < children.length; i++) { + if (isTermsParagraph(children[i])) termsIdxs.push(i) + } + + // Missing: insert + if (termsIdxs.length === 0) { + const next = [...children] + next.splice( + idxForm, + 0, + createBlock('core/paragraph', { anchor: TERMS_ANCHOR, content: DEFAULT_TERMS_TEXT }) + ) + return next + } + + // One: move if needed + if (termsIdxs.length === 1) { + const idxTerms = termsIdxs[0] + if (idxTerms === idxForm - 1) return children + + const next = [...children] + const [terms] = next.splice(idxTerms, 1) + const idxForm2 = next.findIndex(b => b.name === 'famehelsinki/form-controls') + next.splice(idxForm2, 0, terms) + return next + } + + // Many: drop extras, then position + const keepIdx = termsIdxs[0] + let changed = false + const filtered: BlockInstance[] = [] + for (let i = 0; i < children.length; i++) { + const isTerms = isTermsParagraph(children[i]) + if (!isTerms) { + filtered.push(children[i]) + continue + } + if (i === keepIdx) { + filtered.push(children[i]) + } else { + changed = true + } + } + + const idxForm2 = filtered.findIndex(b => b.name === 'famehelsinki/form-controls') + const idxTerms2 = filtered.findIndex(isTermsParagraph) + if (idxForm2 === -1 || idxTerms2 === -1) { + return changed ? filtered : children + } + + if (idxTerms2 === idxForm2 - 1) { + return changed ? filtered : children + } + + const out = [...filtered] + const [terms] = out.splice(idxTerms2, 1) + const idxForm3 = out.findIndex(b => b.name === 'famehelsinki/form-controls') + out.splice(idxForm3, 0, terms) + return out +} + +/** + * Repack: rebuild core/columns with desired col count, + * but keep the SAME 3 group blocks (preserve content & clientIds). */ -export default function Edit({ attributes, setAttributes }: EditProps): React.JSX.Element { +function repackColumns(colsDesktop: 1 | 2 | 3, currentTop: BlockInstance, groups: BlockInstance[]) { + const next = buildColumnsFromGroups(colsDesktop, groups) + // Preserve top-level columns attributes if you ever add any to columns + next.attributes = { ...(currentTop.attributes as any) } + return next +} + +export default function Edit({ + attributes, + setAttributes, + clientId, +}: EditProps & { clientId: string }): React.JSX.Element { const { types, returnAddress, @@ -40,8 +198,8 @@ export default function Edit({ attributes, setAttributes }: EditProps): React.JS thirdColor, borderRadius, borderWidth, - useModernStyle, textFieldBorderRadius, + colsDesktop, } = attributes as { types?: string[] returnAddress?: string @@ -53,11 +211,11 @@ export default function Edit({ attributes, setAttributes }: EditProps): React.JS borderWidth?: string textFieldBorderRadius?: string token?: boolean - useModernStyle?: boolean + colsDesktop?: number } - // Having a type is always required. Set a default - // value if the list is uninitialized or empty. + const cols = Math.min(3, Math.max(1, colsDesktop ?? 3)) as 1 | 2 | 3 + useEffect(() => { if (!types || types.length === 0) { setAttributes({ types: [DEFAULT_DONATION_TYPE.value] }) @@ -72,9 +230,9 @@ export default function Edit({ attributes, setAttributes }: EditProps): React.JS | '--primary-color' | '--secondary-color' | '--third-color' - | '--border-radius' - | '--border-width' - | '--text-field-border-radius', + | '--fame-border-radius' + | '--fame-border-width' + | '--fame-text-field-border-radius', string > > @@ -83,19 +241,83 @@ export default function Edit({ attributes, setAttributes }: EditProps): React.JS '--primary-color': primaryColor ?? undefined, '--secondary-color': secondaryColor ?? undefined, '--third-color': thirdColor ?? undefined, - '--border-radius': borderRadius ?? undefined, - '--border-width': borderWidth ?? undefined, - '--text-field-border-radius': textFieldBorderRadius ?? undefined, + '--fame-border-radius': borderRadius ?? undefined, + '--fame-border-width': borderWidth ?? undefined, + '--fame-text-field-border-radius': textFieldBorderRadius ?? undefined, } const primaryColorId = useInstanceId(BaseControl, 'primary-color') const secondaryColorId = useInstanceId(BaseControl, 'secondary-color') const thirdColorId = useInstanceId(BaseControl, 'third-color') + const innerBlocks = useSelect( + select => select(blockEditorStore).getBlocks(clientId) as BlockInstance[], + [clientId] + ) + const { replaceInnerBlocks } = useDispatch(blockEditorStore) + + /** + * Single effect that: + * - initializes if empty/broken + * - repacks columns when colsDesktop changes (without losing content) + * - ensures terms paragraph exists & is correctly placed + */ + useEffect(() => { + const nextInit = buildInitialLayout(cols) + + // Init: empty + if (!innerBlocks || innerBlocks.length === 0) { + replaceInnerBlocks(clientId, nextInit, false) + return + } + + const top = innerBlocks[0] + const hasColumnsTop = innerBlocks.length === 1 && top?.name === 'core/columns' + if (!hasColumnsTop) { + replaceInnerBlocks(clientId, nextInit, false) + return + } + + const groups = readTopGroups(innerBlocks) + if (!groups) { + replaceInnerBlocks(clientId, nextInit, false) + return + } + + // Ensure terms paragraph inside the group that has form-controls + const group3 = findGroupContainingFormControls(groups) + if (group3) { + const children = (group3.innerBlocks ?? []) as BlockInstance[] + const nextChildren = ensureTermsBeforeFormControls(children) + + if (nextChildren !== children) { + // Replace only that group's inner blocks (preserves group block itself) + replaceInnerBlocks(group3.clientId, nextChildren, false) + return + } + } + + // Repack columns only if count differs + const currentColCount = top.innerBlocks?.length ?? 0 + if (currentColCount !== cols) { + const nextTop = repackColumns(cols, top as BlockInstance, groups) + replaceInnerBlocks(clientId, [nextTop], false) + } + }, [cols, clientId, innerBlocks, replaceInnerBlocks]) + return ( <> + setAttributes({ colsDesktop: v ?? 3 })} + /> +
t !== type) } + next.sort((a, b) => order.indexOf(a) - order.indexOf(b)) setAttributes({ types: next }) }} @@ -140,6 +363,7 @@ export default function Edit({ attributes, setAttributes }: EditProps): React.JS value={returnAddress ?? ''} onChange={returnAddress => setAttributes({ returnAddress })} /> + setAttributes({ campaign })} /> + + + + setAttributes({ borderRadius: value })} /> + setAttributes({ borderWidth: value })} /> + setAttributes({ textFieldBorderRadius: value })} /> - setAttributes({ useModernStyle: value })} - /> + setAttributes({ token })} /> +
+ {...useBlockProps({ + className: 'fame-form__wrapper', + style: styleVars, + })} + > + null} + /> +
) } diff --git a/src/Blocks/donation-form/render.php b/src/Blocks/donation-form/render.php new file mode 100644 index 0000000..ad0fb29 --- /dev/null +++ b/src/Blocks/donation-form/render.php @@ -0,0 +1,126 @@ +|null $attributes + * @var string|null $content + * @var WP_Block|null $block + */ + +$attributes = $attributes ?? []; +$content = $content ?? ''; + +if (!function_exists('famehelsinki_sanitize_return_url')) { + /** + * Prevent open redirects: + * - If empty: homepage (absolute) + * - If relative "/path": convert to absolute with home_url() + * - If absolute: allow only same-host + */ + function famehelsinki_sanitize_return_url(string $url): string + { + $url = trim($url); + + $home = home_url('/'); + $site_host = wp_parse_url($home, PHP_URL_HOST); + + if (!$site_host) { + return $home; + } + + if ($url === '') { + return $home; + } + + // Relative path -> absolute + if (str_starts_with($url, '/')) { + return esc_url_raw(home_url($url)); + } + + // Absolute URL -> check host + $parsed = wp_parse_url($url); + if (!$parsed || empty($parsed['host'])) { + return $home; + } + + if ($parsed['host'] !== $site_host) { + return $home; + } + + // Keep user's absolute URL as-is (same host) + return esc_url_raw($url); + } +} + +$attrs = wp_parse_args($attributes, [ + 'returnAddress' => '/', + 'campaign' => '', + 'token' => false, + 'primaryColor' => '#000000', + 'secondaryColor' => '#FFFFFF', + 'thirdColor' => '#444', + 'borderRadius' => '0px', + 'borderWidth' => '1px', + 'textFieldBorderRadius' => '0px', +]); + +$container_classes = 'fame-form-container'; + +$wrapper_style = sprintf( + '--primary-color:%s;--secondary-color:%s;--third-color:%s;--fame-border-radius:%s;--fame-border-width:%s;--fame-text-field-border-radius:%s;', + esc_attr($attrs['primaryColor'] ?: 'inherit'), + esc_attr($attrs['secondaryColor'] ?: 'inherit'), + esc_attr($attrs['thirdColor'] ?: 'inherit'), + esc_attr($attrs['borderRadius'] ?: 'inherit'), + esc_attr($attrs['borderWidth'] ?: 'inherit'), + esc_attr($attrs['textFieldBorderRadius'] ?: 'inherit') +); + +$block_wrapper_attrs = get_block_wrapper_attributes([ + 'class' => $container_classes, +]); + +$token_attr = !empty($attrs['token']) ? ' data-token="1"' : ''; + +/** + * Render inner blocks robustly: + * - Prefer parsed block tree ($block->inner_blocks) + * - Fallback to serialized $content + */ +$inner = ''; + +if ($block instanceof WP_Block && count($block->inner_blocks) > 0) { + foreach ($block->inner_blocks as $inner_block) { + $inner .= $inner_block->render(); + } +} else { + $inner = $content !== '' ? do_blocks($content) : ''; +} + +$return_address = famehelsinki_sanitize_return_url((string) ($attrs['returnAddress'] ?? '/')); +?> +
> +
novalidate> +
+ +
+ + + + + + + +
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/src/Blocks/donation-form/save.tsx b/src/Blocks/donation-form/save.tsx index e67e944..e574ced 100644 --- a/src/Blocks/donation-form/save.tsx +++ b/src/Blocks/donation-form/save.tsx @@ -1,63 +1,15 @@ -import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor' import React from 'react' -import { SaveProps } from '../common/types.ts' +import { InnerBlocks } from '@wordpress/block-editor' /** - * The save function defines the way in which the different attributes should - * be combined into the final markup, which is then serialized by the block - * editor into `post_content`. + * This block is rendered dynamically on the server (render.php). * - * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save + * We still need to output so that child blocks + * are saved into post_content. WordPress uses this serialized structure + * to restore the block tree in the editor. + * + * The actual frontend markup is generated in PHP. */ -export default function save({ attributes }: SaveProps): React.JSX.Element { - const { - returnAddress, - campaign, - token, - primaryColor, - secondaryColor, - thirdColor, - borderRadius, - borderWidth, - textFieldBorderRadius, - useModernStyle, - } = attributes - - const blockProps = useBlockProps.save({ - className: `fame-form-container ${useModernStyle ? 'has-modern-style' : ''}`, - }) - const innerBlockProps = useInnerBlocksProps.save({ - className: 'fame-form__wrapper', - style: { - '--primary-color': primaryColor || 'inherit', - '--secondary-color': secondaryColor || 'inherit', - '--third-color': thirdColor || 'inherit', - '--border-radius': borderRadius || 'inherit', - '--border-width': borderWidth || 'inherit', - '--text-field-border-radius': textFieldBorderRadius || 'inherit', - }, - }) - - return ( -
-
-
- - - - - - {campaign && } - -
-
- Loading -
-
-
- ) +export default function save() { + return } From 62dc3d5d5aef69191c292db88d7eccf9b7f071bd Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Tue, 24 Feb 2026 15:21:32 +0200 Subject: [PATCH 11/34] LHJ-149: Refactor donation form styles --- src/Blocks/donation-form/edit.css | 343 +++++++++++---------- src/Blocks/donation-form/view.css | 485 +++++++++++++++++------------- 2 files changed, 445 insertions(+), 383 deletions(-) diff --git a/src/Blocks/donation-form/edit.css b/src/Blocks/donation-form/edit.css index a412ca5..c30dfe1 100644 --- a/src/Blocks/donation-form/edit.css +++ b/src/Blocks/donation-form/edit.css @@ -1,66 +1,61 @@ -/* Editor-only base styles for the block */ -.wp-block-famehelsinki-donation-form { - --form-element-border: var(--border-width, 2px) solid var(--primary-color, #000); - --form-element-padding: 4px 16px; +/* Editor-only styles for famehelsinki/donation-form + Keep editor preview aligned with front styles */ + +.editor-styles-wrapper .wp-block-famehelsinki-donation-form { + + /* allow container queries used by inner layouts */ + container-type: inline-size; } -.fame-form__wrapper > * + * { +/* Spacing between inner blocks inside our wrapper (editor markup) */ +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__wrapper > * + * { margin-top: 16px; } -/* Gutenberg editor draws button as a div, not a real button */ -.fame-form__controls .wp-element-button { +.editor-styles-wrapper +.wp-block-famehelsinki-donation-form +.fame-form__controls +.wp-element-button { display: inline; } -.fame-form__controls .donation-type__input { - color: var(--primary-color, #000); -} - -.fame-form__row { +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__row { display: flex; flex-wrap: wrap; gap: 0 16px; } -.fame-form__row > * { +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__row > * { flex: 1; } -.fame-form__help { +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__help { font-size: 0.8em; color: var(--third-color, #333); } -.fame-form__row > .fame-form__help { +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__row > .fame-form__help { flex-basis: 100%; } -.fame-form__group--required .fame-form__label::after { +.editor-styles-wrapper +.wp-block-famehelsinki-donation-form +.fame-form__group--required +.fame-form__label::after { content: "*"; color: #f00; } -/* ========================================================= - EDITOR: MODERN STYLES (apply only when class is set) - ========================================================= */ +/* Inputs: hide radios/checks visually but keep accessible (editor) */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style +.wp-block-famehelsinki-donation-form :where( .wp-block-famehelsinki-donation-type, .wp-block-famehelsinki-donation-amounts, .wp-block-famehelsinki-donation-providers ) -input[type="radio"], -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where( - .wp-block-famehelsinki-donation-type, - .wp-block-famehelsinki-donation-amounts, - .wp-block-famehelsinki-donation-providers -) -.fame-form__check-input { +:where(input[type="radio"], input[type="checkbox"], .fame-form__check-input) { position: absolute; width: 1px; height: 1px; @@ -73,49 +68,91 @@ input[type="radio"], border: 0; } -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.fame-form__legend) { +/* Legend */ + +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__legend { line-height: 1.3; margin: 0 0 0.5rem 0; } +/* Tabs / amount buttons: shared label look */ + .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-type) { +.wp-block-famehelsinki-donation-form +:where( + .wp-block-famehelsinki-donation-type .fame-form__label, + .wp-block-famehelsinki-donation-amounts .fame-form__label +) { + display: flex; + width: 100%; + min-width: 0; + box-sizing: border-box; + + justify-content: center; + align-items: center; + + padding: 0.5rem; + margin: 0; /* avoid overflow caused by per-label margins */ + border: var(--border-width, 1px) solid var(--primary-color, #000); + border-radius: var(--border-radius, 0); + + cursor: pointer; + user-select: none; +} + +/* Donation type layout in editor */ +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type { display: flex; flex-wrap: wrap; gap: 10px; } +/* Amounts grid in editor */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.donation-amounts__other-edit) { - flex-direction: column-reverse; - align-items: flex-start; +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 10px; } +.editor-styles-wrapper +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts > * { + min-width: 0; +} + +.editor-styles-wrapper +.wp-block-famehelsinki-donation-form +:where( + .wp-block-famehelsinki-donation-type .fame-form__label, + .wp-block-famehelsinki-donation-amounts .fame-form__label, + .wp-block-famehelsinki-donation-providers .provider-type__label +).fame-form__label--default { + background-color: var(--primary-color, #000); + color: var(--secondary-color, #fff); + border-color: var(--primary-color, #000); +} +/* Checked state (works when the input is actually toggled) */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style +.wp-block-famehelsinki-donation-form :where( .wp-block-famehelsinki-donation-type .fame-form__label, .wp-block-famehelsinki-donation-amounts .fame-form__label -) { - display: flex; - width: 100%; - justify-content: center; - align-items: center; - padding: 0.5rem; - border: var(--border-width) solid var(--primary-color); - border-radius: var(--border-radius); - cursor: pointer; - user-select: none; +):has(:where(input[type="radio"], input[type="checkbox"], .fame-form__check-input):checked) { + background-color: var(--primary-color, #000); + color: var(--secondary-color, #fff); + border-color: var(--primary-color, #000); } +/* Contact form: labels are not button-like */ + .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-contact-form) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-contact-form .fame-form__label { display: block; padding: 0; @@ -127,58 +164,63 @@ input[type="radio"], font-weight: 400; } +/* Editor uses fake input wrappers */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-contact-form) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-contact-form .fame-form__fake-input { - border: var(--border-width) solid var(--primary-color); - border-radius: var(--text-field-border-radius); + border: var(--border-width, 1px) solid var(--primary-color, #000); + border-radius: var(--text-field-border-radius, 0); } -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts) -.donation-amounts { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 10px; -} +/* Other amount (editor): label + input */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts .donation-amounts__other .fame-form__label { - position: relative; display: block; width: 100%; - margin-bottom: 0.3em; + margin: 0 0 0.3em 0; padding: 0; cursor: default; font-weight: 400; text-align: left; - border: var(--border-width) solid var(--primary-color); - border-radius: var(--border-radius); + border: 0; +} + +/* Make the actual input border match primary (requested) */ +.editor-styles-wrapper +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__other +:where(input, .fame-form__input) { + border: var(--border-width, 1px) solid var(--primary-color, #000) !important; + border-radius: var(--text-field-border-radius, 0) !important; + background: transparent; + color: var(--primary-color, #000); } +/* Unit positioning in editor */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts .donation-amounts__input-wrapper { position: relative; } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts .donation-amounts__input-wrapper input { padding-right: 2em; } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts .donation-amounts__input-wrapper .donation-amounts__unit { position: absolute; @@ -189,87 +231,41 @@ input { font-size: 0.9em; } -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts .fame-form__fieldset) { - border: 0; - padding: 0.01px 0 0; - margin: 0 0 16px 0; -} - -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts .donation-amounts > .fame-form__group) { - margin: 0; - padding: 0; -} - -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where( - .wp-block-famehelsinki-donation-amounts - .donation-amounts - > .fame-form__group - > .fame-form__label -) { - width: 100%; - margin: 0; - box-sizing: border-box; - display: flex; - justify-content: center; - align-items: center; -} +/* Fieldsets inside editor: remove UA spacing */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-amounts .donation-amounts > *) { - min-width: 0; -} - +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.fame-form__fieldset, .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.payment-method-selector.fame-form__fieldset) { +.wp-block-famehelsinki-donation-form +.payment-method-selector.fame-form__fieldset { border: 0; - padding: 0.01px 0 0.01px; + padding: 0.01px 0 0; margin: 0 0 16px 0; } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-form-controls) { - display: block; - padding-top: 16px; - margin-top: 0; -} - -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where( - .payment-method-selector.fame-form__fieldset > legend, - .payment-method-selector.fame-form__fieldset > .fame-form__legend -) { +.wp-block-famehelsinki-donation-form +.payment-method-selector.fame-form__fieldset +:where(legend, .fame-form__legend) { padding: 0; margin: 0 0 0.5rem 0; } -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.payment-method-selector.fame-form__fieldset > .fame-form__group) { - margin: 0; - padding: 0; -} +/* Providers layout in editor */ .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-providers) { +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers { display: flex; flex-wrap: wrap; gap: 10px; } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-providers) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers .fame-form__group label { display: block; @@ -279,68 +275,71 @@ label { } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-providers) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers .provider-type__label { width: 100%; + min-width: 0; box-sizing: border-box; + display: flex; justify-content: center; align-items: center; + padding: 0.5rem 1rem; - border: var(--border-width) solid var(--primary-color); - border-radius: var(--border-radius); + border: var(--border-width, 1px) solid var(--primary-color, #000); + border-radius: var(--border-radius, 0); + cursor: pointer; +} + +/* Controls spacing in editor */ + +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-form-controls { + display: block; + padding-top: 16px; + margin-top: 0; } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-form-controls) +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-form-controls .wp-element-button:focus-visible { filter: brightness(0.95); - outline: var(--border-width) solid var(--primary-color, var(--wp--preset--color--primary, #000)); + outline: + var(--border-width, 1px) solid + var(--primary-color, var(--wp--preset--color--primary, #000)); outline-offset: 2px; - color: var(--secondary-color); + color: var(--secondary-color, #fff); } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.wp-block-famehelsinki-donation-form) { - padding: 0; - border: none; -} - -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.donation-amounts__other__placeholder) { - border-color: var(--primary-color); - border-radius: var(--border-radius); - border-width: var(--border-width); - width: unset; +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__other__placeholder { + border: var(--border-width, 1px) solid var(--primary-color, #000); + border-radius: var(--border-radius, 0); + padding: 0.6rem 0.75rem; + box-sizing: border-box; } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.contact-form .fame-form__fake-input) { - border-color: var(--primary-color); - border-width: var(--border-width); +.wp-block-famehelsinki-donation-form +:where(.fame-form__label, .provider-type__label) { + font-size: inherit !important; + line-height: inherit !important; } .editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style -:where(.fame-form__label.fame-form__label--default) { - background-color: var(--primary-color); - color: var(--secondary-color); +.wp-block-famehelsinki-donation-form +:where(.fame-form__label *, .provider-type__label *) { + font-size: inherit !important; } -.editor-styles-wrapper -.wp-block-famehelsinki-donation-form.has-modern-style { - container-type: inline-size; -} +/* Responsive preview inside editor (container-based) */ -@container (max-width: 700px) { +@container (max-width: 1000px) { - .wp-block-famehelsinki-donation-form.has-modern-style - .is-layout-grid { + .editor-styles-wrapper .wp-block-famehelsinki-donation-form .is-layout-grid { grid-template-columns: 1fr !important; } } diff --git a/src/Blocks/donation-form/view.css b/src/Blocks/donation-form/view.css index 2f1731e..b2c3a83 100644 --- a/src/Blocks/donation-form/view.css +++ b/src/Blocks/donation-form/view.css @@ -1,5 +1,5 @@ /** - * @file Basic styling for form so that it looks OK by default. + * Fame donation form – front styles */ :root { @@ -9,6 +9,7 @@ --border-width: 1px; /* fallback */ } +/* Base form styles */ .fame-form-container * { box-sizing: border-box; } @@ -45,6 +46,8 @@ padding: 0.6rem 0.75rem; border: var(--border-width, 1px) solid var(--third-color); border-radius: var(--text-field-border-radius); + background: transparent; + color: var(--primary-color, #000); } .fame-form__input:focus { @@ -137,248 +140,308 @@ } } -/* ========================= MODERN STYLE ========================= */ -.wp-block-famehelsinki-donation-form.has-modern-style { +/* MODERN STYLE */ + +.wp-block-famehelsinki-donation-form { --hover-lighten: 16%; +} - .fame-form-container { - max-width: none !important; - } +.wp-block-famehelsinki-donation-form .fame-form__wrapper { + border: 0 !important; + border-style: none !important; + border-width: 0 !important; + outline: 0 !important; +} - .fame-form__input { - background-color: transparent; - color: var(--primary-color, #000); - } +.wp-block-famehelsinki-donation-form .fame-form-container { + max-width: none !important; +} - .fame-form__fieldset { - border: none; - padding: 0; - } +.wp-block-famehelsinki-donation-form .fame-form__input { + background-color: transparent; + color: var(--primary-color, #000); +} - .fame-form__legend { - padding: 0; - margin: 0 0 0.5em 0; - line-height: 1.3; - font-size: clamp(1rem, 4vw + 0.5rem, 1.5rem); - } +.wp-block-famehelsinki-donation-form .fame-form__fieldset { + border: none; + padding: 0; +} - .wp-block-famehelsinki-donation-amounts .fame-form__group, - .wp-block-famehelsinki-donation-type .fame-form__group { - display: block; - width: 100%; - } +.wp-block-famehelsinki-donation-form .fame-form__legend { + padding: 0; + margin: 0 0 0.5em 0; + line-height: 1.3; + font-size: clamp(1rem, 4vw + 0.5rem, 1.5rem); +} - .wp-block-famehelsinki-donation-type { - display: flex; - flex-wrap: wrap; - gap: 10px; - - /* stylelint-disable-next-line no-descending-specificity */ - .fame-form__label { - display: flex; - width: 100%; - justify-content: center; - align-items: center; - padding: 8px; - border: var(--border-width) solid var(--primary-color); - border-radius: var(--border-radius); - cursor: pointer; - margin-right: 0.5rem; - user-select: none; - - /* stylelint-disable-next-line no-descending-specificity */ - &:has(.fame-form__check-input:checked) { - background-color: var(--primary-color); - color: var(--secondary-color); - border-color: var(--primary-color); - } - - /* stylelint-disable-next-line no-descending-specificity */ - &:hover { - background: color-mix(in srgb, var(--primary-color) 12%, #fff 10%); - } - } - - /* stylelint-disable-next-line no-descending-specificity */ - .fame-form__check-input { - display: none; - } - } +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts .fame-form__group, +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type .fame-form__group { + display: block; + width: 100%; +} - /* stylelint-disable-next-line no-descending-specificity */ - .fame-form__check-input { - display: none; - } +/* Donation type (tabs) */ +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type { + display: flex; + flex-wrap: wrap; + gap: 10px; +} - .wp-block-famehelsinki-donation-amounts .donation-amounts { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 10px; - } +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type .fame-form__label { + display: flex; + width: 100%; + justify-content: center; + align-items: center; + padding: 8px; + border: var(--border-width) solid var(--primary-color); + border-radius: var(--border-radius); + cursor: pointer; + margin-right: 0.5rem; + user-select: none; +} - .wp-block-famehelsinki-donation-amounts .donation-amounts__other { - position: relative; - width: 100%; - padding-top: 5px; - } +/* Shared “button-like” labels for tabs + amount buttons */ +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts .fame-form__label, +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type .fame-form__label { + display: flex; + width: 100%; + justify-content: center; + align-items: center; + padding: 8px; + margin-right: 0.5rem; + user-select: none; + cursor: pointer; + border: var(--border-width, 2px) solid var(--primary-color); + border-radius: var(--border-radius); + transition: + background 0.15s ease, + color 0.15s ease, + border-color 0.15s ease; +} - .wp-block-famehelsinki-donation-amounts .donation-amounts__input-wrapper { - position: relative; - } +/* Donation type hover (now after base label rules) */ +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type .fame-form__label:hover { + background: color-mix(in srgb, var(--primary-color) 12%, #fff 10%); +} - .wp-block-famehelsinki-donation-amounts .donation-amounts__input-wrapper input { - padding-right: 2em; - } +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type .fame-form__check-input { + display: none; +} - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-amounts .donation-amounts__other .label-wrapper { - display: inline-flex; - font-size: 16px; - } +/* Donation amounts grid */ +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts .donation-amounts { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; +} - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-amounts .donation-amounts__other .fame-form__label { - position: relative; - display: block; - width: 100%; - padding: 0; - border: none; - cursor: default; - text-align: left; - margin-right: 0; - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__other { + position: relative; + width: 100%; + padding-top: 5px; +} - .wp-block-famehelsinki-donation-amounts .donation-amounts__other input { - display: block; - width: 100%; - box-sizing: border-box; - border: var(--border-width, 2px) solid var(--primary-color); - border-radius: var(--border-radius); - font-size: inherit; - max-width: none; - color: var(--primary-color); - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__input-wrapper { + position: relative; +} - .wp-block-famehelsinki-donation-amounts .donation-amounts__other .donation-amounts__minmax { - font-size: 16px; - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__input-wrapper +input { + padding-right: 2em; +} - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-amounts .fame-form__label, - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-type .fame-form__label { - display: flex; - width: 100%; - justify-content: center; - align-items: center; - padding: 8px; - margin-right: 0.5rem; - user-select: none; - cursor: pointer; - border: var(--border-width, 2px) solid var(--primary-color); - border-radius: var(--border-radius); - transition: - background 0.15s ease, - color 0.15s ease, - border-color 0.15s ease; - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__other +.label-wrapper { + display: inline-flex; + font-size: 16px; +} - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-amounts .fame-form__label:has(.fame-form__check-input:checked), - .wp-block-famehelsinki-donation-type .fame-form__label:has(.fame-form__check-input:checked) { - background: var(--primary-color); - color: var(--secondary-color); - border-color: var(--primary-color); - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__other +.fame-form__label { + position: relative; + display: block; + width: 100%; + padding: 0; + border: none; + cursor: default; + text-align: left; + margin-right: 0; +} - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-amounts .fame-form__label:hover, - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-type .fame-form__label:hover { - background: color-mix(in srgb, var(--primary-color) var(--hover-lighten), transparent calc(100% - var(--hover-lighten))); - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__other +input { + display: block; + width: 100%; + box-sizing: border-box; + border: var(--border-width, 2px) solid var(--primary-color); + border-radius: var(--border-radius); + font-size: inherit; + max-width: none; + color: inherit; +} - .wp-block-famehelsinki-donation-providers { - display: block; - width: 100%; - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__other +.donation-amounts__minmax { + font-size: 16px; +} - .payment-method-selector:has(> .fame-form__group:only-child) > .fame-form__group { - display: none; - } +/* Hover before checked (order for no-descending-specificity) */ +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.fame-form__label:hover, +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-type .fame-form__label:hover { + background: color-mix(in srgb, var(--primary-color) var(--hover-lighten), transparent calc(100% - var(--hover-lighten))); +} - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-donation-providers .fame-form__group label { - display: inline-block; - width: 100%; - margin: 0 0 10px 0; - cursor: pointer; - } +/* Checked state (kept after hover) */ +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.fame-form__label:has(.fame-form__check-input:checked), +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-type +.fame-form__label:has(.fame-form__check-input:checked) { + background: var(--primary-color); + color: var(--secondary-color); + border-color: var(--primary-color); +} - .wp-block-famehelsinki-donation-providers .provider-type__label { - display: flex; - width: 100%; - justify-content: center; - align-items: center; - padding: 8px 16px; - border: var(--border-width, 2px) solid var(--primary-color); - border-radius: var(--border-radius); - background: transparent; - transition: - background 0.2s, - color 0.2s, - border-color 0.2s; - } +/* Providers */ +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-providers { + display: block; + width: 100%; +} - .wp-block-famehelsinki-donation-providers .provider-type__label:hover { - background: color-mix(in srgb, var(--primary-color) var(--hover-lighten), transparent calc(100% - var(--hover-lighten))); - } +.wp-block-famehelsinki-donation-form +.payment-method-selector:has(> .fame-form__group:only-child) > .fame-form__group { + display: none; +} - .wp-block-famehelsinki-donation-providers - .fame-form__check-input:checked + .provider-type__label { - background: var(--primary-color); - color: var(--secondary-color); - border-color: var(--primary-color); - } +/* Contact form labels */ +.wp-block-famehelsinki-donation-form .wp-block-famehelsinki-contact-form label { + font-size: 16px; +} - .wp-block-famehelsinki-donation-providers - .payment-method-selector--single - .fame-form__check-input:checked + .provider-type__label { - background: none; - color: inherit; - border-color: transparent !important; - box-shadow: none; - justify-content: left; - padding: 8px 0; - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers +.fame-form__group +label { + display: inline-block; + width: 100%; + margin: 0 0 10px 0; + cursor: pointer; +} - /* stylelint-disable-next-line no-descending-specificity */ - .wp-block-famehelsinki-contact-form label { - font-size: 16px; - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers +.provider-type__label { + display: flex; + width: 100%; + justify-content: center; + align-items: center; + padding: 8px 16px; + border: var(--border-width, 2px) solid var(--primary-color); + border-radius: var(--border-radius); + background: transparent; + transition: + background 0.2s, + color 0.2s, + border-color 0.2s; +} - .wp-block-famehelsinki-donation-amounts .donation-amounts__error { - color: #d63638; /* WP:n default error-red */ - font-size: 16px; - margin-top: 0.25rem; - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers +.provider-type__label:hover { + background: color-mix(in srgb, var(--primary-color) var(--hover-lighten), transparent calc(100% - var(--hover-lighten))); +} - .donation-amounts__input-wrapper input[aria-invalid="true"] { - border-color: #d63638; - outline-color: #d63638; - box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--fame-clr-danger) 35%, transparent); - } +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers +.fame-form__check-input:checked + .provider-type__label { + background: var(--primary-color); + color: var(--secondary-color); + border-color: var(--primary-color); +} + +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-providers +.payment-method-selector--single +.fame-form__check-input:checked + .provider-type__label { + background: none; + color: inherit; + border-color: transparent !important; + box-shadow: none; + justify-content: left; + padding: 8px 0; +} + +/* Errors */ +.wp-block-famehelsinki-donation-form +.wp-block-famehelsinki-donation-amounts +.donation-amounts__error { + color: #d63638; + font-size: 16px; + margin-top: 0.25rem; } +.wp-block-famehelsinki-donation-form .donation-amounts__input-wrapper input[aria-invalid="true"] { + border-color: #d63638; + outline-color: #d63638; + box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--fame-clr-danger) 35%, transparent); +} + +/* Hidden block spacing fix */ +.wp-block-famehelsinki-donation-form .fame-form__hidden + fieldset { + margin-block-start: 0 !important; +} + +/* Allow editing block spacing from editor (front reads block-gap variable) */ +.wp-block-famehelsinki-donation-form .wp-block-columns { + gap: var(--wp--style--block-gap, var(--wp--preset--spacing--20, 2rem)) !important; +} + +/* Hide radio/check inputs inside our "button-like" controls (front) */ +.wp-block-famehelsinki-donation-form +:where( + .wp-block-famehelsinki-donation-type, + .wp-block-famehelsinki-donation-amounts, + .wp-block-famehelsinki-donation-providers +) +:where(input[type="radio"], input[type="checkbox"], .fame-form__check-input) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0 0 0 0); + clip-path: inset(50%); + white-space: nowrap; + border: 0; +} + +/* Responsive */ @media (max-width: 1000px) { - /* has-modern-style donation form → mobile style → Group grid */ - .wp-block-famehelsinki-donation-form.has-modern-style - .fame-form--donations - .wp-block-group.is-layout-grid:is( - [class^="wp-container-core-group-is-layout-"], - [class*=" wp-container-core-group-is-layout-"] - ) { - grid-template-columns: repeat(1, minmax(0, 1fr)); + .wp-block-famehelsinki-donation-form .wp-block-columns { + flex-wrap: wrap !important; + } + + .wp-block-famehelsinki-donation-form .wp-block-column { + flex: 0 0 100% !important; + max-width: 100% !important; } } From 26b090aefd4888def655b7610c9f3bbe6aadb84d Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Tue, 24 Feb 2026 15:32:11 +0200 Subject: [PATCH 12/34] LHJ-149: Refactor donation form save tests, Remove snapshot test (not useful, save() only renders InnerBlocks.Content) --- .../__snapshots__/save.test.ts.snap | 48 ------------------- src/Blocks/donation-form/save.test.ts | 24 +++++----- 2 files changed, 13 insertions(+), 59 deletions(-) delete mode 100644 src/Blocks/donation-form/__snapshots__/save.test.ts.snap diff --git a/src/Blocks/donation-form/__snapshots__/save.test.ts.snap b/src/Blocks/donation-form/__snapshots__/save.test.ts.snap deleted file mode 100644 index 7914e64..0000000 --- a/src/Blocks/donation-form/__snapshots__/save.test.ts.snap +++ /dev/null @@ -1,48 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Gutenberg Block Save Function renders correctly and matches snapshot 1`] = ` -
-
-
-
- - - - -
-
- - Loading - -
-
-
-
-`; diff --git a/src/Blocks/donation-form/save.test.ts b/src/Blocks/donation-form/save.test.ts index 21c0d20..25bea08 100644 --- a/src/Blocks/donation-form/save.test.ts +++ b/src/Blocks/donation-form/save.test.ts @@ -1,17 +1,19 @@ -import { describe, it, expect } from '@jest/globals' +import { describe, it, expect, jest } from '@jest/globals' import { render } from '@testing-library/react' import save from './save' -// Mock attributes for testing -const mockAttributes = { - returnAddress: 'https://example.com/return', - campaign: 'test-campaign', - token: true, -} +jest.mock('@wordpress/block-editor', () => { + const React = require('react') + return { + InnerBlocks: { + Content: () => React.createElement('div', { 'data-testid': 'innerblocks-content' }), + }, + } +}) -describe('Gutenberg Block Save Function', () => { - it('renders correctly and matches snapshot', () => { - const { container } = render(save({ attributes: mockAttributes })) - expect(container).toMatchSnapshot() +describe('donation-form save()', () => { + it('renders InnerBlocks.Content so child blocks are serialized', () => { + const { getByTestId } = render(save() as any) + expect(getByTestId('innerblocks-content')).toBeTruthy() }) }) From 33856f2457a6b49741610c415b4bc59d02cc642d Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 4 Mar 2026 13:26:31 +0200 Subject: [PATCH 13/34] LHJ-143: add alignment support to legend --- src/Blocks/contact-form/block.json | 3 ++- src/Blocks/contact-form/edit.css | 4 ---- src/Blocks/contact-form/edit.tsx | 36 +++++++++++++++++++++++++++--- src/Blocks/contact-form/render.php | 19 +++++++++++++--- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/Blocks/contact-form/block.json b/src/Blocks/contact-form/block.json index 9a31c26..06474a5 100644 --- a/src/Blocks/contact-form/block.json +++ b/src/Blocks/contact-form/block.json @@ -35,7 +35,8 @@ "phone_label": { "type": "string", "default": "Phone" }, "phone_help": { "type": "string", "default": "" }, - "show": { "type": "boolean", "default": true } + "show": { "type": "boolean", "default": true }, + "legendAlign": { "type": "string", "default": "left" } }, "supports": { "multiple": false, diff --git a/src/Blocks/contact-form/edit.css b/src/Blocks/contact-form/edit.css index e0e860d..f0edd7b 100644 --- a/src/Blocks/contact-form/edit.css +++ b/src/Blocks/contact-form/edit.css @@ -1,9 +1,6 @@ .contact-form .fame-form__fake-input { border: var(--form-element-border); padding: var(--form-element-padding); - - /* This is pretty ugly, should set line height - * somewhere, so this should be 1em * line-height */ height: 1.7em; } @@ -14,4 +11,3 @@ .fame-form__help { font-size: 14px !important; } - diff --git a/src/Blocks/contact-form/edit.tsx b/src/Blocks/contact-form/edit.tsx index f93f45a..790888c 100644 --- a/src/Blocks/contact-form/edit.tsx +++ b/src/Blocks/contact-form/edit.tsx @@ -1,6 +1,12 @@ import React from 'react' import { __ } from '@wordpress/i18n' -import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor' +import { + InspectorControls, + RichText, + useBlockProps, + AlignmentToolbar, + BlockControls, +} from '@wordpress/block-editor' import { PanelBody, TextControl, ToggleControl } from '@wordpress/components' import ContactInputControl from './ContactInputControl.tsx' import ContactInputGroup from './ContactInputGroup.tsx' @@ -13,11 +19,17 @@ import { EditProps } from '../common/types.ts' * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#edit */ export default function Edit({ attributes, setAttributes }: EditProps): React.JSX.Element { - const { contact, showAddress, showPhone, showLegend, legend } = attributes + const { contact, showAddress, showPhone, showLegend, legend, legendAlign = 'left' } = attributes const { show = true } = attributes as { show?: boolean } return ( <> + + setAttributes({ legendAlign: next || 'left' })} + /> + setAttributes({ showLegend: checked })} + help={__( + 'If disabled, the legend is marked visually hidden.', + 'fame_lahjoitukset' + )} /> setAttributes({ legend: value })} /> @@ -70,12 +90,22 @@ export default function Edit({ attributes, setAttributes }: EditProps): React.JS {showLegend && ( setAttributes({ legend: value })} + style={{ + textAlign: legendAlign as React.CSSProperties['textAlign'], + }} /> )}
> - - - + + + + Date: Wed, 4 Mar 2026 13:30:30 +0200 Subject: [PATCH 14/34] LHJ-103: add legend alignment and column selection --- src/Blocks/donation-amounts/block.json | 7 +- src/Blocks/donation-amounts/edit.css | 36 +---- src/Blocks/donation-amounts/edit.tsx | 71 ++++++++-- src/Blocks/donation-amounts/render.php | 176 ++++++++++++++++--------- 4 files changed, 182 insertions(+), 108 deletions(-) diff --git a/src/Blocks/donation-amounts/block.json b/src/Blocks/donation-amounts/block.json index aeea4c8..67a4134 100644 --- a/src/Blocks/donation-amounts/block.json +++ b/src/Blocks/donation-amounts/block.json @@ -36,7 +36,12 @@ "showLegend": { "type": "boolean", "default": true }, "legend": { "type": "string", "default": "Donation amount" }, "other": { "type": "boolean", "default": false }, - "otherLabel": { "type": "string", "default": "Other amount" } + "otherLabel": { "type": "string", "default": "Other amount" }, + "legendAlign": { "type": "string", "default": "left" }, + "colsAmounts": { + "type": "number", + "default": 3 + } }, "supports": { "multiple": false, diff --git a/src/Blocks/donation-amounts/edit.css b/src/Blocks/donation-amounts/edit.css index 69047c7..d6d4ad8 100644 --- a/src/Blocks/donation-amounts/edit.css +++ b/src/Blocks/donation-amounts/edit.css @@ -1,34 +1,2 @@ -.donation-amounts { - display: flex; - align-items: stretch; - gap: 16px; -} - -.donation-amounts > * { - flex: 1; -} - -.wp-block-famehelsinki-donation-amounts .donation-amounts__other-label, -.wp-block-famehelsinki-donation-amounts .donation-amounts__minmax { - font-size: 16px !important; - padding-top: 5px; -} - -.wp-block-famehelsinki-donation-amounts .rich-text { - text-wrap: nowrap !important; -} - -.donation-amounts__other__placeholder, -.donation-amounts .fame-form__label { - padding: var(--form-element-padding); - border: var(--form-element-border); - - &.fame-form__label--default { - border-color: #db1414; - } -} - -.donation-amounts__other__placeholder { - align-self: stretch; - width: 10ch; -} +/* Intentionally left empty. + Styles for this block are defined in the main stylesheet. */ diff --git a/src/Blocks/donation-amounts/edit.tsx b/src/Blocks/donation-amounts/edit.tsx index 04bd67c..f81bb00 100644 --- a/src/Blocks/donation-amounts/edit.tsx +++ b/src/Blocks/donation-amounts/edit.tsx @@ -1,7 +1,20 @@ -import React, { useEffect } from 'react' +import React, { CSSProperties, useEffect } from 'react' import { __ } from '@wordpress/i18n' -import { Button, Flex, PanelBody, TextControl, ToggleControl } from '@wordpress/components' -import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor' +import { + Button, + Flex, + PanelBody, + RangeControl, + TextControl, + ToggleControl, +} from '@wordpress/components' +import { + InspectorControls, + RichText, + useBlockProps, + AlignmentToolbar, + BlockControls, +} from '@wordpress/block-editor' import { getDonationLabel, useCurrentDonationType } from '../common/donation-type.ts' import { EditProps } from '../common/types.ts' import { @@ -25,6 +38,8 @@ export type Attributes = { legend?: string other?: boolean otherLabel?: string + legendAlign?: string + colsAmounts?: number } /** @@ -80,7 +95,15 @@ export default function Edit({ clientId, }: EditProps): React.JSX.Element { const { 'famehelsinki/donation-types': types } = context - const { settings, other, legend, showLegend, otherLabel } = attributes + const { + settings, + other, + legend, + showLegend, + otherLabel, + legendAlign = 'left', + colsAmounts: colsAmountsAttr, + } = attributes const currentType = useCurrentDonationType(clientId) const current = settings?.find(({ type }) => type === currentType) @@ -132,7 +155,12 @@ export default function Edit({ }) }, [types, currentType, settings, setAttributes]) - const blockProps = useBlockProps({ className: 'fame-form__fieldset--amounts' }) + const colsAmounts = Math.max(1, Math.min(3, colsAmountsAttr ?? 3)) + + const blockProps = useBlockProps({ + className: 'fame-form__fieldset--amounts', + style: { ['--amount-cols' as any]: String(colsAmounts) }, + }) // Use effect hook should ensure that settings will be set to an array. if (!settings) return
Loading...
@@ -142,6 +170,12 @@ export default function Edit({ return ( <> + + setAttributes({ legendAlign: next || 'left' })} + /> + setAttributes({ showLegend: value })} /> - {visible && !showLegend && ( - setAttributes({ legend: value })} - /> - )} + setAttributes({ legend: value })} + /> + setAttributes({ colsAmounts: v ?? 3 })} + />
) })} +
) diff --git a/src/Blocks/donation-providers/render.php b/src/Blocks/donation-providers/render.php index 3a838ea..a223eb0 100644 --- a/src/Blocks/donation-providers/render.php +++ b/src/Blocks/donation-providers/render.php @@ -68,11 +68,13 @@ $showForType = $isLegendShownForType((string) $type); $legend_class = 'fame-form__legend' . ($showForType ? '' : ' screen-reader-text'); + $legendAlign = isset($attributes['legendAlign']) ? (string) $attributes['legendAlign'] : 'left'; + $legend_style = 'text-align:' . esc_attr($legendAlign) . ';'; ?>
- + @@ -111,7 +113,15 @@ class="fame-form__check-input"
+ + +
\ No newline at end of file diff --git a/src/Blocks/donation-providers/save.tsx b/src/Blocks/donation-providers/save.tsx index af2f1fd..eadb463 100644 --- a/src/Blocks/donation-providers/save.tsx +++ b/src/Blocks/donation-providers/save.tsx @@ -1,6 +1,6 @@ -/** - * Dynamic block – rendering happens in PHP (render.php). - */ +import { InnerBlocks } from '@wordpress/block-editor' +import React from 'react' + export default function save() { - return null + return } From f1d9ac2afe6491a5161f5c842d6ef40b6104a94e Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 4 Mar 2026 13:35:38 +0200 Subject: [PATCH 16/34] LHJ-103: add legend alignment support to donation type block --- src/Blocks/donation-type/DonationTypes.tsx | 4 +- src/Blocks/donation-type/block.json | 3 +- src/Blocks/donation-type/edit.css | 5 ++ src/Blocks/donation-type/edit.tsx | 71 ++++++++++++++++------ src/Blocks/donation-type/render.php | 26 +++++++- 5 files changed, 88 insertions(+), 21 deletions(-) diff --git a/src/Blocks/donation-type/DonationTypes.tsx b/src/Blocks/donation-type/DonationTypes.tsx index 7f31683..401fbf6 100644 --- a/src/Blocks/donation-type/DonationTypes.tsx +++ b/src/Blocks/donation-type/DonationTypes.tsx @@ -26,10 +26,10 @@ const Component: FC = ({ types, value: defaultValue, onChange }) => ( className="donation-type__label" aria-label={__('Donation type', 'fame_lahjoitukset')} allowedFormats={[]} - onChange={label => + onChange={newLabel => onChange({ types: types.map(type => - type.value !== value ? type : { value, label } + type.value !== value ? type : { value, label: newLabel } ), }) } diff --git a/src/Blocks/donation-type/block.json b/src/Blocks/donation-type/block.json index 1cae612..d94286c 100644 --- a/src/Blocks/donation-type/block.json +++ b/src/Blocks/donation-type/block.json @@ -11,7 +11,8 @@ "showLegend": { "type": "boolean", "default": true }, "legend": { "type": "string", "default": "Donation type" }, "value": { "type": "string", "default": "" }, - "types": { "type": "array", "default": [] } + "types": { "type": "array", "default": [] }, + "legendAlign": { "type": "string", "default": "left" } }, "usesContext": ["famehelsinki/donation-types"], "supports": { diff --git a/src/Blocks/donation-type/edit.css b/src/Blocks/donation-type/edit.css index 27b0843..df865ef 100644 --- a/src/Blocks/donation-type/edit.css +++ b/src/Blocks/donation-type/edit.css @@ -7,3 +7,8 @@ .donation-type__input { width: 1.5em; } + +.fame-form__legend { + display: block; + width: 100%; +} diff --git a/src/Blocks/donation-type/edit.tsx b/src/Blocks/donation-type/edit.tsx index c6d6313..b34582a 100644 --- a/src/Blocks/donation-type/edit.tsx +++ b/src/Blocks/donation-type/edit.tsx @@ -1,7 +1,13 @@ -import React, { useEffect } from 'react' +import React, { CSSProperties, useEffect } from 'react' import { __ } from '@wordpress/i18n' import { RadioControl, PanelBody, TextControl, ToggleControl } from '@wordpress/components' -import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor' +import { + InspectorControls, + RichText, + useBlockProps, + AlignmentToolbar, + BlockControls, +} from '@wordpress/block-editor' import { DEFAULT_DONATION_TYPE, DONATION_TYPES, DonationType } from '../common/donation-type.ts' import { EditProps } from '../common/types.ts' import DonationTypes from './DonationTypes.tsx' @@ -11,6 +17,7 @@ export type Attributes = { types?: DonationType[] value?: string showLegend?: boolean + legendAlign?: string } /** @@ -25,7 +32,7 @@ export default function Edit({ setAttributes, }: EditProps): React.JSX.Element { const { 'famehelsinki/donation-types': enabledTypes } = context - const { types, value } = attributes + const { types, value, legendAlign = 'left' } = attributes useEffect(() => { const enabled = @@ -38,10 +45,10 @@ export default function Edit({ // - enabled types might have been removed. const update = DONATION_TYPES // Filter all enabled types. - .filter(({ value }) => enabled.includes(value)) + .filter(({ value: typeValue }) => enabled.includes(typeValue)) // Use existing type from if it exists, otherwise add // new with default label from DONATION_TYPES array. - .map(t => types?.find(({ value }) => t.value === value) ?? t) + .map(t => types?.find(({ value: typeValue }) => t.value === typeValue) ?? t) // Calculate default value. Use existing if it exists in updated list, otherwise use first from updated list or fallback to default. const defaultValue = @@ -72,6 +79,12 @@ export default function Edit({ return ( <> + + setAttributes({ legendAlign: next || 'left' })} + /> + {types?.length && types?.length > 1 && ( @@ -83,7 +96,7 @@ export default function Edit({ )} selected={value ?? types?.[0]?.value} options={types} - onChange={value => setAttributes({ value })} + onChange={nextValue => setAttributes({ value: nextValue })} /> )} setAttributes({ showLegend })} /> - {visible && !attributes.showLegend && ( - setAttributes({ legend })} - /> - )} + + setAttributes({ legend })} + />
@@ -112,18 +126,41 @@ export default function Edit({ {attributes.showLegend && ( setAttributes({ legend })} + style={{ + textAlign: legendAlign as CSSProperties['textAlign'], + fontFamily: 'inherit', + }} /> )} ) : ( - `Type: ${types?.[0]?.value ?? DEFAULT_DONATION_TYPE.value} (hidden)` + <> + {attributes.showLegend && ( + setAttributes({ legend })} + style={{ + textAlign: legendAlign as CSSProperties['textAlign'], + fontFamily: 'inherit', + }} + /> + )} + {`Type: ${types?.[0]?.value ?? DEFAULT_DONATION_TYPE.value} (hidden)`} + )}
diff --git a/src/Blocks/donation-type/render.php b/src/Blocks/donation-type/render.php index e8e7e8a..b5ea7f8 100644 --- a/src/Blocks/donation-type/render.php +++ b/src/Blocks/donation-type/render.php @@ -20,6 +20,21 @@ ? (string) $attributes['legend'] : __('Donation type', 'fame_lahjoitukset'); +$legend_align = isset($attributes['legendAlign']) ? (string) $attributes['legendAlign'] : 'left'; + +$legend_classes = ['fame-form__legend']; + +if (!$show_legend) { + $legend_classes[] = 'screen-reader-text'; +} + +if ($legend_align) { + $legend_classes[] = 'has-text-align-' . $legend_align; +} + +// Ensures alignment works even when legend is rendered as a
in the hidden branch. +$legend_style = $legend_align !== '' ? 'text-align:' . esc_attr($legend_align) . ';' : ''; + $saved_types = (isset($attributes['types']) && is_array($attributes['types'])) ? $attributes['types'] : []; $saved_value = isset($attributes['value']) ? (string) $attributes['value'] : ''; @@ -81,11 +96,20 @@ $val = (string) ($types[0]['value'] ?? $default_value); ?>
> +
+ +
+
> - + + From 0b7a2a19b351ab527afca4587425cd08891c6403 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 4 Mar 2026 14:06:31 +0200 Subject: [PATCH 17/34] LHJ-149: add error color from attributes, remove adding paragrapgh from form level (added in donation providers) --- src/Blocks/donation-form/block.json | 9 +- src/Blocks/donation-form/edit.css | 16 +-- src/Blocks/donation-form/edit.tsx | 175 ++++++++-------------------- src/Blocks/donation-form/render.php | 13 ++- src/Blocks/donation-form/view.css | 15 +-- 5 files changed, 75 insertions(+), 153 deletions(-) diff --git a/src/Blocks/donation-form/block.json b/src/Blocks/donation-form/block.json index 3bc0b15..d7b4175 100644 --- a/src/Blocks/donation-form/block.json +++ b/src/Blocks/donation-form/block.json @@ -17,7 +17,7 @@ }, "colsDesktop": { "type": "number", - "default": 3 + "default": 1 }, "token": { "type": "boolean", @@ -54,6 +54,10 @@ "borderWidth": { "type": "string", "default": "1px" + }, + "dangerColor": { + "type": "string", + "default": "#dc3545" } }, "supports": { @@ -68,7 +72,8 @@ "html": false, "typography": { "fontSize": true - } + }, + "border": { "radius": true, "width": true } }, "allowedBlocks": ["core/columns"], "icon": "money", diff --git a/src/Blocks/donation-form/edit.css b/src/Blocks/donation-form/edit.css index c30dfe1..2767dac 100644 --- a/src/Blocks/donation-form/edit.css +++ b/src/Blocks/donation-form/edit.css @@ -31,7 +31,7 @@ .editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__help { font-size: 0.8em; - color: var(--third-color, #333); + color: inherit; } .editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__row > .fame-form__help { @@ -43,11 +43,10 @@ .fame-form__group--required .fame-form__label::after { content: "*"; - color: #f00; + color: var(--fame-clr-danger, #f00); } /* Inputs: hide radios/checks visually but keep accessible (editor) */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form :where( @@ -69,14 +68,12 @@ } /* Legend */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__legend { line-height: 1.3; margin: 0 0 0.5rem 0; } /* Tabs / amount buttons: shared label look */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form :where( @@ -113,7 +110,7 @@ .wp-block-famehelsinki-donation-amounts .donation-amounts { display: grid; - grid-template-columns: repeat(2, 1fr); + grid-template-columns: repeat(var(--amount-cols, 3), minmax(0, 1fr)); gap: 10px; } @@ -149,7 +146,6 @@ } /* Contact form: labels are not button-like */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-contact-form @@ -169,12 +165,11 @@ .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-contact-form .fame-form__fake-input { - border: var(--border-width, 1px) solid var(--primary-color, #000); + border: var(--border-width, 1px) solid var(--third-color, #000); border-radius: var(--text-field-border-radius, 0); } /* Other amount (editor): label + input */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts @@ -232,7 +227,6 @@ input { } /* Fieldsets inside editor: remove UA spacing */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts @@ -254,7 +248,6 @@ input { } /* Providers layout in editor */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-providers { @@ -293,7 +286,6 @@ label { } /* Controls spacing in editor */ - .editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-form-controls { display: block; padding-top: 16px; diff --git a/src/Blocks/donation-form/edit.tsx b/src/Blocks/donation-form/edit.tsx index c8e36e7..7741b7f 100644 --- a/src/Blocks/donation-form/edit.tsx +++ b/src/Blocks/donation-form/edit.tsx @@ -24,15 +24,9 @@ import { EditProps } from '../common/types.ts' const TOP_ALLOWED_BLOCKS = ['core/columns'] as const -const DEFAULT_TERMS_TEXT = __( - 'Lahjoittamalla hyväksyt tietosuojakäytännön ja tilaus- ja peruutusehdot', - 'fame_lahjoitukset' -) - -const TERMS_ANCHOR = 'fame-terms' - function buildInitialLayout(colsDesktop: 1 | 2 | 3): BlockInstance[] { - const group = (inner: BlockInstance[] = []) => createBlock('core/group', {}, inner) + const group = (inner: BlockInstance[] = [], attrs: Record = {}) => + createBlock('core/group', attrs, inner) const donationType = createBlock('famehelsinki/donation-type') const donationAmounts = createBlock('famehelsinki/donation-amounts') @@ -40,14 +34,11 @@ function buildInitialLayout(colsDesktop: 1 | 2 | 3): BlockInstance[] { const donationProviders = createBlock('famehelsinki/donation-providers') const formControls = createBlock('famehelsinki/form-controls') - const termsParagraph = createBlock('core/paragraph', { - anchor: TERMS_ANCHOR, - content: DEFAULT_TERMS_TEXT, - }) - const g1 = group([donationType, donationAmounts]) + const g2 = group([contactForm]) - const g3 = group([donationProviders, termsParagraph, formControls]) + + const g3 = group([donationProviders, formControls]) const columns = buildColumnsFromGroups(colsDesktop, [g1, g2, g3]) return [columns] @@ -87,100 +78,18 @@ function readTopGroups(blocks: BlockInstance[]): BlockInstance[] | null { return groups.length === 3 ? groups : null } -function findGroupContainingFormControls(groups: BlockInstance[]): BlockInstance | null { - for (const g of groups) { - const inner = (g.innerBlocks ?? []) as BlockInstance[] - if (inner.some(b => b.name === 'famehelsinki/form-controls')) return g - } - return null -} - -function isTermsParagraph(b: BlockInstance): boolean { - return b.name === 'core/paragraph' && (b.attributes as any)?.anchor === TERMS_ANCHOR -} - -/** - * Ensure: - * - exactly one terms paragraph (anchor=fame-terms) - * - positioned right before famehelsinki/form-controls - * - * Returns SAME array reference if no changes are needed. - */ -function ensureTermsBeforeFormControls(children: BlockInstance[]): BlockInstance[] { - const idxForm = children.findIndex(b => b.name === 'famehelsinki/form-controls') - if (idxForm === -1) return children - - const termsIdxs: number[] = [] - for (let i = 0; i < children.length; i++) { - if (isTermsParagraph(children[i])) termsIdxs.push(i) - } - - // Missing: insert - if (termsIdxs.length === 0) { - const next = [...children] - next.splice( - idxForm, - 0, - createBlock('core/paragraph', { anchor: TERMS_ANCHOR, content: DEFAULT_TERMS_TEXT }) - ) - return next - } - - // One: move if needed - if (termsIdxs.length === 1) { - const idxTerms = termsIdxs[0] - if (idxTerms === idxForm - 1) return children - - const next = [...children] - const [terms] = next.splice(idxTerms, 1) - const idxForm2 = next.findIndex(b => b.name === 'famehelsinki/form-controls') - next.splice(idxForm2, 0, terms) - return next - } - - // Many: drop extras, then position - const keepIdx = termsIdxs[0] - let changed = false - const filtered: BlockInstance[] = [] - for (let i = 0; i < children.length; i++) { - const isTerms = isTermsParagraph(children[i]) - if (!isTerms) { - filtered.push(children[i]) - continue - } - if (i === keepIdx) { - filtered.push(children[i]) - } else { - changed = true - } - } - - const idxForm2 = filtered.findIndex(b => b.name === 'famehelsinki/form-controls') - const idxTerms2 = filtered.findIndex(isTermsParagraph) - if (idxForm2 === -1 || idxTerms2 === -1) { - return changed ? filtered : children - } - - if (idxTerms2 === idxForm2 - 1) { - return changed ? filtered : children - } - - const out = [...filtered] - const [terms] = out.splice(idxTerms2, 1) - const idxForm3 = out.findIndex(b => b.name === 'famehelsinki/form-controls') - out.splice(idxForm3, 0, terms) - return out -} - /** * Repack: rebuild core/columns with desired col count, - * but keep the SAME 3 group blocks (preserve content & clientIds). + * but keep the SAME 3 group blocks. */ function repackColumns(colsDesktop: 1 | 2 | 3, currentTop: BlockInstance, groups: BlockInstance[]) { const next = buildColumnsFromGroups(colsDesktop, groups) // Preserve top-level columns attributes if you ever add any to columns - next.attributes = { ...(currentTop.attributes as any) } - return next + return createBlock( + next.name, + { ...(currentTop.attributes as any), ...(next.attributes as any) }, + next.innerBlocks + ) } export default function Edit({ @@ -200,6 +109,7 @@ export default function Edit({ borderWidth, textFieldBorderRadius, colsDesktop, + dangerColor, } = attributes as { types?: string[] returnAddress?: string @@ -212,6 +122,7 @@ export default function Edit({ textFieldBorderRadius?: string token?: boolean colsDesktop?: number + dangerColor?: string } const cols = Math.min(3, Math.max(1, colsDesktop ?? 3)) as 1 | 2 | 3 @@ -230,9 +141,10 @@ export default function Edit({ | '--primary-color' | '--secondary-color' | '--third-color' - | '--fame-border-radius' - | '--fame-border-width' - | '--fame-text-field-border-radius', + | '--border-radius' + | '--border-width' + | '--text-field-border-radius' + | '--fame-clr-danger', string > > @@ -241,14 +153,16 @@ export default function Edit({ '--primary-color': primaryColor ?? undefined, '--secondary-color': secondaryColor ?? undefined, '--third-color': thirdColor ?? undefined, - '--fame-border-radius': borderRadius ?? undefined, - '--fame-border-width': borderWidth ?? undefined, - '--fame-text-field-border-radius': textFieldBorderRadius ?? undefined, + '--border-radius': borderRadius ?? undefined, + '--border-width': borderWidth ?? undefined, + '--text-field-border-radius': textFieldBorderRadius ?? undefined, + '--fame-clr-danger': dangerColor ?? undefined, } const primaryColorId = useInstanceId(BaseControl, 'primary-color') const secondaryColorId = useInstanceId(BaseControl, 'secondary-color') const thirdColorId = useInstanceId(BaseControl, 'third-color') + const dangerColorId = useInstanceId(BaseControl, 'fame-clr-danger') const innerBlocks = useSelect( select => select(blockEditorStore).getBlocks(clientId) as BlockInstance[], @@ -284,19 +198,6 @@ export default function Edit({ return } - // Ensure terms paragraph inside the group that has form-controls - const group3 = findGroupContainingFormControls(groups) - if (group3) { - const children = (group3.innerBlocks ?? []) as BlockInstance[] - const nextChildren = ensureTermsBeforeFormControls(children) - - if (nextChildren !== children) { - // Replace only that group's inner blocks (preserves group block itself) - replaceInnerBlocks(group3.clientId, nextChildren, false) - return - } - } - // Repack columns only if count differs const currentColCount = top.innerBlocks?.length ?? 0 if (currentColCount !== cols) { @@ -361,7 +262,9 @@ export default function Edit({ 'fame_lahjoitukset' )} value={returnAddress ?? ''} - onChange={returnAddress => setAttributes({ returnAddress })} + onChange={newReturnAddress => + setAttributes({ returnAddress: newReturnAddress }) + } /> setAttributes({ campaign })} + onChange={newCampaign => setAttributes({ campaign: newCampaign })} /> + + + setAttributes({ + dangerColor: + typeof value === 'string' ? value : value?.hex || '', + }) + } + disableAlpha + /> + + setAttributes({ token })} + onChange={newToken => setAttributes({ token: newToken })} /> diff --git a/src/Blocks/donation-form/render.php b/src/Blocks/donation-form/render.php index ad0fb29..1cc5160 100644 --- a/src/Blocks/donation-form/render.php +++ b/src/Blocks/donation-form/render.php @@ -67,22 +67,23 @@ function famehelsinki_sanitize_return_url(string $url): string 'borderRadius' => '0px', 'borderWidth' => '1px', 'textFieldBorderRadius' => '0px', + 'dangerColor' => '#dc3545', ]); -$container_classes = 'fame-form-container'; - $wrapper_style = sprintf( - '--primary-color:%s;--secondary-color:%s;--third-color:%s;--fame-border-radius:%s;--fame-border-width:%s;--fame-text-field-border-radius:%s;', + '--primary-color:%s;--secondary-color:%s;--third-color:%s;--border-radius:%s;--border-width:%s;--text-field-border-radius:%s;--fame-clr-danger:%s;', esc_attr($attrs['primaryColor'] ?: 'inherit'), esc_attr($attrs['secondaryColor'] ?: 'inherit'), esc_attr($attrs['thirdColor'] ?: 'inherit'), esc_attr($attrs['borderRadius'] ?: 'inherit'), esc_attr($attrs['borderWidth'] ?: 'inherit'), - esc_attr($attrs['textFieldBorderRadius'] ?: 'inherit') + esc_attr($attrs['textFieldBorderRadius'] ?: 'inherit'), + esc_attr($attrs['dangerColor'] ?: '#dc3545') ); $block_wrapper_attrs = get_block_wrapper_attributes([ - 'class' => $container_classes, + 'class' => 'fame-form-container fame-form__wrapper', + 'style' => $wrapper_style, ]); $token_attr = !empty($attrs['token']) ? ' data-token="1"' : ''; @@ -106,7 +107,7 @@ function famehelsinki_sanitize_return_url(string $url): string ?>
>
novalidate> -
+
diff --git a/src/Blocks/donation-form/view.css b/src/Blocks/donation-form/view.css index b2c3a83..2681b00 100644 --- a/src/Blocks/donation-form/view.css +++ b/src/Blocks/donation-form/view.css @@ -5,7 +5,6 @@ :root { --fame-clr-primary: #80bdff; --fame-clr-muted: #6c757d; - --fame-clr-danger: #dc3545; --border-width: 1px; /* fallback */ } @@ -65,7 +64,7 @@ display: block; margin-top: 0.25rem; font-size: 16px; - color: var(--third-color); + color: inherit; } .fame-form__row > .fame-form__help { @@ -168,10 +167,12 @@ } .wp-block-famehelsinki-donation-form .fame-form__legend { - padding: 0; + padding: 0 0 3px 0; margin: 0 0 0.5em 0; line-height: 1.3; font-size: clamp(1rem, 4vw + 0.5rem, 1.5rem); + display: block; + width: 100%; } .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts .fame-form__group, @@ -231,7 +232,7 @@ /* Donation amounts grid */ .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts .donation-amounts { display: grid; - grid-template-columns: repeat(3, 1fr); + grid-template-columns: repeat(var(--amount-cols, 3), minmax(0, 1fr)); gap: 10px; } @@ -392,14 +393,14 @@ label { .wp-block-famehelsinki-donation-form .wp-block-famehelsinki-donation-amounts .donation-amounts__error { - color: #d63638; + color: var(--fame-clr-danger); font-size: 16px; margin-top: 0.25rem; } .wp-block-famehelsinki-donation-form .donation-amounts__input-wrapper input[aria-invalid="true"] { - border-color: #d63638; - outline-color: #d63638; + border-color: var(--fame-clr-danger); + outline-color: var(--fame-clr-danger); box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--fame-clr-danger) 35%, transparent); } From f1807da42a64062d17e00c78210b1631df6990a3 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 4 Mar 2026 14:07:23 +0200 Subject: [PATCH 18/34] LHJ-149: lint fix --- src/Blocks/donation-form/view/FormHandler.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Blocks/donation-form/view/FormHandler.ts b/src/Blocks/donation-form/view/FormHandler.ts index 440cb71..69029f1 100644 --- a/src/Blocks/donation-form/view/FormHandler.ts +++ b/src/Blocks/donation-form/view/FormHandler.ts @@ -265,11 +265,12 @@ export default class FormHandler { ) } } catch (error) { + // eslint-disable-next-line no-console console.error('Submit failed', error) if (error instanceof Validation) { - Object.entries(error.errors).forEach(([key, error]) => { - this.addError(key, error) + Object.entries(error.errors).forEach(([key, message]) => { + this.addError(key, message) }) return } From 583a452ed390e0d69ad247d4684002f7cc07d60f Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Wed, 11 Mar 2026 13:18:37 +0200 Subject: [PATCH 19/34] LHJ-149: harden render escaping, validate legendAlign, fix double do_blocks, stabilise edit effect, style change --- src/Blocks/contact-form/render.php | 17 ++++++++-------- src/Blocks/donation-amounts/render.php | 11 ++++++----- src/Blocks/donation-form/edit.tsx | 25 +++++++++++++++++------- src/Blocks/donation-form/render.php | 2 +- src/Blocks/donation-form/view.css | 1 + src/Blocks/donation-providers/render.php | 9 ++++++--- src/Blocks/donation-type/render.php | 11 ++++++----- 7 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/Blocks/contact-form/render.php b/src/Blocks/contact-form/render.php index e14c3db..f1a95f9 100644 --- a/src/Blocks/contact-form/render.php +++ b/src/Blocks/contact-form/render.php @@ -51,7 +51,7 @@ ?>
" class="fame-form__help"> - +
@@ -88,7 +88,7 @@ class="fame-form__input" - +
@@ -98,7 +98,10 @@ class="fame-form__input" ?>
> - + -
\ No newline at end of file +
diff --git a/src/Blocks/donation-form/edit.tsx b/src/Blocks/donation-form/edit.tsx index 7741b7f..8061af7 100644 --- a/src/Blocks/donation-form/edit.tsx +++ b/src/Blocks/donation-form/edit.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react' +import React, { useEffect, useRef } from 'react' import { __ } from '@wordpress/i18n' import { InspectorControls, @@ -170,29 +170,38 @@ export default function Edit({ ) const { replaceInnerBlocks } = useDispatch(blockEditorStore) + // Keep a ref so the effect always reads the latest inner blocks without + // needing them in the dependency array (which would fire on every keystroke). + const innerBlocksRef = useRef(innerBlocks) + innerBlocksRef.current = innerBlocks + /** * Single effect that: * - initializes if empty/broken * - repacks columns when colsDesktop changes (without losing content) - * - ensures terms paragraph exists & is correctly placed + * + * Intentionally omits `innerBlocks` and `replaceInnerBlocks` from deps: + * - `innerBlocks` is read via ref to avoid running on every child block change. + * - `replaceInnerBlocks` is a stable dispatch reference that never changes. */ useEffect(() => { + const currentInnerBlocks = innerBlocksRef.current const nextInit = buildInitialLayout(cols) // Init: empty - if (!innerBlocks || innerBlocks.length === 0) { + if (!currentInnerBlocks || currentInnerBlocks.length === 0) { replaceInnerBlocks(clientId, nextInit, false) return } - const top = innerBlocks[0] - const hasColumnsTop = innerBlocks.length === 1 && top?.name === 'core/columns' + const top = currentInnerBlocks[0] + const hasColumnsTop = currentInnerBlocks.length === 1 && top?.name === 'core/columns' if (!hasColumnsTop) { replaceInnerBlocks(clientId, nextInit, false) return } - const groups = readTopGroups(innerBlocks) + const groups = readTopGroups(currentInnerBlocks) if (!groups) { replaceInnerBlocks(clientId, nextInit, false) return @@ -204,7 +213,9 @@ export default function Edit({ const nextTop = repackColumns(cols, top as BlockInstance, groups) replaceInnerBlocks(clientId, [nextTop], false) } - }, [cols, clientId, innerBlocks, replaceInnerBlocks]) + // We intentionally read innerBlocks through a ref to avoid rerunning on every block edit. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [cols, clientId]) return ( <> diff --git a/src/Blocks/donation-form/render.php b/src/Blocks/donation-form/render.php index 1cc5160..795fedf 100644 --- a/src/Blocks/donation-form/render.php +++ b/src/Blocks/donation-form/render.php @@ -100,7 +100,7 @@ function famehelsinki_sanitize_return_url(string $url): string $inner .= $inner_block->render(); } } else { - $inner = $content !== '' ? do_blocks($content) : ''; + $inner = $content; } $return_address = famehelsinki_sanitize_return_url((string) ($attrs['returnAddress'] ?? '/')); diff --git a/src/Blocks/donation-form/view.css b/src/Blocks/donation-form/view.css index 2681b00..f712a48 100644 --- a/src/Blocks/donation-form/view.css +++ b/src/Blocks/donation-form/view.css @@ -412,6 +412,7 @@ label { /* Allow editing block spacing from editor (front reads block-gap variable) */ .wp-block-famehelsinki-donation-form .wp-block-columns { gap: var(--wp--style--block-gap, var(--wp--preset--spacing--20, 2rem)) !important; + margin-bottom: 0 !important; } /* Hide radio/check inputs inside our "button-like" controls (front) */ diff --git a/src/Blocks/donation-providers/render.php b/src/Blocks/donation-providers/render.php index a223eb0..34fb4c0 100644 --- a/src/Blocks/donation-providers/render.php +++ b/src/Blocks/donation-providers/render.php @@ -67,9 +67,12 @@ $single = count($list) === 1; $showForType = $isLegendShownForType((string) $type); + $legendAlign_raw = isset($attributes['legendAlign']) ? (string) $attributes['legendAlign'] : 'left'; + $legendAlign = in_array($legendAlign_raw, ['left', 'center', 'right', 'justify'], true) + ? $legendAlign_raw + : 'left'; $legend_class = 'fame-form__legend' . ($showForType ? '' : ' screen-reader-text'); - $legendAlign = isset($attributes['legendAlign']) ? (string) $attributes['legendAlign'] : 'left'; - $legend_style = 'text-align:' . esc_attr($legendAlign) . ';'; + $legend_style = 'text-align:' . $legendAlign . ';'; ?>
\ No newline at end of file diff --git a/src/Blocks/donation-type/render.php b/src/Blocks/donation-type/render.php index b5ea7f8..fdb07fa 100644 --- a/src/Blocks/donation-type/render.php +++ b/src/Blocks/donation-type/render.php @@ -20,7 +20,10 @@ ? (string) $attributes['legend'] : __('Donation type', 'fame_lahjoitukset'); -$legend_align = isset($attributes['legendAlign']) ? (string) $attributes['legendAlign'] : 'left'; +$legend_align_raw = isset($attributes['legendAlign']) ? (string) $attributes['legendAlign'] : 'left'; +$legend_align = in_array($legend_align_raw, ['left', 'center', 'right', 'justify'], true) + ? $legend_align_raw + : 'left'; $legend_classes = ['fame-form__legend']; @@ -28,12 +31,10 @@ $legend_classes[] = 'screen-reader-text'; } -if ($legend_align) { - $legend_classes[] = 'has-text-align-' . $legend_align; -} +$legend_classes[] = 'has-text-align-' . $legend_align; // Ensures alignment works even when legend is rendered as a
in the hidden branch. -$legend_style = $legend_align !== '' ? 'text-align:' . esc_attr($legend_align) . ';' : ''; +$legend_style = 'text-align:' . $legend_align . ';'; $saved_types = (isset($attributes['types']) && is_array($attributes['types'])) ? $attributes['types'] : []; $saved_value = isset($attributes['value']) ? (string) $attributes['value'] : ''; From 44677c5700d8bf2834ead9bfc3fb64a7b1022d2f Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Thu, 12 Mar 2026 12:01:25 +0200 Subject: [PATCH 20/34] LHJ-150: Add campaign selection block --- src/Blocks/donation-campaigns/block.json | 25 ++++ src/Blocks/donation-campaigns/edit.tsx | 165 +++++++++++++++++++++++ src/Blocks/donation-campaigns/index.ts | 9 ++ src/Blocks/donation-campaigns/render.php | 58 ++++++++ src/Blocks/donation-campaigns/save.tsx | 3 + src/Blocks/donation-form/block.json | 4 - src/Blocks/donation-form/edit.tsx | 34 +++-- src/Blocks/donation-form/render.php | 4 - 8 files changed, 281 insertions(+), 21 deletions(-) create mode 100644 src/Blocks/donation-campaigns/block.json create mode 100644 src/Blocks/donation-campaigns/edit.tsx create mode 100644 src/Blocks/donation-campaigns/index.ts create mode 100644 src/Blocks/donation-campaigns/render.php create mode 100644 src/Blocks/donation-campaigns/save.tsx diff --git a/src/Blocks/donation-campaigns/block.json b/src/Blocks/donation-campaigns/block.json new file mode 100644 index 0000000..dfe13b8 --- /dev/null +++ b/src/Blocks/donation-campaigns/block.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "famehelsinki/donation-campaigns", + "version": "0.1.0", + "title": "Campaigns", + "category": "widgets", + "description": "Campaign selector for the donation form.", + "parent": ["famehelsinki/donation-form"], + "example": {}, + "attributes": { + "show": { "type": "boolean", "default": false }, + "campaigns": { "type": "array", "default": [] }, + "label": { "type": "string", "default": "Campaign" }, + "showLabel": { "type": "boolean", "default": true } + }, + "supports": { + "multiple": false, + "html": false + }, + "icon": "tag", + "textdomain": "fame_lahjoitukset", + "editorScript": "file:./index.js", + "render": "file:./render.php" +} diff --git a/src/Blocks/donation-campaigns/edit.tsx b/src/Blocks/donation-campaigns/edit.tsx new file mode 100644 index 0000000..b527194 --- /dev/null +++ b/src/Blocks/donation-campaigns/edit.tsx @@ -0,0 +1,165 @@ +import React, { useState } from 'react' +import { __ } from '@wordpress/i18n' +import { InspectorControls, useBlockProps } from '@wordpress/block-editor' +import { PanelBody, TextControl, ToggleControl, Button } from '@wordpress/components' +import { EditProps } from '../common/types.ts' + +const MAX_CAMPAIGNS = 10 + +type Attributes = { + show: boolean + campaigns: string[] + label: string + showLabel: boolean +} + +export default function Edit({ + attributes, + setAttributes, +}: EditProps): React.JSX.Element { + const { show, campaigns, label, showLabel } = attributes + + const [newCampaign, setNewCampaign] = useState('') + + const addCampaign = () => { + const trimmed = newCampaign.trim() + if (!trimmed || campaigns.length >= MAX_CAMPAIGNS) return + setAttributes({ campaigns: [...campaigns, trimmed] }) + setNewCampaign('') + } + + const removeCampaign = (index: number) => { + setAttributes({ campaigns: campaigns.filter((_, i) => i !== index) }) + } + + return ( + <> + + + setAttributes({ show: value })} + /> + + {show && ( + <> + setAttributes({ showLabel: value })} + /> + setAttributes({ label: value })} + /> + +
+

+ {__('Campaigns', 'fame_lahjoitukset')} +

+ {campaigns.map((campaign, index) => ( +
+ {campaign} + +
+ ))} + + {campaigns.length < MAX_CAMPAIGNS ? ( +
+
+ { + if (e.key === 'Enter') { + e.preventDefault() + addCampaign() + } + }} + /> +
+ +
+ ) : ( +

+ {__( + 'Maximum of 10 campaigns reached.', + 'fame_lahjoitukset' + )} +

+ )} +
+ + )} +
+
+ +
+ {show ? ( +
+ {showLabel && ( + + )} + +
+ ) : ( +
+ {__( + 'The campaign selector is not in use. Use the toggle in the sidebar to enable it.', + 'fame_lahjoitukset' + )} +
+ )} +
+ + ) +} diff --git a/src/Blocks/donation-campaigns/index.ts b/src/Blocks/donation-campaigns/index.ts new file mode 100644 index 0000000..20f6b44 --- /dev/null +++ b/src/Blocks/donation-campaigns/index.ts @@ -0,0 +1,9 @@ +import { registerBlockType } from '@wordpress/blocks' +import Edit from './edit' +import save from './save' +import metadata from './block.json' + +registerBlockType(metadata.name, { + edit: Edit, + save, +} as any) diff --git a/src/Blocks/donation-campaigns/render.php b/src/Blocks/donation-campaigns/render.php new file mode 100644 index 0000000..c567e00 --- /dev/null +++ b/src/Blocks/donation-campaigns/render.php @@ -0,0 +1,58 @@ +|null $attributes */ +$attributes = $attributes ?? []; + +$show = array_key_exists('show', $attributes) ? (bool) $attributes['show'] : false; +$campaigns = isset($attributes['campaigns']) && is_array($attributes['campaigns']) + ? $attributes['campaigns'] + : []; + +if (!$show || empty($campaigns)) { + return; +} + +$showLabel = array_key_exists('showLabel', $attributes) ? (bool) $attributes['showLabel'] : true; +$label = isset($attributes['label']) && trim((string) $attributes['label']) !== '' + ? (string) $attributes['label'] + : __('Campaign', 'fame_lahjoitukset'); + +$wrapper_attrs = get_block_wrapper_attributes([ + 'class' => 'fame-form__group', +]); + +?> +
> + + + + + +
\ No newline at end of file diff --git a/src/Blocks/donation-campaigns/save.tsx b/src/Blocks/donation-campaigns/save.tsx new file mode 100644 index 0000000..25c9d31 --- /dev/null +++ b/src/Blocks/donation-campaigns/save.tsx @@ -0,0 +1,3 @@ +export default function save() { + return null +} diff --git a/src/Blocks/donation-form/block.json b/src/Blocks/donation-form/block.json index d7b4175..818c581 100644 --- a/src/Blocks/donation-form/block.json +++ b/src/Blocks/donation-form/block.json @@ -23,10 +23,6 @@ "type": "boolean", "default": false }, - "campaign": { - "type": "string", - "default": "" - }, "returnAddress": { "type": "string", "default": "/" diff --git a/src/Blocks/donation-form/edit.tsx b/src/Blocks/donation-form/edit.tsx index 8061af7..92e12d0 100644 --- a/src/Blocks/donation-form/edit.tsx +++ b/src/Blocks/donation-form/edit.tsx @@ -29,12 +29,13 @@ function buildInitialLayout(colsDesktop: 1 | 2 | 3): BlockInstance[] { createBlock('core/group', attrs, inner) const donationType = createBlock('famehelsinki/donation-type') + const donationCampaigns = createBlock('famehelsinki/donation-campaigns') const donationAmounts = createBlock('famehelsinki/donation-amounts') const contactForm = createBlock('famehelsinki/contact-form') const donationProviders = createBlock('famehelsinki/donation-providers') const formControls = createBlock('famehelsinki/form-controls') - const g1 = group([donationType, donationAmounts]) + const g1 = group([donationType, donationCampaigns, donationAmounts]) const g2 = group([contactForm]) @@ -100,7 +101,6 @@ export default function Edit({ const { types, returnAddress, - campaign, token, primaryColor, secondaryColor, @@ -113,7 +113,6 @@ export default function Edit({ } = attributes as { types?: string[] returnAddress?: string - campaign?: string primaryColor?: string secondaryColor?: string thirdColor?: string @@ -207,6 +206,25 @@ export default function Edit({ return } + // Migration: insert donation-campaigns into g1 if it is missing. + const g1 = groups[0] + const hasCampaigns = g1.innerBlocks?.some(b => b.name === 'famehelsinki/donation-campaigns') + if (!hasCampaigns) { + const campaigns = createBlock('famehelsinki/donation-campaigns') + const donationTypeIdx = + g1.innerBlocks?.findIndex(b => b.name === 'famehelsinki/donation-type') ?? -1 + const insertAt = donationTypeIdx >= 0 ? donationTypeIdx + 1 : 0 + const newG1Inner = [ + ...(g1.innerBlocks?.slice(0, insertAt) ?? []), + campaigns, + ...(g1.innerBlocks?.slice(insertAt) ?? []), + ] + const newG1 = createBlock('core/group', g1.attributes, newG1Inner) + const nextTop = repackColumns(cols, top as BlockInstance, [newG1, groups[1], groups[2]]) + replaceInnerBlocks(clientId, [nextTop], false) + return + } + // Repack columns only if count differs const currentColCount = top.innerBlocks?.length ?? 0 if (currentColCount !== cols) { @@ -278,16 +296,6 @@ export default function Edit({ } /> - setAttributes({ campaign: newCampaign })} - /> - '/', - 'campaign' => '', 'token' => false, 'primaryColor' => '#000000', 'secondaryColor' => '#FFFFFF', @@ -114,9 +113,6 @@ function famehelsinki_sanitize_return_url(string $url): string - - -
From 43f687c6a53eceb284938ac4f95c20ec3e46fd04 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 09:50:17 +0200 Subject: [PATCH 21/34] LHJ-79: add domain path --- fame-lahjoitukset.php | 1 + 1 file changed, 1 insertion(+) diff --git a/fame-lahjoitukset.php b/fame-lahjoitukset.php index 0c02b6e..5ef2174 100644 --- a/fame-lahjoitukset.php +++ b/fame-lahjoitukset.php @@ -14,6 +14,7 @@ * License: GPL-2.0-or-later * License URI: https://www.gnu.org/licenses/gpl-2.0.html * Text Domain: fame_lahjoitukset + * Domain Path: /languages * * @package CreateBlock */ From c26d41c1f22d1032f4199f70b616d420b04ee761 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 09:51:26 +0200 Subject: [PATCH 22/34] LHJ-79: add i18n scripts --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 414fea8..4ce8f98 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,11 @@ "main": "build/index.js", "scripts": { "build": "wp-scripts build", + "i18n:pot": "npm run build && wp i18n make-pot . languages/fame_lahjoitukset.pot --domain=fame_lahjoitukset --exclude=node_modules,vendor,tests,.git", + "i18n:derive": "sed 's/Language: fi_FI/Language: fi/' languages/fame_lahjoitukset-fi_FI.po > languages/fame_lahjoitukset-fi.po && sed 's/Language: sv_SE/Language: sv/' languages/fame_lahjoitukset-sv_SE.po > languages/fame_lahjoitukset-sv.po", + "i18n:mo": "wp i18n make-mo languages/fame_lahjoitukset-fi_FI.po && wp i18n make-mo languages/fame_lahjoitukset-fi.po && wp i18n make-mo languages/fame_lahjoitukset-sv_SE.po && wp i18n make-mo languages/fame_lahjoitukset-sv.po", + "i18n:json": "wp i18n make-json languages/fame_lahjoitukset-fi_FI.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-fi.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-sv_SE.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-sv.po languages/ --no-purge", + "i18n": "npm run i18n:pot && npm run i18n:derive && npm run i18n:mo && npm run i18n:json", "format": "wp-scripts format src", "lint:css": "wp-scripts lint-style", "lint:js": "wp-scripts lint-js", From 68aaa0a5fc494a7b226efb76c48f7f4be9bb1e25 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 09:51:56 +0200 Subject: [PATCH 23/34] LHJ-79: update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 7e13136..577a20b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,8 +17,8 @@ "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.3.0", "@types/wordpress__block-editor": "^11.5.16", - "@wordpress/scripts": "^30.25.0", "@wordpress/dom-ready": "^4.32.0", + "@wordpress/scripts": "^30.25.0", "eslint": "^8.57.1", "eslint-config-prettier": "^10.1.5", "eslint-plugin-react": "^7.37.5", From a87597174a7ed3c446b123e741c7d6a366ec9559 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 09:53:21 +0200 Subject: [PATCH 24/34] LHJ-79: add translation files to FI and SV --- ...t-fi-00bee4e57e311861dfb1c0adb7a51ca5.json | 1 + ...t-fi-51ba2e6489258c6bfb22ef95cc627b94.json | 1 + ...t-fi-843cb9ca3e3cd9fa8a010526de06581f.json | 1 + ...t-fi-a1a498bc675c3116ad6115b38bfff5b4.json | 1 + ...t-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 1 + ...t-fi-c12d28b3423fdb3237c59e032da4fa7f.json | 1 + ...t-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json | 1 + ...t-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json | 1 + languages/fame_lahjoitukset-fi.mo | Bin 0 -> 8750 bytes languages/fame_lahjoitukset-fi.po | 579 ++++++++++++++++++ ...i_FI-00bee4e57e311861dfb1c0adb7a51ca5.json | 1 + ...i_FI-51ba2e6489258c6bfb22ef95cc627b94.json | 1 + ...i_FI-843cb9ca3e3cd9fa8a010526de06581f.json | 1 + ...i_FI-a1a498bc675c3116ad6115b38bfff5b4.json | 1 + ...i_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 1 + ...i_FI-c12d28b3423fdb3237c59e032da4fa7f.json | 1 + ...i_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json | 1 + ...i_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json | 1 + languages/fame_lahjoitukset-fi_FI.mo | Bin 0 -> 8753 bytes languages/fame_lahjoitukset-fi_FI.po | 579 ++++++++++++++++++ ...t-sv-00bee4e57e311861dfb1c0adb7a51ca5.json | 1 + ...t-sv-51ba2e6489258c6bfb22ef95cc627b94.json | 1 + ...t-sv-843cb9ca3e3cd9fa8a010526de06581f.json | 1 + ...t-sv-a1a498bc675c3116ad6115b38bfff5b4.json | 1 + ...t-sv-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 1 + ...t-sv-c12d28b3423fdb3237c59e032da4fa7f.json | 1 + ...t-sv-d6c9f4c6041699fdecfef4f8c7a20e85.json | 1 + ...t-sv-ff8c96b8bc4bc42ad7e498decd6882a5.json | 1 + languages/fame_lahjoitukset-sv.mo | Bin 0 -> 8519 bytes languages/fame_lahjoitukset-sv.po | 579 ++++++++++++++++++ ...v_SE-00bee4e57e311861dfb1c0adb7a51ca5.json | 1 + ...v_SE-51ba2e6489258c6bfb22ef95cc627b94.json | 1 + ...v_SE-843cb9ca3e3cd9fa8a010526de06581f.json | 1 + ...v_SE-a1a498bc675c3116ad6115b38bfff5b4.json | 1 + ...v_SE-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 1 + ...v_SE-c12d28b3423fdb3237c59e032da4fa7f.json | 1 + ...v_SE-d6c9f4c6041699fdecfef4f8c7a20e85.json | 1 + ...v_SE-ff8c96b8bc4bc42ad7e498decd6882a5.json | 1 + languages/fame_lahjoitukset-sv_SE.mo | Bin 0 -> 8522 bytes languages/fame_lahjoitukset-sv_SE.po | 579 ++++++++++++++++++ languages/fame_lahjoitukset.pot | 448 +++++++++++--- 41 files changed, 2707 insertions(+), 89 deletions(-) create mode 100644 languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json create mode 100644 languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json create mode 100644 languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json create mode 100644 languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json create mode 100644 languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json create mode 100644 languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json create mode 100644 languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json create mode 100644 languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json create mode 100644 languages/fame_lahjoitukset-fi.mo create mode 100644 languages/fame_lahjoitukset-fi.po create mode 100644 languages/fame_lahjoitukset-fi_FI-00bee4e57e311861dfb1c0adb7a51ca5.json create mode 100644 languages/fame_lahjoitukset-fi_FI-51ba2e6489258c6bfb22ef95cc627b94.json create mode 100644 languages/fame_lahjoitukset-fi_FI-843cb9ca3e3cd9fa8a010526de06581f.json create mode 100644 languages/fame_lahjoitukset-fi_FI-a1a498bc675c3116ad6115b38bfff5b4.json create mode 100644 languages/fame_lahjoitukset-fi_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json create mode 100644 languages/fame_lahjoitukset-fi_FI-c12d28b3423fdb3237c59e032da4fa7f.json create mode 100644 languages/fame_lahjoitukset-fi_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json create mode 100644 languages/fame_lahjoitukset-fi_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json create mode 100644 languages/fame_lahjoitukset-fi_FI.mo create mode 100644 languages/fame_lahjoitukset-fi_FI.po create mode 100644 languages/fame_lahjoitukset-sv-00bee4e57e311861dfb1c0adb7a51ca5.json create mode 100644 languages/fame_lahjoitukset-sv-51ba2e6489258c6bfb22ef95cc627b94.json create mode 100644 languages/fame_lahjoitukset-sv-843cb9ca3e3cd9fa8a010526de06581f.json create mode 100644 languages/fame_lahjoitukset-sv-a1a498bc675c3116ad6115b38bfff5b4.json create mode 100644 languages/fame_lahjoitukset-sv-bd2530ea3cf0fb7e2347ef1e57ad40df.json create mode 100644 languages/fame_lahjoitukset-sv-c12d28b3423fdb3237c59e032da4fa7f.json create mode 100644 languages/fame_lahjoitukset-sv-d6c9f4c6041699fdecfef4f8c7a20e85.json create mode 100644 languages/fame_lahjoitukset-sv-ff8c96b8bc4bc42ad7e498decd6882a5.json create mode 100644 languages/fame_lahjoitukset-sv.mo create mode 100644 languages/fame_lahjoitukset-sv.po create mode 100644 languages/fame_lahjoitukset-sv_SE-00bee4e57e311861dfb1c0adb7a51ca5.json create mode 100644 languages/fame_lahjoitukset-sv_SE-51ba2e6489258c6bfb22ef95cc627b94.json create mode 100644 languages/fame_lahjoitukset-sv_SE-843cb9ca3e3cd9fa8a010526de06581f.json create mode 100644 languages/fame_lahjoitukset-sv_SE-a1a498bc675c3116ad6115b38bfff5b4.json create mode 100644 languages/fame_lahjoitukset-sv_SE-bd2530ea3cf0fb7e2347ef1e57ad40df.json create mode 100644 languages/fame_lahjoitukset-sv_SE-c12d28b3423fdb3237c59e032da4fa7f.json create mode 100644 languages/fame_lahjoitukset-sv_SE-d6c9f4c6041699fdecfef4f8c7a20e85.json create mode 100644 languages/fame_lahjoitukset-sv_SE-ff8c96b8bc4bc42ad7e498decd6882a5.json create mode 100644 languages/fame_lahjoitukset-sv_SE.mo create mode 100644 languages/fame_lahjoitukset-sv_SE.po diff --git a/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json b/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json new file mode 100644 index 0000000..8041433 --- /dev/null +++ b/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Label":["Otsikko"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Tarjoajatyyppi"],"General settings":["Yleiset asetukset"],"label":["otsikko"],"Donation provider":["Lahjoitusmaksuntarjoaja"],"Terms text\u2026":["Ehtojen teksti\u2026"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json b/languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json new file mode 100644 index 0000000..74066a5 --- /dev/null +++ b/languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-form\/view.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"The minimum donation amount is %1$s%2$s.":["Pienin mahdollinen lahjoitussumma on %1$s%2$s."],"The maximum donation amount is %1$s%2$s.":["Suurin mahdollinen lahjoitussumma on %1$s%2$s."],"Invalid amount":["Virheellinen summa"],"First name is required":["Etunimi on pakollinen"],"Invalid first name":["Virheellinen etunimi"],"Last name is required":["Sukunimi on pakollinen"],"Invalid last name":["Virheellinen sukunimi"],"Email is required":["S\u00e4hk\u00f6posti on pakollinen"],"Invalid email":["Virheellinen s\u00e4hk\u00f6postiosoite"],"Invalid phone number":["Virheellinen puhelinnumero"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json b/languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json new file mode 100644 index 0000000..7d20d02 --- /dev/null +++ b/languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/contact-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Contacts":["Yhteystiedot"],"Settings":["Asetukset"],"Show contact fields":["N\u00e4yt\u00e4 yhteystietokent\u00e4t"],"Require contact":["Vaadi yhteystiedot"],"Contact details are required if enabled":["Yhteystiedot ovat pakollisia, jos k\u00e4yt\u00f6ss\u00e4"],"Show address":["N\u00e4yt\u00e4 osoite"],"Show address fields":["N\u00e4yt\u00e4 osoitekent\u00e4t"],"Show phone":["N\u00e4yt\u00e4 puhelinnumero"],"Show phone number fields":["N\u00e4yt\u00e4 puhelinnumerokent\u00e4t"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"The contact form is not in use. Use the toggle in the sidebar to enable it.":["Yhteystietolomake ei ole k\u00e4yt\u00f6ss\u00e4. Ota se k\u00e4ytt\u00f6\u00f6n sivupalkin kytkimest\u00e4."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json b/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json new file mode 100644 index 0000000..9774f01 --- /dev/null +++ b/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Lahjoitustapa"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Default donation type":["Oletuslahjoistuistapa"],"Select donation type that will be used by default.":["Valitse oletuksena k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json b/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json new file mode 100644 index 0000000..8bcf57f --- /dev/null +++ b/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Muu summa"],"Min":["V\u00e4hint\u00e4\u00e4n"],"Max":["Enint\u00e4\u00e4n"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Amount":["Summa"],"Currency label":["Valuuttamerkki"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Merkki, joka n\u00e4ytet\u00e4\u00e4n summien vieress\u00e4. T\u00e4m\u00e4 ei ohjaa todellista lahjoitusvaluuttaa. T\u00e4ll\u00e4 hetkell\u00e4 vain eurot ovat tuettuja."],"Default amount":["Oletussumma"],"Amount that is preselected.":["Oletuksena valittu summa."],"Min Amount":["V\u00e4himm\u00e4issumma"],"Minimum amount for other amount field.":["Pienin sallittu summa muulle summakent\u00e4lle."],"Max Amount":["Enimm\u00e4issumma"],"Maximum amount for other amount field.":["Suurin sallittu summa muulle summakent\u00e4lle."],"Other amount text":["Muu summa -teksti"],"Show other amount":["N\u00e4yt\u00e4 muu summa"],"Show other amount input field":["N\u00e4yt\u00e4 muu summa -sy\u00f6tekentt\u00e4"],"Amount columns":["Summien sarakkeet"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Add button":["Lis\u00e4\u00e4 painike"],"Remove button":["Poista painike"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json b/languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json new file mode 100644 index 0000000..ecbd5e0 --- /dev/null +++ b/languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-campaigns\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Asetukset"],"Show campaign selector":["N\u00e4yt\u00e4 kampanjavalitsin"],"Show label":["N\u00e4yt\u00e4 otsikko"],"Label":["Otsikko"],"Campaigns":["Kampanjat"],"Remove campaign":["Poista kampanja"],"Remove":["Poista"],"New campaign":["Uusi kampanja"],"Add":["Lis\u00e4\u00e4"],"Maximum of 10 campaigns reached.":["Enint\u00e4\u00e4n 10 kampanjaa on saavutettu."],"No campaigns added yet":["Kampanjoja ei ole viel\u00e4 lis\u00e4tty"],"The campaign selector is not in use. Use the toggle in the sidebar to enable it.":["Kampanjavalitsin ei ole k\u00e4yt\u00f6ss\u00e4. Ota se k\u00e4ytt\u00f6\u00f6n sivupalkin kytkimest\u00e4."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json b/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json new file mode 100644 index 0000000..b5bcda9 --- /dev/null +++ b/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Donate":["Lahjoita"],"Button labels":["Painikkeiden tekstit"],"Single button text":["Kertalahjitus-painikkeen teksti"],"Recurring button text":["Toistuva-painikkeen teksti"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json b/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json new file mode 100644 index 0000000..69ad324 --- /dev/null +++ b/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Desktop columns":["Sarakkeet ty\u00f6p\u00f6yd\u00e4ll\u00e4"],"Enabled donation types":["K\u00e4yt\u00f6ss\u00e4 olevat lahjoitustavat"],"Choose the donation type to enable.":["Valitse k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."],"Return address":["Paluuosoite"],"Page that is displayed after donation is submitted.":["Sivu, joka n\u00e4ytet\u00e4\u00e4n lahjoituksen l\u00e4hett\u00e4misen j\u00e4lkeen."],"Tab background color":["V\u00e4lilehden taustav\u00e4ri"],"This is the background color for tabs.":["T\u00e4m\u00e4 on v\u00e4lilehtien taustav\u00e4ri."],"Tab text":["V\u00e4lilehden teksti"],"This is the text color for selected tabs.":["T\u00e4m\u00e4 on valittujen v\u00e4lilehtien tekstiv\u00e4ri."],"Input border color":["Sy\u00f6tekent\u00e4n reunan v\u00e4ri"],"This defines the border and helper text color of the input field.":["M\u00e4\u00e4ritt\u00e4\u00e4 sy\u00f6tekent\u00e4n reunan ja ohjetekstin v\u00e4rin."],"Danger color":["Vaarav\u00e4ri"],"This defines the danger color for error messages and invalid input fields.":["M\u00e4\u00e4ritt\u00e4\u00e4 vaarav\u00e4rin virheviestej\u00e4 ja virheellisi\u00e4 sy\u00f6tekentti\u00e4 varten."],"Border Radius":["Reunan py\u00f6ristys"],"This is the border-radius for tabs.":["T\u00e4m\u00e4 on v\u00e4lilehtien reunan py\u00f6ristys."],"Border Width":["Reunan leveys"],"This is the border-width for tabs and input fields.":["T\u00e4m\u00e4 on v\u00e4lilehtien ja sy\u00f6tekenttien reunan leveys."],"Text field border radius":["Tekstikent\u00e4n reunan py\u00f6ristys"],"This is the border-radius for the text fields.":["T\u00e4m\u00e4 on tekstikenttien reunan py\u00f6ristys."],"Return userinfo token":["Palauta k\u00e4ytt\u00e4j\u00e4tietotunnus"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["T\u00e4m\u00e4 asetus sis\u00e4llytt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tietotunnuksen paluuosoitteeseen. T\u00e4m\u00e4 ei ole yleens\u00e4 hy\u00f6dyllist\u00e4 ja vaatii mukautetun logiikan tunnuksen k\u00e4sittelemiseen."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi.mo b/languages/fame_lahjoitukset-fi.mo new file mode 100644 index 0000000000000000000000000000000000000000..67530baae7bbd1aa45d07cb65bc2bbe59d2af639 GIT binary patch literal 8750 zcmbuEUyLM2dBEF=A@=gez!?%JPAFmp%azv#3A<;s3K$Zg1MIl58MkEq1B=8W#L%=34$pbPNB!rO2 z@2jfrnb}*&k(_4d*VSEJ_0?D3znc4xH{JYv!oQNgJNf(M&r2&w9{hzF<tKD7`%n{r{S&ev+xA`XLuKU8NLJFPABR2AYU^6 z8kBLiV_U;F(;mV5;dAgd_!%g2eJQs84Ze}~i%{fwCAM#3^0&}F27eje8{2E}4YYp; zo`ysCCiqb(a(o)fIA4hO{}syk--5Tp@55KYC6x3Gd;=6YKLkatzk)0=`8X7Pz5w|o zpW^H7@SmW9{|V*!t5BvqzZJ^!+o9;;3>5j_8{1Dokt2hmj}Jgu$EV=Ea0*54Z$m^( zegs9XS2LK%btjbPcR|tPO5`~x>;7#h{hyBa$58b197LtbKR`ao7x+2`zYImbZ^iZx zp{(QeOv2R39Z=-G2mUI2CzR(`;4i_ap~y9XqW@>1==Z}==KBQXll&cD(*JYt-SBI0 z6W)Q)7vVlU4zERi1D>OO3yXXVJ_bdv&qJ}l&%!SJCKNs1h7wP}N8odC2<7?r;IG5G zSj0W>QTQ7$gDdc_;REoia24LlBF@0`@ZIoPDEj<76#4%hir>8q?|`pEiNbe4(a$+3 zcJ&ne*iA`dpxDuC7z9z1V^E&o1(`BA0pNq;{6ng-o{Y$`G-*S`Dak<;%{IF zeiGgdzaHB^hHPQdVN+$iRVe#)0m^=EL%JkSL($h5%KRUNGX7_vyf=lv2)_bFj{k<@ ze?Ne4gU5I%dUycJc$cB9rw?Vneh*6jFG5t6d=tJEz5-=E$55uccN|K;hoI=`N%%)l zL#9gpE8Z6&MZR00tmlnTG?9m;zTKt9PuzGR(!DEb~l zRG$1P6uDl2^8V-J^RGf#_bc!cT)~Jp;UB;*{7U3aEaJClFGG3055*7v5sDps1KtO3 zWzu)T2cWz^gr9(a9`CQIAouS>S?6EEd*RhgtG4M#P*M&*w1Y^zu48=B?z2LQ~6UnwR1(DoEsK(?jlsL$m(HUHBHyoPT5M0 zN>iE4^qfh%$-}xgFnOx3TwYHeF3QxD>atF4T{W%u+0^xuhyC~}(>o@sl1KD#r0rhb zUT~{l6qQjcFFpI=`Xmlnr4g}d8Iv=qMkSRxF86e=XR6BX*vz`giLSgeaK)%uZgO6hV*+GV&4kS= zM`ba#3^(f`>rU2&tWh?mSz)r~)sQagr%E2xL&F05`-OG&pfXPJ=WM>mBU@HZ<lYVP5vnSinOG8}_(C*k)wa&7M>f1Cmc{jO`k7}oOf^7ti zUdYEfvuU%yrfFm$^bZerTansZnT|rXcSijpH!81(JE&z{tSfvYTQJtDUtG;qZk};s zA3>v4S8ex^I4w-2^1`tJxhso|4RXjnQ(G@uMOOv;a4f6H`7(7`1gom*(WofBE37xt zEvRtaD=1kn@QQpd+0f6(pNgKwr5)D8D3~|+0?Wo$ys@cWYcjm7=~nEjm1Wh7?jt*{ zdwp@k4V%kfJFLxbWZ1{e)poGt@uIzEY3yC9CdMU~=EPZOD2Gy$O}&TbMP*|eBixiX z^{!(Pt&5=Ss@@q|=M}Z7Cqt7v0!g&z&CF<=KX|WtOpo=JcP81gng>pHOM*Z**^KXa zmrpJm*&@+vdlf@jknXY>7GuLhK@;R+tI;A)ePHlbfCbQYb&2<-DS@tPn#jRKy9F{4 z@RBVb0b7kV?RLc>B8gtE+ALE$MixSxoe-0JIO+0AbiOTYw4H9g5w^cd{JlnAoKb== zfhpXMq0U=M?CQg8cpUsQT+dt9^>>u@j_St=PrY-^T}D4^r9$tSNwz!|)V{5E)DDSZ zuOywMF^tMhZ!+7a99I7FrDs2$Y>R99Nt+l^hWxQjfL{;63d0^{^&Y?uY+gA649c{5 zuOMvqaLbc)@HSMMPVA7#0M{u^Mi7^0EHE09WhERN$IF}=5*xqc&v2PoWMm$^O#>&r>J2u zG&D9;E`*Voau7_ckDMual}y6ByET~yO~&+Hsa{>Vf`X^mvpq4vK2Nbt(WMVQ-Q;~N zOv*5dvEUaX>JjOEQaMA=e6py^g~ZS|-M-J;w(70aem!F*3$9d)8^Y`!FQRA;-?d6j9>+-flF_i}Ks`M~lx z->V5foo%CsJhXXktNzl)g^jhDY%AU6B{>98W^}f(sZ}2&m`>aLjOz7uN$Gp`%J!q3 zcg_0Al)I+vtdUowSX))^+OckF^U`+b5h^XI?K|hG&{x&z<g?$=;@(`IJ)Wz# zomDF*&MdvZbH1QVM*X`K>rc&F)Kao;tLee?prPWBmD>R+x*iU-|F)b-DqZTqz({SE z5u-Q=OdZr`IZUv(Q_{uQ`{Z$8s>RG*JvQlr|`) z^16uELD7|~Sw8b77wfUEDZuMGt@ErNSPoSbCF*#k^_bYfu;aR}IOT0M>ZW9!UK>rX zP15N>mdQ4S>P9ygb(}HYuPc;NaUR#@excE0d*4g2H9hDL7_eaRoJyKy=M<+GMPXsZ zs$h#yN|4`?Sv1Wfj)EQ0ygwBtYp&+_aCp!sGh^xEcPR9G4CRgr6vArjR?TeFNmaPY z4h99KLOHP9nI7cfWQYM&MkF3tn-%`eoL$^PHP{XADm}|!TwyPsuw~yEHk6eG^Gp_R z&FLYU>%wzZC965~Qaw20?x?0vBA(QUU2xd(Ye+V{d5A3yw911mh82l{h)0dBkz_nQ zAj?k=h8U?qd;NW_N!Y2#j@oBifUkMG)4scy0tK2I(2uJzuH?^`(VAT?+T9l&MVSw6 zb|dDxPPNlI=k#wyjVMwshlpdNVQtklXBYwi61C2*hIK8L>#aTP0L|{)FmmP`L}%7A zdu!u0PKx^5`Fvx3#!b|7!!ur~E89-gM2%u!du<{iY8DNl&FO)2lVqcg@oILZIwAUS zDjC;DZCT?767>|Lp?GvP#3*yMk6#iOi98$Pcq5&Si9|F1yTm5W9Zr2*!Of=E@?iX4 z=?u&&xa1S!n#2O?(&)u*G8v6*vMqi?3~4VqAy~`&F@h$W(nm+M!93iZ>4~tFS~Zyq zgM?!YEcyc1x<>FQ?E#AIzZf+1an%v-D^?Jf1XJ#DY@3}T?Jno~; zfr=9^HiKcgq`BMJ6TU!3;Ma@hLAwxN>WUuQM=_}U#5RT;14J`edq;JuHo`DwJH(>L zH?J++Z6v>FO3s~xY<@hel7-e0dxs}vHZy&n5XlsTU7uMN?)yZUto0qmRkQ2iOe`7n zP&AxNzA+KlyyJbLsJvGa!1G*!g<>k1EI%p1Iw!l6a!FJK7_6&tEb>55edAt!n?u&< zDzSCmnz!)^m%=9o`14@m29{$Ws+`Nfj-N|OS^SVg^uu5OuLH&~HPro761l|v#%)6& zlNdBRA;%bVqun=xa>VVi=9yW{B_2W!(c6SjLU{MeBq}VtId01ZNdV+1!V{?w|5Ci~ z@A$}X7iMwN9BY0tB+P7wWWj2f!kY`Oi6PAFd4trbf%O+A?;T|MXd5p+V4Q6i-LKuAO&0m_1`C<-!2CxIXlUW5=*lt4rhDIy=X`IkgUeEi6V zl;^Fg?wQ$J$dR08=jrOMu6paO_p9dq@s686mhi9S?=AfO=}po~k_TTsrQAA0djYP% zSHV?y8{B}u47cEG;RoUC;UB=)!H>uGXW?sTe-YjazXFfKZ@|0Z58ylDoph3Z5Ar4B zpMx^aW^8Nt3$#b@BzzX$4!;aVu5ZQmx8WOU{|gj(ei+-YVDclh-voaN-XGiN;2UVa zAD)0icnAD66gj>KWt?}Va<(@^ApB(|T1B1Z;AA0LFWjxWIb;XV|({~aP? z@?TKodKH6-TyKH${B9_ET#8(QvhLr4(*FbT{uqjWo`tA1`4Z%lyujC+;9o(J@1@xO z4=C%njY*g~xeJQC_rhO+?}qaHGWZ96#ae_%6!j3KFRZZN&mlq?}2|0 z*Wq0VeG%@$`{1?6e}XHtU&A6Fg^xnf>&Kwj-&bH4{xcLk-i{KF!iV9ra0uo3kKo(k z-7Ml>cpknBW^f692L2lS8@LQ_Wf7<0S@<4!6^cH;21WkAgW`8TfOo;yqeS65q3CA? zid{VopL<1;7$|mh8-pNfasG^DC-$O*{|P)(*K(fRV6RMx5A%5S%JY|@?C%eutoJ5@tmyj){8jjN zDDtepc~NpnL`24CTF3kWca$U$V{t z6n#%1Do_3hid@e_dH?J2`QJiW_fO#C@Ld@3I{ZD@h2M?5nMM2t?UPWR525(spF^>u z7vTf&bxithcnZq2?8r=Dt~ILcCN^im0?lmE<*K+tRCi7({z39 zl&#dLG?mFr&zZEFJfwRAlc(zPrPbu2qD)PxF6q?PRnvOXrmmkn`B{&z(~ zl+!flCZ|)?EA7ZjBVyAsCTCKON-A}q+|#|DsVci=GwUWtyYkM!6{BXk$yr&B36NDa z6E>?HmBrXH+_Z9AEN|c-)^IMad9oc?f8tQU@cE`4=b(T$3-=?X_yUB%oR6Dg5 zY$Is&LO#}+O`8QaO(P4Te|Wgviqzi9bQH3^GwK()QF%SwLM^LeUEv$qg0WWp;!3V^ z^NbVw2pX-rYO{~TX<;gr7mf|cU0GyokVE#V+IrC{x+>U*V_8Mcm#NDlSXEVzMn&me zVYQKNPKB#pLCI=?SL8d%ntn$9RP;11?XVt3!Mwp2ST?rejZJM^li_7ew_;l@EvjC0 zAK7u;>x&z%*aC%5UQz3MGBmj(kVJc4&y2?TgZHXO^;mCsXObA66mU?i5yI{ zT_6(yFWK-Bu+>=8ZdV*4lIZ1%%`&xRWFf@a2{FlslP<4B=i9(W+v#Q-Vf(AZ-)rQ> z8724b#}Iu0G6$$H70t^{i!Ge@9vGsD7OA)H~PAW%RRFD)gS2WW!@l?VEZ_ zZIKvuO43Oh!>HW!CbMbEVdXDhy!yFhQ(V(e+Qf)5x1rK>VuwTqxK3#@g19_mu_0Y`*_)Rnj~x~xx3PCs5oWhE$)`yv z%945ffQ`B(CH+6g8b;@DjV3xh!`{1ePj&B!d#W($FuL>q(vkNtE}Ik8WDzmsYIdM+ zvJw6$>JPi2h$PZyX3u4+10$p}Y0$?eQ8*p^e1_+aQkKzmHTtNJ6C(fEofHjtjo;Jjl@;dTD&_GbmktMZA!za?86`WDlv!| z#yc;;D;7QTGaXFLRT6RuX?K@E+qsZ-o}iwkI$fR#&P&~;?umsO|exd_n4{&St6eD$}I7 zpIqYez~bWa;v$_pmkc%VVSSbFLPz>Ft5_xoJ$?Sd!g^K{5IV9m)w0Ub3(e}xiPPfY zT%NfvS8qF`mX4lYcwgsiL8Z(NY*Vj4J!@18$*QgP_xAT1D$ZHC9gwB#;ZXZ;%dw== zr5+57ly@0ninBnjm6YAi)l_P9ZBKTcqT;w9HB_Bz^6+H;T4^gck;2H|$;{Z$TK5wT z44IQ0Y6caimRuAE%y)Hr;gTn0miDCQ1)&boM7yCEiNZ@xB_^wD4i8Q5!T#RFaeIGn zyua6mGGf;VNuTOFByiTGgw|qA%{9`4BFoqXeN63Asr%RWuT|(~uD6U|b2LSd7I~4joigHH<3SqT% zt7f+8m?~Ul2ZMrYp&VH5?C<5_aEJj^MkF3tn-%`eoL$^NHP{UvD?Q6#TwyPsuw~yE zHk6eG^GxP%&FCST>)dlzC965`Qaw22?x?0#BBa!aU2xvO9iZ8r z8AgtsgXqj!W^Zl0#z|3sJD+dN&bW?xZg|Gab!FR$ny69iYOhTsM9rchw7I|M+$346 zW4xMPsZNMK98AXbVO!StfkZvUXeb_C4Kd1G?c$fjMIz6dINnHSV(WO@w81>w zo$86Om0C5K34?@V3@rKr*SbdVDD57LBv`rvugLkKu8pxxux@S;H=5kwU-f#zBd2B@ z;_pfuHXid)XHUh6=bOQ>T+-Za>ti7W; zRU2U#vmIjIpjRmoiIkiEkbGMkycPl#j+!miIObN79sOwRQk z^;NU$;aDsg^guM6Nxm@=*u3L?p{Tr962S9Zf`wu#nJhmh!8#|qlX6K^1Q@KVaV+vc zP<`WGew#zq=qj;w-kP=X3YWqs2Ke(};s%zJAgY|nz>Z%`Nm=}sL-fO6|E~kaFg4Wu zR1&$w{l;xWAd?t0JtW5%bEDnYf^x*|vF52+%p@K{4$<3$P(pb3$|Nexy*X~n1xWzp zD8dt|5dTuV@9+4?Z|7!l(j04kG$hPyhGfBNn8KS2u8AQ`?d7NTi79ew6tg{p;9@_1 zyr0>3Ze|3ZDrENEQ0L9g;jM?nguHV@gt@)S+U~xz;G8Idn{#heeYCClh~(okRuJEEb?#d=-BvqdzqbK@$s5w`M-=K1S?5}LH8cOme6BJY;IX?nO ziV4)+23kboYR)Rk$LIorQv>5tVRiz(PDr!-G z=YG7ISuaTtmS=x+@4N5bbIv{I+;iufci;3(!oP~o{d_+B6VghO$8Vidx{lCZfGhA8 zxDM}x=itx54!i@tAHE#^4*W^@hoOBH-bVXl@OJn~_z3(v_yBw!?t}L-NX9+RADMp* z$~+sPt>I789>YWMX?Pd>TPSjUKD56Ce~R`$Ly_k{L;Gbc{z}^Sz*oUXLwgOrg7$mh zK{$eU!#{x{$H$<|^V!h<4^Za64)2BEgEzwkjPw+I1r#|y07b4phNzf43&oy)4f&sZ zls~V7pMna02g>uCF{V7f9m?~2q1fRt6#3s4+83e7kwdY^`=RLZQTQm_fg<<6K}1ac z7m8fBFqz18Ka}SWK(XUe;0hGI-wtK`dqe*g6#G04F=_HQkpIbN`Ew8aA{6kcMCl;o9A?6nUfdeRR4zYN9Rr=jfoy8{hmOOg_bKmKay|4k_R{Vo)} zJ_R3y*P*O)8=ES2zb|kf#H7g^AVZQ>_!xW_6uo{Qid=sQMXu+d?Bi#ktp61#^IeCc z@4rI@@Aw%%em|6X9*2kEc_?=JKzRNvl=-efOr3lIV#4Gbkg1aAq3Cxjla%l-D0=)F z6uEvc@DHHG+aE!((}&=r@Wb#m@T=kZ|AgoN2gR>$MQGWFMJWDr7>ZsOp{$?77W@q; z_IVCI2LB$4J$?X1|2s)SqSyUUb>3aVYZqBb0dj zS159RFZADxGAC%?4>w>BUVxu~`{CU+mCRAN)QPyTA75y*#T>>^6jA z_Yc9V@C$GWz7L@k{4*%;eGbZg{7dLx;Gx9v>!GZBKJYR;K>M$t?EBZD*z3Dc^!aZn zcDjX03AyARDE8O~#U5{l$x52aM|CFFmPN8MDkp^vP~9@0jEXuo?Lb?V)oNUs+T^Bd zP1;V5>h91KsXBjlJvmxdsj1Xioo16dw%(DYc90x(^Q&BUOkO9)^k}TJe$jlPYfzT8 zQA^*x{J}$UVbv=uWd}w$;@$0XV%u?~^rvN^ZB`b_ZjX(!r80%?>_H9bAat16?Ke3+90x#`RH^U_FHL#(@%)f1iP+iH-dsVUmYiDEpls^fjbTl7S+rSmL} z3dW`pMHufN_8O6zu3QHpo1XEYEQ~59qYh?S7w__ak3yrQkVe^}Hi3;vi%ReGdf1S9#C@;Y%$(O|ByF;pT zo)U(-H0vMx`1IdrJ?q9EmAOE5^Z2JOxMseFIBTTB?zu_MIn0@TLw8h%gP~t>oTMR* zN~d#~4O5M3_x0PCpG`I-G~J>xM^yg&*dW2L`(%Y>8KfjOMlGce)%ND4D+cW`cO5O zM#7PUVB&q8nR2djlJIVC!pVar!|`3K?xeOQ1y9+}y5fQZp5mKgOP74w$vaR?$}oyC z9~UC(9>@E3Z4F8Do#mvOJNR1?o$lP0U@E#M>Eva1i2F2E%uSSqKIz8ek^S0ZRGycY z$nMTeWP)kVk7w>aL2+y*`!SG1lX~OB!8;hsMlL3))W*KedV7u z25#Q0gK>X^cjs!aumw?Do7vpl6eX^M)k5z~(wTd(8cV}q?7bhlD$$GS=Q}RRD-=ER zEA2j->%^ZW9J`w&+SZA*b%A=8>U4P~IWM)B+6NcT8mWX@r|N!|wvJBvb!($sRs(Ct z_40uOm!iwI%c_4MluZY``yRM7ZUx(9#e&pPt&K_-b*?$)mc3)Yjf+E83^N`V{R!!( zwPEyVS)IFNC_4rVr%s$&o65G-UR;n%0A)sN1D{%UNrL5cRvcE{fvzZhkDT8)-g@J7 zoGjThRcnoNMT)g$^~O$S7tWmCXdR={lG?ttN`=0x4lW*ithIQkwRCV}X>s|`68~Sn zxVXHy$l%slLk+ywSmlN=ka1CqWmRu2oXIC-gO+Sdy{rn1LbE<{@UVn8UynRosMj1( zOOG60_?6abNtulKdlc&zXFX~mS>L(R?<-5eG4oXo3q2kuM@?QfsE6)qXR74*&b5kq zn*!ZEZ!UB#xzL@|)Ww{}#(nE>c}kO$GMlm4km`kQE^@_YB=cR^xsq>&Yg}AJ^;kqg zZ#2nwu8mCyHlXGOfR9C6jx@k6fK_tOs^{~pe=yPI@FpA z<-<-bv37sw3Z+oi9~jHE?qsm78t+_16J~HHv6X8Z`ZTwYT8k*u@@xB+f+TG)( z(G~&&yJIc2!ahX%ge#v6<-#}gVMYZ<;zFXU))E!m_v90&c4co+@`WaTay!n)j`ekH zgvoQ=XWzuBl{m&EnUyLO>tYr?BP>^d6oV3tcmxJ_d!@7$$M8SUh{FuC?of-|NBL34 zIpmzfN3Wi}{<#2?d33RbG%UgoI_zDOO4`Z#G-h1P?)(;hGAu_U*)X51e0eBBW4M`z z8(KCATmEw_p52+Lr!e3MiaI=v1v!6W*c zKhK9Hzgf|Uw@9}_%sT$qYVMCN5#oR~zd7_PO~$bJw^zHtcZaHIc zx_H7xi}Le;cS*UATJDi6zUiF^chBSwSq71UwZxG_?q*JY8Vg5O|q| z=7%Mn6EQKX`8*Nyp58CrV4pi)d?=U83_q`2Vwe3Xy8|`Y#LdRC6Vijq6wNMjclnHQ zqBT>HRO4Y$aUb%pum>Zm40eL>E!_0ng5>0oBWmt^ae9&rWEjZXn1^HhWW6jMzbvMu9)M>eY zB95NDe4dfy(~@Jtm7H$7Z>&Dz6={{9Rc0&Ic>Q!yNzv`ARr!HJ&YdP4Bo6iRefE#x?rqV;MyBL&sX?o2VQ4|f-lQZF8lrS{Ze_#I_K1>{?0X*e=y-+#peb-ANwO|CCS}?Jf(CUqrCuE;0xgf zyc(W?e+oPBMetqlD)@f*V)&uZz6h_N{TX;Ad>Y;k{|(**e+qAf*D*-O-OV4Fe;vv^ zTcNGt%W03{5%?H<3H$;SxxOCS{{>%0`~RTG^Rv*tjKyC;`&#%X@L*`K!k`7F?j-tJwE~YpFGK* zTi_R=f%jDJVy--cqJ#~>z6J`eeye2qWX!vBCG-}giN*HHAh znnhSTxgLtV2jHvW8=*XZ5WWh&1BzTbQ0)IG6#G67WxbC;{wJU2kBt8^d=vZ@JPof$ z=#%gqybV4T_`h(4_7y03AG{BWT|WrL|DJ|z_+2P=dUgCi)hd z;BokRn8PLbVfY64O}GrNM2Vwt4ZaCJ3dNpZg(CldLy5be!t3Ex7*TjD6#J||@vDd7 zM=nbe1D!pY1W}Ufq1fvnMD%1S^shj%_a>Bme|z8nvL#6c#UI}t`u`S+et!=|udl$H z;WJRyc@di`cE2I;AjG7}U63Kkz3@)>*HHBO2PkrV9Ex0@g|d(T3T6HOfimASQ1tyd zRPgFo`tgUL%=4G<2z&^No&GL7{}(9peI8=!wQ0#OO9)zESuZ7wFH%emnzZ+%KT$ zdl|`D>~swjJKYLJ&Oe7T?s(|mgtyR6!}AY7OqhHKid>(9H^R?Bk>^`b;_)X?^-UxIhQm*do8-&ME@M{omv3f>BT3&rjSUgPDt7mD2qD0aUHFT!uY zC1?>!!6%@+_wP{l<42+YDjrH4x1p^2P~hLdL$p5uW#7L8#a=&zqR+3O*y&0pCFGJ< zK(WU`DE3&D#a7Z(KB_aZwk(pBQ8_7Wfa;d{WK`6#X$RV>tXAX7)FwAwYtnYIs=Gr| zr0T)Vjbyc~Qd6l-oo16dw%(ehc95*P`BknvCa;rw^k}TJe$jlPYfzT8QA^)@^zkEc zVbv=uWd}w$;@zEcV%u?~^rvN^ZB`b_?u?DHr80%?>_Gd(@Yt16LpM-XcZTXT8^u7J7c=(2+=!PAEBdc zOw=%0cV@^}aUAYcIHa+7(Sr}DJMjgzuA>QTxBAa*CdQhG(RAC;m;ve3kbz5x>kT@+(t%}mJ z0fnu~oDH(bJ~dl6ctu-z|FEc47W^@js`Oq}PsZc2a-pyhrJFP1hBHvIQ4$qJKRKlz zk&goYExWXmQzu(Df{1lq~z@Qw@lWYfqNiCvp-A(eUQ zHqEHqHarx>Bo|uIiad3R!Fd55K-*3#qAyKJbaiYZ2MhH|WFp}uXIutsEEe01#y%s7 zUCw8Dt~y2(Adf1S9#C@;Y%$(O|ByF;pTo)U(-H0vMx z`1IdrJ?qjQmAOE5^Z2JOxMseFIBTTB?zu_MILw)SOLtUoTMR*N~d#~EmMtZ z_w{>^K9OumXu3sXj;Q?ku|ygnHAlVwB02v?_hxQp~|$v zfJ7#^#Aq^uggkSxA#L@bb1ykO`Y0pa_`9k}vmMRh6OR;?aq_qcqq*fs`UB@0h2U?T zCImgx9$31$K5+Qv+Alf^;rtu}c@O8x3bL9g5mK&Z2L>h|6OUqkzZ;57B4cLuT$b81 zLppN|y4+-{igRp4SP=GP3Ca8+UC+$qq-HAqJ301vf}6?e&fa0}glPHQfBs`o!l~u` zKPVAb_EVmh5~P_iNG*rbe(%iK$erV%(or)4m;RW?{qjkQ8Rk<%^r31ljf5iy!NmJG zGv!?6B;noOgp&tLhU2?d-AQdr3ZAl`b;Sh-JjFM~mM;0UleeOnlwlNOJ}yMmeUA5? z+8UDP+sa8bcks6)I^DS~!Blij(#gy25cg@Sn9C^(ebSA`Bm1?_s5~#vlii(}$OO}z zAJ5v~>m^B>&uf|So-<@$;qD0sWs@?!6JW=J)>-OVs?+6}UR;n%0A)sN3!hqcNrL5cRvcB`fvzZhk3G0`ymi-foGjThRcoDd zMT)g$byp{|3#T90YTZMnCAEEPjS78P9bPr@NL#_olFUs-C7nXhVC=f9=h9|sgmQnPgRuM)adSc zbEj*`o$jQjH0D4y?pufZQ<|KV*^JGG6fksimn+UiGT+(V3;DTllZ%U}9*aoyjVAf- z1yW;8KJxcDKRkw2jkBtn>{k!9(nFhVlPC%9lM(_$OSRq4Tx~h5b}ww#iji>?vg{d@ zoYncn>L}`2T@`F=-9v(Ya)!j0>MHeGH_awBh$NV-9#+}5yyjJ?hrB#Ohgx%|yv?a4 z*6#0Kpc=~h17o?_oeZ{Bm6I6 zs!69}>kGF_a@#XGzLS=6PdQPHw2d~-t!(oUZM?xB=x4dj`q9sl&{oE&rhT>D3=+$V zoN<^{M)rNa%W~}W%7Xjf2;J9%O9n;(ky-qft8?^lwT9!mUq+a_1ZRFr$bgcOlV5Yl#Z3eDaA?yUI5x`D_#4zZ2(U$ND-p!sNN` zvv1#Nf96&PeDsa=Oc6ML2L0P|nGn(Pz4_lc5#OBa%D&1wARL zBngHbC6P53oM*8zS4MY1o%v3nH zRO4Y$aV7Gvum>Zm40eL>E!^~6gyiIqBWmt^ae9&rWEjZXn1^HhWW6kA0b(hcK)M>ebB95ND zf1Z})(~@Jtm7H$7FReb}EoqHkR%R>Jcms7&N!{(MRr!rV&YdP4Bg^w~d#ySGIXAB}|K(#>VD6)uY+qO(OaKHA~` kAG)7)8Y!r5_GXG{eYm%XlzQ=aEVZW=-2c>N=6DAD4#h%aApigX literal 0 HcmV?d00001 diff --git a/languages/fame_lahjoitukset-sv_SE.po b/languages/fame_lahjoitukset-sv_SE.po new file mode 100644 index 0000000..9999436 --- /dev/null +++ b/languages/fame_lahjoitukset-sv_SE.po @@ -0,0 +1,579 @@ +# Swedish translation for Lahjoitin +# Copyright (C) 2026 Fame Helsinki +# This file is distributed under the GPL-2.0-or-later. +# Translators: Fame Helsinki +msgid "" +msgstr "" +"Project-Id-Version: Lahjoitin 1.1.2\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-lahjoitin\n" +"POT-Creation-Date: 2026-03-12T10:31:31+00:00\n" +"PO-Revision-Date: 2026-03-12 00:00+0000\n" +"Last-Translator: Fame Helsinki\n" +"Language-Team: Swedish\n" +"Language: sv_SE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Domain: fame_lahjoitukset\n" + +#. Plugin Name of the plugin +#: fame-lahjoitukset.php +msgid "Lahjoitin" +msgstr "" + +#. Description of the plugin +#: fame-lahjoitukset.php +msgid "Wordpress plugin for Fame lahjoitukset system." +msgstr "WordPress-tillägg för Fame lahjoitukset-system." + +#. Author of the plugin +#: fame-lahjoitukset.php +msgid "Fame Helsinki" +msgstr "" + +#: build/Blocks/contact-form/render.php:26 +#: src/Blocks/contact-form/render.php:26 +#: build/Blocks/contact-form/index.js:1 +msgid "Contacts" +msgstr "Kontaktuppgifter" + +#: build/Blocks/donation-amounts/render.php:36 +#: src/Blocks/donation-amounts/render.php:36 +#: build/Blocks/donation-amounts/index.js:1 +msgid "Other amount" +msgstr "Annat belopp" + +#: build/Blocks/donation-amounts/render.php:38 +#: src/Blocks/donation-amounts/render.php:38 +msgid "Donation amount" +msgstr "Donationsbelopp" + +#: build/Blocks/donation-amounts/render.php:233 +#: src/Blocks/donation-amounts/render.php:233 +#: build/Blocks/donation-amounts/index.js:1 +msgid "Min" +msgstr "Min" + +#: build/Blocks/donation-amounts/render.php:235 +#: src/Blocks/donation-amounts/render.php:235 +#: build/Blocks/donation-amounts/index.js:1 +msgid "Max" +msgstr "Max" + +#: build/Blocks/donation-campaigns/render.php:30 +#: src/Blocks/donation-campaigns/render.php:30 +msgid "Campaign" +msgstr "Kampanj" + +#: build/Blocks/donation-campaigns/render.php:46 +#: src/Blocks/donation-campaigns/render.php:46 +msgid "Select campaign" +msgstr "Välj kampanj" + +#: build/Blocks/donation-form/render.php:120 +#: src/Blocks/donation-form/render.php:120 +msgid "Loading" +msgstr "Laddar" + +#: build/Blocks/donation-providers/render.php:25 +#: src/Blocks/donation-providers/render.php:25 +msgid "Payment provider" +msgstr "Betalningsleverantör" + +#: build/Blocks/donation-type/render.php:21 +#: src/Blocks/donation-type/render.php:21 +#: build/Blocks/donation-type/index.js:1 +msgid "Donation type" +msgstr "Donationstyp" + +#: build/Blocks/donation-type/render.php:55 +#: build/Blocks/donation-type/render.php:75 +#: src/Blocks/donation-type/render.php:55 +#: src/Blocks/donation-type/render.php:75 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-form/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +#: build/Blocks/form-controls/index.js:1 +msgid "Single" +msgstr "Engång" + +#: build/Blocks/donation-type/render.php:56 +#: src/Blocks/donation-type/render.php:56 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-form/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +#: build/Blocks/form-controls/index.js:1 +msgid "Recurring" +msgstr "Återkommande" + +#: build/Blocks/form-controls/render.php:12 +#: src/Blocks/form-controls/render.php:12 +#: build/Blocks/form-controls/index.js:1 +msgid "Donate" +msgstr "Donera" + +#: build/Blocks/form-controls/render.php:45 +#: src/Blocks/form-controls/render.php:45 +msgid "Please enable JavaScript to use this form." +msgstr "Aktivera JavaScript för att använda detta formulär." + +#: fame-lahjoitukset.php:44 +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-campaigns/index.js:1 +#: build/Blocks/donation-form/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Settings" +msgstr "Inställningar" + +#: src/Settings.php:36 +msgid "Backend URL" +msgstr "Backend-URL" + +#: src/Settings.php:37 +msgid "Your lahjoitukset-backend instance" +msgstr "Din lahjoitukset-backend-instans" + +#: src/Settings.php:42 +msgid "Fame lahjoitukset settings" +msgstr "Fame lahjoitukset-inställningar" + +#: src/Settings.php:43 +msgid "Lahjoitukset" +msgstr "" + +#: templates/error-reinstall.php:7 +msgid "The Lahjoitin plugin is installed incorrectly, please re-install" +msgstr "Lahjoitin-insticksprogrammet är installerat felaktigt, installera om det" + +#: build/Blocks/contact-form/index.js:1 +msgid "Show contact fields" +msgstr "Visa kontaktfält" + +#: build/Blocks/contact-form/index.js:1 +msgid "Require contact" +msgstr "Kräv kontaktuppgifter" + +#: build/Blocks/contact-form/index.js:1 +msgid "Contact details are required if enabled" +msgstr "Kontaktuppgifter krävs om aktiverat" + +#: build/Blocks/contact-form/index.js:1 +msgid "Show address" +msgstr "Visa adress" + +#: build/Blocks/contact-form/index.js:1 +msgid "Show address fields" +msgstr "Visa adressfält" + +#: build/Blocks/contact-form/index.js:1 +msgid "Show phone" +msgstr "Visa telefon" + +#: build/Blocks/contact-form/index.js:1 +msgid "Show phone number fields" +msgstr "Visa telefonnummerfält" + +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Show legend" +msgstr "Visa rubrik" + +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "If disabled, the legend is marked visually hidden." +msgstr "Om inaktiverat markeras rubriken som visuellt dold." + +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Legend" +msgstr "Rubrik" + +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Description for screen readers (for accessibility)." +msgstr "Beskrivning för skärmläsare (för tillgänglighet)." + +#: build/Blocks/contact-form/index.js:1 +msgid "The contact form is not in use. Use the toggle in the sidebar to enable it." +msgstr "Kontaktformuläret används inte. Använd knappen i sidofältet för att aktivera det." + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Amount" +msgstr "Belopp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Currency label" +msgstr "Valutaetikett" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported." +msgstr "Etikett som visas bredvid belopp. Detta styr inte faktisk donationsvaluta. För närvarande stöds endast euro." + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Default amount" +msgstr "Standardbelopp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Amount that is preselected." +msgstr "Förvalt belopp." + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Min Amount" +msgstr "Minbelopp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Minimum amount for other amount field." +msgstr "Minsta belopp för fältet Annat belopp." + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Max Amount" +msgstr "Maxbelopp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Maximum amount for other amount field." +msgstr "Maximalt belopp för fältet Annat belopp." + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Other amount text" +msgstr "Text för annat belopp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Show other amount" +msgstr "Visa annat belopp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Show other amount input field" +msgstr "Visa inmatningsfält för annat belopp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Amount columns" +msgstr "Beloppskolumner" + +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-form/index.js:1 +msgid "Choose 1–3 columns for the form layout." +msgstr "Välj 1–3 kolumner för formulärets layout." + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Add button" +msgstr "Lägg till knapp" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Remove button" +msgstr "Ta bort knapp" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Show campaign selector" +msgstr "Visa kampanjväljare" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Show label" +msgstr "Visa etikett" + +#: build/Blocks/donation-campaigns/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +msgid "Label" +msgstr "Etikett" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Campaigns" +msgstr "Kampanjer" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Remove campaign" +msgstr "Ta bort kampanj" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Remove" +msgstr "Ta bort" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "New campaign" +msgstr "Ny kampanj" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Add" +msgstr "Lägg till" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Maximum of 10 campaigns reached." +msgstr "Maximalt 10 kampanjer har nåtts." + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "No campaigns added yet" +msgstr "Inga kampanjer har lagts till ännu" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "The campaign selector is not in use. Use the toggle in the sidebar to enable it." +msgstr "Kampanjväljaren används inte. Använd knappen i sidofältet för att aktivera den." + +#: build/Blocks/donation-form/index.js:1 +msgid "Desktop columns" +msgstr "Kolumner på skrivbordet" + +#: build/Blocks/donation-form/index.js:1 +msgid "Enabled donation types" +msgstr "Aktiverade donationstyper" + +#: build/Blocks/donation-form/index.js:1 +msgid "Choose the donation type to enable." +msgstr "Välj donationstyp som ska aktiveras." + +#: build/Blocks/donation-form/index.js:1 +msgid "Return address" +msgstr "Returadress" + +#: build/Blocks/donation-form/index.js:1 +msgid "Page that is displayed after donation is submitted." +msgstr "Sida som visas efter att donationen skickats." + +#: build/Blocks/donation-form/index.js:1 +msgid "Tab background color" +msgstr "Flikens bakgrundsfärg" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the background color for tabs." +msgstr "Detta är bakgrundsfärgen för flikar." + +#: build/Blocks/donation-form/index.js:1 +msgid "Tab text" +msgstr "Fliktext" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the text color for selected tabs." +msgstr "Detta är textfärgen för valda flikar." + +#: build/Blocks/donation-form/index.js:1 +msgid "Input border color" +msgstr "Inmatningsfältets kantfärg" + +#: build/Blocks/donation-form/index.js:1 +msgid "This defines the border and helper text color of the input field." +msgstr "Definierar kantens och hjälptextens färg för inmatningsfältet." + +#: build/Blocks/donation-form/index.js:1 +msgid "Danger color" +msgstr "Varningsfärg" + +#: build/Blocks/donation-form/index.js:1 +msgid "This defines the danger color for error messages and invalid input fields." +msgstr "Definierar varningsfärgen för felmeddelanden och ogiltiga inmatningsfält." + +#: build/Blocks/donation-form/index.js:1 +msgid "Border Radius" +msgstr "Kantradie" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the border-radius for tabs." +msgstr "Detta är kantradien för flikar." + +#: build/Blocks/donation-form/index.js:1 +msgid "Border Width" +msgstr "Kantbredd" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the border-width for tabs and input fields." +msgstr "Detta är kantbredden för flikar och inmatningsfält." + +#: build/Blocks/donation-form/index.js:1 +msgid "Text field border radius" +msgstr "Textfältets kantradie" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the border-radius for the text fields." +msgstr "Detta är kantradien för textfälten." + +#: build/Blocks/donation-form/index.js:1 +msgid "Return userinfo token" +msgstr "Returnera användarinformationstoken" + +#: build/Blocks/donation-form/index.js:1 +msgid "This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token." +msgstr "Det här alternativet inkluderar användarinformationstoken i returadressen. Det är i allmänhet inte användbart och kräver anpassad logik för att hantera token." + +#. translators: %1$s: minimum amount, %2$s: currency symbol +#: build/Blocks/donation-form/view.js:2 +#, js-format +msgid "The minimum donation amount is %1$s%2$s." +msgstr "Det minsta donationsbeloppet är %1$s%2$s." + +#. translators: %1$s: maximum amount, %2$s: currency symbol +#: build/Blocks/donation-form/view.js:3 +#, js-format +msgid "The maximum donation amount is %1$s%2$s." +msgstr "Det maximala donationsbeloppet är %1$s%2$s." + +#: build/Blocks/donation-form/view.js:3 +msgid "Invalid amount" +msgstr "Ogiltigt belopp" + +#: build/Blocks/donation-form/view.js:3 +msgid "First name is required" +msgstr "Förnamn krävs" + +#: build/Blocks/donation-form/view.js:3 +msgid "Invalid first name" +msgstr "Ogiltigt förnamn" + +#: build/Blocks/donation-form/view.js:3 +msgid "Last name is required" +msgstr "Efternamn krävs" + +#: build/Blocks/donation-form/view.js:3 +msgid "Invalid last name" +msgstr "Ogiltigt efternamn" + +#: build/Blocks/donation-form/view.js:3 +msgid "Email is required" +msgstr "E-post krävs" + +#: build/Blocks/donation-form/view.js:3 +msgid "Invalid email" +msgstr "Ogiltig e-postadress" + +#: build/Blocks/donation-form/view.js:3 +msgid "Invalid phone number" +msgstr "Ogiltigt telefonnummer" + +#: build/Blocks/donation-providers/index.js:1 +msgid "MobilePay" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Paytrail" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Provider type" +msgstr "Leverantörstyp" + +#: build/Blocks/donation-providers/index.js:1 +msgid "General settings" +msgstr "Allmänna inställningar" + +#: build/Blocks/donation-providers/index.js:1 +msgid "label" +msgstr "etikett" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Donation provider" +msgstr "Donationsleverantör" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Terms text…" +msgstr "Villkorstext…" + +#: build/Blocks/donation-type/index.js:1 +msgid "Default donation type" +msgstr "Standard donationstyp" + +#: build/Blocks/donation-type/index.js:1 +msgid "Select donation type that will be used by default." +msgstr "Välj donationstyp som används som standard." + +#: build/Blocks/form-controls/index.js:1 +msgid "Button labels" +msgstr "Knappetikett" + +#: build/Blocks/form-controls/index.js:1 +msgid "Single button text" +msgstr "Knapptext för engångsdonation" + +#: build/Blocks/form-controls/index.js:1 +msgid "Recurring button text" +msgstr "Knapptext för återkommande" + +#: build/Blocks/contact-form/block.json +#: src/Blocks/contact-form/block.json +msgctxt "block title" +msgid "Contact form" +msgstr "Kontaktformulär" + +#: build/Blocks/contact-form/block.json +#: src/Blocks/contact-form/block.json +msgctxt "block description" +msgid "Gutenberg block for Fame lahjoitukset backend." +msgstr "Gutenberg-block för Fame lahjoitukset-backend." + +#: build/Blocks/donation-amounts/block.json +#: src/Blocks/donation-amounts/block.json +msgctxt "block title" +msgid "Donation amounts" +msgstr "Donationsbelopp" + +#: build/Blocks/donation-amounts/block.json +#: src/Blocks/donation-amounts/block.json +msgctxt "block description" +msgid "Allows selecting donation amounts." +msgstr "Möjliggör val av donationsbelopp." + +#: build/Blocks/donation-campaigns/block.json +#: src/Blocks/donation-campaigns/block.json +msgctxt "block title" +msgid "Campaigns" +msgstr "Kampanjer" + +#: build/Blocks/donation-campaigns/block.json +#: src/Blocks/donation-campaigns/block.json +msgctxt "block description" +msgid "Campaign selector for the donation form." +msgstr "Kampanjväljare för donationsformuläret." + +#: build/Blocks/donation-form/block.json +#: src/Blocks/donation-form/block.json +msgctxt "block title" +msgid "Lahjoitin" +msgstr "" + +#: build/Blocks/donation-form/block.json +#: src/Blocks/donation-form/block.json +msgctxt "block description" +msgid "Gutenberg block for Fame donation system." +msgstr "Gutenberg-block för Fame donationssystem." + +#: build/Blocks/donation-providers/block.json +#: src/Blocks/donation-providers/block.json +msgctxt "block title" +msgid "Payment providers" +msgstr "Betalningsleverantörer" + +#: build/Blocks/donation-providers/block.json +#: src/Blocks/donation-providers/block.json +msgctxt "block description" +msgid "Allows selecting payment providers." +msgstr "Möjliggör val av betalningsleverantör." + +#: build/Blocks/donation-type/block.json +#: src/Blocks/donation-type/block.json +msgctxt "block title" +msgid "Donation type" +msgstr "Donationstyp" + +#: build/Blocks/donation-type/block.json +#: src/Blocks/donation-type/block.json +msgctxt "block description" +msgid "Allows selecting donation type." +msgstr "Möjliggör val av donationstyp." + +#: build/Blocks/form-controls/block.json +#: src/Blocks/form-controls/block.json +msgctxt "block title" +msgid "Form controls" +msgstr "Formulärkontroller" + +#: build/Blocks/form-controls/block.json +#: src/Blocks/form-controls/block.json +msgctxt "block description" +msgid "Adds form controls." +msgstr "Lägger till formulärkontroller." diff --git a/languages/fame_lahjoitukset.pot b/languages/fame_lahjoitukset.pot index 1465611..eae77a9 100644 --- a/languages/fame_lahjoitukset.pot +++ b/languages/fame_lahjoitukset.pot @@ -1,22 +1,22 @@ -# Copyright (C) 2025 Fame Helsinki +# Copyright (C) 2026 Fame Helsinki # This file is distributed under the GPL-2.0-or-later. msgid "" msgstr "" -"Project-Id-Version: Fame lahjoitukset 1.x\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/fame-lahjoitukset\n" +"Project-Id-Version: Lahjoitin 1.1.2\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-lahjoitin\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2025-03-19T22:28:47+02:00\n" +"POT-Creation-Date: 2026-03-12T10:31:31+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.11.0\n" +"X-Generator: WP-CLI 2.12.0\n" "X-Domain: fame_lahjoitukset\n" #. Plugin Name of the plugin #: fame-lahjoitukset.php -msgid "Fame lahjoitukset" +msgid "Lahjoitin" msgstr "" #. Description of the plugin @@ -29,6 +29,103 @@ msgstr "" msgid "Fame Helsinki" msgstr "" +#: build/Blocks/contact-form/render.php:26 +#: src/Blocks/contact-form/render.php:26 +#: build/Blocks/contact-form/index.js:1 +msgid "Contacts" +msgstr "" + +#: build/Blocks/donation-amounts/render.php:36 +#: src/Blocks/donation-amounts/render.php:36 +#: build/Blocks/donation-amounts/index.js:1 +msgid "Other amount" +msgstr "" + +#: build/Blocks/donation-amounts/render.php:38 +#: src/Blocks/donation-amounts/render.php:38 +msgid "Donation amount" +msgstr "" + +#: build/Blocks/donation-amounts/render.php:233 +#: src/Blocks/donation-amounts/render.php:233 +#: build/Blocks/donation-amounts/index.js:1 +msgid "Min" +msgstr "" + +#: build/Blocks/donation-amounts/render.php:235 +#: src/Blocks/donation-amounts/render.php:235 +#: build/Blocks/donation-amounts/index.js:1 +msgid "Max" +msgstr "" + +#: build/Blocks/donation-campaigns/render.php:30 +#: src/Blocks/donation-campaigns/render.php:30 +msgid "Campaign" +msgstr "" + +#: build/Blocks/donation-campaigns/render.php:46 +#: src/Blocks/donation-campaigns/render.php:46 +msgid "Select campaign" +msgstr "" + +#: build/Blocks/donation-form/render.php:120 +#: src/Blocks/donation-form/render.php:120 +msgid "Loading" +msgstr "" + +#: build/Blocks/donation-providers/render.php:25 +#: src/Blocks/donation-providers/render.php:25 +msgid "Payment provider" +msgstr "" + +#: build/Blocks/donation-type/render.php:21 +#: src/Blocks/donation-type/render.php:21 +#: build/Blocks/donation-type/index.js:1 +msgid "Donation type" +msgstr "" + +#: build/Blocks/donation-type/render.php:55 +#: build/Blocks/donation-type/render.php:75 +#: src/Blocks/donation-type/render.php:55 +#: src/Blocks/donation-type/render.php:75 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-form/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +#: build/Blocks/form-controls/index.js:1 +msgid "Single" +msgstr "" + +#: build/Blocks/donation-type/render.php:56 +#: src/Blocks/donation-type/render.php:56 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-form/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +#: build/Blocks/form-controls/index.js:1 +msgid "Recurring" +msgstr "" + +#: build/Blocks/form-controls/render.php:12 +#: src/Blocks/form-controls/render.php:12 +#: build/Blocks/form-controls/index.js:1 +msgid "Donate" +msgstr "" + +#: build/Blocks/form-controls/render.php:45 +#: src/Blocks/form-controls/render.php:45 +msgid "Please enable JavaScript to use this form." +msgstr "" + +#: fame-lahjoitukset.php:44 +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-campaigns/index.js:1 +#: build/Blocks/donation-form/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Settings" +msgstr "" + #: src/Settings.php:36 msgid "Backend URL" msgstr "" @@ -46,203 +143,352 @@ msgid "Lahjoitukset" msgstr "" #: templates/error-reinstall.php:7 -msgid "The Fame Lahjoitukset plugin is installed incorrectly, please re-install" +msgid "The Lahjoitin plugin is installed incorrectly, please re-install" msgstr "" -#: build/Blocks/contact-form/index.js:249 -#: build/Blocks/donation-amounts/index.js:485 -#: build/Blocks/donation-form/index.js:198 -#: build/Blocks/donation-type/index.js:286 -msgid "Settings" +#: build/Blocks/contact-form/index.js:1 +msgid "Show contact fields" msgstr "" -#: build/Blocks/contact-form/index.js:251 +#: build/Blocks/contact-form/index.js:1 msgid "Require contact" msgstr "" -#: build/Blocks/contact-form/index.js:252 +#: build/Blocks/contact-form/index.js:1 msgid "Contact details are required if enabled" msgstr "" -#: build/Blocks/contact-form/index.js:258 +#: build/Blocks/contact-form/index.js:1 msgid "Show address" msgstr "" -#: build/Blocks/contact-form/index.js:259 +#: build/Blocks/contact-form/index.js:1 msgid "Show address fields" msgstr "" -#: build/Blocks/contact-form/index.js:265 +#: build/Blocks/contact-form/index.js:1 msgid "Show phone" msgstr "" -#: build/Blocks/contact-form/index.js:266 +#: build/Blocks/contact-form/index.js:1 msgid "Show phone number fields" msgstr "" -#: build/Blocks/donation-amounts/index.js:26 -#: build/Blocks/donation-amounts/index.js:145 -#: build/Blocks/donation-amounts/index.js:555 -msgid "Amount" +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Show legend" msgstr "" -#: build/Blocks/donation-amounts/index.js:66 -#: build/Blocks/donation-form/index.js:25 -#: build/Blocks/donation-type/index.js:69 -msgid "Single" +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "If disabled, the legend is marked visually hidden." msgstr "" -#: build/Blocks/donation-amounts/index.js:67 -#: build/Blocks/donation-form/index.js:26 -#: build/Blocks/donation-type/index.js:70 -msgid "Recurring" +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Legend" +msgstr "" + +#: build/Blocks/contact-form/index.js:1 +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +#: build/Blocks/donation-type/index.js:1 +msgid "Description for screen readers (for accessibility)." msgstr "" -#: build/Blocks/donation-amounts/index.js:199 +#: build/Blocks/contact-form/index.js:1 +msgid "The contact form is not in use. Use the toggle in the sidebar to enable it." +msgstr "" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Amount" +msgstr "" + +#: build/Blocks/donation-amounts/index.js:1 msgid "Currency label" msgstr "" -#: build/Blocks/donation-amounts/index.js:200 +#: build/Blocks/donation-amounts/index.js:1 msgid "Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported." msgstr "" -#: build/Blocks/donation-amounts/index.js:207 -#: build/Blocks/donation-amounts/index.js:215 +#: build/Blocks/donation-amounts/index.js:1 msgid "Default amount" msgstr "" -#: build/Blocks/donation-amounts/index.js:208 -#: build/Blocks/donation-amounts/index.js:216 +#: build/Blocks/donation-amounts/index.js:1 msgid "Amount that is preselected." msgstr "" -#: build/Blocks/donation-amounts/index.js:295 -msgid "Other amount text" +#: build/Blocks/donation-amounts/index.js:1 +msgid "Min Amount" msgstr "" -#: build/Blocks/donation-amounts/index.js:300 -#: build/Blocks/donation-amounts/index.js:301 -#: build/Blocks/donation-amounts/index.js:673 -msgid "Other amount" +#: build/Blocks/donation-amounts/index.js:1 +msgid "Minimum amount for other amount field." msgstr "" -#: build/Blocks/donation-amounts/index.js:487 -msgid "Show other amount" +#: build/Blocks/donation-amounts/index.js:1 +msgid "Max Amount" msgstr "" -#: build/Blocks/donation-amounts/index.js:488 -msgid "Show other amount input field" +#: build/Blocks/donation-amounts/index.js:1 +msgid "Maximum amount for other amount field." msgstr "" -#: build/Blocks/donation-amounts/index.js:494 -#: build/Blocks/donation-type/index.js:296 -msgid "Show legend" +#: build/Blocks/donation-amounts/index.js:1 +msgid "Other amount text" msgstr "" -#: build/Blocks/donation-amounts/index.js:495 -#: build/Blocks/donation-type/index.js:297 -msgid "If disabled, the legend is marked visually hidden." +#: build/Blocks/donation-amounts/index.js:1 +msgid "Show other amount" msgstr "" -#: build/Blocks/donation-amounts/index.js:502 -#: build/Blocks/donation-amounts/index.js:554 -#: build/Blocks/donation-type/index.js:304 -#: build/Blocks/donation-type/index.js:320 -msgid "Legend" +#: build/Blocks/donation-amounts/index.js:1 +msgid "Show other amount input field" +msgstr "" + +#: build/Blocks/donation-amounts/index.js:1 +msgid "Amount columns" msgstr "" -#: build/Blocks/donation-amounts/index.js:503 -#: build/Blocks/donation-type/index.js:305 -msgid "Description for screen readers." +#: build/Blocks/donation-amounts/index.js:1 +#: build/Blocks/donation-form/index.js:1 +msgid "Choose 1–3 columns for the form layout." msgstr "" -#: build/Blocks/donation-amounts/index.js:515 +#: build/Blocks/donation-amounts/index.js:1 msgid "Add button" msgstr "" -#: build/Blocks/donation-amounts/index.js:524 +#: build/Blocks/donation-amounts/index.js:1 msgid "Remove button" msgstr "" -#: build/Blocks/donation-form/index.js:100 +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Show campaign selector" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Show label" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +#: build/Blocks/donation-providers/index.js:1 +msgid "Label" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Campaigns" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Remove campaign" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Remove" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "New campaign" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Add" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "Maximum of 10 campaigns reached." +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "No campaigns added yet" +msgstr "" + +#: build/Blocks/donation-campaigns/index.js:1 +msgid "The campaign selector is not in use. Use the toggle in the sidebar to enable it." +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "Desktop columns" +msgstr "" + +#: build/Blocks/donation-form/index.js:1 msgid "Enabled donation types" msgstr "" -#: build/Blocks/donation-form/index.js:101 -msgid "Donation types that can be used with this form. Selecting multiple options is allowed." +#: build/Blocks/donation-form/index.js:1 +msgid "Choose the donation type to enable." msgstr "" -#: build/Blocks/donation-form/index.js:205 +#: build/Blocks/donation-form/index.js:1 msgid "Return address" msgstr "" -#: build/Blocks/donation-form/index.js:206 +#: build/Blocks/donation-form/index.js:1 msgid "Page that is displayed after donation is submitted." msgstr "" -#: build/Blocks/donation-form/index.js:212 -msgid "Campaign" +#: build/Blocks/donation-form/index.js:1 +msgid "Tab background color" +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the background color for tabs." +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "Tab text" +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the text color for selected tabs." +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "Input border color" +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "This defines the border and helper text color of the input field." +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "Danger color" +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "This defines the danger color for error messages and invalid input fields." +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "Border Radius" +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the border-radius for tabs." +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "Border Width" +msgstr "" + +#: build/Blocks/donation-form/index.js:1 +msgid "This is the border-width for tabs and input fields." msgstr "" -#: build/Blocks/donation-form/index.js:213 -msgid "Label that can be used to segment donations coming from this form." +#: build/Blocks/donation-form/index.js:1 +msgid "Text field border radius" msgstr "" -#: build/Blocks/donation-form/index.js:219 +#: build/Blocks/donation-form/index.js:1 +msgid "This is the border-radius for the text fields." +msgstr "" + +#: build/Blocks/donation-form/index.js:1 msgid "Return userinfo token" msgstr "" -#: build/Blocks/donation-form/index.js:220 +#: build/Blocks/donation-form/index.js:1 msgid "This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token." msgstr "" -#: build/Blocks/donation-form/view.js:521 +#. translators: %1$s: minimum amount, %2$s: currency symbol +#: build/Blocks/donation-form/view.js:2 +#, js-format +msgid "The minimum donation amount is %1$s%2$s." +msgstr "" + +#. translators: %1$s: maximum amount, %2$s: currency symbol +#: build/Blocks/donation-form/view.js:3 +#, js-format +msgid "The maximum donation amount is %1$s%2$s." +msgstr "" + +#: build/Blocks/donation-form/view.js:3 msgid "Invalid amount" msgstr "" -#: build/Blocks/donation-form/view.js:524 +#: build/Blocks/donation-form/view.js:3 msgid "First name is required" msgstr "" -#: build/Blocks/donation-form/view.js:525 +#: build/Blocks/donation-form/view.js:3 msgid "Invalid first name" msgstr "" -#: build/Blocks/donation-form/view.js:528 +#: build/Blocks/donation-form/view.js:3 msgid "Last name is required" msgstr "" -#: build/Blocks/donation-form/view.js:529 +#: build/Blocks/donation-form/view.js:3 msgid "Invalid last name" msgstr "" -#: build/Blocks/donation-form/view.js:532 +#: build/Blocks/donation-form/view.js:3 msgid "Email is required" msgstr "" -#: build/Blocks/donation-form/view.js:533 +#: build/Blocks/donation-form/view.js:3 msgid "Invalid email" msgstr "" -#: build/Blocks/donation-form/view.js:536 +#: build/Blocks/donation-form/view.js:3 msgid "Invalid phone number" msgstr "" -#: build/Blocks/donation-type/index.js:158 -#: build/Blocks/donation-type/index.js:321 -msgid "Donation type" +#: build/Blocks/donation-providers/index.js:1 +msgid "MobilePay" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Paytrail" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Provider type" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "General settings" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "label" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Donation provider" +msgstr "" + +#: build/Blocks/donation-providers/index.js:1 +msgid "Terms text…" msgstr "" -#: build/Blocks/donation-type/index.js:288 +#: build/Blocks/donation-type/index.js:1 msgid "Default donation type" msgstr "" -#: build/Blocks/donation-type/index.js:289 +#: build/Blocks/donation-type/index.js:1 msgid "Select donation type that will be used by default." msgstr "" -#: build/Blocks/form-controls/index.js:117 -msgid "Please enable JavaScript to use this form." +#: build/Blocks/form-controls/index.js:1 +msgid "Button labels" +msgstr "" + +#: build/Blocks/form-controls/index.js:1 +msgid "Single button text" +msgstr "" + +#: build/Blocks/form-controls/index.js:1 +msgid "Recurring button text" msgstr "" #: build/Blocks/contact-form/block.json @@ -269,10 +515,22 @@ msgctxt "block description" msgid "Allows selecting donation amounts." msgstr "" +#: build/Blocks/donation-campaigns/block.json +#: src/Blocks/donation-campaigns/block.json +msgctxt "block title" +msgid "Campaigns" +msgstr "" + +#: build/Blocks/donation-campaigns/block.json +#: src/Blocks/donation-campaigns/block.json +msgctxt "block description" +msgid "Campaign selector for the donation form." +msgstr "" + #: build/Blocks/donation-form/block.json #: src/Blocks/donation-form/block.json msgctxt "block title" -msgid "Donation form" +msgid "Lahjoitin" msgstr "" #: build/Blocks/donation-form/block.json @@ -281,6 +539,18 @@ msgctxt "block description" msgid "Gutenberg block for Fame donation system." msgstr "" +#: build/Blocks/donation-providers/block.json +#: src/Blocks/donation-providers/block.json +msgctxt "block title" +msgid "Payment providers" +msgstr "" + +#: build/Blocks/donation-providers/block.json +#: src/Blocks/donation-providers/block.json +msgctxt "block description" +msgid "Allows selecting payment providers." +msgstr "" + #: build/Blocks/donation-type/block.json #: src/Blocks/donation-type/block.json msgctxt "block title" From 9588ef2d6c1c1b6b7029270bd577a0cddd2bb9e2 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 09:55:59 +0200 Subject: [PATCH 25/34] LHJ-79: Fix plugin translation loading and add locale fallback support --- src/Blocks.php | 68 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/src/Blocks.php b/src/Blocks.php index df324d2..1e71d9f 100644 --- a/src/Blocks.php +++ b/src/Blocks.php @@ -37,6 +37,23 @@ public static function create(ContainerInterface $container): self */ public function onBlockRegister(\WP_Block_Type $block): void { + $langPath = LAHJOITUKSET_PLUGIN_PATH . 'languages'; + + // Register translations for all editor scripts. + foreach ($block->editor_script_handles as $handle) { + wp_set_script_translations($handle, 'fame_lahjoitukset', $langPath); + } + + // Register translations for frontend scripts that have a valid registered src. + // Handles with an empty src (e.g. block.json references a file that was not built) + // trigger warnings in load_script_textdomain when wp_parse_url gets a bare domain URL. + $wpScripts = wp_scripts(); + foreach ([...$block->view_script_handles, ...$block->script_handles] as $handle) { + if (!empty($wpScripts->registered[$handle]->src ?? '')) { + wp_set_script_translations($handle, 'fame_lahjoitukset', $langPath); + } + } + if ($block->name === 'famehelsinki/donation-form') { if (empty($block->view_script_handles)) { return; @@ -51,6 +68,53 @@ public function onBlockRegister(\WP_Block_Type $block): void } + /** + * Load the plugin text domain with locale fallback support. + * + * WordPress's automatic plugin translation loading only looks in WP_LANG_DIR + * and only resolves the exact locale. This method loads from the plugin's own + * languages/ directory and falls back from a short locale (e.g. "fi") to its + * full-locale variant (e.g. "fi_FI"), and vice versa, so the plugin works on + * sites regardless of whether they use the short or full form. + */ + #[Action('init')] + public function loadTextdomain(): void + { + $locale = determine_locale(); + $langDir = LAHJOITUKSET_PLUGIN_PATH . 'languages'; + + foreach ($this->buildLocaleFallbacks($locale, $langDir) as $candidate) { + if (load_textdomain('fame_lahjoitukset', "$langDir/fame_lahjoitukset-$candidate.mo", $candidate)) { + return; + } + } + } + + /** + * Returns locale candidates to try, most specific first. + * + * - fi_FI → [fi_FI, fi] + * - fi → [fi, fi_FI] (fi_FI discovered by scanning available .mo files) + */ + /** @return string[] */ + private function buildLocaleFallbacks(string $locale, string $langDir): array + { + $locales = [$locale]; + + if (str_contains($locale, '_')) { + // Full locale: append the short form (fi_FI → fi). + $locales[] = strstr($locale, '_', true); + } else { + // Short locale: scan for available full-locale .mo files (fi → fi_FI). + $pattern = $langDir . '/fame_lahjoitukset-' . $locale . '_*.mo'; + foreach (glob($pattern) ?: [] as $file) { + $locales[] = substr(basename($file, '.mo'), strlen('fame_lahjoitukset-')); + } + } + + return array_unique($locales); + } + /** * Init Gutenberg component. */ @@ -67,7 +131,9 @@ public function registerBlockTypes(): void // https://developer.wordpress.org/reference/functions/register_block_type/ $block = register_block_type($block_folder); - $this->onBlockRegister($block); + if ($block instanceof \WP_Block_Type) { + $this->onBlockRegister($block); + } } } } From 212ff72fcb398dd54d3387d93914b4e0d9105541 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 09:57:15 +0200 Subject: [PATCH 26/34] LHJ-79: Remove unused path reference --- src/Blocks/donation-providers/block.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Blocks/donation-providers/block.json b/src/Blocks/donation-providers/block.json index e3cf6d2..a040503 100644 --- a/src/Blocks/donation-providers/block.json +++ b/src/Blocks/donation-providers/block.json @@ -27,7 +27,6 @@ "textdomain": "fame_lahjoitukset", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", - "script": "file:./view.js", "style": "file:./style-index.css", "render": "file:./render.php" } From 02108d25b78578f5c4f5c3408a44a759fe2c89b8 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 09:58:07 +0200 Subject: [PATCH 27/34] LHJ-79: change default language text to english --- src/Blocks/donation-form/view/AmountHandler.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Blocks/donation-form/view/AmountHandler.ts b/src/Blocks/donation-form/view/AmountHandler.ts index 3cf7f94..aa676ba 100644 --- a/src/Blocks/donation-form/view/AmountHandler.ts +++ b/src/Blocks/donation-form/view/AmountHandler.ts @@ -232,8 +232,8 @@ export class AmountWrapper { this.#showError( target, sprintf( - /* translators: %1$s: amount, %2$s: currency symbol */ - __('Pienin mahdollinen lahjoitussumma on %1$s%2$s.', 'fame_lahjoitukset'), + /* translators: %1$s: minimum amount, %2$s: currency symbol */ + __('The minimum donation amount is %1$s%2$s.', 'fame_lahjoitukset'), min, unit ) @@ -249,8 +249,8 @@ export class AmountWrapper { this.#showError( target, sprintf( - /* translators: %1$s: amount, %2$s: currency symbol */ - __('Suurin mahdollinen lahjoitussumma on %1$s%2$s.', 'fame_lahjoitukset'), + /* translators: %1$s: maximum amount, %2$s: currency symbol */ + __('The maximum donation amount is %1$s%2$s.', 'fame_lahjoitukset'), max, unit ) From daf2abad17eff1a41193bd99516c4ab22483de75 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 13:38:01 +0200 Subject: [PATCH 28/34] LHJ-79: update i18n scripts --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2a248d5..7625b10 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,10 @@ "main": "build/index.js", "scripts": { "build": "wp-scripts build", - "i18n:pot": "npm run build && wp i18n make-pot . languages/fame_lahjoitukset.pot --domain=fame_lahjoitukset --exclude=node_modules,vendor,tests,.git", + "i18n:pot": "npm run build && ddev exec bash -lc \"cd /var/www/html/web/app/plugins/wp-lahjoitin && wp i18n make-pot . languages/fame_lahjoitukset.pot --domain=fame_lahjoitukset --exclude=node_modules,vendor,tests,.git\"", "i18n:derive": "sed 's/Language: fi_FI/Language: fi/' languages/fame_lahjoitukset-fi_FI.po > languages/fame_lahjoitukset-fi.po && sed 's/Language: sv_SE/Language: sv/' languages/fame_lahjoitukset-sv_SE.po > languages/fame_lahjoitukset-sv.po", - "i18n:mo": "wp i18n make-mo languages/fame_lahjoitukset-fi_FI.po && wp i18n make-mo languages/fame_lahjoitukset-fi.po && wp i18n make-mo languages/fame_lahjoitukset-sv_SE.po && wp i18n make-mo languages/fame_lahjoitukset-sv.po", - "i18n:json": "wp i18n make-json languages/fame_lahjoitukset-fi_FI.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-fi.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-sv_SE.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-sv.po languages/ --no-purge", + "i18n:mo": "ddev exec bash -lc \"cd /var/www/html/web/app/plugins/wp-lahjoitin && wp i18n make-mo languages/fame_lahjoitukset-fi_FI.po && wp i18n make-mo languages/fame_lahjoitukset-fi.po && wp i18n make-mo languages/fame_lahjoitukset-sv_SE.po && wp i18n make-mo languages/fame_lahjoitukset-sv.po\"", + "i18n:json": "ddev exec bash -lc \"cd /var/www/html/web/app/plugins/wp-lahjoitin && wp i18n make-json languages/fame_lahjoitukset-fi_FI.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-fi.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-sv_SE.po languages/ --no-purge && wp i18n make-json languages/fame_lahjoitukset-sv.po languages/ --no-purge\"", "i18n": "npm run i18n:pot && npm run i18n:derive && npm run i18n:mo && npm run i18n:json", "format": "wp-scripts format src", "lint:css": "wp-scripts lint-style", From 8b332d4f1a089516df306e7bc531942c2d248008 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 13 Mar 2026 13:38:46 +0200 Subject: [PATCH 29/34] LHJ-79: change texts --- src/Blocks/donation-form/edit.tsx | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Blocks/donation-form/edit.tsx b/src/Blocks/donation-form/edit.tsx index 92e12d0..09c773b 100644 --- a/src/Blocks/donation-form/edit.tsx +++ b/src/Blocks/donation-form/edit.tsx @@ -298,8 +298,11 @@ export default function Edit({ setAttributes({ borderRadius: value })} /> @@ -371,7 +380,7 @@ export default function Edit({ Date: Fri, 13 Mar 2026 13:40:47 +0200 Subject: [PATCH 30/34] LHJ-79: Update translation files after updating source strings --- ...t-fi-00bee4e57e311861dfb1c0adb7a51ca5.json | 2 +- ...t-fi-51ba2e6489258c6bfb22ef95cc627b94.json | 2 +- ...t-fi-843cb9ca3e3cd9fa8a010526de06581f.json | 2 +- ...t-fi-a1a498bc675c3116ad6115b38bfff5b4.json | 2 +- ...t-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 2 +- ...t-fi-c12d28b3423fdb3237c59e032da4fa7f.json | 2 +- ...t-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json | 2 +- ...t-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json | 2 +- languages/fame_lahjoitukset-fi.mo | Bin 8750 -> 8807 bytes languages/fame_lahjoitukset-fi.po | 16 +++++++------- ...i_FI-00bee4e57e311861dfb1c0adb7a51ca5.json | 2 +- ...i_FI-51ba2e6489258c6bfb22ef95cc627b94.json | 2 +- ...i_FI-843cb9ca3e3cd9fa8a010526de06581f.json | 2 +- ...i_FI-a1a498bc675c3116ad6115b38bfff5b4.json | 2 +- ...i_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 2 +- ...i_FI-c12d28b3423fdb3237c59e032da4fa7f.json | 2 +- ...i_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json | 2 +- ...i_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json | 2 +- languages/fame_lahjoitukset-fi_FI.mo | Bin 8753 -> 8810 bytes languages/fame_lahjoitukset-fi_FI.po | 16 +++++++------- ...t-sv-00bee4e57e311861dfb1c0adb7a51ca5.json | 2 +- ...t-sv-51ba2e6489258c6bfb22ef95cc627b94.json | 2 +- ...t-sv-843cb9ca3e3cd9fa8a010526de06581f.json | 2 +- ...t-sv-a1a498bc675c3116ad6115b38bfff5b4.json | 2 +- ...t-sv-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 2 +- ...t-sv-c12d28b3423fdb3237c59e032da4fa7f.json | 2 +- ...t-sv-d6c9f4c6041699fdecfef4f8c7a20e85.json | 2 +- ...t-sv-ff8c96b8bc4bc42ad7e498decd6882a5.json | 2 +- languages/fame_lahjoitukset-sv.mo | Bin 8519 -> 8606 bytes languages/fame_lahjoitukset-sv.po | 16 +++++++------- ...v_SE-00bee4e57e311861dfb1c0adb7a51ca5.json | 2 +- ...v_SE-51ba2e6489258c6bfb22ef95cc627b94.json | 2 +- ...v_SE-843cb9ca3e3cd9fa8a010526de06581f.json | 2 +- ...v_SE-a1a498bc675c3116ad6115b38bfff5b4.json | 2 +- ...v_SE-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 2 +- ...v_SE-c12d28b3423fdb3237c59e032da4fa7f.json | 2 +- ...v_SE-d6c9f4c6041699fdecfef4f8c7a20e85.json | 2 +- ...v_SE-ff8c96b8bc4bc42ad7e498decd6882a5.json | 2 +- languages/fame_lahjoitukset-sv_SE.mo | Bin 8522 -> 8609 bytes languages/fame_lahjoitukset-sv_SE.po | 16 +++++++------- languages/fame_lahjoitukset.pot | 20 ++++++++---------- 41 files changed, 73 insertions(+), 75 deletions(-) diff --git a/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json b/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json index 8041433..d86c0e1 100644 --- a/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json +++ b/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Label":["Otsikko"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Tarjoajatyyppi"],"General settings":["Yleiset asetukset"],"label":["otsikko"],"Donation provider":["Lahjoitusmaksuntarjoaja"],"Terms text\u2026":["Ehtojen teksti\u2026"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Label":["Otsikko"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Tarjoajatyyppi"],"General settings":["Yleiset asetukset"],"label":["otsikko"],"Donation provider":["Lahjoitusmaksuntarjoaja"],"Terms text\u2026":["Ehtojen teksti\u2026"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json b/languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json index 74066a5..028bfb7 100644 --- a/languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json +++ b/languages/fame_lahjoitukset-fi-51ba2e6489258c6bfb22ef95cc627b94.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-form\/view.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"The minimum donation amount is %1$s%2$s.":["Pienin mahdollinen lahjoitussumma on %1$s%2$s."],"The maximum donation amount is %1$s%2$s.":["Suurin mahdollinen lahjoitussumma on %1$s%2$s."],"Invalid amount":["Virheellinen summa"],"First name is required":["Etunimi on pakollinen"],"Invalid first name":["Virheellinen etunimi"],"Last name is required":["Sukunimi on pakollinen"],"Invalid last name":["Virheellinen sukunimi"],"Email is required":["S\u00e4hk\u00f6posti on pakollinen"],"Invalid email":["Virheellinen s\u00e4hk\u00f6postiosoite"],"Invalid phone number":["Virheellinen puhelinnumero"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/view.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"The minimum donation amount is %1$s%2$s.":["Pienin mahdollinen lahjoitussumma on %1$s%2$s."],"The maximum donation amount is %1$s%2$s.":["Suurin mahdollinen lahjoitussumma on %1$s%2$s."],"Invalid amount":["Virheellinen summa"],"First name is required":["Etunimi on pakollinen"],"Invalid first name":["Virheellinen etunimi"],"Last name is required":["Sukunimi on pakollinen"],"Invalid last name":["Virheellinen sukunimi"],"Email is required":["S\u00e4hk\u00f6posti on pakollinen"],"Invalid email":["Virheellinen s\u00e4hk\u00f6postiosoite"],"Invalid phone number":["Virheellinen puhelinnumero"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json b/languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json index 7d20d02..58f42c3 100644 --- a/languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json +++ b/languages/fame_lahjoitukset-fi-843cb9ca3e3cd9fa8a010526de06581f.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/contact-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Contacts":["Yhteystiedot"],"Settings":["Asetukset"],"Show contact fields":["N\u00e4yt\u00e4 yhteystietokent\u00e4t"],"Require contact":["Vaadi yhteystiedot"],"Contact details are required if enabled":["Yhteystiedot ovat pakollisia, jos k\u00e4yt\u00f6ss\u00e4"],"Show address":["N\u00e4yt\u00e4 osoite"],"Show address fields":["N\u00e4yt\u00e4 osoitekent\u00e4t"],"Show phone":["N\u00e4yt\u00e4 puhelinnumero"],"Show phone number fields":["N\u00e4yt\u00e4 puhelinnumerokent\u00e4t"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"The contact form is not in use. Use the toggle in the sidebar to enable it.":["Yhteystietolomake ei ole k\u00e4yt\u00f6ss\u00e4. Ota se k\u00e4ytt\u00f6\u00f6n sivupalkin kytkimest\u00e4."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/contact-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Contacts":["Yhteystiedot"],"Settings":["Asetukset"],"Show contact fields":["N\u00e4yt\u00e4 yhteystietokent\u00e4t"],"Require contact":["Vaadi yhteystiedot"],"Contact details are required if enabled":["Yhteystiedot ovat pakollisia, jos k\u00e4yt\u00f6ss\u00e4"],"Show address":["N\u00e4yt\u00e4 osoite"],"Show address fields":["N\u00e4yt\u00e4 osoitekent\u00e4t"],"Show phone":["N\u00e4yt\u00e4 puhelinnumero"],"Show phone number fields":["N\u00e4yt\u00e4 puhelinnumerokent\u00e4t"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"The contact form is not in use. Use the toggle in the sidebar to enable it.":["Yhteystietolomake ei ole k\u00e4yt\u00f6ss\u00e4. Ota se k\u00e4ytt\u00f6\u00f6n sivupalkin kytkimest\u00e4."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json b/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json index 9774f01..7f5a1ca 100644 --- a/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json +++ b/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Lahjoitustapa"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Default donation type":["Oletuslahjoistuistapa"],"Select donation type that will be used by default.":["Valitse oletuksena k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Lahjoitustapa"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Default donation type":["Oletuslahjoistuistapa"],"Select donation type that will be used by default.":["Valitse oletuksena k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json b/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json index 8bcf57f..3680511 100644 --- a/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json +++ b/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Muu summa"],"Min":["V\u00e4hint\u00e4\u00e4n"],"Max":["Enint\u00e4\u00e4n"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Amount":["Summa"],"Currency label":["Valuuttamerkki"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Merkki, joka n\u00e4ytet\u00e4\u00e4n summien vieress\u00e4. T\u00e4m\u00e4 ei ohjaa todellista lahjoitusvaluuttaa. T\u00e4ll\u00e4 hetkell\u00e4 vain eurot ovat tuettuja."],"Default amount":["Oletussumma"],"Amount that is preselected.":["Oletuksena valittu summa."],"Min Amount":["V\u00e4himm\u00e4issumma"],"Minimum amount for other amount field.":["Pienin sallittu summa muulle summakent\u00e4lle."],"Max Amount":["Enimm\u00e4issumma"],"Maximum amount for other amount field.":["Suurin sallittu summa muulle summakent\u00e4lle."],"Other amount text":["Muu summa -teksti"],"Show other amount":["N\u00e4yt\u00e4 muu summa"],"Show other amount input field":["N\u00e4yt\u00e4 muu summa -sy\u00f6tekentt\u00e4"],"Amount columns":["Summien sarakkeet"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Add button":["Lis\u00e4\u00e4 painike"],"Remove button":["Poista painike"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Muu summa"],"Min":["V\u00e4hint\u00e4\u00e4n"],"Max":["Enint\u00e4\u00e4n"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Amount":["Summa"],"Currency label":["Valuuttamerkki"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Merkki, joka n\u00e4ytet\u00e4\u00e4n summien vieress\u00e4. T\u00e4m\u00e4 ei ohjaa todellista lahjoitusvaluuttaa. T\u00e4ll\u00e4 hetkell\u00e4 vain eurot ovat tuettuja."],"Default amount":["Oletussumma"],"Amount that is preselected.":["Oletuksena valittu summa."],"Min Amount":["V\u00e4himm\u00e4issumma"],"Minimum amount for other amount field.":["Pienin sallittu summa muulle summakent\u00e4lle."],"Max Amount":["Enimm\u00e4issumma"],"Maximum amount for other amount field.":["Suurin sallittu summa muulle summakent\u00e4lle."],"Other amount text":["Muu summa -teksti"],"Show other amount":["N\u00e4yt\u00e4 muu summa"],"Show other amount input field":["N\u00e4yt\u00e4 muu summa -sy\u00f6tekentt\u00e4"],"Amount columns":["Summien sarakkeet"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Add button":["Lis\u00e4\u00e4 painike"],"Remove button":["Poista painike"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json b/languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json index ecbd5e0..aba48f1 100644 --- a/languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json +++ b/languages/fame_lahjoitukset-fi-c12d28b3423fdb3237c59e032da4fa7f.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-campaigns\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Asetukset"],"Show campaign selector":["N\u00e4yt\u00e4 kampanjavalitsin"],"Show label":["N\u00e4yt\u00e4 otsikko"],"Label":["Otsikko"],"Campaigns":["Kampanjat"],"Remove campaign":["Poista kampanja"],"Remove":["Poista"],"New campaign":["Uusi kampanja"],"Add":["Lis\u00e4\u00e4"],"Maximum of 10 campaigns reached.":["Enint\u00e4\u00e4n 10 kampanjaa on saavutettu."],"No campaigns added yet":["Kampanjoja ei ole viel\u00e4 lis\u00e4tty"],"The campaign selector is not in use. Use the toggle in the sidebar to enable it.":["Kampanjavalitsin ei ole k\u00e4yt\u00f6ss\u00e4. Ota se k\u00e4ytt\u00f6\u00f6n sivupalkin kytkimest\u00e4."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-campaigns\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Asetukset"],"Show campaign selector":["N\u00e4yt\u00e4 kampanjavalitsin"],"Show label":["N\u00e4yt\u00e4 otsikko"],"Label":["Otsikko"],"Campaigns":["Kampanjat"],"Remove campaign":["Poista kampanja"],"Remove":["Poista"],"New campaign":["Uusi kampanja"],"Add":["Lis\u00e4\u00e4"],"Maximum of 10 campaigns reached.":["Enint\u00e4\u00e4n 10 kampanjaa on saavutettu."],"No campaigns added yet":["Kampanjoja ei ole viel\u00e4 lis\u00e4tty"],"The campaign selector is not in use. Use the toggle in the sidebar to enable it.":["Kampanjavalitsin ei ole k\u00e4yt\u00f6ss\u00e4. Ota se k\u00e4ytt\u00f6\u00f6n sivupalkin kytkimest\u00e4."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json b/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json index b5bcda9..4156ef3 100644 --- a/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json +++ b/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Donate":["Lahjoita"],"Button labels":["Painikkeiden tekstit"],"Single button text":["Kertalahjitus-painikkeen teksti"],"Recurring button text":["Toistuva-painikkeen teksti"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Donate":["Lahjoita"],"Button labels":["Painikkeiden tekstit"],"Single button text":["Kertalahjitus-painikkeen teksti"],"Recurring button text":["Toistuva-painikkeen teksti"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json b/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json index 69ad324..02c33d9 100644 --- a/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json +++ b/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Desktop columns":["Sarakkeet ty\u00f6p\u00f6yd\u00e4ll\u00e4"],"Enabled donation types":["K\u00e4yt\u00f6ss\u00e4 olevat lahjoitustavat"],"Choose the donation type to enable.":["Valitse k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."],"Return address":["Paluuosoite"],"Page that is displayed after donation is submitted.":["Sivu, joka n\u00e4ytet\u00e4\u00e4n lahjoituksen l\u00e4hett\u00e4misen j\u00e4lkeen."],"Tab background color":["V\u00e4lilehden taustav\u00e4ri"],"This is the background color for tabs.":["T\u00e4m\u00e4 on v\u00e4lilehtien taustav\u00e4ri."],"Tab text":["V\u00e4lilehden teksti"],"This is the text color for selected tabs.":["T\u00e4m\u00e4 on valittujen v\u00e4lilehtien tekstiv\u00e4ri."],"Input border color":["Sy\u00f6tekent\u00e4n reunan v\u00e4ri"],"This defines the border and helper text color of the input field.":["M\u00e4\u00e4ritt\u00e4\u00e4 sy\u00f6tekent\u00e4n reunan ja ohjetekstin v\u00e4rin."],"Danger color":["Vaarav\u00e4ri"],"This defines the danger color for error messages and invalid input fields.":["M\u00e4\u00e4ritt\u00e4\u00e4 vaarav\u00e4rin virheviestej\u00e4 ja virheellisi\u00e4 sy\u00f6tekentti\u00e4 varten."],"Border Radius":["Reunan py\u00f6ristys"],"This is the border-radius for tabs.":["T\u00e4m\u00e4 on v\u00e4lilehtien reunan py\u00f6ristys."],"Border Width":["Reunan leveys"],"This is the border-width for tabs and input fields.":["T\u00e4m\u00e4 on v\u00e4lilehtien ja sy\u00f6tekenttien reunan leveys."],"Text field border radius":["Tekstikent\u00e4n reunan py\u00f6ristys"],"This is the border-radius for the text fields.":["T\u00e4m\u00e4 on tekstikenttien reunan py\u00f6ristys."],"Return userinfo token":["Palauta k\u00e4ytt\u00e4j\u00e4tietotunnus"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["T\u00e4m\u00e4 asetus sis\u00e4llytt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tietotunnuksen paluuosoitteeseen. T\u00e4m\u00e4 ei ole yleens\u00e4 hy\u00f6dyllist\u00e4 ja vaatii mukautetun logiikan tunnuksen k\u00e4sittelemiseen."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Desktop columns":["Sarakkeet ty\u00f6p\u00f6yd\u00e4ll\u00e4"],"Enabled donation types":["K\u00e4yt\u00f6ss\u00e4 olevat lahjoitustavat"],"Choose the donation type to enable.":["Valitse k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."],"Return address":["Paluuosoite"],"Page that is displayed after donation is submitted.":["Sivu, joka n\u00e4ytet\u00e4\u00e4n lahjoituksen l\u00e4hett\u00e4misen j\u00e4lkeen."],"Selected button background color":["Valitun napin taustav\u00e4ri"],"This is the background color for selected buttons.":["T\u00e4m\u00e4 on taustav\u00e4ri valitulle napille."],"Selected button text color":["Valitun napin tekstin v\u00e4ri"],"This is the text color for selected buttons.":["T\u00e4m\u00e4 on valitun napin tekstin v\u00e4ri."],"Input border color":["Sy\u00f6tekent\u00e4n reunan v\u00e4ri"],"This defines the border and helper text color of the input field.":["M\u00e4\u00e4ritt\u00e4\u00e4 sy\u00f6tekent\u00e4n reunan ja ohjetekstin v\u00e4rin."],"Danger color":["Vaarav\u00e4ri"],"This defines the danger color for error messages and invalid input fields.":["M\u00e4\u00e4ritt\u00e4\u00e4 vaarav\u00e4rin virheviestej\u00e4 ja virheellisi\u00e4 sy\u00f6tekentti\u00e4 varten."],"Border Radius":["Reunan py\u00f6ristys"],"This is the border-radius for tabs.":["T\u00e4m\u00e4 on valintanappien reunan py\u00f6ristys."],"Border Width":["Reunan leveys"],"This is the border-width for tabs and input fields.":["T\u00e4m\u00e4 on valintanappien ja sy\u00f6tekenttien reunan leveys."],"Text field border radius":["Tekstikent\u00e4n reunan py\u00f6ristys"],"This is the border-radius for the text fields.":["T\u00e4m\u00e4 on tekstikenttien reunan py\u00f6ristys."],"Return userinfo token":["Palauta k\u00e4ytt\u00e4j\u00e4tietotunnus"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["T\u00e4m\u00e4 asetus sis\u00e4llytt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tietotunnuksen paluuosoitteeseen. T\u00e4m\u00e4 ei ole yleens\u00e4 hy\u00f6dyllist\u00e4 ja vaatii mukautetun logiikan tunnuksen k\u00e4sittelemiseen."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi.mo b/languages/fame_lahjoitukset-fi.mo index 67530baae7bbd1aa45d07cb65bc2bbe59d2af639..d16ba443682383a6d5616c66cbaf9efe3a25fdb6 100644 GIT binary patch delta 1566 zcmZA0S!_&E9LMp$rd3*P)lQeWEsD}gX)(5pAgLwML@VM&rZv&(bXuL;@*pN8mIowE z8cW0j6&`3XA)0uRCLRc0DpJb}2`?f-5E0AwH**t9axfGPj=;~zV?X&Bi`hA56VQihFTgBZi`m$K`543^jC$k8aT4vbI2>={7`%f# z_Bh94$q6rM1?c#Kb+|CsY#koPnKAEheDvcSY{P?i z1~pznw53>=A2XZIOO%dkJdIWO2y0N`E`|lT1b1Qpui|)okIFEevJ_$wPR7Na^{9$O zFawX^#bIVAFq8J87^@Jp1yB>}kiBgaYN2K%Y1{AhA4iq$0*=G$s3W_FBk?g-;1Ev3 zOwLX1IjAGuf?97o>Ih@qyyy(~A>Y_hoP`%q0X#%)@D}yq2b_q%P=QROp}R93OE7?{ zL?ddw7%HJ2)RA36&HsoLFJ?K^&qs%Y$|!*PumLr(6;-N(cnFUnd)ow}Q-1|2z#3FW z%Ta-@L7n|(EW-n+3S2?1f%PZHIsf~-D3hpI`a4DWdZ8V4q z;5G8tJAQQAGYeAVxu_#9LNc}rRK){W%>K5X7e&;Hb8!z6i(Nq;yT^|LdWG8X9V(FT zNHHv*dTZly)JCg48&C;^(7|1(?@l3)_3;x^<_~z$5e%U|_~x~96x=Ru{&1+t4Q+E8 zyIi+D;xq=ETDNz$cSW{2P3__KPTLszcY+(*?WTs}w@1B5+{j5!%ZvUyC;l?8H2ysA z$neyfi5;WIXV+{BhFjdOh!Y8Rv_u>?*cEky-2=UyE%x6?s5R;`BRQ7XTQF%@;%;Gj zTJ>LFINiy$!r@SIHLSGyf!?-(UWW`c7;%H_(-ANBmBh#TDzg6Ss`XXp{|Up}EYagT Go%S0ViQX~* delta 1488 zcmY+@OGs346vy%7q^0?8G_%YZwU?Qel!#`MWI+WLVNt6Zb4Vv2V53kFw;~Fm-C!kD zR2a1gDF%ujAT~(UB0(2DHkB=+Ha!dqH}?J6O$aXY`M>V}f6n>e`BXnpf49ctB%0a7 z6f+)s%8wUEa6W!?`;$1Aep;$oGUj3?F2%)IiJISo3-BP$#$z}SPhu8EQ0Lu79=n%n z&h!g|^fof^8h2rCn%Q;?;R?L(`VQ;pC#IWi!)>?>d$9Uy0wV0k^R*akQEViNM ze_|mPWjbU*V+-l5!&WTE>sWzfSdB@fu^#JjBc8-;971LM3iI$A=3**kl*>^Ss>1|4 zfH&jJf;fkMvcoO}YhKiXBIHafMs2VjN!s?f<4vg2b)!mp2368NOu`#jig$1czIFRk z$Sqna_p1G>QCH?{rJ*}*K-SnnRLQzg0bD~J@Cfx{40CW4704G{h`+G_y-cbS6{!7o zqY`RHUD+ zDl9>LBl}PlaFFY_^V9R({}md_jvVgn z=xT5BAL?lB=(L7FWAu4yvL_Osu{4s9aeh{qfr}a0$bjSKTTWn@L`ZX`jQ_A4&mPl*54NE_jk1WXVyf@eLE8Wy%6c~t;-E} Vg?Mjf!Sp7+|NCad(Qv=KW7HleOh;~DG+ze z>~W6SY458Y~F^C&68@FHqhOro9{`h$;qL&(pb z=UO~9VT{%qI>xaLS4=T$!P8iYuYG^wTG|zPY>s=3+4x;VR#DR7G6O z!n1fQ!|Vc1q}>>26@s>A)P&8*-nJdJP&bmao$&iFqDprYr{e?Ekv+x9_zJ6W6z5@( zb5pw(b)-8{>+MAyVf-*JI>Y10H+Bve;7wEjFHjqNLVfrZXJLSc0-24vJC#_9&8SL5 zQ0pB-C3FdOWVccCzahnoTR!y*(NT`ds2TO)Hq=BHRjM<13eO`kSP{{wzYZ1PN>oN` zQGsqko&651z|*J-+(oW|4W-68|7W}?lkcbuCb6qZS%r$c9#`XfRA9%k39q0wdV>n! zBl5E^JapTGbJF7ls3UfejI9n;@n$Sxe{1DM5xH24aU>SIi~Q^<4+ZoAwc!_3Ait1e z*mUZxjjK@`ZSdWON?;EJGJ(af5V;I+6_&k7YGPBb{Dkm($Vj zc|ESv5$^2X-PhCa?s7VNqCI`KIr8rWFLKCB4<#Puj3)2rW(M+N|ISH_<&`Dg=bfF9 zUNgBjzc72*)^N1T>vtVD+}q_kUbsKzg%1o5^mW;PBa!Zy$Bfii^5~qxjO3HKnSuJh zzHknt)`~_WsnxK?+J^`B4G%bEph4FQvrliLG*p_H8LAHc)zuQJFZdINzghB9=yKpU D_nFa zie+l~hwDmBe#9h{gyu&Qnf)V5eikXu*Y=%K-|q4G_5FO_@Av0>A1V?Rmsh%C>1NiO zWyWK-`5BLo(2WC5{}+y>pObBtiC!FsGjR$oL(Ny?MBI&IFpBxujs+M;o!5grmdLi) z&6_=bBYwCC&g%*`{Ki)-)*hEen1 zun4D*i;)G5wWL#mO}H4la49~;<(NSlE3g8~u^lJiEmX$OaWZ~JFJ@ClIU7}>Ag1Cj z>=|WNk7@LCV(db&=0+`;g`8={s0~&lN!xa3d=IL0QB+BfqDp!OGw=c~z)Ls-Upsvl z_sK2VBGi7XP*)b)Ktp%B4OwfosFFod0h~u2a2@sHUG!i-Dv(b&34h}>bTg?+l%n>l zMkUmUy0Sy4_4kls#cY6vkAWYkjNH^yFV06T45CW46OUpYa+ZB`##4w=0cN5yDnJG5 z!(t4ezL6cM3UnaXZ^wq_x&L!Cl*vO>2Cq=1{DX=-jVM;37ZunxT!~@SK^IX0^dgVl z=0{)uYt;OE)D?e4GPab$;flL)D(71f4Mh~hg}4P3KnH4rPSnAtk)$nw>}3y78xJ~u zM+KZp{r%`cy;q7nwvitt+K8%n6k}A~PSH?g3DgF6oCVKNng75|Si+~g84qIs`yEG5 zH7ldP1T`N<{T*+hzNL3KAG0`h8J42n-|yr8duW_>Cf50fBX37#+J*D*Dr%!aT#UKg zlkPN#s@Pt~lc>twLnZPARiXE&%)dE(7k_?zL-|E~S^Bu)d2*hmw diff --git a/languages/fame_lahjoitukset-fi_FI.po b/languages/fame_lahjoitukset-fi_FI.po index ca79a1f..ff571b7 100644 --- a/languages/fame_lahjoitukset-fi_FI.po +++ b/languages/fame_lahjoitukset-fi_FI.po @@ -339,20 +339,20 @@ msgid "Page that is displayed after donation is submitted." msgstr "Sivu, joka näytetään lahjoituksen lähettämisen jälkeen." #: build/Blocks/donation-form/index.js:1 -msgid "Tab background color" -msgstr "Valintanapin taustaväri" +msgid "Selected button background color" +msgstr "Valitun napin taustaväri" #: build/Blocks/donation-form/index.js:1 -msgid "This is the background color for tabs." -msgstr "Tämä on valintanappien taustaväri." +msgid "This is the background color for selected buttons." +msgstr "Tämä on taustaväri valitulle napille." #: build/Blocks/donation-form/index.js:1 -msgid "Tab text" -msgstr "Valintanapin teksti" +msgid "Selected button text color" +msgstr "Valitun napin tekstin väri" #: build/Blocks/donation-form/index.js:1 -msgid "This is the text color for selected tabs." -msgstr "Tämä on valittujen valintanappien tekstiväri." +msgid "This is the text color for selected buttons." +msgstr "Tämä on valitun napin tekstin väri." #: build/Blocks/donation-form/index.js:1 msgid "Input border color" diff --git a/languages/fame_lahjoitukset-sv-00bee4e57e311861dfb1c0adb7a51ca5.json b/languages/fame_lahjoitukset-sv-00bee4e57e311861dfb1c0adb7a51ca5.json index 5fe0f28..1262d80 100644 --- a/languages/fame_lahjoitukset-sv-00bee4e57e311861dfb1c0adb7a51ca5.json +++ b/languages/fame_lahjoitukset-sv-00bee4e57e311861dfb1c0adb7a51ca5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Show legend":["Visa rubrik"],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"Label":["Etikett"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Leverant\u00f6rstyp"],"General settings":["Allm\u00e4nna inst\u00e4llningar"],"label":["etikett"],"Donation provider":["Donationsleverant\u00f6r"],"Terms text\u2026":["Villkorstext\u2026"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Show legend":["Visa rubrik"],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"Label":["Etikett"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Leverant\u00f6rstyp"],"General settings":["Allm\u00e4nna inst\u00e4llningar"],"label":["etikett"],"Donation provider":["Donationsleverant\u00f6r"],"Terms text\u2026":["Villkorstext\u2026"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv-51ba2e6489258c6bfb22ef95cc627b94.json b/languages/fame_lahjoitukset-sv-51ba2e6489258c6bfb22ef95cc627b94.json index af91a19..ecaa1ea 100644 --- a/languages/fame_lahjoitukset-sv-51ba2e6489258c6bfb22ef95cc627b94.json +++ b/languages/fame_lahjoitukset-sv-51ba2e6489258c6bfb22ef95cc627b94.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-form\/view.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"The minimum donation amount is %1$s%2$s.":["Det minsta donationsbeloppet \u00e4r %1$s%2$s."],"The maximum donation amount is %1$s%2$s.":["Det maximala donationsbeloppet \u00e4r %1$s%2$s."],"Invalid amount":["Ogiltigt belopp"],"First name is required":["F\u00f6rnamn kr\u00e4vs"],"Invalid first name":["Ogiltigt f\u00f6rnamn"],"Last name is required":["Efternamn kr\u00e4vs"],"Invalid last name":["Ogiltigt efternamn"],"Email is required":["E-post kr\u00e4vs"],"Invalid email":["Ogiltig e-postadress"],"Invalid phone number":["Ogiltigt telefonnummer"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/view.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"The minimum donation amount is %1$s%2$s.":["Det minsta donationsbeloppet \u00e4r %1$s%2$s."],"The maximum donation amount is %1$s%2$s.":["Det maximala donationsbeloppet \u00e4r %1$s%2$s."],"Invalid amount":["Ogiltigt belopp"],"First name is required":["F\u00f6rnamn kr\u00e4vs"],"Invalid first name":["Ogiltigt f\u00f6rnamn"],"Last name is required":["Efternamn kr\u00e4vs"],"Invalid last name":["Ogiltigt efternamn"],"Email is required":["E-post kr\u00e4vs"],"Invalid email":["Ogiltig e-postadress"],"Invalid phone number":["Ogiltigt telefonnummer"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv-843cb9ca3e3cd9fa8a010526de06581f.json b/languages/fame_lahjoitukset-sv-843cb9ca3e3cd9fa8a010526de06581f.json index 8536855..168a04a 100644 --- a/languages/fame_lahjoitukset-sv-843cb9ca3e3cd9fa8a010526de06581f.json +++ b/languages/fame_lahjoitukset-sv-843cb9ca3e3cd9fa8a010526de06581f.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/contact-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Contacts":["Kontaktuppgifter"],"Settings":["Inst\u00e4llningar"],"Show contact fields":["Visa kontaktf\u00e4lt"],"Require contact":["Kr\u00e4v kontaktuppgifter"],"Contact details are required if enabled":["Kontaktuppgifter kr\u00e4vs om aktiverat"],"Show address":["Visa adress"],"Show address fields":["Visa adressf\u00e4lt"],"Show phone":["Visa telefon"],"Show phone number fields":["Visa telefonnummerf\u00e4lt"],"Show legend":["Visa rubrik"],"If disabled, the legend is marked visually hidden.":["Om inaktiverat markeras rubriken som visuellt dold."],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"The contact form is not in use. Use the toggle in the sidebar to enable it.":["Kontaktformul\u00e4ret anv\u00e4nds inte. Anv\u00e4nd knappen i sidof\u00e4ltet f\u00f6r att aktivera det."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/contact-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Contacts":["Kontaktuppgifter"],"Settings":["Inst\u00e4llningar"],"Show contact fields":["Visa kontaktf\u00e4lt"],"Require contact":["Kr\u00e4v kontaktuppgifter"],"Contact details are required if enabled":["Kontaktuppgifter kr\u00e4vs om aktiverat"],"Show address":["Visa adress"],"Show address fields":["Visa adressf\u00e4lt"],"Show phone":["Visa telefon"],"Show phone number fields":["Visa telefonnummerf\u00e4lt"],"Show legend":["Visa rubrik"],"If disabled, the legend is marked visually hidden.":["Om inaktiverat markeras rubriken som visuellt dold."],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"The contact form is not in use. Use the toggle in the sidebar to enable it.":["Kontaktformul\u00e4ret anv\u00e4nds inte. Anv\u00e4nd knappen i sidof\u00e4ltet f\u00f6r att aktivera det."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv-a1a498bc675c3116ad6115b38bfff5b4.json b/languages/fame_lahjoitukset-sv-a1a498bc675c3116ad6115b38bfff5b4.json index bb66d2a..ed42f99 100644 --- a/languages/fame_lahjoitukset-sv-a1a498bc675c3116ad6115b38bfff5b4.json +++ b/languages/fame_lahjoitukset-sv-a1a498bc675c3116ad6115b38bfff5b4.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Donationstyp"],"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Settings":["Inst\u00e4llningar"],"Show legend":["Visa rubrik"],"If disabled, the legend is marked visually hidden.":["Om inaktiverat markeras rubriken som visuellt dold."],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"Default donation type":["Standard donationstyp"],"Select donation type that will be used by default.":["V\u00e4lj donationstyp som anv\u00e4nds som standard."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Donationstyp"],"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Settings":["Inst\u00e4llningar"],"Show legend":["Visa rubrik"],"If disabled, the legend is marked visually hidden.":["Om inaktiverat markeras rubriken som visuellt dold."],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"Default donation type":["Standard donationstyp"],"Select donation type that will be used by default.":["V\u00e4lj donationstyp som anv\u00e4nds som standard."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv-bd2530ea3cf0fb7e2347ef1e57ad40df.json b/languages/fame_lahjoitukset-sv-bd2530ea3cf0fb7e2347ef1e57ad40df.json index 320f03d..c327b15 100644 --- a/languages/fame_lahjoitukset-sv-bd2530ea3cf0fb7e2347ef1e57ad40df.json +++ b/languages/fame_lahjoitukset-sv-bd2530ea3cf0fb7e2347ef1e57ad40df.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Annat belopp"],"Min":["Min"],"Max":["Max"],"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Settings":["Inst\u00e4llningar"],"Show legend":["Visa rubrik"],"If disabled, the legend is marked visually hidden.":["Om inaktiverat markeras rubriken som visuellt dold."],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"Amount":["Belopp"],"Currency label":["Valutaetikett"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Etikett som visas bredvid belopp. Detta styr inte faktisk donationsvaluta. F\u00f6r n\u00e4rvarande st\u00f6ds endast euro."],"Default amount":["Standardbelopp"],"Amount that is preselected.":["F\u00f6rvalt belopp."],"Min Amount":["Minbelopp"],"Minimum amount for other amount field.":["Minsta belopp f\u00f6r f\u00e4ltet Annat belopp."],"Max Amount":["Maxbelopp"],"Maximum amount for other amount field.":["Maximalt belopp f\u00f6r f\u00e4ltet Annat belopp."],"Other amount text":["Text f\u00f6r annat belopp"],"Show other amount":["Visa annat belopp"],"Show other amount input field":["Visa inmatningsf\u00e4lt f\u00f6r annat belopp"],"Amount columns":["Beloppskolumner"],"Choose 1\u20133 columns for the form layout.":["V\u00e4lj 1\u20133 kolumner f\u00f6r formul\u00e4rets layout."],"Add button":["L\u00e4gg till knapp"],"Remove button":["Ta bort knapp"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Annat belopp"],"Min":["Min"],"Max":["Max"],"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Settings":["Inst\u00e4llningar"],"Show legend":["Visa rubrik"],"If disabled, the legend is marked visually hidden.":["Om inaktiverat markeras rubriken som visuellt dold."],"Legend":["Rubrik"],"Description for screen readers (for accessibility).":["Beskrivning f\u00f6r sk\u00e4rml\u00e4sare (f\u00f6r tillg\u00e4nglighet)."],"Amount":["Belopp"],"Currency label":["Valutaetikett"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Etikett som visas bredvid belopp. Detta styr inte faktisk donationsvaluta. F\u00f6r n\u00e4rvarande st\u00f6ds endast euro."],"Default amount":["Standardbelopp"],"Amount that is preselected.":["F\u00f6rvalt belopp."],"Min Amount":["Minbelopp"],"Minimum amount for other amount field.":["Minsta belopp f\u00f6r f\u00e4ltet Annat belopp."],"Max Amount":["Maxbelopp"],"Maximum amount for other amount field.":["Maximalt belopp f\u00f6r f\u00e4ltet Annat belopp."],"Other amount text":["Text f\u00f6r annat belopp"],"Show other amount":["Visa annat belopp"],"Show other amount input field":["Visa inmatningsf\u00e4lt f\u00f6r annat belopp"],"Amount columns":["Beloppskolumner"],"Choose 1\u20133 columns for the form layout.":["V\u00e4lj 1\u20133 kolumner f\u00f6r formul\u00e4rets layout."],"Add button":["L\u00e4gg till knapp"],"Remove button":["Ta bort knapp"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv-c12d28b3423fdb3237c59e032da4fa7f.json b/languages/fame_lahjoitukset-sv-c12d28b3423fdb3237c59e032da4fa7f.json index 1cb4678..d7a367b 100644 --- a/languages/fame_lahjoitukset-sv-c12d28b3423fdb3237c59e032da4fa7f.json +++ b/languages/fame_lahjoitukset-sv-c12d28b3423fdb3237c59e032da4fa7f.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-campaigns\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Inst\u00e4llningar"],"Show campaign selector":["Visa kampanjv\u00e4ljare"],"Show label":["Visa etikett"],"Label":["Etikett"],"Campaigns":["Kampanjer"],"Remove campaign":["Ta bort kampanj"],"Remove":["Ta bort"],"New campaign":["Ny kampanj"],"Add":["L\u00e4gg till"],"Maximum of 10 campaigns reached.":["Maximalt 10 kampanjer har n\u00e5tts."],"No campaigns added yet":["Inga kampanjer har lagts till \u00e4nnu"],"The campaign selector is not in use. Use the toggle in the sidebar to enable it.":["Kampanjv\u00e4ljaren anv\u00e4nds inte. Anv\u00e4nd knappen i sidof\u00e4ltet f\u00f6r att aktivera den."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-campaigns\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Inst\u00e4llningar"],"Show campaign selector":["Visa kampanjv\u00e4ljare"],"Show label":["Visa etikett"],"Label":["Etikett"],"Campaigns":["Kampanjer"],"Remove campaign":["Ta bort kampanj"],"Remove":["Ta bort"],"New campaign":["Ny kampanj"],"Add":["L\u00e4gg till"],"Maximum of 10 campaigns reached.":["Maximalt 10 kampanjer har n\u00e5tts."],"No campaigns added yet":["Inga kampanjer har lagts till \u00e4nnu"],"The campaign selector is not in use. Use the toggle in the sidebar to enable it.":["Kampanjv\u00e4ljaren anv\u00e4nds inte. Anv\u00e4nd knappen i sidof\u00e4ltet f\u00f6r att aktivera den."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv-d6c9f4c6041699fdecfef4f8c7a20e85.json b/languages/fame_lahjoitukset-sv-d6c9f4c6041699fdecfef4f8c7a20e85.json index 282c9c5..31a8cdb 100644 --- a/languages/fame_lahjoitukset-sv-d6c9f4c6041699fdecfef4f8c7a20e85.json +++ b/languages/fame_lahjoitukset-sv-d6c9f4c6041699fdecfef4f8c7a20e85.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Donate":["Donera"],"Button labels":["Knappetikett"],"Single button text":["Knapptext f\u00f6r eng\u00e5ngsdonation"],"Recurring button text":["Knapptext f\u00f6r \u00e5terkommande"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Donate":["Donera"],"Button labels":["Knappetikett"],"Single button text":["Knapptext f\u00f6r eng\u00e5ngsdonation"],"Recurring button text":["Knapptext f\u00f6r \u00e5terkommande"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv-ff8c96b8bc4bc42ad7e498decd6882a5.json b/languages/fame_lahjoitukset-sv-ff8c96b8bc4bc42ad7e498decd6882a5.json index 0c7ecad..ce17124 100644 --- a/languages/fame_lahjoitukset-sv-ff8c96b8bc4bc42ad7e498decd6882a5.json +++ b/languages/fame_lahjoitukset-sv-ff8c96b8bc4bc42ad7e498decd6882a5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.12.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Settings":["Inst\u00e4llningar"],"Choose 1\u20133 columns for the form layout.":["V\u00e4lj 1\u20133 kolumner f\u00f6r formul\u00e4rets layout."],"Desktop columns":["Kolumner p\u00e5 skrivbordet"],"Enabled donation types":["Aktiverade donationstyper"],"Choose the donation type to enable.":["V\u00e4lj donationstyp som ska aktiveras."],"Return address":["Returadress"],"Page that is displayed after donation is submitted.":["Sida som visas efter att donationen skickats."],"Tab background color":["Flikens bakgrundsf\u00e4rg"],"This is the background color for tabs.":["Detta \u00e4r bakgrundsf\u00e4rgen f\u00f6r flikar."],"Tab text":["Fliktext"],"This is the text color for selected tabs.":["Detta \u00e4r textf\u00e4rgen f\u00f6r valda flikar."],"Input border color":["Inmatningsf\u00e4ltets kantf\u00e4rg"],"This defines the border and helper text color of the input field.":["Definierar kantens och hj\u00e4lptextens f\u00e4rg f\u00f6r inmatningsf\u00e4ltet."],"Danger color":["Varningsf\u00e4rg"],"This defines the danger color for error messages and invalid input fields.":["Definierar varningsf\u00e4rgen f\u00f6r felmeddelanden och ogiltiga inmatningsf\u00e4lt."],"Border Radius":["Kantradie"],"This is the border-radius for tabs.":["Detta \u00e4r kantradien f\u00f6r flikar."],"Border Width":["Kantbredd"],"This is the border-width for tabs and input fields.":["Detta \u00e4r kantbredden f\u00f6r flikar och inmatningsf\u00e4lt."],"Text field border radius":["Textf\u00e4ltets kantradie"],"This is the border-radius for the text fields.":["Detta \u00e4r kantradien f\u00f6r textf\u00e4lten."],"Return userinfo token":["Returnera anv\u00e4ndarinformationstoken"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["Det h\u00e4r alternativet inkluderar anv\u00e4ndarinformationstoken i returadressen. Det \u00e4r i allm\u00e4nhet inte anv\u00e4ndbart och kr\u00e4ver anpassad logik f\u00f6r att hantera token."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"sv","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Eng\u00e5ng"],"Recurring":["\u00c5terkommande"],"Settings":["Inst\u00e4llningar"],"Choose 1\u20133 columns for the form layout.":["V\u00e4lj 1\u20133 kolumner f\u00f6r formul\u00e4rets layout."],"Desktop columns":["Kolumner p\u00e5 skrivbordet"],"Enabled donation types":["Aktiverade donationstyper"],"Choose the donation type to enable.":["V\u00e4lj donationstyp som ska aktiveras."],"Return address":["Returadress"],"Page that is displayed after donation is submitted.":["Sida som visas efter att donationen skickats."],"Selected button background color":["Markerad knappens bakgrundsf\u00e4rg"],"This is the background color for selected buttons.":["Bakgrundsf\u00e4rgen f\u00f6r markerade knappar."],"Selected button text color":["Textf\u00e4rgen f\u00f6r markerade knappar"],"This is the text color for selected buttons.":["Detta \u00e4r textf\u00e4rgen f\u00f6r markerade knappar."],"Input border color":["Inmatningsf\u00e4ltets kantf\u00e4rg"],"This defines the border and helper text color of the input field.":["Definierar kantens och hj\u00e4lptextens f\u00e4rg f\u00f6r inmatningsf\u00e4ltet."],"Danger color":["Varningsf\u00e4rg"],"This defines the danger color for error messages and invalid input fields.":["Definierar varningsf\u00e4rgen f\u00f6r felmeddelanden och ogiltiga inmatningsf\u00e4lt."],"Border Radius":["Kantradie"],"This is the border-radius for tabs.":["Detta \u00e4r kantradien f\u00f6r flikar."],"Border Width":["Kantbredd"],"This is the border-width for tabs and input fields.":["Detta \u00e4r kantbredden f\u00f6r flikar och inmatningsf\u00e4lt."],"Text field border radius":["Textf\u00e4ltets kantradie"],"This is the border-radius for the text fields.":["Detta \u00e4r kantradien f\u00f6r textf\u00e4lten."],"Return userinfo token":["Returnera anv\u00e4ndarinformationstoken"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["Det h\u00e4r alternativet inkluderar anv\u00e4ndarinformationstoken i returadressen. Det \u00e4r i allm\u00e4nhet inte anv\u00e4ndbart och kr\u00e4ver anpassad logik f\u00f6r att hantera token."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-sv.mo b/languages/fame_lahjoitukset-sv.mo index 3797001ca7c371a6f028b1c3d0f738ded45aa954..5b14a2f40c7d9a7245547b35065c169a25927fee 100644 GIT binary patch delta 1547 zcmZ|ONoZ416vpvmI;gcZaUN>pYt>Tggj%cB2(<;l2?V1c;v!AcR@){uiJ%}xyHFQh zsKG)-+^C39u^LAl5EK*y1r@}piwZ7WbmM>uivQ2NO$8z3ckjE?Ip@CjsP1%qU%-=c z%@O1dbK?Gh8uC|XtQ;A1S{~R>n~hIzue2=*n*2NgER0W&c_0u*J(nBpz`+j=G{#I2hYIW!DzJVWkAtWHawcUr^r15Mql3#( z^S7e**@26(6IH3}+3}RUprH*vAXT^TNL8(XRh(fZs0^zxh5=M2y{N$Mx<14l`cF`m zdWMzw8cQ*k=rmrA8n46(-ao6Np}W|QdWl+4nRTH8=)rl|hpJFNR^t~`hI9CIRMHiw z%+{a+ZgQVTQS3?yNgQni=XP`I@@9@`ylbi%Q=Sll*6hE7OE_9U}I>6?Y`GFOUnJ>JC7IqCP_vh-VTSAKTS z%ue6lg8B`icxxmcYIItop^lD7G{I4v#6gLs2WR8W7G&eUtw_{qdT>4Nw7V-J*(ITP kdSL43%-7;P&#by3OaHSVUF-L!1O9{Fe>TcI@*nX00cok)y#N3J delta 1440 zcmZA0OGs346vy$CHa^p_mu1>GnKou-MQK=3z7n#)7TTf~HtHzpPM7Y{Er&78l|@tiTVr65Tmwi?JS$<8IXa zH!Q-1(<5X-qmgu0VGvi~1+2suxCYZnV=Xpd4MuS`K15|ah6VTq^Dv7tN*}61wdle& zygbD$fT~z#gi{E{a#1DoA;DXPGrk^G@@7oO9gYFyRxE_6c*q$)hRSdNmDqhO#&Ohh z(zsWZKF=}Yqd`@z5?NynScThBnVmreb{!SiFzPNJq5^n@I&d77@mKU>=A6X(a@0BN za3!{)Ds?h3AF(Smbl`2I+BS+*(cU3v*%wrXshko*H!70|DzMXz=P;T6c~qqau?%nG z0vvPZe>wBNv6T1EQVCmku^jahtwm+lh6*5vOYtbGLc>^vPf->5gQ`IGyhLUNsDP_c z}hT37FkH{&Au zerNs!Qbaq83Ty}qaReiZ=p_w(m!DCQen*YFxTsB7fGyaC+wd-y;|yMHm3RZzVGnM> zA@t!Ss`N#kL_iH#MZXvISr2-s|79AZ4Cu4lLs(wCh}!rBbtRvi@eC&QJug8$xYaR= z%jn-g-Thls#Xh1E`hluc3WxIL*-TVLd<&?DO0pqdoqEI-`#J5+9DlpF-QUsM-5=W5 z*XivD1w;MT;%|>X%gRiOP0cBZxpGb=hZ#7Rb1);;l0Q+{7~Itx=-bOScCl%1*W*k5 w-KODi;6OOOu^=UBZbKj(_IsK5Z&~cPrz|$$Ih?WIAMEsdyVw->6h@Q&0^N11;0;(Ll;lz_d4HV$lPPsNuix+gyM4dk-~a!p;zH$(rD<`; z%(_OHO~!s4ieHeQ{pK$Rhi99O$2?TO2(xe%4#)L48iP0$qu%&QoJjv1X5cLxgZGi2 zJ;}EC-wAK%mGj^$)?o2Sv(G%Wx-_<8>T|A5j?&p)6ByDo(;u&stPP zLYR)n@yZ~xQ>Y4-#o2|RY$d8hbx0Dn*?S&Bm00tJ;W5wCs4F^;nRv~6eiM~pH!86Y zn2$N!pUzo=Dt(n_yp9G{H5Zv{F)YHPsLURq0_#Tw_7=zDCsY6#6H*)IpfV4jgJr1s zn^60-;6glvs#I5MJZ>*&Xv6nN)$IpTRm)}-XPAS^uo%O*9F<82DzF~Uhd7viAF5JM zaTdPD0A>=M#tTv7b8sf_pB2;4UDTsqqGnWPCr|;L!#S8lRp>1i;Wt!6`i_izLHc%^4!6RN}s ztiW!p#zFqnXS)_v`rW7i+EJD3K_&XlPyH{^DByH`c8}4)U#NwCI=Yf_l83ZlkkhS1c9| zIa`7a&08bkU7<#&A>0y<*gALMgqXW0mKsXj9q~HZnLQ-U7ace!@y0hT@yd5RBeiF8 z$Edwom1}~LW;YUSbecoKwl+5u++-i|n}-U>IhBp6A& foBTQXJvTkApklz%|13xZ{O5iDY?6HB-EUQ!`D+eW4VwEKAA_Eei^<^3pP+R^~DwQzQgqMs~=HyhYJX z$grR?lu(Fvh&OfuZaj&F_`vo9)-aEVHKqxhFdwgA4nD*ZT*PvWjWebQ>u?BrQ2Wc6 zjXCjtx?s>iI~%bZ%WxDo;TznFk+iW5>#-UKFbSWcI)01k_!U#pNsO`pl~4_a;Sn4U zGNuDp67_Qm#h6r7WW`AFrp#WiK}Ft-k$Bkl1ad2;55rOCX#XOr!x2$nFm#X7dPM#DxoQ?z*$rxL2CmE#G^XPL={|Ruh*lV zYet>tL0xG-=JI}Xfq^2tje5~E>PnVS5B@-P9F!JFDgl*L0jkhS)N>8?dNbxTZ@2d^ zAt9P;sKO>N6Q|Lyisl*Ud-(-b=`YlJ1num?Ol-kUJb;gIJtpzdR>ZYfi#@mpC$Iqj zp`y>r2o%(a70i24U+b|9@*iU`$3hwUD9eR6QUCZ7btRwebtjue%u7%&ZnZs+rOfZ5 z?*2V0u}`Rmexs6# Date: Fri, 13 Mar 2026 13:50:00 +0200 Subject: [PATCH 31/34] LHJ-79: update version and readme --- fame-lahjoitukset.php | 2 +- readme.txt | 89 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 78 insertions(+), 13 deletions(-) diff --git a/fame-lahjoitukset.php b/fame-lahjoitukset.php index 5ef2174..4f202c7 100644 --- a/fame-lahjoitukset.php +++ b/fame-lahjoitukset.php @@ -7,7 +7,7 @@ /** * Plugin Name: Lahjoitin * Description: Wordpress plugin for Fame lahjoitukset system. - * Version: 1.1.2 + * Version: 1.1.3 * Requires at least: 6.7 * Requires PHP: 8.3 * Author: Fame Helsinki diff --git a/readme.txt b/readme.txt index 79c9e6a..c0067fc 100644 --- a/readme.txt +++ b/readme.txt @@ -1,33 +1,98 @@ === Lahjoitin === Contributors: Fame Helsinki -Tags: block +Tags: block, donation Tested up to: 6.7 -Stable tag: 1.0.0 +Stable tag: 1.1.3 License: GPL-2.0-or-later License URI: https://www.gnu.org/licenses/gpl-2.0.html -Wordpress plugin for Fame lahjoitukset backend. +WordPress plugin for the Lahjoitin.fi donation platform. == Description == -Lahjoitin is a WordPress plugin that provides a Gutenberg block for adding a donation form to your website. It is part of the Lahjoitin.fi donation platform, developed by Fame, and integrates into WordPress to support easy and accessible online donations. +Lahjoitin is a WordPress plugin that provides a Gutenberg block for adding a donation form to your website. +It is part of the Lahjoitin.fi donation platform developed by Fame and integrates into WordPress to support easy and accessible online donations. -👉 Learn more at [Lahjoitin.fi](https://lahjoitin.fi) +The plugin provides configurable blocks for donation type selection, donation amounts, campaign selection, contact details and payment providers. + +Learn more at https://lahjoitin.fi == Installation == -1. Upload the plugin files to the `/wp-content/plugins/wp-lahjoitukset` directory, or install the plugin through the WordPress plugins screen directly. -1. Activate the plugin through the 'Plugins' screen in WordPress +1. Upload the plugin files to the /wp-content/plugins/wp-lahjoitin directory, or install the plugin through the WordPress Plugins screen. +2. Activate the plugin through the Plugins screen in WordPress. +3. Add the Lahjoitin block to a page using the block editor. +4. Configure donation options and publish the page. + +== Development == + +Install dependencies: + +npm install + +Build the block scripts: + +npm run build + +Start development build with watch mode: + +npm run dev + +== Translations == + +The plugin supports translations using WordPress internationalization (i18n). +All source strings are written in English and use the text domain: fame_lahjoitukset. + +Translation files are located in the /languages directory. + +Currently supported languages include: +- Finnish (fi_FI) +- Swedish (sv_SE) + +The repository includes compiled .mo files for PHP and .json files for JavaScript so translations work immediately when the plugin is installed. + +== Updating translation strings == + +If source strings in the code change, regenerate the translation template from the plugin directory: + +npm run i18n:pot + +This updates the translation template: + +languages/fame_lahjoitukset.pot + +== Updating translations == + +After updating the POT file, update the translation files: + +languages/fame_lahjoitukset-fi_FI.po +languages/fame_lahjoitukset-sv_SE.po + +Add or update translations for any new or changed strings. + +== Regenerating translation build files == + +After updating the .po files run: + +npm run i18n + +This generates: +- .mo files used by PHP +- .json files used by the block editor and frontend JavaScript + +These files are committed to the repository so the plugin works without running build tools after installation. == Frequently Asked Questions == -= Where do I get support = += Where do I get support? = -Contact us at info@fame.fi. +Contact Fame Helsinki at info@fame.fi. == Changelog == -= 0.1.0 = -* Release += 1.1.3 = +* Translation workflow improvements +* Updated translation files -== += 1.0.0 = +* Initial release \ No newline at end of file From 05ac86a1adaa326821ff976b6c665ffda512ab43 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Tue, 17 Mar 2026 10:27:55 +0200 Subject: [PATCH 32/34] LHJ-79: show campaign selector when there is more than 1 campaign --- src/Blocks/donation-campaigns/render.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Blocks/donation-campaigns/render.php b/src/Blocks/donation-campaigns/render.php index c567e00..072218c 100644 --- a/src/Blocks/donation-campaigns/render.php +++ b/src/Blocks/donation-campaigns/render.php @@ -20,7 +20,7 @@ ? $attributes['campaigns'] : []; -if (!$show || empty($campaigns)) { +if (!$show || count($campaigns) <= 1) { return; } From 285c413750b2feab26182fbdcc57dea1a1863826 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Tue, 17 Mar 2026 11:17:38 +0200 Subject: [PATCH 33/34] LHJ-79: style fix --- src/Blocks/donation-form/edit.css | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Blocks/donation-form/edit.css b/src/Blocks/donation-form/edit.css index 2767dac..1c57118 100644 --- a/src/Blocks/donation-form/edit.css +++ b/src/Blocks/donation-form/edit.css @@ -3,8 +3,20 @@ .editor-styles-wrapper .wp-block-famehelsinki-donation-form { - /* allow container queries used by inner layouts */ - container-type: inline-size; + .editor-styles-wrapper .wp-block-famehelsinki-donation-form { + width: 100%; + max-width: 100%; + min-width: 0; + inline-size: 100%; + box-sizing: border-box; + } +} + +.editor-styles-wrapper .wp-block-famehelsinki-donation-form .fame-form__wrapper { + width: 100% !important; + max-width: 100% !important; + min-width: 0 !important; + inline-size: 100% !important; } /* Spacing between inner blocks inside our wrapper (editor markup) */ @@ -331,7 +343,13 @@ label { @container (max-width: 1000px) { - .editor-styles-wrapper .wp-block-famehelsinki-donation-form .is-layout-grid { - grid-template-columns: 1fr !important; + /* core/columns uses is-layout-flex (not is-layout-grid) */ + .editor-styles-wrapper .wp-block-famehelsinki-donation-form .is-layout-flex.wp-block-columns { + flex-wrap: wrap !important; + } + + .editor-styles-wrapper .wp-block-famehelsinki-donation-form .wp-block-column { + flex: 0 0 100% !important; + max-width: 100% !important; } } From 3dba7281f642da4e02ce8dd1e372b7f5f7639253 Mon Sep 17 00:00:00 2001 From: Mikaela Lindfors Date: Fri, 20 Mar 2026 09:39:10 +0200 Subject: [PATCH 34/34] LHJ-79: Fix translation text --- ...t-fi-00bee4e57e311861dfb1c0adb7a51ca5.json | 2 +- ...t-fi-a1a498bc675c3116ad6115b38bfff5b4.json | 2 +- ...t-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 2 +- ...t-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json | 2 +- ...t-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json | 2 +- languages/fame_lahjoitukset-fi.mo | Bin 8807 -> 8809 bytes languages/fame_lahjoitukset-fi.po | 4 ++-- ...i_FI-00bee4e57e311861dfb1c0adb7a51ca5.json | 2 +- ...i_FI-a1a498bc675c3116ad6115b38bfff5b4.json | 2 +- ...i_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json | 2 +- ...i_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json | 2 +- ...i_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json | 2 +- languages/fame_lahjoitukset-fi_FI.mo | Bin 8810 -> 8812 bytes languages/fame_lahjoitukset-fi_FI.po | 4 ++-- languages/fame_lahjoitukset.pot | 4 ++-- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json b/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json index d86c0e1..c0d65ce 100644 --- a/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json +++ b/languages/fame_lahjoitukset-fi-00bee4e57e311861dfb1c0adb7a51ca5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Label":["Otsikko"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Tarjoajatyyppi"],"General settings":["Yleiset asetukset"],"label":["otsikko"],"Donation provider":["Lahjoitusmaksuntarjoaja"],"Terms text\u2026":["Ehtojen teksti\u2026"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Label":["Otsikko"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Tarjoajatyyppi"],"General settings":["Yleiset asetukset"],"label":["otsikko"],"Donation provider":["Lahjoitusmaksuntarjoaja"],"Terms text\u2026":["Ehtojen teksti\u2026"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json b/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json index 7f5a1ca..9d2087c 100644 --- a/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json +++ b/languages/fame_lahjoitukset-fi-a1a498bc675c3116ad6115b38bfff5b4.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Lahjoitustapa"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Default donation type":["Oletuslahjoistuistapa"],"Select donation type that will be used by default.":["Valitse oletuksena k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Lahjoitustapa"],"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Default donation type":["Oletuslahjoistuistapa"],"Select donation type that will be used by default.":["Valitse oletuksena k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json b/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json index 3680511..3c438ad 100644 --- a/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json +++ b/languages/fame_lahjoitukset-fi-bd2530ea3cf0fb7e2347ef1e57ad40df.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Muu summa"],"Min":["V\u00e4hint\u00e4\u00e4n"],"Max":["Enint\u00e4\u00e4n"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Amount":["Summa"],"Currency label":["Valuuttamerkki"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Merkki, joka n\u00e4ytet\u00e4\u00e4n summien vieress\u00e4. T\u00e4m\u00e4 ei ohjaa todellista lahjoitusvaluuttaa. T\u00e4ll\u00e4 hetkell\u00e4 vain eurot ovat tuettuja."],"Default amount":["Oletussumma"],"Amount that is preselected.":["Oletuksena valittu summa."],"Min Amount":["V\u00e4himm\u00e4issumma"],"Minimum amount for other amount field.":["Pienin sallittu summa muulle summakent\u00e4lle."],"Max Amount":["Enimm\u00e4issumma"],"Maximum amount for other amount field.":["Suurin sallittu summa muulle summakent\u00e4lle."],"Other amount text":["Muu summa -teksti"],"Show other amount":["N\u00e4yt\u00e4 muu summa"],"Show other amount input field":["N\u00e4yt\u00e4 muu summa -sy\u00f6tekentt\u00e4"],"Amount columns":["Summien sarakkeet"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Add button":["Lis\u00e4\u00e4 painike"],"Remove button":["Poista painike"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Muu summa"],"Min":["V\u00e4hint\u00e4\u00e4n"],"Max":["Enint\u00e4\u00e4n"],"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Amount":["Summa"],"Currency label":["Valuuttamerkki"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Merkki, joka n\u00e4ytet\u00e4\u00e4n summien vieress\u00e4. T\u00e4m\u00e4 ei ohjaa todellista lahjoitusvaluuttaa. T\u00e4ll\u00e4 hetkell\u00e4 vain eurot ovat tuettuja."],"Default amount":["Oletussumma"],"Amount that is preselected.":["Oletuksena valittu summa."],"Min Amount":["V\u00e4himm\u00e4issumma"],"Minimum amount for other amount field.":["Pienin sallittu summa muulle summakent\u00e4lle."],"Max Amount":["Enimm\u00e4issumma"],"Maximum amount for other amount field.":["Suurin sallittu summa muulle summakent\u00e4lle."],"Other amount text":["Muu summa -teksti"],"Show other amount":["N\u00e4yt\u00e4 muu summa"],"Show other amount input field":["N\u00e4yt\u00e4 muu summa -sy\u00f6tekentt\u00e4"],"Amount columns":["Summien sarakkeet"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Add button":["Lis\u00e4\u00e4 painike"],"Remove button":["Poista painike"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json b/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json index 4156ef3..ea1907a 100644 --- a/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json +++ b/languages/fame_lahjoitukset-fi-d6c9f4c6041699fdecfef4f8c7a20e85.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Donate":["Lahjoita"],"Button labels":["Painikkeiden tekstit"],"Single button text":["Kertalahjitus-painikkeen teksti"],"Recurring button text":["Toistuva-painikkeen teksti"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Donate":["Lahjoita"],"Button labels":["Painikkeiden tekstit"],"Single button text":["Kertalahjoitus-painikkeen teksti"],"Recurring button text":["Toistuva-painikkeen teksti"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json b/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json index 02c33d9..17b888d 100644 --- a/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json +++ b/languages/fame_lahjoitukset-fi-ff8c96b8bc4bc42ad7e498decd6882a5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Desktop columns":["Sarakkeet ty\u00f6p\u00f6yd\u00e4ll\u00e4"],"Enabled donation types":["K\u00e4yt\u00f6ss\u00e4 olevat lahjoitustavat"],"Choose the donation type to enable.":["Valitse k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."],"Return address":["Paluuosoite"],"Page that is displayed after donation is submitted.":["Sivu, joka n\u00e4ytet\u00e4\u00e4n lahjoituksen l\u00e4hett\u00e4misen j\u00e4lkeen."],"Selected button background color":["Valitun napin taustav\u00e4ri"],"This is the background color for selected buttons.":["T\u00e4m\u00e4 on taustav\u00e4ri valitulle napille."],"Selected button text color":["Valitun napin tekstin v\u00e4ri"],"This is the text color for selected buttons.":["T\u00e4m\u00e4 on valitun napin tekstin v\u00e4ri."],"Input border color":["Sy\u00f6tekent\u00e4n reunan v\u00e4ri"],"This defines the border and helper text color of the input field.":["M\u00e4\u00e4ritt\u00e4\u00e4 sy\u00f6tekent\u00e4n reunan ja ohjetekstin v\u00e4rin."],"Danger color":["Vaarav\u00e4ri"],"This defines the danger color for error messages and invalid input fields.":["M\u00e4\u00e4ritt\u00e4\u00e4 vaarav\u00e4rin virheviestej\u00e4 ja virheellisi\u00e4 sy\u00f6tekentti\u00e4 varten."],"Border Radius":["Reunan py\u00f6ristys"],"This is the border-radius for tabs.":["T\u00e4m\u00e4 on valintanappien reunan py\u00f6ristys."],"Border Width":["Reunan leveys"],"This is the border-width for tabs and input fields.":["T\u00e4m\u00e4 on valintanappien ja sy\u00f6tekenttien reunan leveys."],"Text field border radius":["Tekstikent\u00e4n reunan py\u00f6ristys"],"This is the border-radius for the text fields.":["T\u00e4m\u00e4 on tekstikenttien reunan py\u00f6ristys."],"Return userinfo token":["Palauta k\u00e4ytt\u00e4j\u00e4tietotunnus"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["T\u00e4m\u00e4 asetus sis\u00e4llytt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tietotunnuksen paluuosoitteeseen. T\u00e4m\u00e4 ei ole yleens\u00e4 hy\u00f6dyllist\u00e4 ja vaatii mukautetun logiikan tunnuksen k\u00e4sittelemiseen."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Desktop columns":["Sarakkeet ty\u00f6p\u00f6yd\u00e4ll\u00e4"],"Enabled donation types":["K\u00e4yt\u00f6ss\u00e4 olevat lahjoitustavat"],"Choose the donation type to enable.":["Valitse k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."],"Return address":["Paluuosoite"],"Page that is displayed after donation is submitted.":["Sivu, joka n\u00e4ytet\u00e4\u00e4n lahjoituksen l\u00e4hett\u00e4misen j\u00e4lkeen."],"Selected button background color":["Valitun napin taustav\u00e4ri"],"This is the background color for selected buttons.":["T\u00e4m\u00e4 on taustav\u00e4ri valitulle napille."],"Selected button text color":["Valitun napin tekstin v\u00e4ri"],"This is the text color for selected buttons.":["T\u00e4m\u00e4 on valitun napin tekstin v\u00e4ri."],"Input border color":["Sy\u00f6tekent\u00e4n reunan v\u00e4ri"],"This defines the border and helper text color of the input field.":["M\u00e4\u00e4ritt\u00e4\u00e4 sy\u00f6tekent\u00e4n reunan ja ohjetekstin v\u00e4rin."],"Danger color":["Vaarav\u00e4ri"],"This defines the danger color for error messages and invalid input fields.":["M\u00e4\u00e4ritt\u00e4\u00e4 vaarav\u00e4rin virheviestej\u00e4 ja virheellisi\u00e4 sy\u00f6tekentti\u00e4 varten."],"Border Radius":["Reunan py\u00f6ristys"],"This is the border-radius for tabs.":["T\u00e4m\u00e4 on valintanappien reunan py\u00f6ristys."],"Border Width":["Reunan leveys"],"This is the border-width for tabs and input fields.":["T\u00e4m\u00e4 on valintanappien ja sy\u00f6tekenttien reunan leveys."],"Text field border radius":["Tekstikent\u00e4n reunan py\u00f6ristys"],"This is the border-radius for the text fields.":["T\u00e4m\u00e4 on tekstikenttien reunan py\u00f6ristys."],"Return userinfo token":["Palauta k\u00e4ytt\u00e4j\u00e4tietotunnus"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["T\u00e4m\u00e4 asetus sis\u00e4llytt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tietotunnuksen paluuosoitteeseen. T\u00e4m\u00e4 ei ole yleens\u00e4 hy\u00f6dyllist\u00e4 ja vaatii mukautetun logiikan tunnuksen k\u00e4sittelemiseen."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi.mo b/languages/fame_lahjoitukset-fi.mo index d16ba443682383a6d5616c66cbaf9efe3a25fdb6..90e6f01368d687986fb778b0685fe42e30c94564 100644 GIT binary patch delta 298 zcmXZXy9+^49KiA4g2;0q!}T2GEv1BPN-^*++(CJj@+uRHzrtcL7}Z^rKfz)XqeWI_ zviRPvI`uiQ1TFJ8Ux<|d~Y$DChc&ZN7Zhxdbl(p#xl;0-| delta 296 zcmXZXF-t;G7{>8uNmJ2qNF=Y`au8E6gh21$b_Kyfzd_s~&}hmVZQjXGAvicWMIZ!y zhM+CPT?n_p$wmAhyzp{<=Q-!)g?H=zxgYnDASvnFl5AXK8uwvN!zx+~H+InU`B=htTY(l_etBr%_*$a$$&tksR`4HhF?S=?v5jWH z8{Xk8^ao?)1DZw7i_!&Np;@#N<|byyonlm?^sscI)63M*e;uj&_~Lud-r#Auu_k9n DYB?tC diff --git a/languages/fame_lahjoitukset-fi.po b/languages/fame_lahjoitukset-fi.po index bca123d..1f4e345 100644 --- a/languages/fame_lahjoitukset-fi.po +++ b/languages/fame_lahjoitukset-fi.po @@ -97,7 +97,7 @@ msgstr "Lahjoitustapa" #: build/Blocks/donation-type/index.js:1 #: build/Blocks/form-controls/index.js:1 msgid "Single" -msgstr "Kertalahjitus" +msgstr "Kertalahjoitus" #: build/Blocks/donation-type/render.php:56 #: src/Blocks/donation-type/render.php:56 @@ -488,7 +488,7 @@ msgstr "Painikkeiden tekstit" #: build/Blocks/form-controls/index.js:1 msgid "Single button text" -msgstr "Kertalahjitus-painikkeen teksti" +msgstr "Kertalahjoitus-painikkeen teksti" #: build/Blocks/form-controls/index.js:1 msgid "Recurring button text" diff --git a/languages/fame_lahjoitukset-fi_FI-00bee4e57e311861dfb1c0adb7a51ca5.json b/languages/fame_lahjoitukset-fi_FI-00bee4e57e311861dfb1c0adb7a51ca5.json index 1175fd9..36e5e4a 100644 --- a/languages/fame_lahjoitukset-fi_FI-00bee4e57e311861dfb1c0adb7a51ca5.json +++ b/languages/fame_lahjoitukset-fi_FI-00bee4e57e311861dfb1c0adb7a51ca5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Label":["Otsikko"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Tarjoajatyyppi"],"General settings":["Yleiset asetukset"],"label":["otsikko"],"Donation provider":["Lahjoitusmaksuntarjoaja"],"Terms text\u2026":["Ehtojen teksti\u2026"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-providers\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Label":["Otsikko"],"MobilePay":[""],"Paytrail":[""],"Provider type":["Tarjoajatyyppi"],"General settings":["Yleiset asetukset"],"label":["otsikko"],"Donation provider":["Lahjoitusmaksuntarjoaja"],"Terms text\u2026":["Ehtojen teksti\u2026"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi_FI-a1a498bc675c3116ad6115b38bfff5b4.json b/languages/fame_lahjoitukset-fi_FI-a1a498bc675c3116ad6115b38bfff5b4.json index a20a644..c45c9ba 100644 --- a/languages/fame_lahjoitukset-fi_FI-a1a498bc675c3116ad6115b38bfff5b4.json +++ b/languages/fame_lahjoitukset-fi_FI-a1a498bc675c3116ad6115b38bfff5b4.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Lahjoitustapa"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Default donation type":["Oletuslahjoistuistapa"],"Select donation type that will be used by default.":["Valitse oletuksena k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-type\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Donation type":["Lahjoitustapa"],"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Default donation type":["Oletuslahjoistuistapa"],"Select donation type that will be used by default.":["Valitse oletuksena k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json b/languages/fame_lahjoitukset-fi_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json index 330a527..2c38fac 100644 --- a/languages/fame_lahjoitukset-fi_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json +++ b/languages/fame_lahjoitukset-fi_FI-bd2530ea3cf0fb7e2347ef1e57ad40df.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Muu summa"],"Min":["V\u00e4hint\u00e4\u00e4n"],"Max":["Enint\u00e4\u00e4n"],"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Amount":["Summa"],"Currency label":["Valuuttamerkki"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Merkki, joka n\u00e4ytet\u00e4\u00e4n summien vieress\u00e4. T\u00e4m\u00e4 ei ohjaa todellista lahjoitusvaluuttaa. T\u00e4ll\u00e4 hetkell\u00e4 vain eurot ovat tuettuja."],"Default amount":["Oletussumma"],"Amount that is preselected.":["Oletuksena valittu summa."],"Min Amount":["V\u00e4himm\u00e4issumma"],"Minimum amount for other amount field.":["Pienin sallittu summa muulle summakent\u00e4lle."],"Max Amount":["Enimm\u00e4issumma"],"Maximum amount for other amount field.":["Suurin sallittu summa muulle summakent\u00e4lle."],"Other amount text":["Muu summa -teksti"],"Show other amount":["N\u00e4yt\u00e4 muu summa"],"Show other amount input field":["N\u00e4yt\u00e4 muu summa -sy\u00f6tekentt\u00e4"],"Amount columns":["Summien sarakkeet"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Add button":["Lis\u00e4\u00e4 painike"],"Remove button":["Poista painike"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-amounts\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Other amount":["Muu summa"],"Min":["V\u00e4hint\u00e4\u00e4n"],"Max":["Enint\u00e4\u00e4n"],"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Show legend":["N\u00e4yt\u00e4 otsikko"],"If disabled, the legend is marked visually hidden.":["Jos poistettu k\u00e4yt\u00f6st\u00e4, otsikko merkit\u00e4\u00e4n visuaalisesti piilotettuna."],"Legend":["Otsikko"],"Description for screen readers (for accessibility).":["Kuvaus ruudunlukijoille (saavutettavuus)."],"Amount":["Summa"],"Currency label":["Valuuttamerkki"],"Label that is shown next to amounts. This does not control actual donation currency. Currently only euros are supported.":["Merkki, joka n\u00e4ytet\u00e4\u00e4n summien vieress\u00e4. T\u00e4m\u00e4 ei ohjaa todellista lahjoitusvaluuttaa. T\u00e4ll\u00e4 hetkell\u00e4 vain eurot ovat tuettuja."],"Default amount":["Oletussumma"],"Amount that is preselected.":["Oletuksena valittu summa."],"Min Amount":["V\u00e4himm\u00e4issumma"],"Minimum amount for other amount field.":["Pienin sallittu summa muulle summakent\u00e4lle."],"Max Amount":["Enimm\u00e4issumma"],"Maximum amount for other amount field.":["Suurin sallittu summa muulle summakent\u00e4lle."],"Other amount text":["Muu summa -teksti"],"Show other amount":["N\u00e4yt\u00e4 muu summa"],"Show other amount input field":["N\u00e4yt\u00e4 muu summa -sy\u00f6tekentt\u00e4"],"Amount columns":["Summien sarakkeet"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Add button":["Lis\u00e4\u00e4 painike"],"Remove button":["Poista painike"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json b/languages/fame_lahjoitukset-fi_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json index 1039b04..51af4f4 100644 --- a/languages/fame_lahjoitukset-fi_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json +++ b/languages/fame_lahjoitukset-fi_FI-d6c9f4c6041699fdecfef4f8c7a20e85.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Donate":["Lahjoita"],"Button labels":["Painikkeiden tekstit"],"Single button text":["Kertalahjitus-painikkeen teksti"],"Recurring button text":["Toistuva-painikkeen teksti"]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/form-controls\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Donate":["Lahjoita"],"Button labels":["Painikkeiden tekstit"],"Single button text":["Kertalahjoitus-painikkeen teksti"],"Recurring button text":["Toistuva-painikkeen teksti"]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json b/languages/fame_lahjoitukset-fi_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json index 256caf7..72c9b23 100644 --- a/languages/fame_lahjoitukset-fi_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json +++ b/languages/fame_lahjoitukset-fi_FI-ff8c96b8bc4bc42ad7e498decd6882a5.json @@ -1 +1 @@ -{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Desktop columns":["Sarakkeet ty\u00f6p\u00f6yd\u00e4ll\u00e4"],"Enabled donation types":["K\u00e4yt\u00f6ss\u00e4 olevat lahjoitustavat"],"Choose the donation type to enable.":["Valitse k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."],"Return address":["Paluuosoite"],"Page that is displayed after donation is submitted.":["Sivu, joka n\u00e4ytet\u00e4\u00e4n lahjoituksen l\u00e4hett\u00e4misen j\u00e4lkeen."],"Selected button background color":["Valitun napin taustav\u00e4ri"],"This is the background color for selected buttons.":["T\u00e4m\u00e4 on taustav\u00e4ri valitulle napille."],"Selected button text color":["Valitun napin tekstin v\u00e4ri"],"This is the text color for selected buttons.":["T\u00e4m\u00e4 on valitun napin tekstin v\u00e4ri."],"Input border color":["Sy\u00f6tekent\u00e4n reunan v\u00e4ri"],"This defines the border and helper text color of the input field.":["M\u00e4\u00e4ritt\u00e4\u00e4 sy\u00f6tekent\u00e4n reunan ja ohjetekstin v\u00e4rin."],"Danger color":["Vaarav\u00e4ri"],"This defines the danger color for error messages and invalid input fields.":["M\u00e4\u00e4ritt\u00e4\u00e4 vaarav\u00e4rin virheviestej\u00e4 ja virheellisi\u00e4 sy\u00f6tekentti\u00e4 varten."],"Border Radius":["Reunan py\u00f6ristys"],"This is the border-radius for tabs.":["T\u00e4m\u00e4 on valintanappien reunan py\u00f6ristys."],"Border Width":["Reunan leveys"],"This is the border-width for tabs and input fields.":["T\u00e4m\u00e4 on valintanappien ja sy\u00f6tekenttien reunan leveys."],"Text field border radius":["Tekstikent\u00e4n reunan py\u00f6ristys"],"This is the border-radius for the text fields.":["T\u00e4m\u00e4 on tekstikenttien reunan py\u00f6ristys."],"Return userinfo token":["Palauta k\u00e4ytt\u00e4j\u00e4tietotunnus"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["T\u00e4m\u00e4 asetus sis\u00e4llytt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tietotunnuksen paluuosoitteeseen. T\u00e4m\u00e4 ei ole yleens\u00e4 hy\u00f6dyllist\u00e4 ja vaatii mukautetun logiikan tunnuksen k\u00e4sittelemiseen."]}}} \ No newline at end of file +{"translation-revision-date":"2026-03-12 00:00+0000","generator":"WP-CLI\/2.11.0","source":"build\/Blocks\/donation-form\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fi_FI","plural-forms":"nplurals=2; plural=(n != 1);"},"Single":["Kertalahjoitus"],"Recurring":["Toistuva"],"Settings":["Asetukset"],"Choose 1\u20133 columns for the form layout.":["Valitse 1\u20133 saraketta lomakkeen asetteluun."],"Desktop columns":["Sarakkeet ty\u00f6p\u00f6yd\u00e4ll\u00e4"],"Enabled donation types":["K\u00e4yt\u00f6ss\u00e4 olevat lahjoitustavat"],"Choose the donation type to enable.":["Valitse k\u00e4ytett\u00e4v\u00e4 lahjoitustapa."],"Return address":["Paluuosoite"],"Page that is displayed after donation is submitted.":["Sivu, joka n\u00e4ytet\u00e4\u00e4n lahjoituksen l\u00e4hett\u00e4misen j\u00e4lkeen."],"Selected button background color":["Valitun napin taustav\u00e4ri"],"This is the background color for selected buttons.":["T\u00e4m\u00e4 on taustav\u00e4ri valitulle napille."],"Selected button text color":["Valitun napin tekstin v\u00e4ri"],"This is the text color for selected buttons.":["T\u00e4m\u00e4 on valitun napin tekstin v\u00e4ri."],"Input border color":["Sy\u00f6tekent\u00e4n reunan v\u00e4ri"],"This defines the border and helper text color of the input field.":["M\u00e4\u00e4ritt\u00e4\u00e4 sy\u00f6tekent\u00e4n reunan ja ohjetekstin v\u00e4rin."],"Danger color":["Vaarav\u00e4ri"],"This defines the danger color for error messages and invalid input fields.":["M\u00e4\u00e4ritt\u00e4\u00e4 vaarav\u00e4rin virheviestej\u00e4 ja virheellisi\u00e4 sy\u00f6tekentti\u00e4 varten."],"Border Radius":["Reunan py\u00f6ristys"],"This is the border-radius for tabs.":["T\u00e4m\u00e4 on valintanappien reunan py\u00f6ristys."],"Border Width":["Reunan leveys"],"This is the border-width for tabs and input fields.":["T\u00e4m\u00e4 on valintanappien ja sy\u00f6tekenttien reunan leveys."],"Text field border radius":["Tekstikent\u00e4n reunan py\u00f6ristys"],"This is the border-radius for the text fields.":["T\u00e4m\u00e4 on tekstikenttien reunan py\u00f6ristys."],"Return userinfo token":["Palauta k\u00e4ytt\u00e4j\u00e4tietotunnus"],"This option includes userinfo token in the return address. This is not generally useful and requires custom logic to handle the token.":["T\u00e4m\u00e4 asetus sis\u00e4llytt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tietotunnuksen paluuosoitteeseen. T\u00e4m\u00e4 ei ole yleens\u00e4 hy\u00f6dyllist\u00e4 ja vaatii mukautetun logiikan tunnuksen k\u00e4sittelemiseen."]}}} \ No newline at end of file diff --git a/languages/fame_lahjoitukset-fi_FI.mo b/languages/fame_lahjoitukset-fi_FI.mo index 0145abbbab407a9c3a9553dbab08834a3cc2d9b2..a5c5cd85e9e13b36c021c6eee2865e6bec0103d5 100644 GIT binary patch delta 298 zcmXZXJqtlm9DwnE2^qKyWWc=)@={(($-rbH@f8$>yp)$gDT90si-A$yQTYfKn;0#! zDw907t4{sSbI$2>&a?a~A9A*(OGM5A5e@I?!7r-l4vG{pgLNEY15cPjC1hH{0zE)u ze}^&rU=qVzW>`bx+#I8*tFn|mlPe2(TxsS*j_9Xvn7}v2Q45P?v4X}03ryqo?*$#S wC1QTWi3+Wv6Vv}LqK~dc>>>_}7>mGHdvx!vO<7uAzX!;&2Q#v}YobFn53$Sz*t1h4TO zT`bs%ee99%(fqIQ6o2s?9fliyG<{QS;H#rZYc5|rbn*FEqV&d5#SJ!bk7sC~NF5xa z88E{(E>k}-M?R=0i{!CHuAy19mF7#Vko|gAqI47YvWs$Y96mkDA3cP@B)Gkcf2?`t EA7a@iTmS$7 diff --git a/languages/fame_lahjoitukset-fi_FI.po b/languages/fame_lahjoitukset-fi_FI.po index ff571b7..d8597d7 100644 --- a/languages/fame_lahjoitukset-fi_FI.po +++ b/languages/fame_lahjoitukset-fi_FI.po @@ -97,7 +97,7 @@ msgstr "Lahjoitustapa" #: build/Blocks/donation-type/index.js:1 #: build/Blocks/form-controls/index.js:1 msgid "Single" -msgstr "Kertalahjitus" +msgstr "Kertalahjoitus" #: build/Blocks/donation-type/render.php:56 #: src/Blocks/donation-type/render.php:56 @@ -488,7 +488,7 @@ msgstr "Painikkeiden tekstit" #: build/Blocks/form-controls/index.js:1 msgid "Single button text" -msgstr "Kertalahjitus-painikkeen teksti" +msgstr "Kertalahjoitus-painikkeen teksti" #: build/Blocks/form-controls/index.js:1 msgid "Recurring button text" diff --git a/languages/fame_lahjoitukset.pot b/languages/fame_lahjoitukset.pot index 17c66a5..62081f1 100644 --- a/languages/fame_lahjoitukset.pot +++ b/languages/fame_lahjoitukset.pot @@ -2,14 +2,14 @@ # This file is distributed under the GPL-2.0-or-later. msgid "" msgstr "" -"Project-Id-Version: Lahjoitin 1.1.2\n" +"Project-Id-Version: Lahjoitin 1.1.3\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-lahjoitin\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-03-13T13:32:32+02:00\n" +"POT-Creation-Date: 2026-03-20T09:33:28+02:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: fame_lahjoitukset\n"