@wordpress/format-library 5.32.0 → 5.32.1-next.ff1cebbba.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 (132) hide show
  1. package/build/bold/index.js +69 -58
  2. package/build/bold/index.js.map +7 -1
  3. package/build/code/index.js +62 -54
  4. package/build/code/index.js.map +7 -1
  5. package/build/default-formats.js +52 -24
  6. package/build/default-formats.js.map +7 -1
  7. package/build/image/index.js +185 -153
  8. package/build/image/index.js.map +7 -1
  9. package/build/index.js +28 -18
  10. package/build/index.js.map +7 -1
  11. package/build/italic/index.js +69 -58
  12. package/build/italic/index.js.map +7 -1
  13. package/build/keyboard/index.js +47 -36
  14. package/build/keyboard/index.js.map +7 -1
  15. package/build/language/index.js +145 -113
  16. package/build/language/index.js.map +7 -1
  17. package/build/link/css-classes-setting.js +81 -0
  18. package/build/link/css-classes-setting.js.map +7 -0
  19. package/build/link/index.js +162 -167
  20. package/build/link/index.js.map +7 -1
  21. package/build/link/inline.js +186 -174
  22. package/build/link/inline.js.map +7 -1
  23. package/build/link/use-link-instance-key.js +25 -19
  24. package/build/link/use-link-instance-key.js.map +7 -1
  25. package/build/link/utils.js +66 -115
  26. package/build/link/utils.js.map +7 -1
  27. package/build/lock-unlock.js +31 -15
  28. package/build/lock-unlock.js.map +7 -1
  29. package/build/non-breaking-space/index.js +44 -28
  30. package/build/non-breaking-space/index.js.map +7 -1
  31. package/build/strikethrough/index.js +57 -42
  32. package/build/strikethrough/index.js.map +7 -1
  33. package/build/subscript/index.js +47 -36
  34. package/build/subscript/index.js.map +7 -1
  35. package/build/superscript/index.js +47 -36
  36. package/build/superscript/index.js.map +7 -1
  37. package/build/text-color/index.js +102 -70
  38. package/build/text-color/index.js.map +7 -1
  39. package/build/text-color/inline.js +118 -116
  40. package/build/text-color/inline.js.map +7 -1
  41. package/build/underline/index.js +62 -40
  42. package/build/underline/index.js.map +7 -1
  43. package/build/unknown/index.js +51 -37
  44. package/build/unknown/index.js.map +7 -1
  45. package/build-module/bold/index.js +52 -52
  46. package/build-module/bold/index.js.map +7 -1
  47. package/build-module/code/index.js +41 -46
  48. package/build-module/code/index.js.map +7 -1
  49. package/build-module/default-formats.js +34 -19
  50. package/build-module/default-formats.js.map +7 -1
  51. package/build-module/image/index.js +174 -144
  52. package/build-module/image/index.js.map +7 -1
  53. package/build-module/index.js +6 -14
  54. package/build-module/index.js.map +7 -1
  55. package/build-module/italic/index.js +52 -52
  56. package/build-module/italic/index.js.map +7 -1
  57. package/build-module/keyboard/index.js +25 -30
  58. package/build-module/keyboard/index.js.map +7 -1
  59. package/build-module/language/index.js +128 -105
  60. package/build-module/language/index.js.map +7 -1
  61. package/build-module/link/css-classes-setting.js +67 -0
  62. package/build-module/link/css-classes-setting.js.map +7 -0
  63. package/build-module/link/index.js +128 -146
  64. package/build-module/link/index.js.map +7 -1
  65. package/build-module/link/inline.js +158 -154
  66. package/build-module/link/inline.js.map +7 -1
  67. package/build-module/link/use-link-instance-key.js +7 -14
  68. package/build-module/link/use-link-instance-key.js.map +7 -1
  69. package/build-module/link/utils.js +46 -101
  70. package/build-module/link/utils.js.map +7 -1
  71. package/build-module/lock-unlock.js +8 -7
  72. package/build-module/lock-unlock.js.map +7 -1
  73. package/build-module/non-breaking-space/index.js +22 -22
  74. package/build-module/non-breaking-space/index.js.map +7 -1
  75. package/build-module/strikethrough/index.js +38 -36
  76. package/build-module/strikethrough/index.js.map +7 -1
  77. package/build-module/subscript/index.js +25 -30
  78. package/build-module/subscript/index.js.map +7 -1
  79. package/build-module/superscript/index.js +25 -30
  80. package/build-module/superscript/index.js.map +7 -1
  81. package/build-module/text-color/index.js +72 -61
  82. package/build-module/text-color/index.js.map +7 -1
  83. package/build-module/text-color/inline.js +107 -106
  84. package/build-module/text-color/inline.js.map +7 -1
  85. package/build-module/underline/index.js +43 -34
  86. package/build-module/underline/index.js.map +7 -1
  87. package/build-module/unknown/index.js +26 -28
  88. package/build-module/unknown/index.js.map +7 -1
  89. package/build-style/style-rtl.css +0 -194
  90. package/build-style/style.css +0 -194
  91. package/package.json +21 -15
  92. package/src/image/style.scss +3 -0
  93. package/src/link/css-classes-setting.js +89 -0
  94. package/src/link/index.js +1 -0
  95. package/src/link/inline.js +19 -0
  96. package/src/link/style.scss +3 -0
  97. package/src/link/test/css-classes-setting.js +144 -0
  98. package/src/link/utils.js +8 -0
  99. package/src/style.scss +4 -4
  100. package/src/text-color/style.scss +2 -0
  101. package/build/default-formats.native.js +0 -16
  102. package/build/default-formats.native.js.map +0 -1
  103. package/build/link/index.native.js +0 -174
  104. package/build/link/index.native.js.map +0 -1
  105. package/build/link/modal-screens/link-picker-screen.native.js +0 -67
  106. package/build/link/modal-screens/link-picker-screen.native.js.map +0 -1
  107. package/build/link/modal-screens/link-settings-screen.native.js +0 -226
  108. package/build/link/modal-screens/link-settings-screen.native.js.map +0 -1
  109. package/build/link/modal-screens/screens.native.js +0 -11
  110. package/build/link/modal-screens/screens.native.js.map +0 -1
  111. package/build/link/modal.native.js +0 -53
  112. package/build/link/modal.native.js.map +0 -1
  113. package/build/text-color/index.native.js +0 -134
  114. package/build/text-color/index.native.js.map +0 -1
  115. package/build/text-color/inline.native.js +0 -150
  116. package/build/text-color/inline.native.js.map +0 -1
  117. package/build-module/default-formats.native.js +0 -10
  118. package/build-module/default-formats.native.js.map +0 -1
  119. package/build-module/link/index.native.js +0 -166
  120. package/build-module/link/index.native.js.map +0 -1
  121. package/build-module/link/modal-screens/link-picker-screen.native.js +0 -59
  122. package/build-module/link/modal-screens/link-picker-screen.native.js.map +0 -1
  123. package/build-module/link/modal-screens/link-settings-screen.native.js +0 -218
  124. package/build-module/link/modal-screens/link-settings-screen.native.js.map +0 -1
  125. package/build-module/link/modal-screens/screens.native.js +0 -5
  126. package/build-module/link/modal-screens/screens.native.js.map +0 -1
  127. package/build-module/link/modal.native.js +0 -45
  128. package/build-module/link/modal.native.js.map +0 -1
  129. package/build-module/text-color/index.native.js +0 -126
  130. package/build-module/text-color/index.native.js.map +0 -1
  131. package/build-module/text-color/inline.native.js +0 -142
  132. package/build-module/text-color/inline.native.js.map +0 -1
