@wordpress/block-editor 15.16.1-next.v.202604091042.0 → 15.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/copy-handler/index.cjs.map +2 -2
  3. package/build/components/link-control/link-preview.cjs +3 -1
  4. package/build/components/link-control/link-preview.cjs.map +2 -2
  5. package/build/components/preset-input-control/index.cjs +7 -4
  6. package/build/components/preset-input-control/index.cjs.map +2 -2
  7. package/build/components/rich-text/event-listeners/index.cjs.map +2 -2
  8. package/build/components/spacing-sizes-control/utils.cjs +1 -1
  9. package/build/components/spacing-sizes-control/utils.cjs.map +2 -2
  10. package/build/components/writing-flow/use-selection-observer.cjs +23 -1
  11. package/build/components/writing-flow/use-selection-observer.cjs.map +2 -2
  12. package/build/hooks/style.cjs +54 -52
  13. package/build/hooks/style.cjs.map +2 -2
  14. package/build-module/components/copy-handler/index.mjs.map +2 -2
  15. package/build-module/components/link-control/link-preview.mjs +3 -1
  16. package/build-module/components/link-control/link-preview.mjs.map +2 -2
  17. package/build-module/components/preset-input-control/index.mjs +7 -4
  18. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  19. package/build-module/components/rich-text/event-listeners/index.mjs.map +2 -2
  20. package/build-module/components/spacing-sizes-control/utils.mjs +1 -1
  21. package/build-module/components/spacing-sizes-control/utils.mjs.map +2 -2
  22. package/build-module/components/writing-flow/use-selection-observer.mjs +23 -1
  23. package/build-module/components/writing-flow/use-selection-observer.mjs.map +2 -2
  24. package/build-module/hooks/style.mjs +54 -52
  25. package/build-module/hooks/style.mjs.map +2 -2
  26. package/package.json +38 -38
  27. package/src/components/copy-handler/index.js +1 -0
  28. package/src/components/link-control/link-preview.js +3 -1
  29. package/src/components/preset-input-control/index.js +10 -4
  30. package/src/components/preset-input-control/test/index.js +70 -0
  31. package/src/components/rich-text/event-listeners/index.js +1 -0
  32. package/src/components/spacing-sizes-control/utils.js +1 -1
  33. package/src/components/writing-flow/use-selection-observer.js +39 -1
  34. package/src/hooks/style.js +75 -61
package/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 15.17.0 (2026-04-15)
6
+
5
7
  ## 15.16.0 (2026-04-01)
6
8
 
7
9
  ## 15.15.0 (2026-03-18)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/copy-handler/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport useClipboardHandler from '../writing-flow/use-clipboard-handler';\n\n/**\n * @deprecated\n */\nexport const __unstableUseClipboardHandler = () => {\n\tdeprecated( '__unstableUseClipboardHandler', {\n\t\talternative: 'BlockCanvas or WritingFlow',\n\t\tsince: '6.4',\n\t\tversion: '6.7',\n\t} );\n\treturn useClipboardHandler();\n};\n\n/**\n * @deprecated\n * @param {Object} props\n */\nexport default function CopyHandler( props ) {\n\tdeprecated( 'CopyHandler', {\n\t\talternative: 'BlockCanvas or WritingFlow',\n\t\tsince: '6.4',\n\t\tversion: '6.7',\n\t} );\n\treturn <div { ...props } ref={ useClipboardHandler() } />;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAAuB;AAKvB,mCAAgC;AAwBxB;AAnBD,IAAM,gCAAgC,MAAM;AAClD,wBAAAA,SAAY,iCAAiC;AAAA,IAC5C,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,EACV,CAAE;AACF,aAAO,6BAAAC,SAAoB;AAC5B;AAMe,SAAR,YAA8B,OAAQ;AAC5C,wBAAAD,SAAY,eAAe;AAAA,IAC1B,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,EACV,CAAE;AACF,SAAO,4CAAC,SAAM,GAAG,OAAQ,SAAM,6BAAAC,SAAoB,GAAI;AACxD;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport useClipboardHandler from '../writing-flow/use-clipboard-handler';\n\n/**\n * @deprecated\n */\nexport const __unstableUseClipboardHandler = () => {\n\tdeprecated( '__unstableUseClipboardHandler', {\n\t\talternative: 'BlockCanvas or WritingFlow',\n\t\tsince: '6.4',\n\t\tversion: '6.7',\n\t} );\n\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\treturn useClipboardHandler();\n};\n\n/**\n * @deprecated\n * @param {Object} props\n */\nexport default function CopyHandler( props ) {\n\tdeprecated( 'CopyHandler', {\n\t\talternative: 'BlockCanvas or WritingFlow',\n\t\tsince: '6.4',\n\t\tversion: '6.7',\n\t} );\n\treturn <div { ...props } ref={ useClipboardHandler() } />;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAAuB;AAKvB,mCAAgC;AAyBxB;AApBD,IAAM,gCAAgC,MAAM;AAClD,wBAAAA,SAAY,iCAAiC;AAAA,IAC5C,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,EACV,CAAE;AAEF,aAAO,6BAAAC,SAAoB;AAC5B;AAMe,SAAR,YAA8B,OAAQ;AAC5C,wBAAAD,SAAY,eAAe;AAAA,IAC1B,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,EACV,CAAE;AACF,SAAO,4CAAC,SAAM,GAAG,OAAQ,SAAM,6BAAAC,SAAoB,GAAI;AACxD;",
6
6
  "names": ["deprecated", "useClipboardHandler"]
7
7
  }
