@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
@@ -1,25 +1,50 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { useMemo, createInterpolateElement } from '@wordpress/element';
5
- import { __, sprintf } from '@wordpress/i18n';
6
- import { speak } from '@wordpress/a11y';
7
- import { Popover } from '@wordpress/components';
8
- import { prependHTTP } from '@wordpress/url';
9
- import { create, insert, isCollapsed, applyFormat, removeFormat, slice, replace, split, concat, useAnchor } from '@wordpress/rich-text';
10
- import { LinkControl, store as blockEditorStore } from '@wordpress/block-editor';
11
- import { useDispatch, useSelect } from '@wordpress/data';
12
-
13
- /**
14
- * Internal dependencies
15
- */
16
- import { createLinkFormat, isValidHref, getFormatBoundary } from './utils';
17
- import { link as settings } from './index';
18
- import { jsx as _jsx } from "react/jsx-runtime";
19
- const LINK_SETTINGS = [...LinkControl.DEFAULT_LINK_SETTINGS, {
20
- id: 'nofollow',
21
- title: __('Mark as nofollow')
22
- }];
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useMemo, createInterpolateElement } from "@wordpress/element";
3
+ import { __, sprintf } from "@wordpress/i18n";
4
+ import { speak } from "@wordpress/a11y";
5
+ import { Popover } from "@wordpress/components";
6
+ import { prependHTTP } from "@wordpress/url";
7
+ import {
8
+ create,
9
+ insert,
10
+ isCollapsed,
11
+ applyFormat,
12
+ removeFormat,
13
+ slice,
14
+ replace,
15
+ split,
16
+ concat,
17
+ useAnchor
18
+ } from "@wordpress/rich-text";
19
+ import {
20
+ LinkControl,
21
+ store as blockEditorStore
22
+ } from "@wordpress/block-editor";
23
+ import { useDispatch, useSelect } from "@wordpress/data";
24
+ import { createLinkFormat, isValidHref, getFormatBoundary } from "./utils";
25
+ import { link as settings } from "./index";
26
+ import CSSClassesSettingComponent from "./css-classes-setting";
27
+ const LINK_SETTINGS = [
28
+ ...LinkControl.DEFAULT_LINK_SETTINGS,
29
+ {
30
+ id: "nofollow",
31
+ title: __("Mark as nofollow")
32
+ },
33
+ {
34
+ id: "cssClasses",
35
+ title: __("Additional CSS class(es)"),
36
+ render: (setting, value, onChange) => {
37
+ return /* @__PURE__ */ jsx(
38
+ CSSClassesSettingComponent,
39
+ {
40
+ setting,
41
+ value,
42
+ onChange
43
+ }
44
+ );
45
+ }
46
+ }
47
+ ];
23
48
  function InlineLinkUI({
24
49
  isActive,
25
50
  activeAttributes,
@@ -31,47 +56,49 @@ function InlineLinkUI({
31
56
  focusOnMount
32
57
  }) {
33
58
  const richLinkTextValue = getRichTextValueFromSelection(value, isActive);
34
-
35
- // Get the text content minus any HTML tags.
36
59
  const richTextText = richLinkTextValue.text;
37
- const {
38
- selectionChange
39
- } = useDispatch(blockEditorStore);
40
- const {
41
- createPageEntity,
42
- userCanCreatePages,
43
- selectionStart
44
- } = useSelect(select => {
45
- const {
46
- getSettings,
47
- getSelectionStart
48
- } = select(blockEditorStore);
49
- const _settings = getSettings();
50
- return {
51
- createPageEntity: _settings.__experimentalCreatePageEntity,
52
- userCanCreatePages: _settings.__experimentalUserCanCreatePages,
53
- selectionStart: getSelectionStart()
54
- };
55
- }, []);
56
- const linkValue = useMemo(() => ({
57
- url: activeAttributes.url,
58
- type: activeAttributes.type,
59
- id: activeAttributes.id,
60
- opensInNewTab: activeAttributes.target === '_blank',
61
- nofollow: activeAttributes.rel?.includes('nofollow'),
62
- title: richTextText
63
- }), [activeAttributes.id, activeAttributes.rel, activeAttributes.target, activeAttributes.type, activeAttributes.url, richTextText]);
60
+ const { selectionChange } = useDispatch(blockEditorStore);
61
+ const { createPageEntity, userCanCreatePages, selectionStart } = useSelect(
62
+ (select) => {
63
+ const { getSettings, getSelectionStart } = select(blockEditorStore);
64
+ const _settings = getSettings();
65
+ return {
66
+ createPageEntity: _settings.__experimentalCreatePageEntity,
67
+ userCanCreatePages: _settings.__experimentalUserCanCreatePages,
68
+ selectionStart: getSelectionStart()
69
+ };
70
+ },
71
+ []
72
+ );
73
+ const linkValue = useMemo(
74
+ () => ({
75
+ url: activeAttributes.url,
76
+ type: activeAttributes.type,
77
+ id: activeAttributes.id,
78
+ opensInNewTab: activeAttributes.target === "_blank",
79
+ nofollow: activeAttributes.rel?.includes("nofollow"),
80
+ title: richTextText,
81
+ cssClasses: activeAttributes.class
82
+ }),
83
+ [
84
+ activeAttributes.class,
85
+ activeAttributes.id,
86
+ activeAttributes.rel,
87
+ activeAttributes.target,
88
+ activeAttributes.type,
89
+ activeAttributes.url,
90
+ richTextText
91
+ ]
92
+ );
64
93
  function removeLink() {
65
- const newValue = removeFormat(value, 'core/link');
94
+ const newValue = removeFormat(value, "core/link");
66
95
  onChange(newValue);
67
96
  stopAddingLink();
68
- speak(__('Link removed.'), 'assertive');
97
+ speak(__("Link removed."), "assertive");
69
98
  }
70
99
  function onChangeLink(nextValue) {
71
100
  const hasLink = linkValue?.url;
72
101
  const isNewLink = !hasLink;
73
-
74
- // Merge the next value with the current link value.
75
102
  nextValue = {
76
103
  ...linkValue,
77
104
  ...nextValue
@@ -80,25 +107,23 @@ function InlineLinkUI({
80
107
  const linkFormat = createLinkFormat({
81
108
  url: newUrl,
82
109
  type: nextValue.type,
83
- id: nextValue.id !== undefined && nextValue.id !== null ? String(nextValue.id) : undefined,
110
+ id: nextValue.id !== void 0 && nextValue.id !== null ? String(nextValue.id) : void 0,
84
111
  opensInNewWindow: nextValue.opensInNewTab,
85
- nofollow: nextValue.nofollow
112
+ nofollow: nextValue.nofollow,
113
+ cssClasses: nextValue.cssClasses
86
114
  });
87
115
  const newText = nextValue.title || newUrl;
88
-
89
- // Scenario: we have any active text selection or an active format.
90
116
  let newValue;
91
117
  if (isCollapsed(value) && !isActive) {
92
- // Scenario: we don't have any actively selected text or formats.
93
118
  const inserted = insert(value, newText);
94
- newValue = applyFormat(inserted, linkFormat, value.start, value.start + newText.length);
119
+ newValue = applyFormat(
120
+ inserted,
121
+ linkFormat,
122
+ value.start,
123
+ value.start + newText.length
124
+ );
95
125
  onChange(newValue);
96
-
97
- // Close the Link UI.
98
126
  stopAddingLink();
99
-
100
- // Move the selection to the end of the inserted link outside of the format boundary
101
- // so the user can continue typing after the link.
102
127
  selectionChange({
103
128
  clientId: selectionStart.clientId,
104
129
  identifier: selectionStart.attributeKey,
@@ -108,58 +133,34 @@ function InlineLinkUI({
108
133
  } else if (newText === richTextText) {
109
134
  newValue = applyFormat(value, linkFormat);
110
135
  } else {
111
- // Scenario: Editing an existing link.
112
-
113
- // Create new RichText value for the new text in order that we
114
- // can apply formats to it.
115
- newValue = create({
116
- text: newText
117
- });
118
- // Apply the new Link format to this new text value.
136
+ newValue = create({ text: newText });
119
137
  newValue = applyFormat(newValue, linkFormat, 0, newText.length);
120
-
121
- // Get the boundaries of the active link format.
122
138
  const boundary = getFormatBoundary(value, {
123
- type: 'core/link'
139
+ type: "core/link"
124
140
  });
125
-
126
- // Split the value at the start of the active link format.
127
- // Passing "start" as the 3rd parameter is required to ensure
128
- // the second half of the split value is split at the format's
129
- // start boundary and avoids relying on the value's "end" property
130
- // which may not correspond correctly.
131
- const [valBefore, valAfter] = split(value, boundary.start, boundary.start);
132
-
133
- // Update the original (full) RichTextValue replacing the
134
- // target text with the *new* RichTextValue containing:
135
- // 1. The new text content.
136
- // 2. The new link format.
137
- // As "replace" will operate on the first match only, it is
138
- // run only against the second half of the value which was
139
- // split at the active format's boundary. This avoids a bug
140
- // with incorrectly targeted replacements.
141
- // See: https://github.com/WordPress/gutenberg/issues/41771.
142
- // Note original formats will be lost when applying this change.
143
- // That is expected behaviour.
144
- // See: https://github.com/WordPress/gutenberg/pull/33849#issuecomment-936134179.
141
+ const [valBefore, valAfter] = split(
142
+ value,
143
+ boundary.start,
144
+ boundary.start
145
+ );
145
146
  const newValAfter = replace(valAfter, richTextText, newValue);
146
147
  newValue = concat(valBefore, newValAfter);
147
148
  }
148
149
  onChange(newValue);
149
-
150
- // Focus should only be returned to the rich text on submit if this link is not
151
- // being created for the first time. If it is then focus should remain within the
152
- // Link UI because it should remain open for the user to modify the link they have
153
- // just created.
154
150
  if (!isNewLink) {
155
151
  stopAddingLink();
156
152
  }
157
153
  if (!isValidHref(newUrl)) {
158
- speak(__('Warning: the link has been inserted but may have errors. Please test it.'), 'assertive');
154
+ speak(
155
+ __(
156
+ "Warning: the link has been inserted but may have errors. Please test it."
157
+ ),
158
+ "assertive"
159
+ );
159
160
  } else if (isActive) {
160
- speak(__('Link edited.'), 'assertive');
161
+ speak(__("Link edited."), "assertive");
161
162
  } else {
162
- speak(__('Link inserted.'), 'assertive');
163
+ speak(__("Link inserted."), "assertive");
163
164
  }
164
165
  }
165
166
  const popoverAnchor = useAnchor({
@@ -172,75 +173,78 @@ function InlineLinkUI({
172
173
  async function handleCreate(pageTitle) {
173
174
  const page = await createPageEntity({
174
175
  title: pageTitle,
175
- status: 'draft'
176
+ status: "draft"
176
177
  });
177
178
  return {
178
179
  id: page.id,
179
180
  type: page.type,
180
181
  title: page.title.rendered,
181
182
  url: page.link,
182
- kind: 'post-type'
183
+ kind: "post-type"
183
184
  };
184
185
  }
185
186
  function createButtonText(searchTerm) {
186
- return createInterpolateElement(sprintf(/* translators: %s: search term. */
187
- __('Create page: <mark>%s</mark>'), searchTerm), {
188
- mark: /*#__PURE__*/_jsx("mark", {})
189
- });
187
+ return createInterpolateElement(
188
+ sprintf(
189
+ /* translators: %s: search term. */
190
+ __("Create page: <mark>%s</mark>"),
191
+ searchTerm
192
+ ),
193
+ { mark: /* @__PURE__ */ jsx("mark", {}) }
194
+ );
190
195
  }
191
- return /*#__PURE__*/_jsx(Popover, {
192
- anchor: popoverAnchor,
193
- animate: false,
194
- onClose: stopAddingLink,
195
- onFocusOutside: onFocusOutside,
196
- placement: "bottom",
197
- offset: 8,
198
- shift: true,
199
- focusOnMount: focusOnMount,
200
- constrainTabbing: true,
201
- children: /*#__PURE__*/_jsx(LinkControl, {
202
- value: linkValue,
203
- onChange: onChangeLink,
204
- onRemove: removeLink,
205
- hasRichPreviews: true,
206
- createSuggestion: createPageEntity && handleCreate,
207
- withCreateSuggestion: userCanCreatePages,
208
- createSuggestionButtonText: createButtonText,
209
- hasTextControl: true,
210
- settings: LINK_SETTINGS,
211
- showInitialSuggestions: true,
212
- suggestionsQuery: {
213
- // always show Pages as initial suggestions
214
- initialSuggestionsSearchOptions: {
215
- type: 'post',
216
- subtype: 'page',
217
- perPage: 20
196
+ return /* @__PURE__ */ jsx(
197
+ Popover,
198
+ {
199
+ anchor: popoverAnchor,
200
+ animate: false,
201
+ onClose: stopAddingLink,
202
+ onFocusOutside,
203
+ placement: "bottom",
204
+ offset: 8,
205
+ shift: true,
206
+ focusOnMount,
207
+ constrainTabbing: true,
208
+ children: /* @__PURE__ */ jsx(
209
+ LinkControl,
210
+ {
211
+ value: linkValue,
212
+ onChange: onChangeLink,
213
+ onRemove: removeLink,
214
+ hasRichPreviews: true,
215
+ createSuggestion: createPageEntity && handleCreate,
216
+ withCreateSuggestion: userCanCreatePages,
217
+ createSuggestionButtonText: createButtonText,
218
+ hasTextControl: true,
219
+ settings: LINK_SETTINGS,
220
+ showInitialSuggestions: true,
221
+ suggestionsQuery: {
222
+ // always show Pages as initial suggestions
223
+ initialSuggestionsSearchOptions: {
224
+ type: "post",
225
+ subtype: "page",
226
+ perPage: 20
227
+ }
228
+ }
218
229
  }
219
- }
220
- })
221
- });
230
+ )
231
+ }
232
+ );
222
233
  }
223
234
  function getRichTextValueFromSelection(value, isActive) {
224
- // Default to the selection ranges on the RichTextValue object.
225
235
  let textStart = value.start;
226
236
  let textEnd = value.end;
227
-
228
- // If the format is currently active then the rich text value
229
- // should always be taken from the bounds of the active format
230
- // and not the selected text.
231
237
  if (isActive) {
232
238
  const boundary = getFormatBoundary(value, {
233
- type: 'core/link'
239
+ type: "core/link"
234
240
  });
235
241
  textStart = boundary.start;
236
-
237
- // Text *selection* always extends +1 beyond the edge of the format.
238
- // We account for that here.
239
242
  textEnd = boundary.end + 1;
240
243
  }
241
-
242
- // Get a RichTextValue containing the selected text content.
243
244
  return slice(value, textStart, textEnd);
244
245
  }
245
- export default InlineLinkUI;
246
- //# sourceMappingURL=inline.js.map
246
+ var inline_default = InlineLinkUI;
247
+ export {
248
+ inline_default as default
249
+ };
250
+ //# sourceMappingURL=inline.js.map
@@ -1 +1,7 @@
1
- {"version":3,"names":["useMemo","createInterpolateElement","__","sprintf","speak","Popover","prependHTTP","create","insert","isCollapsed","applyFormat","removeFormat","slice","replace","split","concat","useAnchor","LinkControl","store","blockEditorStore","useDispatch","useSelect","createLinkFormat","isValidHref","getFormatBoundary","link","settings","jsx","_jsx","LINK_SETTINGS","DEFAULT_LINK_SETTINGS","id","title","InlineLinkUI","isActive","activeAttributes","value","onChange","onFocusOutside","stopAddingLink","contentRef","focusOnMount","richLinkTextValue","getRichTextValueFromSelection","richTextText","text","selectionChange","createPageEntity","userCanCreatePages","selectionStart","select","getSettings","getSelectionStart","_settings","__experimentalCreatePageEntity","__experimentalUserCanCreatePages","linkValue","url","type","opensInNewTab","target","nofollow","rel","includes","removeLink","newValue","onChangeLink","nextValue","hasLink","isNewLink","newUrl","linkFormat","undefined","String","opensInNewWindow","newText","inserted","start","length","clientId","identifier","attributeKey","boundary","valBefore","valAfter","newValAfter","popoverAnchor","editableContentElement","current","handleCreate","pageTitle","page","status","rendered","kind","createButtonText","searchTerm","mark","anchor","animate","onClose","placement","offset","shift","constrainTabbing","children","onRemove","hasRichPreviews","createSuggestion","withCreateSuggestion","createSuggestionButtonText","hasTextControl","showInitialSuggestions","suggestionsQuery","initialSuggestionsSearchOptions","subtype","perPage","textStart","textEnd","end"],"sources":["@wordpress/format-library/src/link/inline.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useMemo, createInterpolateElement } from '@wordpress/element';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { speak } from '@wordpress/a11y';\nimport { Popover } from '@wordpress/components';\nimport { prependHTTP } from '@wordpress/url';\nimport {\n\tcreate,\n\tinsert,\n\tisCollapsed,\n\tapplyFormat,\n\tremoveFormat,\n\tslice,\n\treplace,\n\tsplit,\n\tconcat,\n\tuseAnchor,\n} from '@wordpress/rich-text';\nimport {\n\tLinkControl,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useDispatch, useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { createLinkFormat, isValidHref, getFormatBoundary } from './utils';\nimport { link as settings } from './index';\n\nconst LINK_SETTINGS = [\n\t...LinkControl.DEFAULT_LINK_SETTINGS,\n\t{\n\t\tid: 'nofollow',\n\t\ttitle: __( 'Mark as nofollow' ),\n\t},\n];\n\nfunction InlineLinkUI( {\n\tisActive,\n\tactiveAttributes,\n\tvalue,\n\tonChange,\n\tonFocusOutside,\n\tstopAddingLink,\n\tcontentRef,\n\tfocusOnMount,\n} ) {\n\tconst richLinkTextValue = getRichTextValueFromSelection( value, isActive );\n\n\t// Get the text content minus any HTML tags.\n\tconst richTextText = richLinkTextValue.text;\n\n\tconst { selectionChange } = useDispatch( blockEditorStore );\n\n\tconst { createPageEntity, userCanCreatePages, selectionStart } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getSettings, getSelectionStart } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst _settings = getSettings();\n\n\t\t\treturn {\n\t\t\t\tcreatePageEntity: _settings.__experimentalCreatePageEntity,\n\t\t\t\tuserCanCreatePages: _settings.__experimentalUserCanCreatePages,\n\t\t\t\tselectionStart: getSelectionStart(),\n\t\t\t};\n\t\t},\n\t\t[]\n\t);\n\n\tconst linkValue = useMemo(\n\t\t() => ( {\n\t\t\turl: activeAttributes.url,\n\t\t\ttype: activeAttributes.type,\n\t\t\tid: activeAttributes.id,\n\t\t\topensInNewTab: activeAttributes.target === '_blank',\n\t\t\tnofollow: activeAttributes.rel?.includes( 'nofollow' ),\n\t\t\ttitle: richTextText,\n\t\t} ),\n\t\t[\n\t\t\tactiveAttributes.id,\n\t\t\tactiveAttributes.rel,\n\t\t\tactiveAttributes.target,\n\t\t\tactiveAttributes.type,\n\t\t\tactiveAttributes.url,\n\t\t\trichTextText,\n\t\t]\n\t);\n\n\tfunction removeLink() {\n\t\tconst newValue = removeFormat( value, 'core/link' );\n\t\tonChange( newValue );\n\t\tstopAddingLink();\n\t\tspeak( __( 'Link removed.' ), 'assertive' );\n\t}\n\n\tfunction onChangeLink( nextValue ) {\n\t\tconst hasLink = linkValue?.url;\n\t\tconst isNewLink = ! hasLink;\n\n\t\t// Merge the next value with the current link value.\n\t\tnextValue = {\n\t\t\t...linkValue,\n\t\t\t...nextValue,\n\t\t};\n\n\t\tconst newUrl = prependHTTP( nextValue.url );\n\t\tconst linkFormat = createLinkFormat( {\n\t\t\turl: newUrl,\n\t\t\ttype: nextValue.type,\n\t\t\tid:\n\t\t\t\tnextValue.id !== undefined && nextValue.id !== null\n\t\t\t\t\t? String( nextValue.id )\n\t\t\t\t\t: undefined,\n\t\t\topensInNewWindow: nextValue.opensInNewTab,\n\t\t\tnofollow: nextValue.nofollow,\n\t\t} );\n\n\t\tconst newText = nextValue.title || newUrl;\n\n\t\t// Scenario: we have any active text selection or an active format.\n\t\tlet newValue;\n\t\tif ( isCollapsed( value ) && ! isActive ) {\n\t\t\t// Scenario: we don't have any actively selected text or formats.\n\t\t\tconst inserted = insert( value, newText );\n\n\t\t\tnewValue = applyFormat(\n\t\t\t\tinserted,\n\t\t\t\tlinkFormat,\n\t\t\t\tvalue.start,\n\t\t\t\tvalue.start + newText.length\n\t\t\t);\n\n\t\t\tonChange( newValue );\n\n\t\t\t// Close the Link UI.\n\t\t\tstopAddingLink();\n\n\t\t\t// Move the selection to the end of the inserted link outside of the format boundary\n\t\t\t// so the user can continue typing after the link.\n\t\t\tselectionChange( {\n\t\t\t\tclientId: selectionStart.clientId,\n\t\t\t\tidentifier: selectionStart.attributeKey,\n\t\t\t\tstart: value.start + newText.length + 1,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t} else if ( newText === richTextText ) {\n\t\t\tnewValue = applyFormat( value, linkFormat );\n\t\t} else {\n\t\t\t// Scenario: Editing an existing link.\n\n\t\t\t// Create new RichText value for the new text in order that we\n\t\t\t// can apply formats to it.\n\t\t\tnewValue = create( { text: newText } );\n\t\t\t// Apply the new Link format to this new text value.\n\t\t\tnewValue = applyFormat( newValue, linkFormat, 0, newText.length );\n\n\t\t\t// Get the boundaries of the active link format.\n\t\t\tconst boundary = getFormatBoundary( value, {\n\t\t\t\ttype: 'core/link',\n\t\t\t} );\n\n\t\t\t// Split the value at the start of the active link format.\n\t\t\t// Passing \"start\" as the 3rd parameter is required to ensure\n\t\t\t// the second half of the split value is split at the format's\n\t\t\t// start boundary and avoids relying on the value's \"end\" property\n\t\t\t// which may not correspond correctly.\n\t\t\tconst [ valBefore, valAfter ] = split(\n\t\t\t\tvalue,\n\t\t\t\tboundary.start,\n\t\t\t\tboundary.start\n\t\t\t);\n\n\t\t\t// Update the original (full) RichTextValue replacing the\n\t\t\t// target text with the *new* RichTextValue containing:\n\t\t\t// 1. The new text content.\n\t\t\t// 2. The new link format.\n\t\t\t// As \"replace\" will operate on the first match only, it is\n\t\t\t// run only against the second half of the value which was\n\t\t\t// split at the active format's boundary. This avoids a bug\n\t\t\t// with incorrectly targeted replacements.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/41771.\n\t\t\t// Note original formats will be lost when applying this change.\n\t\t\t// That is expected behaviour.\n\t\t\t// See: https://github.com/WordPress/gutenberg/pull/33849#issuecomment-936134179.\n\t\t\tconst newValAfter = replace( valAfter, richTextText, newValue );\n\n\t\t\tnewValue = concat( valBefore, newValAfter );\n\t\t}\n\n\t\tonChange( newValue );\n\n\t\t// Focus should only be returned to the rich text on submit if this link is not\n\t\t// being created for the first time. If it is then focus should remain within the\n\t\t// Link UI because it should remain open for the user to modify the link they have\n\t\t// just created.\n\t\tif ( ! isNewLink ) {\n\t\t\tstopAddingLink();\n\t\t}\n\n\t\tif ( ! isValidHref( newUrl ) ) {\n\t\t\tspeak(\n\t\t\t\t__(\n\t\t\t\t\t'Warning: the link has been inserted but may have errors. Please test it.'\n\t\t\t\t),\n\t\t\t\t'assertive'\n\t\t\t);\n\t\t} else if ( isActive ) {\n\t\t\tspeak( __( 'Link edited.' ), 'assertive' );\n\t\t} else {\n\t\t\tspeak( __( 'Link inserted.' ), 'assertive' );\n\t\t}\n\t}\n\n\tconst popoverAnchor = useAnchor( {\n\t\teditableContentElement: contentRef.current,\n\t\tsettings: {\n\t\t\t...settings,\n\t\t\tisActive,\n\t\t},\n\t} );\n\n\tasync function handleCreate( pageTitle ) {\n\t\tconst page = await createPageEntity( {\n\t\t\ttitle: pageTitle,\n\t\t\tstatus: 'draft',\n\t\t} );\n\n\t\treturn {\n\t\t\tid: page.id,\n\t\t\ttype: page.type,\n\t\t\ttitle: page.title.rendered,\n\t\t\turl: page.link,\n\t\t\tkind: 'post-type',\n\t\t};\n\t}\n\n\tfunction createButtonText( searchTerm ) {\n\t\treturn createInterpolateElement(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %s: search term. */\n\t\t\t\t__( 'Create page: <mark>%s</mark>' ),\n\t\t\t\tsearchTerm\n\t\t\t),\n\t\t\t{ mark: <mark /> }\n\t\t);\n\t}\n\n\treturn (\n\t\t<Popover\n\t\t\tanchor={ popoverAnchor }\n\t\t\tanimate={ false }\n\t\t\tonClose={ stopAddingLink }\n\t\t\tonFocusOutside={ onFocusOutside }\n\t\t\tplacement=\"bottom\"\n\t\t\toffset={ 8 }\n\t\t\tshift\n\t\t\tfocusOnMount={ focusOnMount }\n\t\t\tconstrainTabbing\n\t\t>\n\t\t\t<LinkControl\n\t\t\t\tvalue={ linkValue }\n\t\t\t\tonChange={ onChangeLink }\n\t\t\t\tonRemove={ removeLink }\n\t\t\t\thasRichPreviews\n\t\t\t\tcreateSuggestion={ createPageEntity && handleCreate }\n\t\t\t\twithCreateSuggestion={ userCanCreatePages }\n\t\t\t\tcreateSuggestionButtonText={ createButtonText }\n\t\t\t\thasTextControl\n\t\t\t\tsettings={ LINK_SETTINGS }\n\t\t\t\tshowInitialSuggestions\n\t\t\t\tsuggestionsQuery={ {\n\t\t\t\t\t// always show Pages as initial suggestions\n\t\t\t\t\tinitialSuggestionsSearchOptions: {\n\t\t\t\t\t\ttype: 'post',\n\t\t\t\t\t\tsubtype: 'page',\n\t\t\t\t\t\tperPage: 20,\n\t\t\t\t\t},\n\t\t\t\t} }\n\t\t\t/>\n\t\t</Popover>\n\t);\n}\n\nfunction getRichTextValueFromSelection( value, isActive ) {\n\t// Default to the selection ranges on the RichTextValue object.\n\tlet textStart = value.start;\n\tlet textEnd = value.end;\n\n\t// If the format is currently active then the rich text value\n\t// should always be taken from the bounds of the active format\n\t// and not the selected text.\n\tif ( isActive ) {\n\t\tconst boundary = getFormatBoundary( value, {\n\t\t\ttype: 'core/link',\n\t\t} );\n\n\t\ttextStart = boundary.start;\n\n\t\t// Text *selection* always extends +1 beyond the edge of the format.\n\t\t// We account for that here.\n\t\ttextEnd = boundary.end + 1;\n\t}\n\n\t// Get a RichTextValue containing the selected text content.\n\treturn slice( value, textStart, textEnd );\n}\n\nexport default InlineLinkUI;\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/link/inline.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useMemo, createInterpolateElement } from '@wordpress/element';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { speak } from '@wordpress/a11y';\nimport { Popover } from '@wordpress/components';\nimport { prependHTTP } from '@wordpress/url';\nimport {\n\tcreate,\n\tinsert,\n\tisCollapsed,\n\tapplyFormat,\n\tremoveFormat,\n\tslice,\n\treplace,\n\tsplit,\n\tconcat,\n\tuseAnchor,\n} from '@wordpress/rich-text';\nimport {\n\tLinkControl,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useDispatch, useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { createLinkFormat, isValidHref, getFormatBoundary } from './utils';\nimport { link as settings } from './index';\nimport CSSClassesSettingComponent from './css-classes-setting';\n\n// CSSClassesSettingComponent moved to its own file and imported above.\n\nconst LINK_SETTINGS = [\n\t...LinkControl.DEFAULT_LINK_SETTINGS,\n\t{\n\t\tid: 'nofollow',\n\t\ttitle: __( 'Mark as nofollow' ),\n\t},\n\t{\n\t\tid: 'cssClasses',\n\t\ttitle: __( 'Additional CSS class(es)' ),\n\t\trender: ( setting, value, onChange ) => {\n\t\t\treturn (\n\t\t\t\t<CSSClassesSettingComponent\n\t\t\t\t\tsetting={ setting }\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t},\n];\n\nfunction InlineLinkUI( {\n\tisActive,\n\tactiveAttributes,\n\tvalue,\n\tonChange,\n\tonFocusOutside,\n\tstopAddingLink,\n\tcontentRef,\n\tfocusOnMount,\n} ) {\n\tconst richLinkTextValue = getRichTextValueFromSelection( value, isActive );\n\n\t// Get the text content minus any HTML tags.\n\tconst richTextText = richLinkTextValue.text;\n\n\tconst { selectionChange } = useDispatch( blockEditorStore );\n\n\tconst { createPageEntity, userCanCreatePages, selectionStart } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getSettings, getSelectionStart } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst _settings = getSettings();\n\n\t\t\treturn {\n\t\t\t\tcreatePageEntity: _settings.__experimentalCreatePageEntity,\n\t\t\t\tuserCanCreatePages: _settings.__experimentalUserCanCreatePages,\n\t\t\t\tselectionStart: getSelectionStart(),\n\t\t\t};\n\t\t},\n\t\t[]\n\t);\n\n\tconst linkValue = useMemo(\n\t\t() => ( {\n\t\t\turl: activeAttributes.url,\n\t\t\ttype: activeAttributes.type,\n\t\t\tid: activeAttributes.id,\n\t\t\topensInNewTab: activeAttributes.target === '_blank',\n\t\t\tnofollow: activeAttributes.rel?.includes( 'nofollow' ),\n\t\t\ttitle: richTextText,\n\t\t\tcssClasses: activeAttributes.class,\n\t\t} ),\n\t\t[\n\t\t\tactiveAttributes.class,\n\t\t\tactiveAttributes.id,\n\t\t\tactiveAttributes.rel,\n\t\t\tactiveAttributes.target,\n\t\t\tactiveAttributes.type,\n\t\t\tactiveAttributes.url,\n\t\t\trichTextText,\n\t\t]\n\t);\n\n\tfunction removeLink() {\n\t\tconst newValue = removeFormat( value, 'core/link' );\n\t\tonChange( newValue );\n\t\tstopAddingLink();\n\t\tspeak( __( 'Link removed.' ), 'assertive' );\n\t}\n\n\tfunction onChangeLink( nextValue ) {\n\t\tconst hasLink = linkValue?.url;\n\t\tconst isNewLink = ! hasLink;\n\n\t\t// Merge the next value with the current link value.\n\t\tnextValue = {\n\t\t\t...linkValue,\n\t\t\t...nextValue,\n\t\t};\n\n\t\tconst newUrl = prependHTTP( nextValue.url );\n\t\tconst linkFormat = createLinkFormat( {\n\t\t\turl: newUrl,\n\t\t\ttype: nextValue.type,\n\t\t\tid:\n\t\t\t\tnextValue.id !== undefined && nextValue.id !== null\n\t\t\t\t\t? String( nextValue.id )\n\t\t\t\t\t: undefined,\n\t\t\topensInNewWindow: nextValue.opensInNewTab,\n\t\t\tnofollow: nextValue.nofollow,\n\t\t\tcssClasses: nextValue.cssClasses,\n\t\t} );\n\n\t\tconst newText = nextValue.title || newUrl;\n\n\t\t// Scenario: we have any active text selection or an active format.\n\t\tlet newValue;\n\t\tif ( isCollapsed( value ) && ! isActive ) {\n\t\t\t// Scenario: we don't have any actively selected text or formats.\n\t\t\tconst inserted = insert( value, newText );\n\n\t\t\tnewValue = applyFormat(\n\t\t\t\tinserted,\n\t\t\t\tlinkFormat,\n\t\t\t\tvalue.start,\n\t\t\t\tvalue.start + newText.length\n\t\t\t);\n\n\t\t\tonChange( newValue );\n\n\t\t\t// Close the Link UI.\n\t\t\tstopAddingLink();\n\n\t\t\t// Move the selection to the end of the inserted link outside of the format boundary\n\t\t\t// so the user can continue typing after the link.\n\t\t\tselectionChange( {\n\t\t\t\tclientId: selectionStart.clientId,\n\t\t\t\tidentifier: selectionStart.attributeKey,\n\t\t\t\tstart: value.start + newText.length + 1,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t} else if ( newText === richTextText ) {\n\t\t\tnewValue = applyFormat( value, linkFormat );\n\t\t} else {\n\t\t\t// Scenario: Editing an existing link.\n\n\t\t\t// Create new RichText value for the new text in order that we\n\t\t\t// can apply formats to it.\n\t\t\tnewValue = create( { text: newText } );\n\t\t\t// Apply the new Link format to this new text value.\n\t\t\tnewValue = applyFormat( newValue, linkFormat, 0, newText.length );\n\n\t\t\t// Get the boundaries of the active link format.\n\t\t\tconst boundary = getFormatBoundary( value, {\n\t\t\t\ttype: 'core/link',\n\t\t\t} );\n\n\t\t\t// Split the value at the start of the active link format.\n\t\t\t// Passing \"start\" as the 3rd parameter is required to ensure\n\t\t\t// the second half of the split value is split at the format's\n\t\t\t// start boundary and avoids relying on the value's \"end\" property\n\t\t\t// which may not correspond correctly.\n\t\t\tconst [ valBefore, valAfter ] = split(\n\t\t\t\tvalue,\n\t\t\t\tboundary.start,\n\t\t\t\tboundary.start\n\t\t\t);\n\n\t\t\t// Update the original (full) RichTextValue replacing the\n\t\t\t// target text with the *new* RichTextValue containing:\n\t\t\t// 1. The new text content.\n\t\t\t// 2. The new link format.\n\t\t\t// As \"replace\" will operate on the first match only, it is\n\t\t\t// run only against the second half of the value which was\n\t\t\t// split at the active format's boundary. This avoids a bug\n\t\t\t// with incorrectly targeted replacements.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/41771.\n\t\t\t// Note original formats will be lost when applying this change.\n\t\t\t// That is expected behaviour.\n\t\t\t// See: https://github.com/WordPress/gutenberg/pull/33849#issuecomment-936134179.\n\t\t\tconst newValAfter = replace( valAfter, richTextText, newValue );\n\n\t\t\tnewValue = concat( valBefore, newValAfter );\n\t\t}\n\n\t\tonChange( newValue );\n\n\t\t// Focus should only be returned to the rich text on submit if this link is not\n\t\t// being created for the first time. If it is then focus should remain within the\n\t\t// Link UI because it should remain open for the user to modify the link they have\n\t\t// just created.\n\t\tif ( ! isNewLink ) {\n\t\t\tstopAddingLink();\n\t\t}\n\n\t\tif ( ! isValidHref( newUrl ) ) {\n\t\t\tspeak(\n\t\t\t\t__(\n\t\t\t\t\t'Warning: the link has been inserted but may have errors. Please test it.'\n\t\t\t\t),\n\t\t\t\t'assertive'\n\t\t\t);\n\t\t} else if ( isActive ) {\n\t\t\tspeak( __( 'Link edited.' ), 'assertive' );\n\t\t} else {\n\t\t\tspeak( __( 'Link inserted.' ), 'assertive' );\n\t\t}\n\t}\n\n\tconst popoverAnchor = useAnchor( {\n\t\teditableContentElement: contentRef.current,\n\t\tsettings: {\n\t\t\t...settings,\n\t\t\tisActive,\n\t\t},\n\t} );\n\n\tasync function handleCreate( pageTitle ) {\n\t\tconst page = await createPageEntity( {\n\t\t\ttitle: pageTitle,\n\t\t\tstatus: 'draft',\n\t\t} );\n\n\t\treturn {\n\t\t\tid: page.id,\n\t\t\ttype: page.type,\n\t\t\ttitle: page.title.rendered,\n\t\t\turl: page.link,\n\t\t\tkind: 'post-type',\n\t\t};\n\t}\n\n\tfunction createButtonText( searchTerm ) {\n\t\treturn createInterpolateElement(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %s: search term. */\n\t\t\t\t__( 'Create page: <mark>%s</mark>' ),\n\t\t\t\tsearchTerm\n\t\t\t),\n\t\t\t{ mark: <mark /> }\n\t\t);\n\t}\n\n\treturn (\n\t\t<Popover\n\t\t\tanchor={ popoverAnchor }\n\t\t\tanimate={ false }\n\t\t\tonClose={ stopAddingLink }\n\t\t\tonFocusOutside={ onFocusOutside }\n\t\t\tplacement=\"bottom\"\n\t\t\toffset={ 8 }\n\t\t\tshift\n\t\t\tfocusOnMount={ focusOnMount }\n\t\t\tconstrainTabbing\n\t\t>\n\t\t\t<LinkControl\n\t\t\t\tvalue={ linkValue }\n\t\t\t\tonChange={ onChangeLink }\n\t\t\t\tonRemove={ removeLink }\n\t\t\t\thasRichPreviews\n\t\t\t\tcreateSuggestion={ createPageEntity && handleCreate }\n\t\t\t\twithCreateSuggestion={ userCanCreatePages }\n\t\t\t\tcreateSuggestionButtonText={ createButtonText }\n\t\t\t\thasTextControl\n\t\t\t\tsettings={ LINK_SETTINGS }\n\t\t\t\tshowInitialSuggestions\n\t\t\t\tsuggestionsQuery={ {\n\t\t\t\t\t// always show Pages as initial suggestions\n\t\t\t\t\tinitialSuggestionsSearchOptions: {\n\t\t\t\t\t\ttype: 'post',\n\t\t\t\t\t\tsubtype: 'page',\n\t\t\t\t\t\tperPage: 20,\n\t\t\t\t\t},\n\t\t\t\t} }\n\t\t\t/>\n\t\t</Popover>\n\t);\n}\n\nfunction getRichTextValueFromSelection( value, isActive ) {\n\t// Default to the selection ranges on the RichTextValue object.\n\tlet textStart = value.start;\n\tlet textEnd = value.end;\n\n\t// If the format is currently active then the rich text value\n\t// should always be taken from the bounds of the active format\n\t// and not the selected text.\n\tif ( isActive ) {\n\t\tconst boundary = getFormatBoundary( value, {\n\t\t\ttype: 'core/link',\n\t\t} );\n\n\t\ttextStart = boundary.start;\n\n\t\t// Text *selection* always extends +1 beyond the edge of the format.\n\t\t// We account for that here.\n\t\ttextEnd = boundary.end + 1;\n\t}\n\n\t// Get a RichTextValue containing the selected text content.\n\treturn slice( value, textStart, textEnd );\n}\n\nexport default InlineLinkUI;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,19 +1,9 @@
1
- // Weakly referenced map allows unused ids to be garbage collected.
2
- const weakMap = new WeakMap();
3
-
4
- // Incrementing zero-based ID value.
1
+ const weakMap = /* @__PURE__ */ new WeakMap();
5
2
  let id = -1;
6
- const prefix = 'link-control-instance';
3
+ const prefix = "link-control-instance";
7
4
  function getKey(_id) {
8
5
  return `${prefix}-${_id}`;
9
6
  }
10
-
11
- /**
12
- * Builds a unique link control key for the given object reference.
13
- *
14
- * @param {Object} instance an unique object reference specific to this link control instance.
15
- * @return {string | undefined} the unique key to use for this link control.
16
- */
17
7
  function useLinkInstanceKey(instance) {
18
8
  if (!instance) {
19
9
  return;
@@ -25,5 +15,8 @@ function useLinkInstanceKey(instance) {
25
15
  weakMap.set(instance, id);
26
16
  return getKey(id);
27
17
  }
28
- export default useLinkInstanceKey;
29
- //# sourceMappingURL=use-link-instance-key.js.map
18
+ var use_link_instance_key_default = useLinkInstanceKey;
19
+ export {
20
+ use_link_instance_key_default as default
21
+ };
22
+ //# sourceMappingURL=use-link-instance-key.js.map
@@ -1 +1,7 @@
1
- {"version":3,"names":["weakMap","WeakMap","id","prefix","getKey","_id","useLinkInstanceKey","instance","has","get","set"],"sources":["@wordpress/format-library/src/link/use-link-instance-key.js"],"sourcesContent":["// Weakly referenced map allows unused ids to be garbage collected.\nconst weakMap = new WeakMap();\n\n// Incrementing zero-based ID value.\nlet id = -1;\n\nconst prefix = 'link-control-instance';\n\nfunction getKey( _id ) {\n\treturn `${ prefix }-${ _id }`;\n}\n\n/**\n * Builds a unique link control key for the given object reference.\n *\n * @param {Object} instance an unique object reference specific to this link control instance.\n * @return {string | undefined} the unique key to use for this link control.\n */\nfunction useLinkInstanceKey( instance ) {\n\tif ( ! instance ) {\n\t\treturn;\n\t}\n\tif ( weakMap.has( instance ) ) {\n\t\treturn getKey( weakMap.get( instance ) );\n\t}\n\n\tid += 1;\n\n\tweakMap.set( instance, id );\n\n\treturn getKey( id );\n}\n\nexport default useLinkInstanceKey;\n"],"mappings":"AAAA;AACA,MAAMA,OAAO,GAAG,IAAIC,OAAO,CAAC,CAAC;;AAE7B;AACA,IAAIC,EAAE,GAAG,CAAC,CAAC;AAEX,MAAMC,MAAM,GAAG,uBAAuB;AAEtC,SAASC,MAAMA,CAAEC,GAAG,EAAG;EACtB,OAAO,GAAIF,MAAM,IAAME,GAAG,EAAG;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,kBAAkBA,CAAEC,QAAQ,EAAG;EACvC,IAAK,CAAEA,QAAQ,EAAG;IACjB;EACD;EACA,IAAKP,OAAO,CAACQ,GAAG,CAAED,QAAS,CAAC,EAAG;IAC9B,OAAOH,MAAM,CAAEJ,OAAO,CAACS,GAAG,CAAEF,QAAS,CAAE,CAAC;EACzC;EAEAL,EAAE,IAAI,CAAC;EAEPF,OAAO,CAACU,GAAG,CAAEH,QAAQ,EAAEL,EAAG,CAAC;EAE3B,OAAOE,MAAM,CAAEF,EAAG,CAAC;AACpB;AAEA,eAAeI,kBAAkB","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/link/use-link-instance-key.js"],
4
+ "sourcesContent": ["// Weakly referenced map allows unused ids to be garbage collected.\nconst weakMap = new WeakMap();\n\n// Incrementing zero-based ID value.\nlet id = -1;\n\nconst prefix = 'link-control-instance';\n\nfunction getKey( _id ) {\n\treturn `${ prefix }-${ _id }`;\n}\n\n/**\n * Builds a unique link control key for the given object reference.\n *\n * @param {Object} instance an unique object reference specific to this link control instance.\n * @return {string | undefined} the unique key to use for this link control.\n */\nfunction useLinkInstanceKey( instance ) {\n\tif ( ! instance ) {\n\t\treturn;\n\t}\n\tif ( weakMap.has( instance ) ) {\n\t\treturn getKey( weakMap.get( instance ) );\n\t}\n\n\tid += 1;\n\n\tweakMap.set( instance, id );\n\n\treturn getKey( id );\n}\n\nexport default useLinkInstanceKey;\n"],
5
+ "mappings": "AACA,MAAM,UAAU,oBAAI,QAAQ;AAG5B,IAAI,KAAK;AAET,MAAM,SAAS;AAEf,SAAS,OAAQ,KAAM;AACtB,SAAO,GAAI,MAAO,IAAK,GAAI;AAC5B;AAQA,SAAS,mBAAoB,UAAW;AACvC,MAAK,CAAE,UAAW;AACjB;AAAA,EACD;AACA,MAAK,QAAQ,IAAK,QAAS,GAAI;AAC9B,WAAO,OAAQ,QAAQ,IAAK,QAAS,CAAE;AAAA,EACxC;AAEA,QAAM;AAEN,UAAQ,IAAK,UAAU,EAAG;AAE1B,SAAO,OAAQ,EAAG;AACnB;AAEA,IAAO,gCAAQ;",
6
+ "names": []
7
+ }