@@ -0,0 +1,89 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useState } from '@wordpress/element';
5
+ import { useInstanceId } from '@wordpress/compose';
6
+ import { __ } from '@wordpress/i18n';
7
+ import {
8
+ __experimentalInputControl as InputControl,
9
+ CheckboxControl,
10
+ VisuallyHidden,
11
+ __experimentalVStack as VStack,
12
+ } from '@wordpress/components';
13
+
14
+ /**
15
+ * CSSClassesSettingComponent
16
+ *
17
+ * Presents a toggleable text input for editing link CSS classes. The input
18
+ * is shown when the toggle is enabled or when there is already a value. When
19
+ * toggled off and a value exists, it resets the value to an empty string.
20
+ *
21
+ * @param {Object} props - Component props.
22
+ * @param {Object} props.setting - Setting configuration object.
23
+ * @param {Object} props.value - Current link value object.
24
+ * @param {Function} props.onChange - Callback when value changes.
25
+ */
26
+ const CSSClassesSettingComponent = ( { setting, value, onChange } ) => {
27
+ const hasValue = value ? value?.cssClasses?.length > 0 : false;
28
+ const [ isSettingActive, setIsSettingActive ] = useState( hasValue );
29
+ const instanceId = useInstanceId( CSSClassesSettingComponent );
30
+ const controlledRegionId = `css-classes-setting-${ instanceId }`;
31
+
32
+ // Sanitize user input: replace commas with spaces, collapse repeated spaces, and trim
33
+ const handleSettingChange = ( newValue ) => {
34
+ const sanitizedValue =
35
+ typeof newValue === 'string'
36
+ ? newValue.replace( /,/g, ' ' ).replace( /\s+/g, ' ' ).trim()
37
+ : newValue;
38
+ onChange( {
39
+ ...value,
40
+ [ setting.id ]: sanitizedValue,
41
+ } );
42
+ };
43
+
44
+ const handleCheckboxChange = () => {
45
+ if ( isSettingActive ) {
46
+ if ( hasValue ) {
47
+ // Reset the value when hiding the input and a value exists.
48
+ handleSettingChange( '' );
49
+ }
50
+ setIsSettingActive( false );
51
+ } else {
52
+ setIsSettingActive( true );
53
+ }
54
+ };
55
+
56
+ return (
57
+ <fieldset>
58
+ <VisuallyHidden as="legend">{ setting.title }</VisuallyHidden>
59
+ <VStack spacing={ 3 }>
60
+ <CheckboxControl
61
+ __nextHasNoMarginBottom
62
+ label={ setting.title }
63
+ onChange={ handleCheckboxChange }
64
+ checked={ isSettingActive || hasValue }
65
+ aria-expanded={ isSettingActive }
66
+ aria-controls={
67
+ isSettingActive ? controlledRegionId : undefined
68
+ }
69
+ />
70
+ { isSettingActive && (
71
+ <div id={ controlledRegionId }>
72
+ <InputControl
73
+ label={ __( 'CSS classes' ) }
74
+ value={ value?.cssClasses }
75
+ onChange={ handleSettingChange }
76
+ help={ __(
77
+ 'Separate multiple classes with spaces.'
78
+ ) }
79
+ __unstableInputWidth="100%"
80
+ __next40pxDefaultSize
81
+ />
82
+ </div>
83
+ ) }
84
+ </VStack>
85
+ </fieldset>
86
+ );
87
+ };
88
+
89
+ export default CSSClassesSettingComponent;
package/src/link/index.js CHANGED
@@ -231,6 +231,7 @@ export const link = {
231
231
  _id: 'id',
232
232
  target: 'target',
233
233
  rel: 'rel',
234
+ class: 'class',
234
235
  },