@@ -64,7 +64,9 @@ function LinkPreview({
64
64
  const hasRichData = richData && Object.keys(richData).length;
65
65
  const displayURL = value && (0, import_url.filterURLForDisplay)((0, import_url.safeDecodeURI)(value.url), 24) || "";
66
66
  const isEmptyURL = !value?.url?.length;
67
- const displayTitle = !isEmptyURL && (0, import_dom.__unstableStripHTML)(richData?.title || value?.title || displayURL);
67
+ const displayTitle = !isEmptyURL && (0, import_dom.__unstableStripHTML)(
68
+ value?.entityTitle || richData?.title || value?.title || displayURL
69
+ );
68
70
  let icon;
69
71
  if (richData?.icon) {
70
72
  icon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { src: richData?.icon, alt: "" });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/link-control/link-preview.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport {\n\tButton,\n\tExternalLink,\n\t__experimentalTruncate as Truncate,\n\t__experimentalHStack as HStack,\n\tFlex,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useCopyToClipboard } from '@wordpress/compose';\nimport { filterURLForDisplay, safeDecodeURI } from '@wordpress/url';\nimport {\n\tIcon,\n\tglobe,\n\tinfo,\n\tlinkOff,\n\tpencil,\n\tcopySmall,\n} from '@wordpress/icons';\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as preferencesStore } from '@wordpress/preferences';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\nimport { ViewerSlot } from './viewer-slot';\n\nconst { Badge } = unlock( componentsPrivateApis );\n\nimport useRichUrlData from './use-rich-url-data';\n\nexport default function LinkPreview( {\n\tvalue,\n\tonEditClick,\n\thasRichPreviews = false,\n\thasUnlinkControl = false,\n\tonRemove,\n} ) {\n\tconst showIconLabels = useSelect(\n\t\t( select ) =>\n\t\t\tselect( preferencesStore ).get( 'core', 'showIconLabels' ),\n\t\t[]\n\t);\n\n\t// Avoid fetching if rich previews are not desired.\n\tconst showRichPreviews = hasRichPreviews ? value?.url : null;\n\n\tconst { richData, isFetching } = useRichUrlData( showRichPreviews );\n\n\t// Rich data may be an empty object so test for that.\n\tconst hasRichData = richData && Object.keys( richData ).length;\n\n\tconst displayURL =\n\t\t( value && filterURLForDisplay( safeDecodeURI( value.url ), 24 ) ) ||\n\t\t'';\n\n\t// url can be undefined if the href attribute is unset\n\tconst isEmptyURL = ! value?.url?.length;\n\n\tconst displayTitle =\n\t\t! isEmptyURL &&\n\t\tstripHTML( richData?.title || value?.title || displayURL );\n\n\tlet icon;\n\n\tif ( richData?.icon ) {\n\t\ticon = <img src={ richData?.icon } alt=\"\" />;\n\t} else if ( isEmptyURL ) {\n\t\ticon = <Icon icon={ info } size={ 32 } />;\n\t} else {\n\t\ticon = <Icon icon={ globe } />;\n\t}\n\n\tconst { createNotice } = useDispatch( noticesStore );\n\tconst ref = useCopyToClipboard( value.url, () => {\n\t\tcreateNotice( 'info', __( 'Link copied to clipboard.' ), {\n\t\t\tisDismissible: true,\n\t\t\ttype: 'snackbar',\n\t\t} );\n\t} );\n\n\treturn (\n\t\t<Flex\n\t\t\trole=\"group\"\n\t\t\taria-label={ __( 'Manage link' ) }\n\t\t\tclassName={ clsx( 'block-editor-link-control__preview', {\n\t\t\t\t'is-current': true,\n\t\t\t\t'is-rich': hasRichData,\n\t\t\t\t'is-fetching': !! isFetching,\n\t\t\t\t'is-preview': true,\n\t\t\t\t'is-error': isEmptyURL,\n\t\t\t\t'is-url-title': displayTitle === displayURL,\n\t\t\t} ) }\n\t\t>\n\t\t\t<Flex gap={ 0 } align=\"flex-start\">\n\t\t\t\t<Flex\n\t\t\t\t\tclassName=\"block-editor-link-control__link-information\"\n\t\t\t\t\trole=\"figure\"\n\t\t\t\t\taria-label={\n\t\t\t\t\t\t/* translators: Accessibility text for the link preview when editing a link. */\n\t\t\t\t\t\t__( 'Link information' )\n\t\t\t\t\t}\n\t\t\t\t\tjustify=\"start\"\n\t\t\t\t\talign=\"flex-start\"\n\t\t\t\t>\n\t\t\t\t\t{ value?.image ? (\n\t\t\t\t\t\t<Flex\n\t\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-image\"\n\t\t\t\t\t\t\tjustify=\"center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<img src={ value?.image } alt=\"\" />\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Flex\n\t\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t\t'block-editor-link-control__preview-icon',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'is-image': richData?.icon,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\tjustify=\"center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ icon }\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t) }\n\t\t\t\t\t<Flex\n\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-details\"\n\t\t\t\t\t\tdirection=\"column\"\n\t\t\t\t\t\tgap={ 2 }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ ! isEmptyURL ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ExternalLink\n\t\t\t\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-title\"\n\t\t\t\t\t\t\t\t\thref={ value.url }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Truncate numberOfLines={ 1 }>\n\t\t\t\t\t\t\t\t\t\t{ displayTitle }\n\t\t\t\t\t\t\t\t\t</Truncate>\n\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t<span className=\"block-editor-link-control__preview-info\">\n\t\t\t\t\t\t\t\t\t<Truncate numberOfLines={ 1 }>\n\t\t\t\t\t\t\t\t\t\t{ displayURL }\n\t\t\t\t\t\t\t\t\t</Truncate>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{ value?.badges?.length > 0 && (\n\t\t\t\t\t\t\t\t\t<HStack\n\t\t\t\t\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-badges\"\n\t\t\t\t\t\t\t\t\t\talignment=\"left\"\n\t\t\t\t\t\t\t\t\t\tgap={ 1 }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ value.badges.map(\n\t\t\t\t\t\t\t\t\t\t\t( badge, index ) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={ `${ badge.label }|${ badge.intent }|${ index }` }\n\t\t\t\t\t\t\t\t\t\t\t\t\tintent={ badge.intent }\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ badge.label }\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"block-editor-link-control__preview-error-notice\">\n\t\t\t\t\t\t\t\t{ __( 'Link is empty' ) }\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Flex>\n\t\t\t\t</Flex>\n\t\t\t\t<Button\n\t\t\t\t\ticon={ pencil }\n\t\t\t\t\tlabel={ __( 'Edit link' ) }\n\t\t\t\t\tonClick={ onEditClick }\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tshowTooltip={ ! showIconLabels }\n\t\t\t\t/>\n\t\t\t\t{ hasUnlinkControl && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\ticon={ linkOff }\n\t\t\t\t\t\tlabel={ __( 'Remove link' ) }\n\t\t\t\t\t\tonClick={ onRemove }\n\t\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\t\tshowTooltip={ ! showIconLabels }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t<Button\n\t\t\t\t\ticon={ copySmall }\n\t\t\t\t\tlabel={ __( 'Copy link' ) }\n\t\t\t\t\tref={ ref }\n\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\tdisabled={ isEmptyURL }\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tshowTooltip={ ! showIconLabels }\n\t\t\t\t/>\n\t\t\t\t<ViewerSlot fillProps={ value } />\n\t\t\t</Flex>\n\t\t</Flex>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport {\n\tButton,\n\tExternalLink,\n\t__experimentalTruncate as Truncate,\n\t__experimentalHStack as HStack,\n\tFlex,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useCopyToClipboard } from '@wordpress/compose';\nimport { filterURLForDisplay, safeDecodeURI } from '@wordpress/url';\nimport {\n\tIcon,\n\tglobe,\n\tinfo,\n\tlinkOff,\n\tpencil,\n\tcopySmall,\n} from '@wordpress/icons';\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as preferencesStore } from '@wordpress/preferences';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\nimport { ViewerSlot } from './viewer-slot';\n\nconst { Badge } = unlock( componentsPrivateApis );\n\nimport useRichUrlData from './use-rich-url-data';\n\nexport default function LinkPreview( {\n\tvalue,\n\tonEditClick,\n\thasRichPreviews = false,\n\thasUnlinkControl = false,\n\tonRemove,\n} ) {\n\tconst showIconLabels = useSelect(\n\t\t( select ) =>\n\t\t\tselect( preferencesStore ).get( 'core', 'showIconLabels' ),\n\t\t[]\n\t);\n\n\t// Avoid fetching if rich previews are not desired.\n\tconst showRichPreviews = hasRichPreviews ? value?.url : null;\n\n\tconst { richData, isFetching } = useRichUrlData( showRichPreviews );\n\n\t// Rich data may be an empty object so test for that.\n\tconst hasRichData = richData && Object.keys( richData ).length;\n\n\tconst displayURL =\n\t\t( value && filterURLForDisplay( safeDecodeURI( value.url ), 24 ) ) ||\n\t\t'';\n\n\t// url can be undefined if the href attribute is unset\n\tconst isEmptyURL = ! value?.url?.length;\n\n\tconst displayTitle =\n\t\t! isEmptyURL &&\n\t\tstripHTML(\n\t\t\tvalue?.entityTitle || richData?.title || value?.title || displayURL\n\t\t);\n\n\tlet icon;\n\n\tif ( richData?.icon ) {\n\t\ticon = <img src={ richData?.icon } alt=\"\" />;\n\t} else if ( isEmptyURL ) {\n\t\ticon = <Icon icon={ info } size={ 32 } />;\n\t} else {\n\t\ticon = <Icon icon={ globe } />;\n\t}\n\n\tconst { createNotice } = useDispatch( noticesStore );\n\tconst ref = useCopyToClipboard( value.url, () => {\n\t\tcreateNotice( 'info', __( 'Link copied to clipboard.' ), {\n\t\t\tisDismissible: true,\n\t\t\ttype: 'snackbar',\n\t\t} );\n\t} );\n\n\treturn (\n\t\t<Flex\n\t\t\trole=\"group\"\n\t\t\taria-label={ __( 'Manage link' ) }\n\t\t\tclassName={ clsx( 'block-editor-link-control__preview', {\n\t\t\t\t'is-current': true,\n\t\t\t\t'is-rich': hasRichData,\n\t\t\t\t'is-fetching': !! isFetching,\n\t\t\t\t'is-preview': true,\n\t\t\t\t'is-error': isEmptyURL,\n\t\t\t\t'is-url-title': displayTitle === displayURL,\n\t\t\t} ) }\n\t\t>\n\t\t\t<Flex gap={ 0 } align=\"flex-start\">\n\t\t\t\t<Flex\n\t\t\t\t\tclassName=\"block-editor-link-control__link-information\"\n\t\t\t\t\trole=\"figure\"\n\t\t\t\t\taria-label={\n\t\t\t\t\t\t/* translators: Accessibility text for the link preview when editing a link. */\n\t\t\t\t\t\t__( 'Link information' )\n\t\t\t\t\t}\n\t\t\t\t\tjustify=\"start\"\n\t\t\t\t\talign=\"flex-start\"\n\t\t\t\t>\n\t\t\t\t\t{ value?.image ? (\n\t\t\t\t\t\t<Flex\n\t\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-image\"\n\t\t\t\t\t\t\tjustify=\"center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<img src={ value?.image } alt=\"\" />\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Flex\n\t\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t\t'block-editor-link-control__preview-icon',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'is-image': richData?.icon,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\tjustify=\"center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ icon }\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t) }\n\t\t\t\t\t<Flex\n\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-details\"\n\t\t\t\t\t\tdirection=\"column\"\n\t\t\t\t\t\tgap={ 2 }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ ! isEmptyURL ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ExternalLink\n\t\t\t\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-title\"\n\t\t\t\t\t\t\t\t\thref={ value.url }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Truncate numberOfLines={ 1 }>\n\t\t\t\t\t\t\t\t\t\t{ displayTitle }\n\t\t\t\t\t\t\t\t\t</Truncate>\n\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t<span className=\"block-editor-link-control__preview-info\">\n\t\t\t\t\t\t\t\t\t<Truncate numberOfLines={ 1 }>\n\t\t\t\t\t\t\t\t\t\t{ displayURL }\n\t\t\t\t\t\t\t\t\t</Truncate>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{ value?.badges?.length > 0 && (\n\t\t\t\t\t\t\t\t\t<HStack\n\t\t\t\t\t\t\t\t\t\tclassName=\"block-editor-link-control__preview-badges\"\n\t\t\t\t\t\t\t\t\t\talignment=\"left\"\n\t\t\t\t\t\t\t\t\t\tgap={ 1 }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ value.badges.map(\n\t\t\t\t\t\t\t\t\t\t\t( badge, index ) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={ `${ badge.label }|${ badge.intent }|${ index }` }\n\t\t\t\t\t\t\t\t\t\t\t\t\tintent={ badge.intent }\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ badge.label }\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"block-editor-link-control__preview-error-notice\">\n\t\t\t\t\t\t\t\t{ __( 'Link is empty' ) }\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Flex>\n\t\t\t\t</Flex>\n\t\t\t\t<Button\n\t\t\t\t\ticon={ pencil }\n\t\t\t\t\tlabel={ __( 'Edit link' ) }\n\t\t\t\t\tonClick={ onEditClick }\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tshowTooltip={ ! showIconLabels }\n\t\t\t\t/>\n\t\t\t\t{ hasUnlinkControl && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\ticon={ linkOff }\n\t\t\t\t\t\tlabel={ __( 'Remove link' ) }\n\t\t\t\t\t\tonClick={ onRemove }\n\t\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\t\tshowTooltip={ ! showIconLabels }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t<Button\n\t\t\t\t\ticon={ copySmall }\n\t\t\t\t\tlabel={ __( 'Copy link' ) }\n\t\t\t\t\tref={ ref }\n\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\tdisabled={ isEmptyURL }\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tshowTooltip={ ! showIconLabels }\n\t\t\t\t/>\n\t\t\t\t<ViewerSlot fillProps={ value } />\n\t\t\t</Flex>\n\t\t</Flex>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["componentsPrivateApis", "preferencesStore", "useRichUrlData", "stripHTML", "noticesStore", "clsx", "Truncate", "HStack"]
7
7
  }
@@ -114,11 +114,14 @@ function PresetInputControl({
114
114
  const step = unitConfig?.step ?? customValueSettings[computedUnit]?.steps ?? 0.1;
115
115
  const max = unitConfig?.max ?? customValueSettings[computedUnit]?.max ?? 10;
116
116
  const handleCustomValueChange = (newValue) => {
117
- const isNumeric = !isNaN(parseFloat(newValue));
118
- const newCustomValue = isNumeric ? newValue : void 0;
119
- if (newCustomValue !== void 0) {
120
- onChange(newCustomValue);
117
+ if (newValue === void 0 || newValue === "") {
118
+ onChange(void 0);
119
+ return;
121
120
  }
121
+ if (isNaN(parseFloat(newValue))) {
122
+ return;
123
+ }
124
+ onChange(newValue);
122
125
  };
123
126
  const handleCustomValueSliderChange = (next) => {
124
127
  onChange([next, computedUnit].join(""));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/preset-input-control/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\tCustomSelectControl,\n\tIcon,\n\tRangeControl,\n\t__experimentalHStack as HStack,\n\t__experimentalParseQuantityAndUnitFromRawValue as parseQuantityAndUnitFromRawValue,\n} from '@wordpress/components';\nimport { usePrevious } from '@wordpress/compose';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { settings } from '@wordpress/icons';\nimport { useState, useEffect, useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport {\n\tCUSTOM_VALUE_SETTINGS,\n\tICON_SIZE,\n\tRANGE_CONTROL_MAX_SIZE,\n} from './constants';\nimport {\n\tgetCustomValueFromPreset,\n\tgetPresetValueFromCustomValue,\n\tgetSliderValueFromPreset,\n\tisValuePreset,\n} from './utils';\nimport CustomValueControls from './custom-value-controls';\n\n/**\n * PresetInputControl component for selecting preset values or entering custom values.\n *\n * Displays preset values as either a slider (for <= 8 presets) or a select dropdown.\n * Allows toggling to custom value mode with a UnitControl and RangeControl.\n * Handles unit tracking and conversion between preset and custom values.\n *\n * @param {Object} props Component props.\n * @param {boolean} props.allowNegativeOnDrag Whether to allow negative values during drag operations.\n * @param {string} props.ariaLabel Accessible label for the control.\n * @param {string} props.className Optional CSS class name.\n * @param {Object} props.customValueSettings Optional custom value settings for max/steps per unit.\n * @param {boolean} props.disableCustomValues Whether to disable custom value input.\n * @param {Object} props.icon Icon to display alongside the control.\n * @param {boolean} props.isMixed Whether the current value is mixed (multiple values).\n * @param {number} props.minimumCustomValue Minimum allowed custom value.\n * @param {Function} props.onChange Callback when value changes.\n * @param {Function} props.onMouseOut Callback for mouse out events.\n * @param {Function} props.onMouseOver Callback for mouse over events.\n * @param {Function} props.onUnitChange Callback when unit changes.\n * @param {Array} props.presets Array of preset objects with name, slug, and size.\n * @param {string} props.presetType Type of preset (e.g., 'spacing', 'border-radius').\n * @param {string} props.selectedUnit Currently selected unit (e.g., 'px', 'em').\n * @param {boolean} props.showTooltip Whether to show tooltip on custom UnitControl.\n * @param {Array} props.units Array of available unit objects (can include max and step).\n * @param {string} props.value Current value (preset or custom).\n *\n * @return {Element} The PresetInputControl component.\n */\nexport default function PresetInputControl( {\n\tallowNegativeOnDrag = false,\n\tariaLabel,\n\tclassName: classNameProp,\n\tcustomValueSettings = CUSTOM_VALUE_SETTINGS,\n\tdisableCustomValues,\n\ticon,\n\tisMixed,\n\tvalue: valueProp,\n\tminimumCustomValue,\n\tonChange,\n\tonMouseOut,\n\tonMouseOver,\n\tonUnitChange,\n\tpresets = [],\n\tpresetType,\n\tselectedUnit,\n\tshowTooltip,\n\tunits,\n} ) {\n\tconst value = useMemo(\n\t\t() => getPresetValueFromCustomValue( valueProp, presets, presetType ),\n\t\t[ valueProp, presets, presetType ]\n\t);\n\n\tconst className = classNameProp ?? 'preset-input-control';\n\n\tconst marks = presets\n\t\t.slice( 1, presets.length - 1 )\n\t\t.map( ( _newValue, index ) => ( {\n\t\t\tvalue: index + 1,\n\t\t\tlabel: undefined,\n\t\t} ) );\n\tconst hasPresets = marks.length > 0;\n\tconst showRangeControl = presets.length <= RANGE_CONTROL_MAX_SIZE;\n\n\tconst allPlaceholder = isMixed ? __( 'Mixed' ) : null;\n\n\tconst [ minValue, setMinValue ] = useState( minimumCustomValue );\n\tconst [ showCustomValueControl, setShowCustomValueControl ] = useState(\n\t\t! disableCustomValues &&\n\t\t\tvalue !== undefined &&\n\t\t\t! isValuePreset( value, presetType )\n\t);\n\n\tlet currentValue = null;\n\n\tconst previousValue = usePrevious( value );\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\t!! value &&\n\t\t\tpreviousValue !== value &&\n\t\t\t! isValuePreset( value, presetType ) &&\n\t\t\tshowCustomValueControl !== true\n\t\t) {\n\t\t\tsetShowCustomValueControl( true );\n\t\t}\n\t}, [ value, previousValue, presetType, showCustomValueControl ] );\n\n\tconst showCustomValueInSelectList =\n\t\t! showRangeControl &&\n\t\t! showCustomValueControl &&\n\t\tvalue !== undefined &&\n\t\t( ! isValuePreset( value, presetType ) ||\n\t\t\t( isValuePreset( value, presetType ) && isMixed ) );\n\n\tlet selectListOptions = presets;\n\tif ( showCustomValueInSelectList ) {\n\t\tselectListOptions = [\n\t\t\t...presets,\n\t\t\t{\n\t\t\t\tname: ! isMixed\n\t\t\t\t\t? // translators: %s: A custom measurement, e.g. a number followed by a unit like 12px.\n\t\t\t\t\t sprintf( __( 'Custom (%s)' ), value )\n\t\t\t\t\t: __( 'Mixed' ),\n\t\t\t\tslug: 'custom',\n\t\t\t\tsize: value,\n\t\t\t},\n\t\t];\n\t\tcurrentValue = selectListOptions.length - 1;\n\t} else if ( ! isMixed ) {\n\t\tcurrentValue = ! showCustomValueControl\n\t\t\t? getSliderValueFromPreset( value, presets, presetType )\n\t\t\t: getCustomValueFromPreset( value, presets, presetType );\n\t}\n\n\tconst options = selectListOptions.map( ( size, index ) => ( {\n\t\tkey: index,\n\t\tname: size.name,\n\t} ) );\n\n\tconst resolvedPresetValue = isValuePreset( value, presetType )\n\t\t? getCustomValueFromPreset( value, presets, presetType )\n\t\t: value;\n\n\tconst [ parsedQuantity, parsedUnit ] =\n\t\tparseQuantityAndUnitFromRawValue( resolvedPresetValue );\n\n\tconst computedUnit = parsedUnit || selectedUnit || 'px';\n\n\t// Get step and max from units prop, falling back to customValueSettings\n\tconst unitConfig = units?.find( ( item ) => item.value === computedUnit );\n\tconst step =\n\t\tunitConfig?.step ?? customValueSettings[ computedUnit ]?.steps ?? 0.1;\n\tconst max =\n\t\tunitConfig?.max ?? customValueSettings[ computedUnit ]?.max ?? 10;\n\n\tconst handleCustomValueChange = ( newValue ) => {\n\t\tconst isNumeric = ! isNaN( parseFloat( newValue ) );\n\t\tconst newCustomValue = isNumeric ? newValue : undefined;\n\n\t\tif ( newCustomValue !== undefined ) {\n\t\t\tonChange( newCustomValue );\n\t\t}\n\t};\n\tconst handleCustomValueSliderChange = ( next ) => {\n\t\tonChange( [ next, computedUnit ].join( '' ) );\n\t};\n\tconst customTooltipContent = ( newValue ) =>\n\t\tvalue === undefined ? undefined : presets[ newValue ]?.name;\n\n\tconst getNewPresetValue = ( next, controlType ) => {\n\t\tconst newValue = parseInt( next, 10 );\n\n\t\tif ( controlType === 'selectList' ) {\n\t\t\tif ( newValue === 0 && presets[ 0 ]?.slug === '0' ) {\n\t\t\t\treturn '0';\n\t\t\t}\n\t\t\tif ( newValue === 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t} else if ( newValue === 0 ) {\n\t\t\treturn '0';\n\t\t}\n\t\treturn `var:preset|${ presetType }|${ presets[ next ]?.slug }`;\n\t};\n\n\treturn (\n\t\t<HStack\n\t\t\tclassName={ `preset-input-control__wrapper ${ className }__wrapper` }\n\t\t>\n\t\t\t{ icon && (\n\t\t\t\t<Icon\n\t\t\t\t\tclassName=\"preset-input-control__icon\"\n\t\t\t\t\ticon={ icon }\n\t\t\t\t\tsize={ ICON_SIZE }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ( ! hasPresets || showCustomValueControl ) && (\n\t\t\t\t<CustomValueControls\n\t\t\t\t\tallowNegativeOnDrag={ allowNegativeOnDrag }\n\t\t\t\t\tariaLabel={ ariaLabel }\n\t\t\t\t\tallPlaceholder={ allPlaceholder }\n\t\t\t\t\tminValue={ minValue }\n\t\t\t\t\tparsedQuantity={ parsedQuantity }\n\t\t\t\t\tcomputedUnit={ computedUnit }\n\t\t\t\t\tunits={ units }\n\t\t\t\t\tisMixed={ isMixed }\n\t\t\t\t\tstep={ step }\n\t\t\t\t\tmax={ max }\n\t\t\t\t\tshowTooltip={ showTooltip }\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tminimumCustomValue={ minimumCustomValue }\n\t\t\t\t\tonCustomValueChange={ handleCustomValueChange }\n\t\t\t\t\tonCustomValueSliderChange={ handleCustomValueSliderChange }\n\t\t\t\t\tonUnitChange={ onUnitChange }\n\t\t\t\t\tonMouseOut={ onMouseOut }\n\t\t\t\t\tonMouseOver={ onMouseOver }\n\t\t\t\t\tsetMinValue={ setMinValue }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPresets && showRangeControl && ! showCustomValueControl && (\n\t\t\t\t<RangeControl\n\t\t\t\t\taria-valuenow={ currentValue }\n\t\t\t\t\taria-valuetext={ presets[ currentValue ]?.name }\n\t\t\t\t\tclassName=\"preset-input-control__preset-range\"\n\t\t\t\t\thideLabelFromVision\n\t\t\t\t\tinitialPosition={ 0 }\n\t\t\t\t\tlabel={ ariaLabel }\n\t\t\t\t\tmax={ presets.length - 1 }\n\t\t\t\t\tmarks={ marks }\n\t\t\t\t\tmin={ 0 }\n\t\t\t\t\tonBlur={ onMouseOut }\n\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\tonChange( getNewPresetValue( newValue ) )\n\t\t\t\t\t}\n\t\t\t\t\tonFocus={ onMouseOver }\n\t\t\t\t\tonMouseDown={ ( event ) => {\n\t\t\t\t\t\t// If mouse down is near start of range set initial value to 0, which\n\t\t\t\t\t\t// prevents the user have to drag right then left to get 0 setting.\n\t\t\t\t\t\tconst nearStart = event?.nativeEvent?.offsetX < 35;\n\t\t\t\t\t\tif ( nearStart && value === undefined ) {\n\t\t\t\t\t\t\tonChange( '0' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tonMouseOut={ onMouseOut }\n\t\t\t\t\tonMouseOver={ onMouseOver }\n\t\t\t\t\trenderTooltipContent={ customTooltipContent }\n\t\t\t\t\tstep={ 1 }\n\t\t\t\t\tvalue={ currentValue }\n\t\t\t\t\twithInputField={ false }\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPresets && ! showRangeControl && ! showCustomValueControl && (\n\t\t\t\t<CustomSelectControl\n\t\t\t\t\tclassName=\"preset-input-control__custom-select-control\"\n\t\t\t\t\thideLabelFromVision\n\t\t\t\t\tlabel={ ariaLabel }\n\t\t\t\t\tonBlur={ onMouseOut }\n\t\t\t\t\tonChange={ ( selection ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tshowCustomValueInSelectList &&\n\t\t\t\t\t\t\tselection.selectedItem.key === options.length - 1\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tsetShowCustomValueControl( true );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tonChange(\n\t\t\t\t\t\t\t\tgetNewPresetValue(\n\t\t\t\t\t\t\t\t\tselection.selectedItem.key,\n\t\t\t\t\t\t\t\t\t'selectList'\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tonFocus={ onMouseOver }\n\t\t\t\t\tonMouseOut={ onMouseOut }\n\t\t\t\t\tonMouseOver={ onMouseOver }\n\t\t\t\t\toptions={ options }\n\t\t\t\t\tsize=\"__unstable-large\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t// passing empty string as a fallback to continue using the\n\t\t\t\t\t\t// component in controlled mode\n\t\t\t\t\t\toptions.find(\n\t\t\t\t\t\t\t( option ) => option.key === currentValue\n\t\t\t\t\t\t) || ''\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPresets && ! disableCustomValues && (\n\t\t\t\t<Button\n\t\t\t\t\tclassName=\"preset-input-control__custom-toggle\"\n\t\t\t\t\ticon={ settings }\n\t\t\t\t\ticonSize={ ICON_SIZE }\n\t\t\t\t\tisPressed={ showCustomValueControl }\n\t\t\t\t\tlabel={\n\t\t\t\t\t\tshowCustomValueControl\n\t\t\t\t\t\t\t? __( 'Use preset' )\n\t\t\t\t\t\t\t: __( 'Set custom value' )\n\t\t\t\t\t}\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tsetShowCustomValueControl( ! showCustomValueControl );\n\t\t\t\t\t} }\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t/>\n\t\t\t) }\n\t\t</HStack>\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAOO;AACP,qBAA4B;AAC5B,kBAA4B;AAC5B,mBAAyB;AACzB,qBAA6C;AAK7C,uBAIO;AACP,mBAKO;AACP,mCAAgC;AA0K9B;AA3Ia,SAAR,mBAAqC;AAAA,EAC3C,sBAAsB;AAAA,EACtB;AAAA,EACA,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,QAAM,YAAQ;AAAA,IACb,UAAM,4CAA+B,WAAW,SAAS,UAAW;AAAA,IACpE,CAAE,WAAW,SAAS,UAAW;AAAA,EAClC;AAEA,QAAM,YAAY,iBAAiB;AAEnC,QAAM,QAAQ,QACZ,MAAO,GAAG,QAAQ,SAAS,CAAE,EAC7B,IAAK,CAAE,WAAW,WAAa;AAAA,IAC/B,OAAO,QAAQ;AAAA,IACf,OAAO;AAAA,EACR,EAAI;AACL,QAAM,aAAa,MAAM,SAAS;AAClC,QAAM,mBAAmB,QAAQ,UAAU;AAE3C,QAAM,iBAAiB,cAAU,gBAAI,OAAQ,IAAI;AAEjD,QAAM,CAAE,UAAU,WAAY,QAAI,yBAAU,kBAAmB;AAC/D,QAAM,CAAE,wBAAwB,yBAA0B,QAAI;AAAA,IAC7D,CAAE,uBACD,UAAU,UACV,KAAE,4BAAe,OAAO,UAAW;AAAA,EACrC;AAEA,MAAI,eAAe;AAEnB,QAAM,oBAAgB,4BAAa,KAAM;AAEzC,gCAAW,MAAM;AAChB,QACC,CAAC,CAAE,SACH,kBAAkB,SAClB,KAAE,4BAAe,OAAO,UAAW,KACnC,2BAA2B,MAC1B;AACD,gCAA2B,IAAK;AAAA,IACjC;AAAA,EACD,GAAG,CAAE,OAAO,eAAe,YAAY,sBAAuB,CAAE;AAEhE,QAAM,8BACL,CAAE,oBACF,CAAE,0BACF,UAAU,WACR,KAAE,4BAAe,OAAO,UAAW,SAClC,4BAAe,OAAO,UAAW,KAAK;AAE1C,MAAI,oBAAoB;AACxB,MAAK,6BAA8B;AAClC,wBAAoB;AAAA,MACnB,GAAG;AAAA,MACH;AAAA,QACC,MAAM,CAAE;AAAA;AAAA,cAEL,yBAAS,gBAAI,aAAc,GAAG,KAAM;AAAA,gBACpC,gBAAI,OAAQ;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAAA,IACD;AACA,mBAAe,kBAAkB,SAAS;AAAA,EAC3C,WAAY,CAAE,SAAU;AACvB,mBAAe,CAAE,6BACd,uCAA0B,OAAO,SAAS,UAAW,QACrD,uCAA0B,OAAO,SAAS,UAAW;AAAA,EACzD;AAEA,QAAM,UAAU,kBAAkB,IAAK,CAAE,MAAM,WAAa;AAAA,IAC3D,KAAK;AAAA,IACL,MAAM,KAAK;AAAA,EACZ,EAAI;AAEJ,QAAM,0BAAsB,4BAAe,OAAO,UAAW,QAC1D,uCAA0B,OAAO,SAAS,UAAW,IACrD;AAEH,QAAM,CAAE,gBAAgB,UAAW,QAClC,kBAAAA,gDAAkC,mBAAoB;AAEvD,QAAM,eAAe,cAAc,gBAAgB;AAGnD,QAAM,aAAa,OAAO,KAAM,CAAE,SAAU,KAAK,UAAU,YAAa;AACxE,QAAM,OACL,YAAY,QAAQ,oBAAqB,YAAa,GAAG,SAAS;AACnE,QAAM,MACL,YAAY,OAAO,oBAAqB,YAAa,GAAG,OAAO;AAEhE,QAAM,0BAA0B,CAAE,aAAc;AAC/C,UAAM,YAAY,CAAE,MAAO,WAAY,QAAS,CAAE;AAClD,UAAM,iBAAiB,YAAY,WAAW;AAE9C,QAAK,mBAAmB,QAAY;AACnC,eAAU,cAAe;AAAA,IAC1B;AAAA,EACD;AACA,QAAM,gCAAgC,CAAE,SAAU;AACjD,aAAU,CAAE,MAAM,YAAa,EAAE,KAAM,EAAG,CAAE;AAAA,EAC7C;AACA,QAAM,uBAAuB,CAAE,aAC9B,UAAU,SAAY,SAAY,QAAS,QAAS,GAAG;AAExD,QAAM,oBAAoB,CAAE,MAAM,gBAAiB;AAClD,UAAM,WAAW,SAAU,MAAM,EAAG;AAEpC,QAAK,gBAAgB,cAAe;AACnC,UAAK,aAAa,KAAK,QAAS,CAAE,GAAG,SAAS,KAAM;AACnD,eAAO;AAAA,MACR;AACA,UAAK,aAAa,GAAI;AACrB,eAAO;AAAA,MACR;AAAA,IACD,WAAY,aAAa,GAAI;AAC5B,aAAO;AAAA,IACR;AACA,WAAO,cAAe,UAAW,IAAK,QAAS,IAAK,GAAG,IAAK;AAAA,EAC7D;AAEA,SACC;AAAA,IAAC,kBAAAC;AAAA,IAAA;AAAA,MACA,WAAY,iCAAkC,SAAU;AAAA,MAEtD;AAAA,gBACD;AAAA,UAAC;AAAA;AAAA,YACA,WAAU;AAAA,YACV;AAAA,YACA,MAAO;AAAA;AAAA,QACR;AAAA,SAEG,CAAE,cAAc,2BACnB;AAAA,UAAC,6BAAAC;AAAA,UAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,qBAAsB;AAAA,YACtB,2BAA4B;AAAA,YAC5B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACD;AAAA,QAEC,cAAc,oBAAoB,CAAE,0BACrC;AAAA,UAAC;AAAA;AAAA,YACA,iBAAgB;AAAA,YAChB,kBAAiB,QAAS,YAAa,GAAG;AAAA,YAC1C,WAAU;AAAA,YACV,qBAAmB;AAAA,YACnB,iBAAkB;AAAA,YAClB,OAAQ;AAAA,YACR,KAAM,QAAQ,SAAS;AAAA,YACvB;AAAA,YACA,KAAM;AAAA,YACN,QAAS;AAAA,YACT,UAAW,CAAE,aACZ,SAAU,kBAAmB,QAAS,CAAE;AAAA,YAEzC,SAAU;AAAA,YACV,aAAc,CAAE,UAAW;AAG1B,oBAAM,YAAY,OAAO,aAAa,UAAU;AAChD,kBAAK,aAAa,UAAU,QAAY;AACvC,yBAAU,GAAI;AAAA,cACf;AAAA,YACD;AAAA,YACA;AAAA,YACA;AAAA,YACA,sBAAuB;AAAA,YACvB,MAAO;AAAA,YACP,OAAQ;AAAA,YACR,gBAAiB;AAAA,YACjB,uBAAqB;AAAA;AAAA,QACtB;AAAA,QAEC,cAAc,CAAE,oBAAoB,CAAE,0BACvC;AAAA,UAAC;AAAA;AAAA,YACA,WAAU;AAAA,YACV,qBAAmB;AAAA,YACnB,OAAQ;AAAA,YACR,QAAS;AAAA,YACT,UAAW,CAAE,cAAe;AAC3B,kBACC,+BACA,UAAU,aAAa,QAAQ,QAAQ,SAAS,GAC/C;AACD,0CAA2B,IAAK;AAAA,cACjC,OAAO;AACN;AAAA,kBACC;AAAA,oBACC,UAAU,aAAa;AAAA,oBACvB;AAAA,kBACD;AAAA,gBACD;AAAA,cACD;AAAA,YACD;AAAA,YACA,SAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA,MAAK;AAAA,YACL;AAAA;AAAA;AAAA,cAGC,QAAQ;AAAA,gBACP,CAAE,WAAY,OAAO,QAAQ;AAAA,cAC9B,KAAK;AAAA;AAAA;AAAA,QAEP;AAAA,QAEC,cAAc,CAAE,uBACjB;AAAA,UAAC;AAAA;AAAA,YACA,WAAU;AAAA,YACV,MAAO;AAAA,YACP,UAAW;AAAA,YACX,WAAY;AAAA,YACZ,OACC,6BACG,gBAAI,YAAa,QACjB,gBAAI,kBAAmB;AAAA,YAE3B,SAAU,MAAM;AACf,wCAA2B,CAAE,sBAAuB;AAAA,YACrD;AAAA,YACA,MAAK;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EAEF;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\tCustomSelectControl,\n\tIcon,\n\tRangeControl,\n\t__experimentalHStack as HStack,\n\t__experimentalParseQuantityAndUnitFromRawValue as parseQuantityAndUnitFromRawValue,\n} from '@wordpress/components';\nimport { usePrevious } from '@wordpress/compose';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { settings } from '@wordpress/icons';\nimport { useState, useEffect, useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport {\n\tCUSTOM_VALUE_SETTINGS,\n\tICON_SIZE,\n\tRANGE_CONTROL_MAX_SIZE,\n} from './constants';\nimport {\n\tgetCustomValueFromPreset,\n\tgetPresetValueFromCustomValue,\n\tgetSliderValueFromPreset,\n\tisValuePreset,\n} from './utils';\nimport CustomValueControls from './custom-value-controls';\n\n/**\n * PresetInputControl component for selecting preset values or entering custom values.\n *\n * Displays preset values as either a slider (for <= 8 presets) or a select dropdown.\n * Allows toggling to custom value mode with a UnitControl and RangeControl.\n * Handles unit tracking and conversion between preset and custom values.\n *\n * @param {Object} props Component props.\n * @param {boolean} props.allowNegativeOnDrag Whether to allow negative values during drag operations.\n * @param {string} props.ariaLabel Accessible label for the control.\n * @param {string} props.className Optional CSS class name.\n * @param {Object} props.customValueSettings Optional custom value settings for max/steps per unit.\n * @param {boolean} props.disableCustomValues Whether to disable custom value input.\n * @param {Object} props.icon Icon to display alongside the control.\n * @param {boolean} props.isMixed Whether the current value is mixed (multiple values).\n * @param {number} props.minimumCustomValue Minimum allowed custom value.\n * @param {Function} props.onChange Callback when value changes.\n * @param {Function} props.onMouseOut Callback for mouse out events.\n * @param {Function} props.onMouseOver Callback for mouse over events.\n * @param {Function} props.onUnitChange Callback when unit changes.\n * @param {Array} props.presets Array of preset objects with name, slug, and size.\n * @param {string} props.presetType Type of preset (e.g., 'spacing', 'border-radius').\n * @param {string} props.selectedUnit Currently selected unit (e.g., 'px', 'em').\n * @param {boolean} props.showTooltip Whether to show tooltip on custom UnitControl.\n * @param {Array} props.units Array of available unit objects (can include max and step).\n * @param {string} props.value Current value (preset or custom).\n *\n * @return {Element} The PresetInputControl component.\n */\nexport default function PresetInputControl( {\n\tallowNegativeOnDrag = false,\n\tariaLabel,\n\tclassName: classNameProp,\n\tcustomValueSettings = CUSTOM_VALUE_SETTINGS,\n\tdisableCustomValues,\n\ticon,\n\tisMixed,\n\tvalue: valueProp,\n\tminimumCustomValue,\n\tonChange,\n\tonMouseOut,\n\tonMouseOver,\n\tonUnitChange,\n\tpresets = [],\n\tpresetType,\n\tselectedUnit,\n\tshowTooltip,\n\tunits,\n} ) {\n\tconst value = useMemo(\n\t\t() => getPresetValueFromCustomValue( valueProp, presets, presetType ),\n\t\t[ valueProp, presets, presetType ]\n\t);\n\n\tconst className = classNameProp ?? 'preset-input-control';\n\n\tconst marks = presets\n\t\t.slice( 1, presets.length - 1 )\n\t\t.map( ( _newValue, index ) => ( {\n\t\t\tvalue: index + 1,\n\t\t\tlabel: undefined,\n\t\t} ) );\n\tconst hasPresets = marks.length > 0;\n\tconst showRangeControl = presets.length <= RANGE_CONTROL_MAX_SIZE;\n\n\tconst allPlaceholder = isMixed ? __( 'Mixed' ) : null;\n\n\tconst [ minValue, setMinValue ] = useState( minimumCustomValue );\n\tconst [ showCustomValueControl, setShowCustomValueControl ] = useState(\n\t\t! disableCustomValues &&\n\t\t\tvalue !== undefined &&\n\t\t\t! isValuePreset( value, presetType )\n\t);\n\n\tlet currentValue = null;\n\n\tconst previousValue = usePrevious( value );\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\t!! value &&\n\t\t\tpreviousValue !== value &&\n\t\t\t! isValuePreset( value, presetType ) &&\n\t\t\tshowCustomValueControl !== true\n\t\t) {\n\t\t\tsetShowCustomValueControl( true );\n\t\t}\n\t}, [ value, previousValue, presetType, showCustomValueControl ] );\n\n\tconst showCustomValueInSelectList =\n\t\t! showRangeControl &&\n\t\t! showCustomValueControl &&\n\t\tvalue !== undefined &&\n\t\t( ! isValuePreset( value, presetType ) ||\n\t\t\t( isValuePreset( value, presetType ) && isMixed ) );\n\n\tlet selectListOptions = presets;\n\tif ( showCustomValueInSelectList ) {\n\t\tselectListOptions = [\n\t\t\t...presets,\n\t\t\t{\n\t\t\t\tname: ! isMixed\n\t\t\t\t\t? // translators: %s: A custom measurement, e.g. a number followed by a unit like 12px.\n\t\t\t\t\t sprintf( __( 'Custom (%s)' ), value )\n\t\t\t\t\t: __( 'Mixed' ),\n\t\t\t\tslug: 'custom',\n\t\t\t\tsize: value,\n\t\t\t},\n\t\t];\n\t\tcurrentValue = selectListOptions.length - 1;\n\t} else if ( ! isMixed ) {\n\t\tcurrentValue = ! showCustomValueControl\n\t\t\t? getSliderValueFromPreset( value, presets, presetType )\n\t\t\t: getCustomValueFromPreset( value, presets, presetType );\n\t}\n\n\tconst options = selectListOptions.map( ( size, index ) => ( {\n\t\tkey: index,\n\t\tname: size.name,\n\t} ) );\n\n\tconst resolvedPresetValue = isValuePreset( value, presetType )\n\t\t? getCustomValueFromPreset( value, presets, presetType )\n\t\t: value;\n\n\tconst [ parsedQuantity, parsedUnit ] =\n\t\tparseQuantityAndUnitFromRawValue( resolvedPresetValue );\n\n\tconst computedUnit = parsedUnit || selectedUnit || 'px';\n\n\t// Get step and max from units prop, falling back to customValueSettings\n\tconst unitConfig = units?.find( ( item ) => item.value === computedUnit );\n\tconst step =\n\t\tunitConfig?.step ?? customValueSettings[ computedUnit ]?.steps ?? 0.1;\n\tconst max =\n\t\tunitConfig?.max ?? customValueSettings[ computedUnit ]?.max ?? 10;\n\n\tconst handleCustomValueChange = ( newValue ) => {\n\t\t// Treat empty or undefined as an explicit clear and propagate undefined.\n\t\tif ( newValue === undefined || newValue === '' ) {\n\t\t\tonChange( undefined );\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore non-numeric intermediate input (e.g. just a unit).\n\t\tif ( isNaN( parseFloat( newValue ) ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tonChange( newValue );\n\t};\n\tconst handleCustomValueSliderChange = ( next ) => {\n\t\tonChange( [ next, computedUnit ].join( '' ) );\n\t};\n\tconst customTooltipContent = ( newValue ) =>\n\t\tvalue === undefined ? undefined : presets[ newValue ]?.name;\n\n\tconst getNewPresetValue = ( next, controlType ) => {\n\t\tconst newValue = parseInt( next, 10 );\n\n\t\tif ( controlType === 'selectList' ) {\n\t\t\tif ( newValue === 0 && presets[ 0 ]?.slug === '0' ) {\n\t\t\t\treturn '0';\n\t\t\t}\n\t\t\tif ( newValue === 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t} else if ( newValue === 0 ) {\n\t\t\treturn '0';\n\t\t}\n\t\treturn `var:preset|${ presetType }|${ presets[ next ]?.slug }`;\n\t};\n\n\treturn (\n\t\t<HStack\n\t\t\tclassName={ `preset-input-control__wrapper ${ className }__wrapper` }\n\t\t>\n\t\t\t{ icon && (\n\t\t\t\t<Icon\n\t\t\t\t\tclassName=\"preset-input-control__icon\"\n\t\t\t\t\ticon={ icon }\n\t\t\t\t\tsize={ ICON_SIZE }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ( ! hasPresets || showCustomValueControl ) && (\n\t\t\t\t<CustomValueControls\n\t\t\t\t\tallowNegativeOnDrag={ allowNegativeOnDrag }\n\t\t\t\t\tariaLabel={ ariaLabel }\n\t\t\t\t\tallPlaceholder={ allPlaceholder }\n\t\t\t\t\tminValue={ minValue }\n\t\t\t\t\tparsedQuantity={ parsedQuantity }\n\t\t\t\t\tcomputedUnit={ computedUnit }\n\t\t\t\t\tunits={ units }\n\t\t\t\t\tisMixed={ isMixed }\n\t\t\t\t\tstep={ step }\n\t\t\t\t\tmax={ max }\n\t\t\t\t\tshowTooltip={ showTooltip }\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tminimumCustomValue={ minimumCustomValue }\n\t\t\t\t\tonCustomValueChange={ handleCustomValueChange }\n\t\t\t\t\tonCustomValueSliderChange={ handleCustomValueSliderChange }\n\t\t\t\t\tonUnitChange={ onUnitChange }\n\t\t\t\t\tonMouseOut={ onMouseOut }\n\t\t\t\t\tonMouseOver={ onMouseOver }\n\t\t\t\t\tsetMinValue={ setMinValue }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPresets && showRangeControl && ! showCustomValueControl && (\n\t\t\t\t<RangeControl\n\t\t\t\t\taria-valuenow={ currentValue }\n\t\t\t\t\taria-valuetext={ presets[ currentValue ]?.name }\n\t\t\t\t\tclassName=\"preset-input-control__preset-range\"\n\t\t\t\t\thideLabelFromVision\n\t\t\t\t\tinitialPosition={ 0 }\n\t\t\t\t\tlabel={ ariaLabel }\n\t\t\t\t\tmax={ presets.length - 1 }\n\t\t\t\t\tmarks={ marks }\n\t\t\t\t\tmin={ 0 }\n\t\t\t\t\tonBlur={ onMouseOut }\n\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\tonChange( getNewPresetValue( newValue ) )\n\t\t\t\t\t}\n\t\t\t\t\tonFocus={ onMouseOver }\n\t\t\t\t\tonMouseDown={ ( event ) => {\n\t\t\t\t\t\t// If mouse down is near start of range set initial value to 0, which\n\t\t\t\t\t\t// prevents the user have to drag right then left to get 0 setting.\n\t\t\t\t\t\tconst nearStart = event?.nativeEvent?.offsetX < 35;\n\t\t\t\t\t\tif ( nearStart && value === undefined ) {\n\t\t\t\t\t\t\tonChange( '0' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tonMouseOut={ onMouseOut }\n\t\t\t\t\tonMouseOver={ onMouseOver }\n\t\t\t\t\trenderTooltipContent={ customTooltipContent }\n\t\t\t\t\tstep={ 1 }\n\t\t\t\t\tvalue={ currentValue }\n\t\t\t\t\twithInputField={ false }\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPresets && ! showRangeControl && ! showCustomValueControl && (\n\t\t\t\t<CustomSelectControl\n\t\t\t\t\tclassName=\"preset-input-control__custom-select-control\"\n\t\t\t\t\thideLabelFromVision\n\t\t\t\t\tlabel={ ariaLabel }\n\t\t\t\t\tonBlur={ onMouseOut }\n\t\t\t\t\tonChange={ ( selection ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tshowCustomValueInSelectList &&\n\t\t\t\t\t\t\tselection.selectedItem.key === options.length - 1\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tsetShowCustomValueControl( true );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tonChange(\n\t\t\t\t\t\t\t\tgetNewPresetValue(\n\t\t\t\t\t\t\t\t\tselection.selectedItem.key,\n\t\t\t\t\t\t\t\t\t'selectList'\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t\tonFocus={ onMouseOver }\n\t\t\t\t\tonMouseOut={ onMouseOut }\n\t\t\t\t\tonMouseOver={ onMouseOver }\n\t\t\t\t\toptions={ options }\n\t\t\t\t\tsize=\"__unstable-large\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t// passing empty string as a fallback to continue using the\n\t\t\t\t\t\t// component in controlled mode\n\t\t\t\t\t\toptions.find(\n\t\t\t\t\t\t\t( option ) => option.key === currentValue\n\t\t\t\t\t\t) || ''\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPresets && ! disableCustomValues && (\n\t\t\t\t<Button\n\t\t\t\t\tclassName=\"preset-input-control__custom-toggle\"\n\t\t\t\t\ticon={ settings }\n\t\t\t\t\ticonSize={ ICON_SIZE }\n\t\t\t\t\tisPressed={ showCustomValueControl }\n\t\t\t\t\tlabel={\n\t\t\t\t\t\tshowCustomValueControl\n\t\t\t\t\t\t\t? __( 'Use preset' )\n\t\t\t\t\t\t\t: __( 'Set custom value' )\n\t\t\t\t\t}\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tsetShowCustomValueControl( ! showCustomValueControl );\n\t\t\t\t\t} }\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t/>\n\t\t\t) }\n\t\t</HStack>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["parseQuantityAndUnitFromRawValue", "HStack", "CustomValueControls"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/rich-text/event-listeners/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useMemo, useRef, useInsertionEffect } from '@wordpress/element';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport beforeInputRules from './before-input-rules';\nimport inputRules from './input-rules';\nimport insertReplacementText from './insert-replacement-text';\nimport removeBrowserShortcuts from './remove-browser-shortcuts';\nimport shortcuts from './shortcuts';\nimport inputEvents from './input-events';\nimport undoAutomaticChange from './undo-automatic-change';\nimport pasteHandler from './paste-handler';\nimport _delete from './delete';\nimport enter from './enter';\nimport firefoxCompat from './firefox-compat';\n\nconst allEventListeners = [\n\tbeforeInputRules,\n\tinputRules,\n\tinsertReplacementText,\n\tremoveBrowserShortcuts,\n\tshortcuts,\n\tinputEvents,\n\tundoAutomaticChange,\n\tpasteHandler,\n\t_delete,\n\tenter,\n\tfirefoxCompat,\n];\n\nexport function useEventListeners( props ) {\n\tconst propsRef = useRef( props );\n\tuseInsertionEffect( () => {\n\t\tpropsRef.current = props;\n\t} );\n\tconst refEffects = useMemo(\n\t\t() => allEventListeners.map( ( refEffect ) => refEffect( propsRef ) ),\n\t\t[ propsRef ]\n\t);\n\n\treturn useRefEffect(\n\t\t( element ) => {\n\t\t\tif ( ! props.isSelected ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst cleanups = refEffects.map( ( effect ) => effect( element ) );\n\t\t\treturn () => {\n\t\t\t\tcleanups.forEach( ( cleanup ) => cleanup() );\n\t\t\t};\n\t\t},\n\t\t[ refEffects, props.isSelected ]\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAAoD;AACpD,qBAA6B;AAK7B,gCAA6B;AAC7B,yBAAuB;AACvB,qCAAkC;AAClC,sCAAmC;AACnC,uBAAsB;AACtB,0BAAwB;AACxB,mCAAgC;AAChC,2BAAyB;AACzB,oBAAoB;AACpB,mBAAkB;AAClB,4BAA0B;AAE1B,IAAM,oBAAoB;AAAA,EACzB,0BAAAA;AAAA,EACA,mBAAAC;AAAA,EACA,+BAAAC;AAAA,EACA,gCAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,sBAAAC;AACD;AAEO,SAAS,kBAAmB,OAAQ;AAC1C,QAAM,eAAW,uBAAQ,KAAM;AAC/B,yCAAoB,MAAM;AACzB,aAAS,UAAU;AAAA,EACpB,CAAE;AACF,QAAM,iBAAa;AAAA,IAClB,MAAM,kBAAkB,IAAK,CAAE,cAAe,UAAW,QAAS,CAAE;AAAA,IACpE,CAAE,QAAS;AAAA,EACZ;AAEA,aAAO;AAAA,IACN,CAAE,YAAa;AACd,UAAK,CAAE,MAAM,YAAa;AACzB;AAAA,MACD;AACA,YAAM,WAAW,WAAW,IAAK,CAAE,WAAY,OAAQ,OAAQ,CAAE;AACjE,aAAO,MAAM;AACZ,iBAAS,QAAS,CAAE,YAAa,QAAQ,CAAE;AAAA,MAC5C;AAAA,IACD;AAAA,IACA,CAAE,YAAY,MAAM,UAAW;AAAA,EAChC;AACD;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useMemo, useRef, useInsertionEffect } from '@wordpress/element';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport beforeInputRules from './before-input-rules';\nimport inputRules from './input-rules';\nimport insertReplacementText from './insert-replacement-text';\nimport removeBrowserShortcuts from './remove-browser-shortcuts';\nimport shortcuts from './shortcuts';\nimport inputEvents from './input-events';\nimport undoAutomaticChange from './undo-automatic-change';\nimport pasteHandler from './paste-handler';\nimport _delete from './delete';\nimport enter from './enter';\nimport firefoxCompat from './firefox-compat';\n\nconst allEventListeners = [\n\tbeforeInputRules,\n\tinputRules,\n\tinsertReplacementText,\n\tremoveBrowserShortcuts,\n\tshortcuts,\n\tinputEvents,\n\tundoAutomaticChange,\n\tpasteHandler,\n\t_delete,\n\tenter,\n\tfirefoxCompat,\n];\n\nexport function useEventListeners( props ) {\n\tconst propsRef = useRef( props );\n\tuseInsertionEffect( () => {\n\t\t// eslint-disable-next-line react-compiler/react-compiler -- false positive, see https://github.com/facebook/react/issues/29196\n\t\tpropsRef.current = props;\n\t} );\n\tconst refEffects = useMemo(\n\t\t() => allEventListeners.map( ( refEffect ) => refEffect( propsRef ) ),\n\t\t[ propsRef ]\n\t);\n\n\treturn useRefEffect(\n\t\t( element ) => {\n\t\t\tif ( ! props.isSelected ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst cleanups = refEffects.map( ( effect ) => effect( element ) );\n\t\t\treturn () => {\n\t\t\t\tcleanups.forEach( ( cleanup ) => cleanup() );\n\t\t\t};\n\t\t},\n\t\t[ refEffects, props.isSelected ]\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAAoD;AACpD,qBAA6B;AAK7B,gCAA6B;AAC7B,yBAAuB;AACvB,qCAAkC;AAClC,sCAAmC;AACnC,uBAAsB;AACtB,0BAAwB;AACxB,mCAAgC;AAChC,2BAAyB;AACzB,oBAAoB;AACpB,mBAAkB;AAClB,4BAA0B;AAE1B,IAAM,oBAAoB;AAAA,EACzB,0BAAAA;AAAA,EACA,mBAAAC;AAAA,EACA,+BAAAC;AAAA,EACA,gCAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,sBAAAC;AACD;AAEO,SAAS,kBAAmB,OAAQ;AAC1C,QAAM,eAAW,uBAAQ,KAAM;AAC/B,yCAAoB,MAAM;AAEzB,aAAS,UAAU;AAAA,EACpB,CAAE;AACF,QAAM,iBAAa;AAAA,IAClB,MAAM,kBAAkB,IAAK,CAAE,cAAe,UAAW,QAAS,CAAE;AAAA,IACpE,CAAE,QAAS;AAAA,EACZ;AAEA,aAAO;AAAA,IACN,CAAE,YAAa;AACd,UAAK,CAAE,MAAM,YAAa;AACzB;AAAA,MACD;AACA,YAAM,WAAW,WAAW,IAAK,CAAE,WAAY,OAAQ,OAAQ,CAAE;AACjE,aAAO,MAAM;AACZ,iBAAS,QAAS,CAAE,YAAa,QAAQ,CAAE;AAAA,MAC5C;AAAA,IACD;AAAA,IACA,CAAE,YAAY,MAAM,UAAW;AAAA,EAChC;AACD;",
6
6
  "names": ["beforeInputRules", "inputRules", "insertReplacementText", "removeBrowserShortcuts", "shortcuts", "inputEvents", "undoAutomaticChange", "pasteHandler", "_delete", "enter", "firefoxCompat"]
7
7
  }
@@ -40,7 +40,7 @@ module.exports = __toCommonJS(utils_exports);
40
40
  var import_i18n = require("@wordpress/i18n");
41
41
  var import_icons = require("@wordpress/icons");
42
42
  var RANGE_CONTROL_MAX_SIZE = 8;
43
- var ALL_SIDES = ["top", "right", "bottom", "left"];
43
+ var ALL_SIDES = ["top", "bottom", "left", "right"];
44
44
  var DEFAULT_VALUES = {
45
45
  top: void 0,
46
46
  right: void 0,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/spacing-sizes-control/utils.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport {\n\tsidesAll,\n\tsidesBottom,\n\tsidesHorizontal,\n\tsidesLeft,\n\tsidesRight,\n\tsidesTop,\n\tsidesVertical,\n} from '@wordpress/icons';\n\nexport const RANGE_CONTROL_MAX_SIZE = 8;\n\nexport const ALL_SIDES = [ 'top', 'right', 'bottom', 'left' ];\n\nexport const DEFAULT_VALUES = {\n\ttop: undefined,\n\tright: undefined,\n\tbottom: undefined,\n\tleft: undefined,\n};\n\nexport const ICONS = {\n\tcustom: sidesAll,\n\taxial: sidesAll,\n\thorizontal: sidesHorizontal,\n\tvertical: sidesVertical,\n\ttop: sidesTop,\n\tright: sidesRight,\n\tbottom: sidesBottom,\n\tleft: sidesLeft,\n};\n\nexport const LABELS = {\n\tdefault: __( 'Spacing control' ),\n\ttop: __( 'Top' ),\n\tbottom: __( 'Bottom' ),\n\tleft: __( 'Left' ),\n\tright: __( 'Right' ),\n\tmixed: __( 'Mixed' ),\n\tvertical: __( 'Vertical' ),\n\thorizontal: __( 'Horizontal' ),\n\taxial: __( 'Horizontal & vertical' ),\n\tcustom: __( 'Custom' ),\n};\n\nexport const VIEWS = {\n\taxial: 'axial',\n\ttop: 'top',\n\tright: 'right',\n\tbottom: 'bottom',\n\tleft: 'left',\n\tcustom: 'custom',\n};\n\n/**\n * Checks is given value is a spacing preset.\n *\n * @param {string} value Value to check\n *\n * @return {boolean} Return true if value is string in format var:preset|spacing|.\n */\nexport function isValueSpacingPreset( value ) {\n\tif ( ! value?.includes ) {\n\t\treturn false;\n\t}\n\treturn value === '0' || value.includes( 'var:preset|spacing|' );\n}\n\n/**\n * Converts a spacing preset into a custom value.\n *\n * @param {string} value Value to convert\n * @param {Array} spacingSizes Array of the current spacing preset objects\n *\n * @return {string} Mapping of the spacing preset to its equivalent custom value.\n */\nexport function getCustomValueFromPreset( value, spacingSizes ) {\n\tif ( ! isValueSpacingPreset( value ) ) {\n\t\treturn value;\n\t}\n\n\tconst slug = getSpacingPresetSlug( value );\n\tconst spacingSize = spacingSizes.find(\n\t\t( size ) => String( size.slug ) === slug\n\t);\n\n\treturn spacingSize?.size;\n}\n\n/**\n * Converts a custom value to preset value if one can be found.\n *\n * Returns value as-is if no match is found.\n *\n * @param {string} value Value to convert\n * @param {Array} spacingSizes Array of the current spacing preset objects\n *\n * @return {string} The preset value if it can be found.\n */\nexport function getPresetValueFromCustomValue( value, spacingSizes ) {\n\t// Return value as-is if it is undefined or is already a preset, or '0';\n\tif ( ! value || isValueSpacingPreset( value ) || value === '0' ) {\n\t\treturn value;\n\t}\n\n\tconst spacingMatch = spacingSizes.find(\n\t\t( size ) => String( size.size ) === String( value )\n\t);\n\n\tif ( spacingMatch?.slug ) {\n\t\treturn `var:preset|spacing|${ spacingMatch.slug }`;\n\t}\n\n\treturn value;\n}\n\n/**\n * Converts a spacing preset into a custom value.\n *\n * @param {string} value Value to convert.\n *\n * @return {string | undefined} CSS var string for given spacing preset value.\n */\nexport function getSpacingPresetCssVar( value ) {\n\tif ( ! value ) {\n\t\treturn;\n\t}\n\n\tconst slug = value.match( /var:preset\\|spacing\\|(.+)/ );\n\n\tif ( ! slug ) {\n\t\treturn value;\n\t}\n\n\treturn `var(--wp--preset--spacing--${ slug[ 1 ] })`;\n}\n\n/**\n * Returns the slug section of the given spacing preset string.\n *\n * @param {string} value Value to extract slug from.\n *\n * @return {string|undefined} The int value of the slug from given spacing preset.\n */\nexport function getSpacingPresetSlug( value ) {\n\tif ( ! value ) {\n\t\treturn;\n\t}\n\n\tif ( value === '0' || value === 'default' ) {\n\t\treturn value;\n\t}\n\n\tconst slug = value.match( /var:preset\\|spacing\\|(.+)/ );\n\n\treturn slug ? slug[ 1 ] : undefined;\n}\n\n/**\n * Converts spacing preset value into a Range component value .\n *\n * @param {string} presetValue Value to convert to Range value.\n * @param {Array} spacingSizes Array of current spacing preset value objects.\n *\n * @return {number} The int value for use in Range control.\n */\nexport function getSliderValueFromPreset( presetValue, spacingSizes ) {\n\tif ( presetValue === undefined ) {\n\t\treturn 0;\n\t}\n\tconst slug =\n\t\tparseFloat( presetValue, 10 ) === 0\n\t\t\t? '0'\n\t\t\t: getSpacingPresetSlug( presetValue );\n\tconst sliderValue = spacingSizes.findIndex( ( spacingSize ) => {\n\t\treturn String( spacingSize.slug ) === slug;\n\t} );\n\n\t// Returning NaN rather than undefined as undefined makes range control thumb sit in center\n\treturn sliderValue !== -1 ? sliderValue : NaN;\n}\n\n/**\n * Determines whether a particular axis has support. If no axis is\n * specified, this function checks if either axis is supported.\n *\n * @param {Array} sides Supported sides.\n * @param {string} axis Which axis to check.\n *\n * @return {boolean} Whether there is support for the specified axis or both axes.\n */\nexport function hasAxisSupport( sides, axis ) {\n\tif ( ! sides || ! sides.length ) {\n\t\treturn false;\n\t}\n\n\tconst hasHorizontalSupport =\n\t\tsides.includes( 'horizontal' ) ||\n\t\t( sides.includes( 'left' ) && sides.includes( 'right' ) );\n\n\tconst hasVerticalSupport =\n\t\tsides.includes( 'vertical' ) ||\n\t\t( sides.includes( 'top' ) && sides.includes( 'bottom' ) );\n\n\tif ( axis === 'horizontal' ) {\n\t\treturn hasHorizontalSupport;\n\t}\n\n\tif ( axis === 'vertical' ) {\n\t\treturn hasVerticalSupport;\n\t}\n\n\treturn hasHorizontalSupport || hasVerticalSupport;\n}\n\n/**\n * Checks if the supported sides are balanced for each axis.\n * - Horizontal - both left and right sides are supported.\n * - Vertical - both top and bottom are supported.\n *\n * @param {Array} sides The supported sides which may be axes as well.\n *\n * @return {boolean} Whether or not the supported sides are balanced.\n */\nexport function hasBalancedSidesSupport( sides = [] ) {\n\tconst counts = { top: 0, right: 0, bottom: 0, left: 0 };\n\tsides.forEach( ( side ) => ( counts[ side ] += 1 ) );\n\n\treturn (\n\t\t( counts.top + counts.bottom ) % 2 === 0 &&\n\t\t( counts.left + counts.right ) % 2 === 0\n\t);\n}\n\n/**\n * Determines which view the SpacingSizesControl should default to on its\n * first render; Axial, Custom, or Single side.\n *\n * @param {Object} values Current side values.\n * @param {Array} sides Supported sides.\n *\n * @return {string} View to display.\n */\nexport function getInitialView( values = {}, sides ) {\n\tconst { top, right, bottom, left } = values;\n\tconst sideValues = [ top, right, bottom, left ].filter( Boolean );\n\n\t// Axial ( Horizontal & vertical ).\n\t// - Has axial side support\n\t// - Has axial side values which match\n\t// - Has no values and the supported sides are balanced\n\tconst hasMatchingAxialValues =\n\t\ttop === bottom && left === right && ( !! top || !! left );\n\tconst hasNoValuesAndBalancedSides =\n\t\t! sideValues.length && hasBalancedSidesSupport( sides );\n\tconst hasOnlyAxialSides =\n\t\tsides?.includes( 'horizontal' ) &&\n\t\tsides?.includes( 'vertical' ) &&\n\t\tsides?.length === 2;\n\n\tif (\n\t\thasAxisSupport( sides ) &&\n\t\t( hasMatchingAxialValues || hasNoValuesAndBalancedSides )\n\t) {\n\t\treturn VIEWS.axial;\n\t}\n\n\t// Only axial sides are supported and single value defined.\n\t// - Ensure the side returned is the first side that has a value.\n\tif ( hasOnlyAxialSides && sideValues.length === 1 ) {\n\t\tlet side;\n\n\t\tObject.entries( values ).some( ( [ key, value ] ) => {\n\t\t\tside = key;\n\t\t\treturn value !== undefined;\n\t\t} );\n\n\t\treturn side;\n\t}\n\n\t// Only single side supported and no value defined.\n\tif ( sides?.length === 1 && ! sideValues.length ) {\n\t\treturn sides[ 0 ];\n\t}\n\n\t// Default to the Custom (separated sides) view.\n\treturn VIEWS.custom;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAmB;AACnB,mBAQO;AAEA,IAAM,yBAAyB;AAE/B,IAAM,YAAY,CAAE,OAAO,SAAS,UAAU,MAAO;AAErD,IAAM,iBAAiB;AAAA,EAC7B,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACP;AAEO,IAAM,QAAQ;AAAA,EACpB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACP;AAEO,IAAM,SAAS;AAAA,EACrB,aAAS,gBAAI,iBAAkB;AAAA,EAC/B,SAAK,gBAAI,KAAM;AAAA,EACf,YAAQ,gBAAI,QAAS;AAAA,EACrB,UAAM,gBAAI,MAAO;AAAA,EACjB,WAAO,gBAAI,OAAQ;AAAA,EACnB,WAAO,gBAAI,OAAQ;AAAA,EACnB,cAAU,gBAAI,UAAW;AAAA,EACzB,gBAAY,gBAAI,YAAa;AAAA,EAC7B,WAAO,gBAAI,uBAAwB;AAAA,EACnC,YAAQ,gBAAI,QAAS;AACtB;AAEO,IAAM,QAAQ;AAAA,EACpB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AACT;AASO,SAAS,qBAAsB,OAAQ;AAC7C,MAAK,CAAE,OAAO,UAAW;AACxB,WAAO;AAAA,EACR;AACA,SAAO,UAAU,OAAO,MAAM,SAAU,qBAAsB;AAC/D;AAUO,SAAS,yBAA0B,OAAO,cAAe;AAC/D,MAAK,CAAE,qBAAsB,KAAM,GAAI;AACtC,WAAO;AAAA,EACR;AAEA,QAAM,OAAO,qBAAsB,KAAM;AACzC,QAAM,cAAc,aAAa;AAAA,IAChC,CAAE,SAAU,OAAQ,KAAK,IAAK,MAAM;AAAA,EACrC;AAEA,SAAO,aAAa;AACrB;AAYO,SAAS,8BAA+B,OAAO,cAAe;AAEpE,MAAK,CAAE,SAAS,qBAAsB,KAAM,KAAK,UAAU,KAAM;AAChE,WAAO;AAAA,EACR;AAEA,QAAM,eAAe,aAAa;AAAA,IACjC,CAAE,SAAU,OAAQ,KAAK,IAAK,MAAM,OAAQ,KAAM;AAAA,EACnD;AAEA,MAAK,cAAc,MAAO;AACzB,WAAO,sBAAuB,aAAa,IAAK;AAAA,EACjD;AAEA,SAAO;AACR;AASO,SAAS,uBAAwB,OAAQ;AAC/C,MAAK,CAAE,OAAQ;AACd;AAAA,EACD;AAEA,QAAM,OAAO,MAAM,MAAO,2BAA4B;AAEtD,MAAK,CAAE,MAAO;AACb,WAAO;AAAA,EACR;AAEA,SAAO,8BAA+B,KAAM,CAAE,CAAE;AACjD;AASO,SAAS,qBAAsB,OAAQ;AAC7C,MAAK,CAAE,OAAQ;AACd;AAAA,EACD;AAEA,MAAK,UAAU,OAAO,UAAU,WAAY;AAC3C,WAAO;AAAA,EACR;AAEA,QAAM,OAAO,MAAM,MAAO,2BAA4B;AAEtD,SAAO,OAAO,KAAM,CAAE,IAAI;AAC3B;AAUO,SAAS,yBAA0B,aAAa,cAAe;AACrE,MAAK,gBAAgB,QAAY;AAChC,WAAO;AAAA,EACR;AACA,QAAM,OACL,WAAY,aAAa,EAAG,MAAM,IAC/B,MACA,qBAAsB,WAAY;AACtC,QAAM,cAAc,aAAa,UAAW,CAAE,gBAAiB;AAC9D,WAAO,OAAQ,YAAY,IAAK,MAAM;AAAA,EACvC,CAAE;AAGF,SAAO,gBAAgB,KAAK,cAAc;AAC3C;AAWO,SAAS,eAAgB,OAAO,MAAO;AAC7C,MAAK,CAAE,SAAS,CAAE,MAAM,QAAS;AAChC,WAAO;AAAA,EACR;AAEA,QAAM,uBACL,MAAM,SAAU,YAAa,KAC3B,MAAM,SAAU,MAAO,KAAK,MAAM,SAAU,OAAQ;AAEvD,QAAM,qBACL,MAAM,SAAU,UAAW,KACzB,MAAM,SAAU,KAAM,KAAK,MAAM,SAAU,QAAS;AAEvD,MAAK,SAAS,cAAe;AAC5B,WAAO;AAAA,EACR;AAEA,MAAK,SAAS,YAAa;AAC1B,WAAO;AAAA,EACR;AAEA,SAAO,wBAAwB;AAChC;AAWO,SAAS,wBAAyB,QAAQ,CAAC,GAAI;AACrD,QAAM,SAAS,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE;AACtD,QAAM,QAAS,CAAE,SAAY,OAAQ,IAAK,KAAK,CAAI;AAEnD,UACG,OAAO,MAAM,OAAO,UAAW,MAAM,MACrC,OAAO,OAAO,OAAO,SAAU,MAAM;AAEzC;AAWO,SAAS,eAAgB,SAAS,CAAC,GAAG,OAAQ;AACpD,QAAM,EAAE,KAAK,OAAO,QAAQ,KAAK,IAAI;AACrC,QAAM,aAAa,CAAE,KAAK,OAAO,QAAQ,IAAK,EAAE,OAAQ,OAAQ;AAMhE,QAAM,yBACL,QAAQ,UAAU,SAAS,UAAW,CAAC,CAAE,OAAO,CAAC,CAAE;AACpD,QAAM,8BACL,CAAE,WAAW,UAAU,wBAAyB,KAAM;AACvD,QAAM,oBACL,OAAO,SAAU,YAAa,KAC9B,OAAO,SAAU,UAAW,KAC5B,OAAO,WAAW;AAEnB,MACC,eAAgB,KAAM,MACpB,0BAA0B,8BAC3B;AACD,WAAO,MAAM;AAAA,EACd;AAIA,MAAK,qBAAqB,WAAW,WAAW,GAAI;AACnD,QAAI;AAEJ,WAAO,QAAS,MAAO,EAAE,KAAM,CAAE,CAAE,KAAK,KAAM,MAAO;AACpD,aAAO;AACP,aAAO,UAAU;AAAA,IAClB,CAAE;AAEF,WAAO;AAAA,EACR;AAGA,MAAK,OAAO,WAAW,KAAK,CAAE,WAAW,QAAS;AACjD,WAAO,MAAO,CAAE;AAAA,EACjB;AAGA,SAAO,MAAM;AACd;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport {\n\tsidesAll,\n\tsidesBottom,\n\tsidesHorizontal,\n\tsidesLeft,\n\tsidesRight,\n\tsidesTop,\n\tsidesVertical,\n} from '@wordpress/icons';\n\nexport const RANGE_CONTROL_MAX_SIZE = 8;\n\nexport const ALL_SIDES = [ 'top', 'bottom', 'left', 'right' ];\n\nexport const DEFAULT_VALUES = {\n\ttop: undefined,\n\tright: undefined,\n\tbottom: undefined,\n\tleft: undefined,\n};\n\nexport const ICONS = {\n\tcustom: sidesAll,\n\taxial: sidesAll,\n\thorizontal: sidesHorizontal,\n\tvertical: sidesVertical,\n\ttop: sidesTop,\n\tright: sidesRight,\n\tbottom: sidesBottom,\n\tleft: sidesLeft,\n};\n\nexport const LABELS = {\n\tdefault: __( 'Spacing control' ),\n\ttop: __( 'Top' ),\n\tbottom: __( 'Bottom' ),\n\tleft: __( 'Left' ),\n\tright: __( 'Right' ),\n\tmixed: __( 'Mixed' ),\n\tvertical: __( 'Vertical' ),\n\thorizontal: __( 'Horizontal' ),\n\taxial: __( 'Horizontal & vertical' ),\n\tcustom: __( 'Custom' ),\n};\n\nexport const VIEWS = {\n\taxial: 'axial',\n\ttop: 'top',\n\tright: 'right',\n\tbottom: 'bottom',\n\tleft: 'left',\n\tcustom: 'custom',\n};\n\n/**\n * Checks is given value is a spacing preset.\n *\n * @param {string} value Value to check\n *\n * @return {boolean} Return true if value is string in format var:preset|spacing|.\n */\nexport function isValueSpacingPreset( value ) {\n\tif ( ! value?.includes ) {\n\t\treturn false;\n\t}\n\treturn value === '0' || value.includes( 'var:preset|spacing|' );\n}\n\n/**\n * Converts a spacing preset into a custom value.\n *\n * @param {string} value Value to convert\n * @param {Array} spacingSizes Array of the current spacing preset objects\n *\n * @return {string} Mapping of the spacing preset to its equivalent custom value.\n */\nexport function getCustomValueFromPreset( value, spacingSizes ) {\n\tif ( ! isValueSpacingPreset( value ) ) {\n\t\treturn value;\n\t}\n\n\tconst slug = getSpacingPresetSlug( value );\n\tconst spacingSize = spacingSizes.find(\n\t\t( size ) => String( size.slug ) === slug\n\t);\n\n\treturn spacingSize?.size;\n}\n\n/**\n * Converts a custom value to preset value if one can be found.\n *\n * Returns value as-is if no match is found.\n *\n * @param {string} value Value to convert\n * @param {Array} spacingSizes Array of the current spacing preset objects\n *\n * @return {string} The preset value if it can be found.\n */\nexport function getPresetValueFromCustomValue( value, spacingSizes ) {\n\t// Return value as-is if it is undefined or is already a preset, or '0';\n\tif ( ! value || isValueSpacingPreset( value ) || value === '0' ) {\n\t\treturn value;\n\t}\n\n\tconst spacingMatch = spacingSizes.find(\n\t\t( size ) => String( size.size ) === String( value )\n\t);\n\n\tif ( spacingMatch?.slug ) {\n\t\treturn `var:preset|spacing|${ spacingMatch.slug }`;\n\t}\n\n\treturn value;\n}\n\n/**\n * Converts a spacing preset into a custom value.\n *\n * @param {string} value Value to convert.\n *\n * @return {string | undefined} CSS var string for given spacing preset value.\n */\nexport function getSpacingPresetCssVar( value ) {\n\tif ( ! value ) {\n\t\treturn;\n\t}\n\n\tconst slug = value.match( /var:preset\\|spacing\\|(.+)/ );\n\n\tif ( ! slug ) {\n\t\treturn value;\n\t}\n\n\treturn `var(--wp--preset--spacing--${ slug[ 1 ] })`;\n}\n\n/**\n * Returns the slug section of the given spacing preset string.\n *\n * @param {string} value Value to extract slug from.\n *\n * @return {string|undefined} The int value of the slug from given spacing preset.\n */\nexport function getSpacingPresetSlug( value ) {\n\tif ( ! value ) {\n\t\treturn;\n\t}\n\n\tif ( value === '0' || value === 'default' ) {\n\t\treturn value;\n\t}\n\n\tconst slug = value.match( /var:preset\\|spacing\\|(.+)/ );\n\n\treturn slug ? slug[ 1 ] : undefined;\n}\n\n/**\n * Converts spacing preset value into a Range component value .\n *\n * @param {string} presetValue Value to convert to Range value.\n * @param {Array} spacingSizes Array of current spacing preset value objects.\n *\n * @return {number} The int value for use in Range control.\n */\nexport function getSliderValueFromPreset( presetValue, spacingSizes ) {\n\tif ( presetValue === undefined ) {\n\t\treturn 0;\n\t}\n\tconst slug =\n\t\tparseFloat( presetValue, 10 ) === 0\n\t\t\t? '0'\n\t\t\t: getSpacingPresetSlug( presetValue );\n\tconst sliderValue = spacingSizes.findIndex( ( spacingSize ) => {\n\t\treturn String( spacingSize.slug ) === slug;\n\t} );\n\n\t// Returning NaN rather than undefined as undefined makes range control thumb sit in center\n\treturn sliderValue !== -1 ? sliderValue : NaN;\n}\n\n/**\n * Determines whether a particular axis has support. If no axis is\n * specified, this function checks if either axis is supported.\n *\n * @param {Array} sides Supported sides.\n * @param {string} axis Which axis to check.\n *\n * @return {boolean} Whether there is support for the specified axis or both axes.\n */\nexport function hasAxisSupport( sides, axis ) {\n\tif ( ! sides || ! sides.length ) {\n\t\treturn false;\n\t}\n\n\tconst hasHorizontalSupport =\n\t\tsides.includes( 'horizontal' ) ||\n\t\t( sides.includes( 'left' ) && sides.includes( 'right' ) );\n\n\tconst hasVerticalSupport =\n\t\tsides.includes( 'vertical' ) ||\n\t\t( sides.includes( 'top' ) && sides.includes( 'bottom' ) );\n\n\tif ( axis === 'horizontal' ) {\n\t\treturn hasHorizontalSupport;\n\t}\n\n\tif ( axis === 'vertical' ) {\n\t\treturn hasVerticalSupport;\n\t}\n\n\treturn hasHorizontalSupport || hasVerticalSupport;\n}\n\n/**\n * Checks if the supported sides are balanced for each axis.\n * - Horizontal - both left and right sides are supported.\n * - Vertical - both top and bottom are supported.\n *\n * @param {Array} sides The supported sides which may be axes as well.\n *\n * @return {boolean} Whether or not the supported sides are balanced.\n */\nexport function hasBalancedSidesSupport( sides = [] ) {\n\tconst counts = { top: 0, right: 0, bottom: 0, left: 0 };\n\tsides.forEach( ( side ) => ( counts[ side ] += 1 ) );\n\n\treturn (\n\t\t( counts.top + counts.bottom ) % 2 === 0 &&\n\t\t( counts.left + counts.right ) % 2 === 0\n\t);\n}\n\n/**\n * Determines which view the SpacingSizesControl should default to on its\n * first render; Axial, Custom, or Single side.\n *\n * @param {Object} values Current side values.\n * @param {Array} sides Supported sides.\n *\n * @return {string} View to display.\n */\nexport function getInitialView( values = {}, sides ) {\n\tconst { top, right, bottom, left } = values;\n\tconst sideValues = [ top, right, bottom, left ].filter( Boolean );\n\n\t// Axial ( Horizontal & vertical ).\n\t// - Has axial side support\n\t// - Has axial side values which match\n\t// - Has no values and the supported sides are balanced\n\tconst hasMatchingAxialValues =\n\t\ttop === bottom && left === right && ( !! top || !! left );\n\tconst hasNoValuesAndBalancedSides =\n\t\t! sideValues.length && hasBalancedSidesSupport( sides );\n\tconst hasOnlyAxialSides =\n\t\tsides?.includes( 'horizontal' ) &&\n\t\tsides?.includes( 'vertical' ) &&\n\t\tsides?.length === 2;\n\n\tif (\n\t\thasAxisSupport( sides ) &&\n\t\t( hasMatchingAxialValues || hasNoValuesAndBalancedSides )\n\t) {\n\t\treturn VIEWS.axial;\n\t}\n\n\t// Only axial sides are supported and single value defined.\n\t// - Ensure the side returned is the first side that has a value.\n\tif ( hasOnlyAxialSides && sideValues.length === 1 ) {\n\t\tlet side;\n\n\t\tObject.entries( values ).some( ( [ key, value ] ) => {\n\t\t\tside = key;\n\t\t\treturn value !== undefined;\n\t\t} );\n\n\t\treturn side;\n\t}\n\n\t// Only single side supported and no value defined.\n\tif ( sides?.length === 1 && ! sideValues.length ) {\n\t\treturn sides[ 0 ];\n\t}\n\n\t// Default to the Custom (separated sides) view.\n\treturn VIEWS.custom;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -125,7 +125,29 @@ function useSelectionObserver() {
125
125
  const isSingularSelection = startClientId === endClientId;
126
126
  if (isSingularSelection) {
127
127
  if (!isMultiSelecting()) {
128
- selectBlock(startClientId);
128
+ const richTextElement = !selection.isCollapsed && (getRichTextElement(startNode) || getRichTextElement(endNode));
129
+ if (richTextElement && ownerDocument.activeElement !== richTextElement) {
130
+ const range = selection.getRangeAt(0);
131
+ const richTextData = (0, import_rich_text.create)({
132
+ element: richTextElement,
133
+ range,
134
+ __unstableIsEditableTree: true
135
+ });
136
+ selectionChange({
137
+ start: {
138
+ clientId: startClientId,
139
+ attributeKey: richTextElement.dataset.wpBlockAttributeKey,
140
+ offset: richTextData.start ?? 0
141
+ },
142
+ end: {
143
+ clientId: startClientId,
144
+ attributeKey: richTextElement.dataset.wpBlockAttributeKey,
145
+ offset: richTextData.end
146
+ }
147
+ });
148
+ } else {
149
+ selectBlock(startClientId);
150
+ }
129
151
  } else {
130
152
  multiSelect(startClientId, startClientId);
131
153
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/writing-flow/use-selection-observer.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\nimport { create } from '@wordpress/rich-text';\nimport { isSelectionForward } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { getBlockClientId } from '../../utils/dom';\n\n/**\n * Extract the selection start node from the selection. When the anchor node is\n * not a text node, the selection offset is the index of a child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionStartNode( selection ) {\n\tconst { anchorNode, anchorOffset } = selection;\n\n\tif ( anchorNode.nodeType === anchorNode.TEXT_NODE ) {\n\t\treturn anchorNode;\n\t}\n\n\tif ( anchorOffset === 0 ) {\n\t\treturn anchorNode;\n\t}\n\n\treturn anchorNode.childNodes[ anchorOffset - 1 ];\n}\n\n/**\n * Extract the selection end node from the selection. When the focus node is not\n * a text node, the selection offset is the index of a child node. The selection\n * reaches up to but excluding that child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionEndNode( selection ) {\n\tconst { focusNode, focusOffset } = selection;\n\n\tif ( focusNode.nodeType === focusNode.TEXT_NODE ) {\n\t\treturn focusNode;\n\t}\n\n\tif ( focusOffset === focusNode.childNodes.length ) {\n\t\treturn focusNode;\n\t}\n\n\t// When the selection is forward (the selection ends with the focus node),\n\t// the selection may extend into the next element with an offset of 0. This\n\t// may trigger multi selection even though the selection does not visually\n\t// end in the next block.\n\tif ( focusOffset === 0 && isSelectionForward( selection ) ) {\n\t\treturn focusNode.previousSibling ?? focusNode.parentElement;\n\t}\n\n\treturn focusNode.childNodes[ focusOffset ];\n}\n\nfunction findDepth( a, b ) {\n\tlet depth = 0;\n\n\twhile ( a[ depth ] === b[ depth ] ) {\n\t\tdepth++;\n\t}\n\n\treturn depth;\n}\n\n/**\n * Sets the `contenteditable` wrapper element to `value`.\n *\n * @param {HTMLElement} node Block element.\n * @param {boolean} value `contentEditable` value (true or false)\n */\nfunction setContentEditableWrapper( node, value ) {\n\t// Since we are calling this on every selection change, check if the value\n\t// needs to be updated first because it trigger the browser to recalculate\n\t// style.\n\tif ( node.contentEditable !== String( value ) ) {\n\t\tnode.contentEditable = value;\n\n\t\t// Firefox doesn't automatically move focus.\n\t\tif ( value ) {\n\t\t\tnode.focus();\n\t\t}\n\t}\n}\n\nfunction getRichTextElement( node ) {\n\tconst element =\n\t\tnode.nodeType === node.ELEMENT_NODE ? node : node.parentElement;\n\treturn element?.closest( '[data-wp-block-attribute-key]' );\n}\n\n/**\n * Sets a multi-selection based on the native selection across blocks.\n */\nexport default function useSelectionObserver() {\n\tconst { multiSelect, selectBlock, selectionChange } =\n\t\tuseDispatch( blockEditorStore );\n\tconst { getBlockParents, getBlockSelectionStart, isMultiSelecting } =\n\t\tuseSelect( blockEditorStore );\n\treturn useRefEffect(\n\t\t( node ) => {\n\t\t\tconst { ownerDocument } = node;\n\t\t\tconst { defaultView } = ownerDocument;\n\n\t\t\tfunction onSelectionChange( event ) {\n\t\t\t\tconst selection = defaultView.getSelection();\n\n\t\t\t\tif ( ! selection.rangeCount ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst startNode = extractSelectionStartNode( selection );\n\t\t\t\tconst endNode = extractSelectionEndNode( selection );\n\n\t\t\t\tif (\n\t\t\t\t\t! node.contains( startNode ) ||\n\t\t\t\t\t! node.contains( endNode )\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If selection is collapsed and we haven't used `shift+click`,\n\t\t\t\t// end multi selection and disable the contentEditable wrapper.\n\t\t\t\t// We have to check about `shift+click` case because elements\n\t\t\t\t// that don't support text selection might be involved, and we might\n\t\t\t\t// update the clientIds to multi-select blocks.\n\t\t\t\t// For now we check if the event is a `mouse` event.\n\t\t\t\tconst isClickShift = event.shiftKey && event.type === 'mouseup';\n\t\t\t\tif ( selection.isCollapsed && ! isClickShift ) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnode.contentEditable === 'true' &&\n\t\t\t\t\t\t! isMultiSelecting()\n\t\t\t\t\t) {\n\t\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\t\tlet element =\n\t\t\t\t\t\t\tstartNode.nodeType === startNode.ELEMENT_NODE\n\t\t\t\t\t\t\t\t? startNode\n\t\t\t\t\t\t\t\t: startNode.parentElement;\n\t\t\t\t\t\telement = element?.closest( '[contenteditable]' );\n\t\t\t\t\t\telement?.focus();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet startClientId = getBlockClientId( startNode );\n\t\t\t\tlet endClientId = getBlockClientId( endNode );\n\n\t\t\t\t// If the selection has changed and we had pressed `shift+click`,\n\t\t\t\t// we need to check if in an element that doesn't support\n\t\t\t\t// text selection has been clicked.\n\t\t\t\tif ( isClickShift ) {\n\t\t\t\t\tconst selectedClientId = getBlockSelectionStart();\n\t\t\t\t\tconst clickedClientId = getBlockClientId( event.target );\n\t\t\t\t\t// `endClientId` is not defined if we end the selection by clicking a non-selectable block.\n\t\t\t\t\t// We need to check if there was already a selection with a non-selectable focusNode.\n\t\t\t\t\tconst focusNodeIsNonSelectable =\n\t\t\t\t\t\tclickedClientId !== endClientId;\n\t\t\t\t\tif (\n\t\t\t\t\t\t( startClientId === endClientId &&\n\t\t\t\t\t\t\tselection.isCollapsed ) ||\n\t\t\t\t\t\t! endClientId ||\n\t\t\t\t\t\tfocusNodeIsNonSelectable\n\t\t\t\t\t) {\n\t\t\t\t\t\tendClientId = clickedClientId;\n\t\t\t\t\t}\n\t\t\t\t\t// Handle the case when we have a non-selectable block\n\t\t\t\t\t// selected and click another one.\n\t\t\t\t\tif ( startClientId !== selectedClientId ) {\n\t\t\t\t\t\tstartClientId = selectedClientId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If the selection did not involve a block, return.\n\t\t\t\tif (\n\t\t\t\t\tstartClientId === undefined &&\n\t\t\t\t\tendClientId === undefined\n\t\t\t\t) {\n\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// On mouseup, if the native selection is within one block\n\t\t\t\t// but the click target is a different block, bail out\n\t\t\t\t// and let the clicked block's focus handler manage\n\t\t\t\t// selection.\n\t\t\t\tif (\n\t\t\t\t\tevent.type === 'mouseup' &&\n\t\t\t\t\t! event.shiftKey &&\n\t\t\t\t\t! isMultiSelecting() &&\n\t\t\t\t\tstartClientId === endClientId\n\t\t\t\t) {\n\t\t\t\t\tconst clickedClientId = getBlockClientId( event.target );\n\t\t\t\t\tif (\n\t\t\t\t\t\tclickedClientId &&\n\t\t\t\t\t\tclickedClientId !== startClientId\n\t\t\t\t\t) {\n\t\t\t\t\t\tselection.removeAllRanges();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isSingularSelection = startClientId === endClientId;\n\t\t\t\tif ( isSingularSelection ) {\n\t\t\t\t\tif ( ! isMultiSelecting() ) {\n\t\t\t\t\t\tselectBlock( startClientId );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, startClientId );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst startPath = [\n\t\t\t\t\t\t...getBlockParents( startClientId ),\n\t\t\t\t\t\tstartClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst endPath = [\n\t\t\t\t\t\t...getBlockParents( endClientId ),\n\t\t\t\t\t\tendClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst depth = findDepth( startPath, endPath );\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tstartPath[ depth ] !== startClientId ||\n\t\t\t\t\t\tendPath[ depth ] !== endClientId\n\t\t\t\t\t) {\n\t\t\t\t\t\tmultiSelect( startPath[ depth ], endPath[ depth ] );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst richTextElementStart =\n\t\t\t\t\t\tgetRichTextElement( startNode );\n\t\t\t\t\tconst richTextElementEnd = getRichTextElement( endNode );\n\n\t\t\t\t\tif ( richTextElementStart && richTextElementEnd ) {\n\t\t\t\t\t\tconst range = selection.getRangeAt( 0 );\n\t\t\t\t\t\tconst richTextDataStart = create( {\n\t\t\t\t\t\t\telement: richTextElementStart,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tconst richTextDataEnd = create( {\n\t\t\t\t\t\t\telement: richTextElementEnd,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tconst startOffset =\n\t\t\t\t\t\t\trichTextDataStart.start ?? richTextDataStart.end;\n\t\t\t\t\t\tconst endOffset =\n\t\t\t\t\t\t\trichTextDataEnd.start ?? richTextDataEnd.end;\n\t\t\t\t\t\tselectionChange( {\n\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\tclientId: startClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementStart.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: startOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tend: {\n\t\t\t\t\t\t\t\tclientId: endClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementEnd.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: endOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, endClientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\townerDocument.addEventListener(\n\t\t\t\t'selectionchange',\n\t\t\t\tonSelectionChange\n\t\t\t);\n\t\t\tdefaultView.addEventListener( 'mouseup', onSelectionChange );\n\t\t\treturn () => {\n\t\t\t\townerDocument.removeEventListener(\n\t\t\t\t\t'selectionchange',\n\t\t\t\t\tonSelectionChange\n\t\t\t\t);\n\t\t\t\tdefaultView.removeEventListener( 'mouseup', onSelectionChange );\n\t\t\t};\n\t\t},\n\t\t[ multiSelect, selectBlock, selectionChange, getBlockParents ]\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\nimport { create } from '@wordpress/rich-text';\nimport { isSelectionForward } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { getBlockClientId } from '../../utils/dom';\n\n/**\n * Extract the selection start node from the selection. When the anchor node is\n * not a text node, the selection offset is the index of a child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionStartNode( selection ) {\n\tconst { anchorNode, anchorOffset } = selection;\n\n\tif ( anchorNode.nodeType === anchorNode.TEXT_NODE ) {\n\t\treturn anchorNode;\n\t}\n\n\tif ( anchorOffset === 0 ) {\n\t\treturn anchorNode;\n\t}\n\n\treturn anchorNode.childNodes[ anchorOffset - 1 ];\n}\n\n/**\n * Extract the selection end node from the selection. When the focus node is not\n * a text node, the selection offset is the index of a child node. The selection\n * reaches up to but excluding that child node.\n *\n * @param {Selection} selection The selection.\n *\n * @return {Element} The selection start node.\n */\nfunction extractSelectionEndNode( selection ) {\n\tconst { focusNode, focusOffset } = selection;\n\n\tif ( focusNode.nodeType === focusNode.TEXT_NODE ) {\n\t\treturn focusNode;\n\t}\n\n\tif ( focusOffset === focusNode.childNodes.length ) {\n\t\treturn focusNode;\n\t}\n\n\t// When the selection is forward (the selection ends with the focus node),\n\t// the selection may extend into the next element with an offset of 0. This\n\t// may trigger multi selection even though the selection does not visually\n\t// end in the next block.\n\tif ( focusOffset === 0 && isSelectionForward( selection ) ) {\n\t\treturn focusNode.previousSibling ?? focusNode.parentElement;\n\t}\n\n\treturn focusNode.childNodes[ focusOffset ];\n}\n\nfunction findDepth( a, b ) {\n\tlet depth = 0;\n\n\twhile ( a[ depth ] === b[ depth ] ) {\n\t\tdepth++;\n\t}\n\n\treturn depth;\n}\n\n/**\n * Sets the `contenteditable` wrapper element to `value`.\n *\n * @param {HTMLElement} node Block element.\n * @param {boolean} value `contentEditable` value (true or false)\n */\nfunction setContentEditableWrapper( node, value ) {\n\t// Since we are calling this on every selection change, check if the value\n\t// needs to be updated first because it trigger the browser to recalculate\n\t// style.\n\tif ( node.contentEditable !== String( value ) ) {\n\t\tnode.contentEditable = value;\n\n\t\t// Firefox doesn't automatically move focus.\n\t\tif ( value ) {\n\t\t\tnode.focus();\n\t\t}\n\t}\n}\n\nfunction getRichTextElement( node ) {\n\tconst element =\n\t\tnode.nodeType === node.ELEMENT_NODE ? node : node.parentElement;\n\treturn element?.closest( '[data-wp-block-attribute-key]' );\n}\n\n/**\n * Sets a multi-selection based on the native selection across blocks.\n */\nexport default function useSelectionObserver() {\n\tconst { multiSelect, selectBlock, selectionChange } =\n\t\tuseDispatch( blockEditorStore );\n\tconst { getBlockParents, getBlockSelectionStart, isMultiSelecting } =\n\t\tuseSelect( blockEditorStore );\n\treturn useRefEffect(\n\t\t( node ) => {\n\t\t\tconst { ownerDocument } = node;\n\t\t\tconst { defaultView } = ownerDocument;\n\n\t\t\tfunction onSelectionChange( event ) {\n\t\t\t\tconst selection = defaultView.getSelection();\n\n\t\t\t\tif ( ! selection.rangeCount ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst startNode = extractSelectionStartNode( selection );\n\t\t\t\tconst endNode = extractSelectionEndNode( selection );\n\n\t\t\t\tif (\n\t\t\t\t\t! node.contains( startNode ) ||\n\t\t\t\t\t! node.contains( endNode )\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If selection is collapsed and we haven't used `shift+click`,\n\t\t\t\t// end multi selection and disable the contentEditable wrapper.\n\t\t\t\t// We have to check about `shift+click` case because elements\n\t\t\t\t// that don't support text selection might be involved, and we might\n\t\t\t\t// update the clientIds to multi-select blocks.\n\t\t\t\t// For now we check if the event is a `mouse` event.\n\t\t\t\tconst isClickShift = event.shiftKey && event.type === 'mouseup';\n\t\t\t\tif ( selection.isCollapsed && ! isClickShift ) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnode.contentEditable === 'true' &&\n\t\t\t\t\t\t! isMultiSelecting()\n\t\t\t\t\t) {\n\t\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\t\tlet element =\n\t\t\t\t\t\t\tstartNode.nodeType === startNode.ELEMENT_NODE\n\t\t\t\t\t\t\t\t? startNode\n\t\t\t\t\t\t\t\t: startNode.parentElement;\n\t\t\t\t\t\telement = element?.closest( '[contenteditable]' );\n\t\t\t\t\t\telement?.focus();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet startClientId = getBlockClientId( startNode );\n\t\t\t\tlet endClientId = getBlockClientId( endNode );\n\n\t\t\t\t// If the selection has changed and we had pressed `shift+click`,\n\t\t\t\t// we need to check if in an element that doesn't support\n\t\t\t\t// text selection has been clicked.\n\t\t\t\tif ( isClickShift ) {\n\t\t\t\t\tconst selectedClientId = getBlockSelectionStart();\n\t\t\t\t\tconst clickedClientId = getBlockClientId( event.target );\n\t\t\t\t\t// `endClientId` is not defined if we end the selection by clicking a non-selectable block.\n\t\t\t\t\t// We need to check if there was already a selection with a non-selectable focusNode.\n\t\t\t\t\tconst focusNodeIsNonSelectable =\n\t\t\t\t\t\tclickedClientId !== endClientId;\n\t\t\t\t\tif (\n\t\t\t\t\t\t( startClientId === endClientId &&\n\t\t\t\t\t\t\tselection.isCollapsed ) ||\n\t\t\t\t\t\t! endClientId ||\n\t\t\t\t\t\tfocusNodeIsNonSelectable\n\t\t\t\t\t) {\n\t\t\t\t\t\tendClientId = clickedClientId;\n\t\t\t\t\t}\n\t\t\t\t\t// Handle the case when we have a non-selectable block\n\t\t\t\t\t// selected and click another one.\n\t\t\t\t\tif ( startClientId !== selectedClientId ) {\n\t\t\t\t\t\tstartClientId = selectedClientId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If the selection did not involve a block, return.\n\t\t\t\tif (\n\t\t\t\t\tstartClientId === undefined &&\n\t\t\t\t\tendClientId === undefined\n\t\t\t\t) {\n\t\t\t\t\tsetContentEditableWrapper( node, false );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// On mouseup, if the native selection is within one block\n\t\t\t\t// but the click target is a different block, bail out\n\t\t\t\t// and let the clicked block's focus handler manage\n\t\t\t\t// selection.\n\t\t\t\tif (\n\t\t\t\t\tevent.type === 'mouseup' &&\n\t\t\t\t\t! event.shiftKey &&\n\t\t\t\t\t! isMultiSelecting() &&\n\t\t\t\t\tstartClientId === endClientId\n\t\t\t\t) {\n\t\t\t\t\tconst clickedClientId = getBlockClientId( event.target );\n\t\t\t\t\tif (\n\t\t\t\t\t\tclickedClientId &&\n\t\t\t\t\t\tclickedClientId !== startClientId\n\t\t\t\t\t) {\n\t\t\t\t\t\tselection.removeAllRanges();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isSingularSelection = startClientId === endClientId;\n\t\t\t\tif ( isSingularSelection ) {\n\t\t\t\t\tif ( ! isMultiSelecting() ) {\n\t\t\t\t\t\t// If the selection is not collapsed and falls\n\t\t\t\t\t\t// within a RichText that doesn't have focus\n\t\t\t\t\t\t// (e.g. the user started dragging from the block\n\t\t\t\t\t\t// wrapper padding), dispatch a full\n\t\t\t\t\t\t// selectionChange so the format toolbar appears.\n\t\t\t\t\t\tconst richTextElement =\n\t\t\t\t\t\t\t! selection.isCollapsed &&\n\t\t\t\t\t\t\t( getRichTextElement( startNode ) ||\n\t\t\t\t\t\t\t\tgetRichTextElement( endNode ) );\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\trichTextElement &&\n\t\t\t\t\t\t\townerDocument.activeElement !== richTextElement\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst range = selection.getRangeAt( 0 );\n\t\t\t\t\t\t\tconst richTextData = create( {\n\t\t\t\t\t\t\t\telement: richTextElement,\n\t\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tselectionChange( {\n\t\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\t\tclientId: startClientId,\n\t\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\t\trichTextElement.dataset\n\t\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\t\toffset: richTextData.start ?? 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tend: {\n\t\t\t\t\t\t\t\t\tclientId: startClientId,\n\t\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\t\trichTextElement.dataset\n\t\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\t\toffset: richTextData.end,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselectBlock( startClientId );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, startClientId );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst startPath = [\n\t\t\t\t\t\t...getBlockParents( startClientId ),\n\t\t\t\t\t\tstartClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst endPath = [\n\t\t\t\t\t\t...getBlockParents( endClientId ),\n\t\t\t\t\t\tendClientId,\n\t\t\t\t\t];\n\t\t\t\t\tconst depth = findDepth( startPath, endPath );\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tstartPath[ depth ] !== startClientId ||\n\t\t\t\t\t\tendPath[ depth ] !== endClientId\n\t\t\t\t\t) {\n\t\t\t\t\t\tmultiSelect( startPath[ depth ], endPath[ depth ] );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst richTextElementStart =\n\t\t\t\t\t\tgetRichTextElement( startNode );\n\t\t\t\t\tconst richTextElementEnd = getRichTextElement( endNode );\n\n\t\t\t\t\tif ( richTextElementStart && richTextElementEnd ) {\n\t\t\t\t\t\tconst range = selection.getRangeAt( 0 );\n\t\t\t\t\t\tconst richTextDataStart = create( {\n\t\t\t\t\t\t\telement: richTextElementStart,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tconst richTextDataEnd = create( {\n\t\t\t\t\t\t\telement: richTextElementEnd,\n\t\t\t\t\t\t\trange,\n\t\t\t\t\t\t\t__unstableIsEditableTree: true,\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tconst startOffset =\n\t\t\t\t\t\t\trichTextDataStart.start ?? richTextDataStart.end;\n\t\t\t\t\t\tconst endOffset =\n\t\t\t\t\t\t\trichTextDataEnd.start ?? richTextDataEnd.end;\n\t\t\t\t\t\tselectionChange( {\n\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\tclientId: startClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementStart.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: startOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tend: {\n\t\t\t\t\t\t\t\tclientId: endClientId,\n\t\t\t\t\t\t\t\tattributeKey:\n\t\t\t\t\t\t\t\t\trichTextElementEnd.dataset\n\t\t\t\t\t\t\t\t\t\t.wpBlockAttributeKey,\n\t\t\t\t\t\t\t\toffset: endOffset,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmultiSelect( startClientId, endClientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\townerDocument.addEventListener(\n\t\t\t\t'selectionchange',\n\t\t\t\tonSelectionChange\n\t\t\t);\n\t\t\tdefaultView.addEventListener( 'mouseup', onSelectionChange );\n\t\t\treturn () => {\n\t\t\t\townerDocument.removeEventListener(\n\t\t\t\t\t'selectionchange',\n\t\t\t\t\tonSelectionChange\n\t\t\t\t);\n\t\t\t\tdefaultView.removeEventListener( 'mouseup', onSelectionChange );\n\t\t\t};\n\t\t},\n\t\t[ multiSelect, selectBlock, selectionChange, getBlockParents ]\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_dom", "blockEditorStore"]
7
7
  }
@@ -198,68 +198,70 @@ var elementTypes = [
198
198
  }
199
199
  ];
200
200
  var STYLE_BLOCK_PROPS_REFERENCE = {};
201
- function useBlockProps({ name, style }) {
202
- const blockElementsContainerIdentifier = (0, import_compose.useInstanceId)(
203
- STYLE_BLOCK_PROPS_REFERENCE,
204
- "wp-elements"
205
- );
206
- const baseElementSelector = `.${blockElementsContainerIdentifier}`;
207
- const blockElementStyles = style?.elements;
208
- const styles = (0, import_element.useMemo)(() => {
209
- if (!blockElementStyles) {
201
+ function getElementCSSRules(blockElementStyles, blockName, baseSelector) {
202
+ if (!blockElementStyles) {
203
+ return;
204
+ }
205
+ const rules = [];
206
+ elementTypes.forEach(({ elementType, pseudo, elements }) => {
207
+ const skipSerialization = (0, import_utils.shouldSkipSerialization)(
208
+ blockName,
209
+ import_color.COLOR_SUPPORT_KEY,
210
+ elementType
211
+ );
212
+ if (skipSerialization) {
210
213
  return;
211
214
  }
212
- const elementCSSRules = [];
213
- elementTypes.forEach(({ elementType, pseudo, elements }) => {
214
- const skipSerialization = (0, import_utils.shouldSkipSerialization)(
215
- name,
216
- import_color.COLOR_SUPPORT_KEY,
217
- elementType
215
+ const elementStyles = blockElementStyles?.[elementType];
216
+ if (elementStyles) {
217
+ const selector = (0, import_utils2.scopeSelector)(
218
+ baseSelector,
219
+ import_blocks.__EXPERIMENTAL_ELEMENTS[elementType]
218
220
  );
219
- if (skipSerialization) {
220
- return;
221
- }
222
- const elementStyles = blockElementStyles?.[elementType];
223
- if (elementStyles) {
224
- const selector = (0, import_utils2.scopeSelector)(
225
- baseElementSelector,
226
- import_blocks.__EXPERIMENTAL_ELEMENTS[elementType]
227
- );
228
- elementCSSRules.push(
229
- (0, import_style_engine.compileCSS)(elementStyles, { selector })
230
- );
231
- if (pseudo) {
232
- pseudo.forEach((pseudoSelector) => {
233
- if (elementStyles[pseudoSelector]) {
234
- elementCSSRules.push(
235
- (0, import_style_engine.compileCSS)(elementStyles[pseudoSelector], {
236
- selector: (0, import_utils2.scopeSelector)(
237
- baseElementSelector,
238
- `${import_blocks.__EXPERIMENTAL_ELEMENTS[elementType]}${pseudoSelector}`
239
- )
240
- })
241
- );
242
- }
243
- });
244
- }
245
- }
246
- if (elements) {
247
- elements.forEach((element) => {
248
- if (blockElementStyles[element]) {
249
- elementCSSRules.push(
250
- (0, import_style_engine.compileCSS)(blockElementStyles[element], {
221
+ rules.push((0, import_style_engine.compileCSS)(elementStyles, { selector }));
222
+ if (pseudo) {
223
+ pseudo.forEach((pseudoSelector) => {
224
+ if (elementStyles[pseudoSelector]) {
225
+ rules.push(
226
+ (0, import_style_engine.compileCSS)(elementStyles[pseudoSelector], {
251
227
  selector: (0, import_utils2.scopeSelector)(
252
- baseElementSelector,
253
- import_blocks.__EXPERIMENTAL_ELEMENTS[element]
228
+ baseSelector,
229
+ `${import_blocks.__EXPERIMENTAL_ELEMENTS[elementType]}${pseudoSelector}`
254
230
  )
255
231
  })
256
232
  );
257
233
  }
258
234
  });
259
235
  }
260
- });
261
- return elementCSSRules.length > 0 ? elementCSSRules.join("") : void 0;
262
- }, [baseElementSelector, blockElementStyles, name]);
236
+ }
237
+ if (elements) {
238
+ elements.forEach((element) => {
239
+ if (blockElementStyles[element]) {
240
+ rules.push(
241
+ (0, import_style_engine.compileCSS)(blockElementStyles[element], {
242
+ selector: (0, import_utils2.scopeSelector)(
243
+ baseSelector,
244
+ import_blocks.__EXPERIMENTAL_ELEMENTS[element]
245
+ )
246
+ })
247
+ );
248
+ }
249
+ });
250
+ }
251
+ });
252
+ return rules.length > 0 ? rules.join("") : void 0;
253
+ }
254
+ function useBlockProps({ name, style }) {
255
+ const blockElementsContainerIdentifier = (0, import_compose.useInstanceId)(
256
+ STYLE_BLOCK_PROPS_REFERENCE,
257
+ "wp-elements"
258
+ );
259
+ const baseElementSelector = `.${blockElementsContainerIdentifier}`;
260
+ const blockElementStyles = style?.elements;
261
+ const styles = (0, import_element.useMemo)(
262
+ () => getElementCSSRules(blockElementStyles, name, baseElementSelector),
263
+ [baseElementSelector, blockElementStyles, name]
264
+ );
263
265
  (0, import_utils.useStyleOverride)({ css: styles });
264
266
  return addSaveProps(
265
267
  { className: blockElementsContainerIdentifier },