235
236
  [ essentialFormatKey ]: true,
236
237
  __unstablePasteRule( value, { html, plainText } ) {
@@ -29,6 +29,9 @@ import { useDispatch, useSelect } from '@wordpress/data';
29
29
  */
30
30
  import { createLinkFormat, isValidHref, getFormatBoundary } from './utils';
31
31
  import { link as settings } from './index';
32
+ import CSSClassesSettingComponent from './css-classes-setting';
33
+
34
+ // CSSClassesSettingComponent moved to its own file and imported above.
32
35
 
33
36
  const LINK_SETTINGS = [
34
37
  ...LinkControl.DEFAULT_LINK_SETTINGS,
@@ -36,6 +39,19 @@ const LINK_SETTINGS = [
36
39
  id: 'nofollow',
37
40
  title: __( 'Mark as nofollow' ),
38
41
  },
42
+ {
43
+ id: 'cssClasses',
44
+ title: __( 'Additional CSS class(es)' ),
45
+ render: ( setting, value, onChange ) => {
46
+ return (
47
+ <CSSClassesSettingComponent
48
+ setting={ setting }
49
+ value={ value }
50
+ onChange={ onChange }
51
+ />
52
+ );
53
+ },
54
+ },
39
55
  ];
40
56
 
41
57
  function InlineLinkUI( {
@@ -78,8 +94,10 @@ function InlineLinkUI( {
78
94
  opensInNewTab: activeAttributes.target === '_blank',
79
95
  nofollow: activeAttributes.rel?.includes( 'nofollow' ),
80
96
  title: richTextText,
97
+ cssClasses: activeAttributes.class,
81
98
  } ),
82
99
  [
100
+ activeAttributes.class,
83
101
  activeAttributes.id,
84
102
  activeAttributes.rel,
85
103
  activeAttributes.target,
@@ -116,6 +134,7 @@ function InlineLinkUI( {
116
134
  : undefined,
117
135
  opensInNewWindow: nextValue.opensInNewTab,
118
136
  nofollow: nextValue.nofollow,
137
+ cssClasses: nextValue.cssClasses,
119
138
  } );
120
139
 
121
140
  const newText = nextValue.title || newUrl;
@@ -1,3 +1,6 @@
1
+ @use "@wordpress/base-styles/colors" as *;
2
+ @use "@wordpress/base-styles/variables" as *;
3
+
1
4
  .block-editor-format-toolbar__link-container-content {
2
5
  display: flex;
3
6
  align-items: center;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import CSSClassesSettingComponent from '../css-classes-setting';
15
+
16
+ describe( 'CSSClassesSettingComponent', () => {
17
+ it( 'renders checkbox and hides input by default when no value', async () => {
18
+ render(
19
+ <CSSClassesSettingComponent
20
+ setting={ {
21
+ id: 'cssClasses',
22
+ title: 'Additional CSS class(es)',
23
+ } }
24
+ value={ { cssClasses: '' } }
25
+ onChange={ () => {} }
26
+ />
27
+ );
28
+
29
+ // Checkbox should be visible
30
+ const checkbox = screen.getByRole( 'checkbox', {
31
+ name: 'Additional CSS class(es)',
32
+ } );
33
+ expect( checkbox ).toBeVisible();
34
+
35
+ // aria-expanded should reflect collapsed state
36
+ expect( checkbox ).toHaveAttribute( 'aria-expanded', 'false' );
37
+
38
+ // aria-controls should not be present when region is not rendered
39
+ expect( checkbox ).not.toHaveAttribute( 'aria-controls' );
40
+
41
+ // Input should not be in the document initially
42
+ expect(
43
+ screen.queryByRole( 'textbox', {
44
+ name: 'CSS classes',
45
+ } )
46
+ ).not.toBeInTheDocument();
47
+ } );
48
+
49
+ it( 'shows input when toggled on and calls onChange when typing', async () => {
50
+ const user = userEvent.setup();
51
+ const onChange = jest.fn();
52
+
53
+ render(
54
+ <CSSClassesSettingComponent
55
+ setting={ {
56
+ id: 'cssClasses',
57
+ title: 'Additional CSS class(es)',
58
+ } }
59
+ value={ { cssClasses: '' } }
60
+ onChange={ onChange }
61
+ />
62
+ );
63
+
64
+ // Toggle on
65
+ const checkbox = screen.getByRole( 'checkbox', {
66
+ name: 'Additional CSS class(es)',
67
+ } );
68
+ // starts collapsed
69
+ expect( checkbox ).toHaveAttribute( 'aria-expanded', 'false' );
70
+ await user.click( checkbox );
71
+ // now expanded
72
+ expect( checkbox ).toHaveAttribute( 'aria-expanded', 'true' );
73
+
74
+ // aria-controls should be present when expanded
75
+ const regionId = checkbox.getAttribute( 'aria-controls' );
76
+ expect( regionId ).toBeTruthy();
77
+
78
+ // Input should appear
79
+ const input = screen.getByRole( 'textbox', {
80
+ name: 'CSS classes',
81
+ } );
82
+ expect( input ).toBeVisible();
83
+
84
+ // Type classes (including commas) - commas should be converted to spaces
85
+ await user.type( input, 'btn,btn-primary , btn-secondary' );
86
+
87
+ // onChange should have been called with the updated value object
88
+ expect( onChange ).toHaveBeenCalledWith(
89
+ expect.objectContaining( {
90
+ cssClasses: 'btn btn-primary btn-secondary',
91
+ } )
92
+ );
93
+ } );
94
+
95
+ it( 'hides input and clears value when toggled off with existing value', async () => {
96
+ const user = userEvent.setup();
97
+ const onChange = jest.fn();
98
+
99
+ render(
100
+ <CSSClassesSettingComponent
101
+ setting={ {
102
+ id: 'cssClasses',
103
+ title: 'Additional CSS class(es)',
104
+ } }
105
+ value={ { cssClasses: 'foo bar' } }
106
+ onChange={ onChange }
107
+ />
108
+ );
109
+
110
+ const checkbox = screen.getByRole( 'checkbox', {
111
+ name: 'Additional CSS class(es)',
112
+ } );
113
+
114
+ // Initially expanded and has aria-controls
115
+ expect( checkbox ).toHaveAttribute( 'aria-expanded', 'true' );
116
+ const initialRegionId = checkbox.getAttribute( 'aria-controls' );
117
+ expect( initialRegionId ).toBeTruthy();
118
+
119
+ // Initially visible because there is a value
120
+ const input = screen.getByRole( 'textbox', {
121
+ name: 'CSS classes',
122
+ } );
123
+ expect( input ).toBeVisible();
124
+
125
+ // Toggle off
126
+ await user.click( checkbox );
127
+ // aria-expanded should now be false
128
+ expect( checkbox ).toHaveAttribute( 'aria-expanded', 'false' );
129
+
130
+ // Should have called onChange with cleared value
131
+ expect( onChange ).toHaveBeenCalledWith(
132
+ expect.objectContaining( { cssClasses: '' } )
133
+ );
134
+ // Input should be hidden afterwards
135
+ expect(
136
+ screen.queryByRole( 'textbox', {
137
+ name: 'CSS classes',
138
+ } )
139
+ ).not.toBeInTheDocument();
140
+
141
+ // aria-controls should be removed when collapsed
142
+ expect( checkbox ).not.toHaveAttribute( 'aria-controls' );
143
+ } );
144
+ } );
package/src/link/utils.js CHANGED
@@ -86,6 +86,7 @@ export function isValidHref( href ) {
86
86
  * @param {string} options.id The ID of the link.
87
87
  * @param {boolean} options.opensInNewWindow Whether this link will open in a new window.
88
88
  * @param {boolean} options.nofollow Whether this link is marked as no follow relationship.
89
+ * @param {string} options.cssClasses The CSS classes to apply to the link.
89
90
  * @return {Object} The final format object.
90
91
  */
91
92
  export function createLinkFormat( {
@@ -94,6 +95,7 @@ export function createLinkFormat( {
94
95
  id,
95
96
  opensInNewWindow,
96
97
  nofollow,
98
+ cssClasses,
97
99
  } ) {
98
100
  const format = {
99
101
  type: 'core/link',
@@ -122,6 +124,12 @@ export function createLinkFormat( {
122
124
  : 'nofollow';
123
125
  }
124
126
 
127
+ const trimmedCssClasses = cssClasses?.trim();
128
+
129
+ if ( trimmedCssClasses?.length ) {
130
+ format.attributes.class = trimmedCssClasses;
131
+ }
132
+
125
133
  return format;
126
134
  }
127
135
 
package/src/style.scss CHANGED
@@ -1,4 +1,4 @@
1
- @import "./image/style.scss";
2
- @import "./link/style.scss";
3
- @import "./text-color/style.scss";
4
- @import "./language/style.scss";
1
+ @use "./image/style.scss" as *;
2
+ @use "./link/style.scss" as *;
3
+ @use "./text-color/style.scss" as *;
4
+ @use "./language/style.scss" as *;
@@ -1,3 +1,5 @@
1
+ @use "@wordpress/base-styles/variables" as *;
2
+
1
3
  // Must equal $color-palette-circle-size from:
2
4
  // @wordpress/components/src/circular-option-picker/style.scss
3
5
  $swatch-size: 28px;
@@ -1,16 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _bold = require("./bold");
8
- var _italic = require("./italic");
9
- var _link = require("./link");
10
- var _strikethrough = require("./strikethrough");
11
- var _textColor = require("./text-color");
12
- /**
13
- * Internal dependencies
14
- */
15
- var _default = exports.default = [_bold.bold, _italic.italic, _link.link, _strikethrough.strikethrough, _textColor.textColor];
16
- //# sourceMappingURL=default-formats.native.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_bold","require","_italic","_link","_strikethrough","_textColor","_default","exports","default","bold","italic","link","strikethrough","textColor"],"sources":["@wordpress/format-library/src/default-formats.native.js"],"sourcesContent":["/**\n * Internal dependencies\n */\nimport { bold } from './bold';\nimport { italic } from './italic';\nimport { link } from './link';\nimport { strikethrough } from './strikethrough';\nimport { textColor } from './text-color';\n\nexport default [ bold, italic, link, strikethrough, textColor ];\n"],"mappings":";;;;;;AAGA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AAPA;AACA;AACA;AAFA,IAAAK,QAAA,GAAAC,OAAA,CAAAC,OAAA,GASe,CAAEC,UAAI,EAAEC,cAAM,EAAEC,UAAI,EAAEC,4BAAa,EAAEC,oBAAS,CAAE","ignoreList":[]}
@@ -1,174 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.link = void 0;
8
- var _clipboard = _interopRequireDefault(require("@react-native-clipboard/clipboard"));
9
- var _i18n = require("@wordpress/i18n");
10
- var _element = require("@wordpress/element");
11
- var _components = require("@wordpress/components");
12
- var _blockEditor = require("@wordpress/block-editor");
13
- var _richText = require("@wordpress/rich-text");
14
- var _url = require("@wordpress/url");
15
- var _icons = require("@wordpress/icons");
16
- var _modal = _interopRequireDefault(require("./modal"));
17
- var _utils = require("./utils");
18
- var _jsxRuntime = require("react/jsx-runtime");
19
- /**
20
- * External dependencies
21
- */
22
-
23
- /**
24
- * WordPress dependencies
25
- */
26
-
27
- /**
28
- * Internal dependencies
29
- */
30
-
31
- const name = 'core/link';
32
- const link = exports.link = {
33
- name,
34
- title: (0, _i18n.__)('Link'),
35
- tagName: 'a',
36
- className: null,
37
- attributes: {
38
- url: 'href',
39
- target: 'target',
40
- rel: 'rel'
41
- },
42
- edit: (0, _components.withSpokenMessages)(class LinkEdit extends _element.Component {
43
- constructor() {
44
- super(...arguments);
45
- this.addLink = this.addLink.bind(this);
46
- this.stopAddingLink = this.stopAddingLink.bind(this);
47
- this.onRemoveFormat = this.onRemoveFormat.bind(this);
48
- this.getURLFromClipboard = this.getURLFromClipboard.bind(this);
49
- this.state = {
50
- addingLink: false
51
- };
52
- }
53
- addLink() {
54
- const {
55
- value,
56
- onChange
57
- } = this.props;
58
- const text = (0, _richText.getTextContent)((0, _richText.slice)(value));
59
- if (text && (0, _url.isURL)(text) && (0, _utils.isValidHref)(text)) {
60
- const newValue = (0, _richText.applyFormat)(value, {
61
- type: name,
62
- attributes: {
63
- url: text
64
- }
65
- });
66
- newValue.start = newValue.end;
67
- newValue.activeFormats = [];
68
- onChange({
69
- ...newValue,
70
- needsSelectionUpdate: true
71
- });
72
- } else {
73
- this.setState({
74
- addingLink: true
75
- });
76
- this.getURLFromClipboard();
77
- }
78
- }
79
- stopAddingLink() {
80
- this.setState({
81
- addingLink: false,
82
- clipboardURL: undefined
83
- });
84
- }
85
- getLinkSelection() {
86
- const {
87
- value,
88
- isActive
89
- } = this.props;
90
- const startFormat = (0, _richText.getActiveFormat)(value, 'core/link');
91
-
92
- // If the link isn't selected, get the link manually by looking around the cursor
93
- // TODO: handle partly selected links.
94
- if (startFormat && (0, _richText.isCollapsed)(value) && isActive) {
95
- let startIndex = value.start;
96
- let endIndex = value.end;
97
- while (value.formats[startIndex]?.find(format => format?.type === startFormat.type)) {
98
- startIndex--;
99
- }
100
- endIndex++;
101
- while (value.formats[endIndex]?.find(format => format?.type === startFormat.type)) {
102
- endIndex++;
103
- }
104
- return {
105
- ...value,
106
- start: startIndex + 1,
107
- end: endIndex
108
- };
109
- }
110
- return value;
111
- }
112
- onRemoveFormat() {
113
- const {
114
- onChange,
115
- speak,
116
- value
117
- } = this.props;
118
- const startFormat = (0, _richText.getActiveFormat)(value, 'core/link');
119
-
120
- // Before we try to remove anything we check if there is something at the caret position to remove.
121
- if ((0, _richText.isCollapsed)(value) && startFormat === undefined) {
122
- return;
123
- }
124
- const linkSelection = this.getLinkSelection();
125
- onChange((0, _richText.removeFormat)(linkSelection, name));
126
- speak((0, _i18n.__)('Link removed.'), 'assertive');
127
- }
128
- async getURLFromClipboard() {
129
- const clipboardText = await _clipboard.default.getString();
130
- if (!clipboardText) {
131
- return;
132
- }
133
- // Check if pasted text is URL.
134
- if (!(0, _url.isURL)(clipboardText)) {
135
- return;
136
- }
137
- this.setState({
138
- clipboardURL: clipboardText
139
- });
140
- }
141
- render() {
142
- const {
143
- isActive,
144
- activeAttributes,
145
- onChange
146
- } = this.props;
147
- const linkSelection = this.getLinkSelection();
148
- // If no URL is set and we have a clipboard URL let's use it.
149
- if (!activeAttributes.url && this.state.clipboardURL) {
150
- activeAttributes.url = this.state.clipboardURL;
151
- }
152
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
153
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_modal.default, {
154
- isVisible: this.state.addingLink,
155
- isActive: isActive,
156
- activeAttributes: activeAttributes,
157
- onClose: this.stopAddingLink,
158
- onChange: onChange,
159
- onRemove: this.onRemoveFormat,
160
- value: linkSelection
161
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_blockEditor.RichTextToolbarButton, {
162
- name: "link",
163
- icon: _icons.link,
164
- title: (0, _i18n.__)('Link'),
165
- onClick: this.addLink,
166
- isActive: isActive,
167
- shortcutType: "primary",
168
- shortcutCharacter: "k"
169
- })]
170
- });
171
- }
172
- })
173
- };
174
- //# sourceMappingURL=index.native.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_clipboard","_interopRequireDefault","require","_i18n","_element","_components","_blockEditor","_richText","_url","_icons","_modal","_utils","_jsxRuntime","name","link","exports","title","__","tagName","className","attributes","url","target","rel","edit","withSpokenMessages","LinkEdit","Component","constructor","arguments","addLink","bind","stopAddingLink","onRemoveFormat","getURLFromClipboard","state","addingLink","value","onChange","props","text","getTextContent","slice","isURL","isValidHref","newValue","applyFormat","type","start","end","activeFormats","needsSelectionUpdate","setState","clipboardURL","undefined","getLinkSelection","isActive","startFormat","getActiveFormat","isCollapsed","startIndex","endIndex","formats","find","format","speak","linkSelection","removeFormat","clipboardText","Clipboard","getString","render","activeAttributes","jsxs","Fragment","children","jsx","default","isVisible","onClose","onRemove","RichTextToolbarButton","icon","linkIcon","onClick","shortcutType","shortcutCharacter"],"sources":["@wordpress/format-library/src/link/index.native.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport Clipboard from '@react-native-clipboard/clipboard';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { Component } from '@wordpress/element';\nimport { withSpokenMessages } from '@wordpress/components';\nimport { RichTextToolbarButton } from '@wordpress/block-editor';\nimport {\n\tapplyFormat,\n\tgetActiveFormat,\n\tgetTextContent,\n\tisCollapsed,\n\tremoveFormat,\n\tslice,\n} from '@wordpress/rich-text';\nimport { isURL } from '@wordpress/url';\nimport { link as linkIcon } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport ModalLinkUI from './modal';\nimport { isValidHref } from './utils';\n\nconst name = 'core/link';\n\nexport const link = {\n\tname,\n\ttitle: __( 'Link' ),\n\ttagName: 'a',\n\tclassName: null,\n\tattributes: {\n\t\turl: 'href',\n\t\ttarget: 'target',\n\t\trel: 'rel',\n\t},\n\tedit: withSpokenMessages(\n\t\tclass LinkEdit extends Component {\n\t\t\tconstructor() {\n\t\t\t\tsuper( ...arguments );\n\n\t\t\t\tthis.addLink = this.addLink.bind( this );\n\t\t\t\tthis.stopAddingLink = this.stopAddingLink.bind( this );\n\t\t\t\tthis.onRemoveFormat = this.onRemoveFormat.bind( this );\n\t\t\t\tthis.getURLFromClipboard =\n\t\t\t\t\tthis.getURLFromClipboard.bind( this );\n\t\t\t\tthis.state = {\n\t\t\t\t\taddingLink: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\taddLink() {\n\t\t\t\tconst { value, onChange } = this.props;\n\t\t\t\tconst text = getTextContent( slice( value ) );\n\n\t\t\t\tif ( text && isURL( text ) && isValidHref( text ) ) {\n\t\t\t\t\tconst newValue = applyFormat( value, {\n\t\t\t\t\t\ttype: name,\n\t\t\t\t\t\tattributes: { url: text },\n\t\t\t\t\t} );\n\t\t\t\t\tnewValue.start = newValue.end;\n\t\t\t\t\tnewValue.activeFormats = [];\n\t\t\t\t\tonChange( { ...newValue, needsSelectionUpdate: true } );\n\t\t\t\t} else {\n\t\t\t\t\tthis.setState( { addingLink: true } );\n\t\t\t\t\tthis.getURLFromClipboard();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstopAddingLink() {\n\t\t\t\tthis.setState( { addingLink: false, clipboardURL: undefined } );\n\t\t\t}\n\n\t\t\tgetLinkSelection() {\n\t\t\t\tconst { value, isActive } = this.props;\n\t\t\t\tconst startFormat = getActiveFormat( value, 'core/link' );\n\n\t\t\t\t// If the link isn't selected, get the link manually by looking around the cursor\n\t\t\t\t// TODO: handle partly selected links.\n\t\t\t\tif ( startFormat && isCollapsed( value ) && isActive ) {\n\t\t\t\t\tlet startIndex = value.start;\n\t\t\t\t\tlet endIndex = value.end;\n\n\t\t\t\t\twhile (\n\t\t\t\t\t\tvalue.formats[ startIndex ]?.find(\n\t\t\t\t\t\t\t( format ) => format?.type === startFormat.type\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tstartIndex--;\n\t\t\t\t\t}\n\n\t\t\t\t\tendIndex++;\n\n\t\t\t\t\twhile (\n\t\t\t\t\t\tvalue.formats[ endIndex ]?.find(\n\t\t\t\t\t\t\t( format ) => format?.type === startFormat.type\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tendIndex++;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\tstart: startIndex + 1,\n\t\t\t\t\t\tend: endIndex,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tonRemoveFormat() {\n\t\t\t\tconst { onChange, speak, value } = this.props;\n\t\t\t\tconst startFormat = getActiveFormat( value, 'core/link' );\n\n\t\t\t\t// Before we try to remove anything we check if there is something at the caret position to remove.\n\t\t\t\tif ( isCollapsed( value ) && startFormat === undefined ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst linkSelection = this.getLinkSelection();\n\n\t\t\t\tonChange( removeFormat( linkSelection, name ) );\n\t\t\t\tspeak( __( 'Link removed.' ), 'assertive' );\n\t\t\t}\n\n\t\t\tasync getURLFromClipboard() {\n\t\t\t\tconst clipboardText = await Clipboard.getString();\n\t\t\t\tif ( ! clipboardText ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Check if pasted text is URL.\n\t\t\t\tif ( ! isURL( clipboardText ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.setState( { clipboardURL: clipboardText } );\n\t\t\t}\n\n\t\t\trender() {\n\t\t\t\tconst { isActive, activeAttributes, onChange } = this.props;\n\t\t\t\tconst linkSelection = this.getLinkSelection();\n\t\t\t\t// If no URL is set and we have a clipboard URL let's use it.\n\t\t\t\tif ( ! activeAttributes.url && this.state.clipboardURL ) {\n\t\t\t\t\tactiveAttributes.url = this.state.clipboardURL;\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ModalLinkUI\n\t\t\t\t\t\t\tisVisible={ this.state.addingLink }\n\t\t\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\t\t\tactiveAttributes={ activeAttributes }\n\t\t\t\t\t\t\tonClose={ this.stopAddingLink }\n\t\t\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\t\t\tonRemove={ this.onRemoveFormat }\n\t\t\t\t\t\t\tvalue={ linkSelection }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\t\t\tname=\"link\"\n\t\t\t\t\t\t\ticon={ linkIcon }\n\t\t\t\t\t\t\ttitle={ __( 'Link' ) }\n\t\t\t\t\t\t\tonClick={ this.addLink }\n\t\t\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\t\t\tshortcutType=\"primary\"\n\t\t\t\t\t\t\tshortcutCharacter=\"k\"\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}\n\t),\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,67 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- var _reactNative = require("react-native");
9
- var _native = require("@react-navigation/native");
10
- var _element = require("@wordpress/element");
11
- var _components = require("@wordpress/components");
12
- var _screens = _interopRequireDefault(require("./screens"));
13
- var _jsxRuntime = require("react/jsx-runtime");
14
- /**
15
- * External dependencies
16
- */
17
-
18
- /**
19
- * WordPress dependencies
20
- */
21
-
22
- /**
23
- * Internal dependencies
24
- */
25
-
26
- const LinkPickerScreen = () => {
27
- const navigation = (0, _native.useNavigation)();
28
- const route = (0, _native.useRoute)();
29
- const navigateToLinkTimeoutRef = (0, _element.useRef)(null);
30
- const navigateBackTimeoutRef = (0, _element.useRef)(null);
31
- const onLinkPicked = ({
32
- url,
33
- title
34
- }) => {
35
- _reactNative.Keyboard.dismiss();
36
- navigateToLinkTimeoutRef.current = setTimeout(() => {
37
- navigation.navigate(_screens.default.settings, {
38
- inputValue: url,
39
- text: title
40
- });
41
- }, 100);
42
- };
43
- const onCancel = () => {
44
- _reactNative.Keyboard.dismiss();
45
- navigateBackTimeoutRef.current = setTimeout(() => {
46
- navigation.goBack();
47
- }, 100);
48
- };
49
- (0, _element.useEffect)(() => {
50
- return () => {
51
- clearTimeout(navigateToLinkTimeoutRef.current);
52
- clearTimeout(navigateBackTimeoutRef.current);
53
- };
54
- }, []);
55
- const {
56
- inputValue
57
- } = route.params;
58
- return (0, _element.useMemo)(() => {
59
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.LinkPicker, {
60
- value: inputValue,
61
- onLinkPicked: onLinkPicked,
62
- onCancel: onCancel
63
- });
64
- }, [inputValue]);
65
- };
66
- var _default = exports.default = LinkPickerScreen;
67
- //# sourceMappingURL=link-picker-screen.native.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_reactNative","require","_native","_element","_components","_screens","_interopRequireDefault","_jsxRuntime","LinkPickerScreen","navigation","useNavigation","route","useRoute","navigateToLinkTimeoutRef","useRef","navigateBackTimeoutRef","onLinkPicked","url","title","Keyboard","dismiss","current","setTimeout","navigate","linkSettingsScreens","settings","inputValue","text","onCancel","goBack","useEffect","clearTimeout","params","useMemo","jsx","LinkPicker","value","_default","exports","default"],"sources":["@wordpress/format-library/src/link/modal-screens/link-picker-screen.native.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport { Keyboard } from 'react-native';\nimport { useNavigation, useRoute } from '@react-navigation/native';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useMemo, useRef } from '@wordpress/element';\n\nimport { LinkPicker } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport linkSettingsScreens from './screens';\n\nconst LinkPickerScreen = () => {\n\tconst navigation = useNavigation();\n\tconst route = useRoute();\n\tconst navigateToLinkTimeoutRef = useRef( null );\n\tconst navigateBackTimeoutRef = useRef( null );\n\n\tconst onLinkPicked = ( { url, title } ) => {\n\t\tKeyboard.dismiss();\n\t\tnavigateToLinkTimeoutRef.current = setTimeout( () => {\n\t\t\tnavigation.navigate( linkSettingsScreens.settings, {\n\t\t\t\tinputValue: url,\n\t\t\t\ttext: title,\n\t\t\t} );\n\t\t}, 100 );\n\t};\n\n\tconst onCancel = () => {\n\t\tKeyboard.dismiss();\n\t\tnavigateBackTimeoutRef.current = setTimeout( () => {\n\t\t\tnavigation.goBack();\n\t\t}, 100 );\n\t};\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tclearTimeout( navigateToLinkTimeoutRef.current );\n\t\t\tclearTimeout( navigateBackTimeoutRef.current );\n\t\t};\n\t}, [] );\n\n\tconst { inputValue } = route.params;\n\treturn useMemo( () => {\n\t\treturn (\n\t\t\t<LinkPicker\n\t\t\t\tvalue={ inputValue }\n\t\t\t\tonLinkPicked={ onLinkPicked }\n\t\t\t\tonCancel={ onCancel }\n\t\t\t/>\n\t\t);\n\t}, [ inputValue ] );\n};\n\nexport default LinkPickerScreen;\n"],"mappings":";;;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAKA,IAAAE,QAAA,GAAAF,OAAA;AAEA,IAAAG,WAAA,GAAAH,OAAA;AAKA,IAAAI,QAAA,GAAAC,sBAAA,CAAAL,OAAA;AAA4C,IAAAM,WAAA,GAAAN,OAAA;AAhB5C;AACA;AACA;;AAIA;AACA;AACA;;AAKA;AACA;AACA;;AAGA,MAAMO,gBAAgB,GAAGA,CAAA,KAAM;EAC9B,MAAMC,UAAU,GAAG,IAAAC,qBAAa,EAAC,CAAC;EAClC,MAAMC,KAAK,GAAG,IAAAC,gBAAQ,EAAC,CAAC;EACxB,MAAMC,wBAAwB,GAAG,IAAAC,eAAM,EAAE,IAAK,CAAC;EAC/C,MAAMC,sBAAsB,GAAG,IAAAD,eAAM,EAAE,IAAK,CAAC;EAE7C,MAAME,YAAY,GAAGA,CAAE;IAAEC,GAAG;IAAEC;EAAM,CAAC,KAAM;IAC1CC,qBAAQ,CAACC,OAAO,CAAC,CAAC;IAClBP,wBAAwB,CAACQ,OAAO,GAAGC,UAAU,CAAE,MAAM;MACpDb,UAAU,CAACc,QAAQ,CAAEC,gBAAmB,CAACC,QAAQ,EAAE;QAClDC,UAAU,EAAET,GAAG;QACfU,IAAI,EAAET;MACP,CAAE,CAAC;IACJ,CAAC,EAAE,GAAI,CAAC;EACT,CAAC;EAED,MAAMU,QAAQ,GAAGA,CAAA,KAAM;IACtBT,qBAAQ,CAACC,OAAO,CAAC,CAAC;IAClBL,sBAAsB,CAACM,OAAO,GAAGC,UAAU,CAAE,MAAM;MAClDb,UAAU,CAACoB,MAAM,CAAC,CAAC;IACpB,CAAC,EAAE,GAAI,CAAC;EACT,CAAC;EAED,IAAAC,kBAAS,EAAE,MAAM;IAChB,OAAO,MAAM;MACZC,YAAY,CAAElB,wBAAwB,CAACQ,OAAQ,CAAC;MAChDU,YAAY,CAAEhB,sBAAsB,CAACM,OAAQ,CAAC;IAC/C,CAAC;EACF,CAAC,EAAE,EAAG,CAAC;EAEP,MAAM;IAAEK;EAAW,CAAC,GAAGf,KAAK,CAACqB,MAAM;EACnC,OAAO,IAAAC,gBAAO,EAAE,MAAM;IACrB,oBACC,IAAA1B,WAAA,CAAA2B,GAAA,EAAC9B,WAAA,CAAA+B,UAAU;MACVC,KAAK,EAAGV,UAAY;MACpBV,YAAY,EAAGA,YAAc;MAC7BY,QAAQ,EAAGA;IAAU,CACrB,CAAC;EAEJ,CAAC,EAAE,CAAEF,UAAU,CAAG,CAAC;AACpB,CAAC;AAAC,IAAAW,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa/B,gBAAgB","ignoreList":[]}