tinacms 0.0.0-c0f1b7d-20250702023438 → 0.0.0-c19d29e-20251224001156

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 (156) hide show
  1. package/dist/admin/api.d.ts +4 -1
  2. package/dist/auth/AuthModal.d.ts +1 -4
  3. package/dist/auth/TinaCloudProvider.d.ts +0 -1
  4. package/dist/cache/node-cache.d.ts +6 -2
  5. package/dist/client.js +240 -181
  6. package/dist/index.js +122442 -34450
  7. package/dist/internalClient/index.d.ts +42 -30
  8. package/dist/react.js +297 -204
  9. package/dist/rich-text/index.d.ts +6 -0
  10. package/dist/rich-text/index.js +234 -224
  11. package/dist/rich-text/prism.js +16 -18
  12. package/dist/rich-text/static.d.ts +6 -0
  13. package/dist/rich-text/static.js +229 -225
  14. package/dist/tina-cms.d.ts +1 -1
  15. package/dist/toolkit/components/ProgressBar.d.ts +11 -0
  16. package/dist/toolkit/components/active-field-indicator.d.ts +1 -0
  17. package/dist/toolkit/components/media/media-item.d.ts +10 -0
  18. package/dist/toolkit/components/ui/button.d.ts +11 -0
  19. package/dist/toolkit/components/ui/calendar.d.ts +8 -0
  20. package/dist/toolkit/components/ui/date-time-picker.d.ts +111 -0
  21. package/dist/toolkit/components/ui/input.d.ts +3 -0
  22. package/dist/toolkit/components/ui/popover.d.ts +7 -0
  23. package/dist/toolkit/components/ui/select.d.ts +13 -0
  24. package/dist/toolkit/fields/components/color-picker/block-widget.d.ts +3 -0
  25. package/dist/toolkit/fields/components/color-picker/color-input.d.ts +35 -0
  26. package/dist/toolkit/fields/components/color-picker/color-picker.d.ts +6 -2
  27. package/dist/toolkit/fields/components/color-picker/color-utils.d.ts +37 -0
  28. package/dist/toolkit/fields/components/color-picker/sketch-widget.d.ts +3 -0
  29. package/dist/toolkit/fields/components/password-field.d.ts +1 -1
  30. package/dist/toolkit/fields/components/reference/components/button.d.ts +1 -1
  31. package/dist/toolkit/fields/components/reference/components/command.d.ts +21 -33
  32. package/dist/toolkit/fields/components/select.d.ts +1 -1
  33. package/dist/toolkit/fields/components/text-field.d.ts +1 -1
  34. package/dist/toolkit/fields/plugins/button-toggle-field-plugin.d.ts +2 -2
  35. package/dist/toolkit/fields/plugins/checkbox-group-field-plugin.d.ts +2 -2
  36. package/dist/toolkit/fields/plugins/color-field-plugin.d.ts +1 -0
  37. package/dist/toolkit/fields/plugins/date-field-plugin.d.ts +0 -2
  38. package/dist/toolkit/fields/plugins/dnd-kit-wrapper.d.ts +49 -0
  39. package/dist/toolkit/fields/plugins/group-list-field-plugin.d.ts +3 -1
  40. package/dist/toolkit/fields/plugins/list-field-plugin.d.ts +3 -0
  41. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/editor.d.ts +20 -18
  42. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/blockquote-element.d.ts +14 -10
  43. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/button.d.ts +5 -5
  44. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block/code-block-element.d.ts +17 -0
  45. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block/error-message.d.ts +6 -0
  46. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-combobox.d.ts +6 -0
  47. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-toolbar-button.d.ts +6 -6
  48. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-leaf.d.ts +2 -11
  49. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-line-element.d.ts +14 -10
  50. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-syntax-leaf.d.ts +2 -11
  51. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/command.d.ts +112 -0
  52. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/dialog.d.ts +12 -0
  53. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/dropdown-menu.d.ts +10 -10
  54. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/floating-toolbar.d.ts +2 -2
  55. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/hr-element.d.ts +3 -0
  56. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/hr-toolbar-button.d.ts +18 -0
  57. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/icons.d.ts +2 -1
  58. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/image-toolbar-button.d.ts +6 -6
  59. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/indent-list-toolbar-button.d.ts +6 -19
  60. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/inline-combobox.d.ts +1 -1
  61. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/input.d.ts +3 -3
  62. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-element.d.ts +4 -11
  63. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-floating-toolbar.d.ts +4 -5
  64. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-toolbar-button.d.ts +4 -4
  65. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/list-element.d.ts +28 -11
  66. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-element.d.ts +3 -10
  67. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-toolbar-button.d.ts +6 -8
  68. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/paragraph-element.d.ts +15 -0
  69. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/popover.d.ts +7 -2
  70. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/quote-toolbar-button.d.ts +6 -6
  71. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/raw-markdown-toolbar-button.d.ts +6 -6
  72. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/resizable.d.ts +24 -21
  73. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/separator.d.ts +2 -2
  74. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/slash-input-element.d.ts +15 -11
  75. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/block-selection.d.ts +6 -0
  76. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-cell-element.d.ts +33 -0
  77. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/{table-dropdown-menu.d.ts → table/table-dropdown-menu.d.ts} +1 -0
  78. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-element.d.ts +20 -0
  79. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-row-element.d.ts +15 -0
  80. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/toolbar.d.ts +7 -7
  81. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/use-floating-toolbar-hook.d.ts +10 -0
  82. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/use-floating-toolbar-state.d.ts +22 -0
  83. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/hooks/use-create-editor.d.ts +6 -0
  84. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-block.d.ts +1 -1
  85. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-lists.d.ts +1 -1
  86. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-marks.d.ts +1 -1
  87. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-utils.d.ts +3 -5
  88. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/common.d.ts +11 -6
  89. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/formatting.d.ts +18 -2
  90. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/index.d.ts +0 -1
  91. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-html-block/index.d.ts +6 -0
  92. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-img-plugin/index.d.ts +2 -2
  93. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-invalid-markdown-plugin/index.d.ts +5 -5
  94. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-mdx-plugins/component.d.ts +7 -4
  95. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-mdx-plugins/index.d.ts +3 -5
  96. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/editor-plugins.d.ts +520 -0
  97. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/components.d.ts +263 -207
  98. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/floating-toolbar-plugin.d.ts +1 -0
  99. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-overrides.d.ts +1 -1
  100. package/dist/toolkit/fields/plugins/radio-group-field-plugin.d.ts +2 -2
  101. package/dist/toolkit/fields/plugins/select-field-plugin.d.ts +2 -2
  102. package/dist/toolkit/fields/plugins/toggle-field-plugin.d.ts +2 -2
  103. package/dist/toolkit/fields/plugins/wrap-field-with-meta.d.ts +6 -2
  104. package/dist/toolkit/form-builder/create-branch-modal.d.ts +13 -0
  105. package/dist/toolkit/form-builder/editorial-workflow-constants.d.ts +17 -0
  106. package/dist/toolkit/form-builder/fields-builder.d.ts +2 -1
  107. package/dist/toolkit/form-builder/form-builder.d.ts +1 -11
  108. package/dist/toolkit/form-builder/index.d.ts +1 -0
  109. package/dist/toolkit/forms/field.d.ts +3 -2
  110. package/dist/toolkit/icons/TinaExtended.d.ts +4 -0
  111. package/dist/toolkit/icons/index.d.ts +1 -0
  112. package/dist/toolkit/index.d.ts +1 -1
  113. package/dist/toolkit/plugin-branch-switcher/branch-button.d.ts +3 -1
  114. package/dist/toolkit/react-modals/modal/modal-actions.d.ts +2 -1
  115. package/dist/toolkit/react-modals/modal/modal-header.d.ts +1 -1
  116. package/dist/toolkit/react-sidebar/components/NavMenuTrigger.d.ts +11 -0
  117. package/dist/toolkit/react-sidebar/components/badge.d.ts +6 -0
  118. package/dist/toolkit/react-sidebar/components/callout.d.ts +5 -0
  119. package/dist/toolkit/react-sidebar/components/local-warning.d.ts +3 -1
  120. package/dist/toolkit/react-sidebar/components/nav-components.d.ts +11 -0
  121. package/dist/toolkit/react-sidebar/components/nav-context.d.ts +15 -0
  122. package/dist/toolkit/react-sidebar/components/nav.d.ts +3 -2
  123. package/dist/toolkit/react-sidebar/components/sidebar-body.d.ts +26 -1
  124. package/dist/toolkit/react-sidebar/index.d.ts +3 -0
  125. package/dist/toolkit/styles/button.d.ts +1 -1
  126. package/dist/toolkit/styles/dropdown-button.d.ts +75 -0
  127. package/dist/toolkit/styles/index.d.ts +1 -0
  128. package/dist/toolkit/tina-state.d.ts +42 -16
  129. package/dist/unifiedClient/index.d.ts +1 -1
  130. package/dist/utils/index.d.ts +1 -0
  131. package/package.json +56 -87
  132. package/dist/admin/pages/IndexingPage.d.ts +0 -2
  133. package/dist/client.mjs +0 -132
  134. package/dist/index.mjs +0 -35827
  135. package/dist/node-cache-5e8db9f0.mjs +0 -63
  136. package/dist/react.mjs +0 -252
  137. package/dist/rich-text/index.mjs +0 -243
  138. package/dist/rich-text/prism.mjs +0 -16
  139. package/dist/rich-text/static.mjs +0 -236
  140. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-element.d.ts +0 -11
  141. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-cell-element.d.ts +0 -27
  142. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-element.d.ts +0 -14
  143. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-row-element.d.ts +0 -13
  144. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/with-correct-void-behavior.d.ts +0 -8
  145. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-code-block/index.d.ts +0 -3
  146. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-link-plugin/index.d.ts +0 -15
  147. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/custom/mermaid-plugin.d.ts +0 -2
  148. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/create-soft-break-plugin.d.ts +0 -7
  149. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/index.d.ts +0 -6
  150. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/on-key-down-soft-break.d.ts +0 -5
  151. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/types.d.ts +0 -11
  152. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/code-block/index.d.ts +0 -11
  153. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/transforms/insert-empty-block.d.ts +0 -2
  154. package/dist/toolkit/react-datetime/DateTime.d.ts +0 -135
  155. package/dist/toolkit/react-sidebar/components/alert.d.ts +0 -5
  156. /package/dist/admin/components/{Sidebar.d.ts → AdminNav.d.ts} +0 -0
@@ -2,7 +2,12 @@ import { BranchData, EventBus } from '@tinacms/toolkit';
2
2
  import { DocumentNode, GraphQLSchema } from 'graphql';
3
3
  import { TokenObject } from '../auth/authenticate';
4
4
  import { AuthProvider, Schema, TinaSchema } from '@tinacms/schema-tools';
5
- import { SearchClient } from '@tinacms/search/dist/index-client';
5
+ import { SearchClient, SearchOptions, SearchQueryResponse, IndexableDocument, FuzzySearchOptions } from '@tinacms/search/index-client';
6
+ interface TinaSearchConfig {
7
+ stopwordLanguages?: string[];
8
+ fuzzyEnabled?: boolean;
9
+ fuzzyOptions?: FuzzySearchOptions;
10
+ }
6
11
  import gql from 'graphql-tag';
7
12
  import { TinaCloudProject } from './types';
8
13
  export * from './authProvider';
@@ -142,6 +147,25 @@ export declare class Client {
142
147
  usingProtectedBranch(): boolean;
143
148
  createBranch({ baseBranch, branchName }: BranchData): Promise<string>;
144
149
  getLatestVersion(): Promise<LatestVersionResponse>;
150
+ /**
151
+ * Initiate and poll for the results of an editorial workflow operation
152
+ *
153
+ * @param options Editorial workflow options
154
+ * @returns Object with branch and PR info when complete
155
+ */
156
+ executeEditorialWorkflow(options: {
157
+ branchName: string;
158
+ baseBranch: string;
159
+ prTitle?: string;
160
+ graphQLContentOp?: {
161
+ query: string;
162
+ variables: Record<string, unknown>;
163
+ };
164
+ onStatusUpdate?: (status: {
165
+ status: string;
166
+ message?: string;
167
+ }) => void;
168
+ }): Promise<any>;
145
169
  }
146
170
  export declare const DEFAULT_LOCAL_TINA_GQL_SERVER_URL = "http://localhost:4001/graphql";
147
171
  export declare class LocalClient extends Client {
@@ -152,38 +176,26 @@ export declare class LocalClient extends Client {
152
176
  get isLocalMode(): boolean;
153
177
  }
154
178
  export declare class TinaCMSSearchClient implements SearchClient {
155
- private client;
156
- private tinaSearchConfig?;
157
- constructor(client: Client, tinaSearchConfig?: {
158
- stopwordLanguages?: string[];
159
- });
160
- query(query: string, options?: {
161
- limit?: number;
162
- cursor?: string;
163
- }): Promise<{
164
- results: any[];
165
- nextCursor: string | null;
166
- total: number;
167
- prevCursor: string | null;
168
- }>;
169
- del(ids: string[]): Promise<any>;
170
- put(docs: any[]): Promise<any>;
179
+ protected readonly client: Client;
180
+ protected readonly fuzzyEnabled: boolean;
181
+ protected readonly stopwordLanguages?: string[];
182
+ protected readonly defaultFuzzyOptions?: FuzzySearchOptions;
183
+ constructor(client: Client, tinaSearchConfig?: TinaSearchConfig);
184
+ protected buildSearchUrl(query: string, options?: SearchOptions, useFuzzy?: boolean): string;
185
+ query(query: string, options?: SearchOptions): Promise<SearchQueryResponse>;
186
+ del(ids: string[]): Promise<void>;
187
+ put(docs: IndexableDocument[]): Promise<void>;
171
188
  supportsClientSideIndexing(): boolean;
172
189
  }
173
190
  export declare class LocalSearchClient implements SearchClient {
174
- private client;
175
- constructor(client: Client);
176
- query(query: string, options?: {
177
- limit?: number;
178
- cursor?: string;
179
- }): Promise<{
180
- results: any[];
181
- nextCursor: string | null;
182
- total: number;
183
- prevCursor: string | null;
184
- }>;
185
- del(ids: string[]): Promise<any>;
186
- put(docs: any[]): Promise<any>;
191
+ protected readonly client: Client;
192
+ protected readonly fuzzyEnabled: boolean;
193
+ protected readonly defaultFuzzyOptions?: FuzzySearchOptions;
194
+ constructor(client: Client, tinaSearchConfig?: Omit<TinaSearchConfig, 'stopwordLanguages'>);
195
+ protected buildSearchUrl(query: string, options?: SearchOptions, useFuzzy?: boolean): string;
196
+ query(query: string, options?: SearchOptions): Promise<SearchQueryResponse>;
197
+ del(_ids: string[]): Promise<void>;
198
+ put(_docs: IndexableDocument[]): Promise<void>;
187
199
  supportsClientSideIndexing(): boolean;
188
200
  }
189
201
  export type PackageVersionInfo = {
package/dist/react.js CHANGED
@@ -1,71 +1,113 @@
1
- (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("react")) : typeof define === "function" && define.amd ? define(["exports", "react"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.tinacms = {}, global.NOOP));
3
- })(this, function(exports2, React) {
4
- "use strict";
5
- function useTina(props) {
6
- const stringifiedQuery = JSON.stringify({
7
- query: props.query,
8
- variables: props.variables
9
- });
10
- const id = React.useMemo(
11
- () => hashFromQuery(stringifiedQuery),
12
- [stringifiedQuery]
13
- );
14
- const processedData = React.useMemo(() => {
1
+ import React from "react";
2
+ function useTina(props) {
3
+ const stringifiedQuery = JSON.stringify({
4
+ query: props.query,
5
+ variables: props.variables
6
+ });
7
+ const id = React.useMemo(
8
+ () => hashFromQuery(stringifiedQuery),
9
+ [stringifiedQuery]
10
+ );
11
+ const processedData = React.useMemo(() => {
12
+ if (props.data) {
15
13
  const dataCopy = JSON.parse(JSON.stringify(props.data));
16
14
  return addMetadata(id, dataCopy, []);
17
- }, [props.data, id]);
18
- const [data, setData] = React.useState(processedData);
19
- const [isClient, setIsClient] = React.useState(false);
20
- const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
21
- const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
22
- React.useEffect(() => {
23
- setIsClient(true);
24
- setData(processedData);
25
- parent.postMessage({
26
- type: "url-changed"
27
- });
28
- }, [id, processedData]);
29
- React.useEffect(() => {
30
- if (quickEditEnabled) {
31
- let mouseDownHandler = function(e) {
32
- const attributeNames = e.target.getAttributeNames();
33
- const tinaAttribute = attributeNames.find(
34
- (name) => name.startsWith("data-tina-field")
15
+ }
16
+ }, [props.data, id]);
17
+ const [data, setData] = React.useState(processedData);
18
+ const [isClient, setIsClient] = React.useState(false);
19
+ const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
20
+ const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
21
+ React.useEffect(() => {
22
+ setIsClient(true);
23
+ setData(processedData);
24
+ parent.postMessage({
25
+ type: "url-changed"
26
+ });
27
+ }, [id, processedData]);
28
+ React.useEffect(() => {
29
+ if (quickEditEnabled) {
30
+ let mouseDownHandler = function(e) {
31
+ const attributeNames = e.target.getAttributeNames();
32
+ const tinaAttribute = attributeNames.find(
33
+ (name) => name.startsWith("data-tina-field")
34
+ );
35
+ let fieldName;
36
+ if (tinaAttribute) {
37
+ e.preventDefault();
38
+ e.stopPropagation();
39
+ fieldName = e.target.getAttribute(tinaAttribute);
40
+ } else {
41
+ const ancestor = e.target.closest(
42
+ "[data-tina-field], [data-tina-field-overlay]"
35
43
  );
36
- let fieldName;
37
- if (tinaAttribute) {
38
- e.preventDefault();
39
- e.stopPropagation();
40
- fieldName = e.target.getAttribute(tinaAttribute);
41
- } else {
42
- const ancestor = e.target.closest(
43
- "[data-tina-field], [data-tina-field-overlay]"
44
+ if (ancestor) {
45
+ const attributeNames2 = ancestor.getAttributeNames();
46
+ const tinaAttribute2 = attributeNames2.find(
47
+ (name) => name.startsWith("data-tina-field")
44
48
  );
45
- if (ancestor) {
46
- const attributeNames2 = ancestor.getAttributeNames();
47
- const tinaAttribute2 = attributeNames2.find(
48
- (name) => name.startsWith("data-tina-field")
49
- );
50
- if (tinaAttribute2) {
51
- e.preventDefault();
52
- e.stopPropagation();
53
- fieldName = ancestor.getAttribute(tinaAttribute2);
54
- }
49
+ if (tinaAttribute2) {
50
+ e.preventDefault();
51
+ e.stopPropagation();
52
+ fieldName = ancestor.getAttribute(tinaAttribute2);
55
53
  }
56
54
  }
57
- if (fieldName) {
55
+ }
56
+ if (fieldName) {
57
+ if (lastHoveredField !== null) {
58
+ lastHoveredField = null;
58
59
  if (isInTinaIframe) {
59
60
  parent.postMessage(
60
- { type: "field:selected", fieldName },
61
+ { type: "field:hovered", fieldName: null },
61
62
  window.location.origin
62
63
  );
63
64
  }
64
65
  }
65
- };
66
- const style = document.createElement("style");
67
- style.type = "text/css";
68
- style.textContent = `
66
+ if (isInTinaIframe) {
67
+ parent.postMessage(
68
+ { type: "field:selected", fieldName },
69
+ window.location.origin
70
+ );
71
+ }
72
+ }
73
+ }, mouseEnterHandler = function(e) {
74
+ if (!(e.target instanceof Element)) {
75
+ return;
76
+ }
77
+ const attributeNames = e.target.getAttributeNames();
78
+ const tinaAttribute = attributeNames.find(
79
+ (name) => name.startsWith("data-tina-field")
80
+ );
81
+ let fieldName;
82
+ if (tinaAttribute) {
83
+ fieldName = e.target.getAttribute(tinaAttribute);
84
+ } else {
85
+ const ancestor = e.target.closest(
86
+ "[data-tina-field], [data-tina-field-overlay]"
87
+ );
88
+ if (ancestor) {
89
+ const attributeNames2 = ancestor.getAttributeNames();
90
+ const tinaAttribute2 = attributeNames2.find(
91
+ (name) => name.startsWith("data-tina-field")
92
+ );
93
+ if (tinaAttribute2) {
94
+ fieldName = ancestor.getAttribute(tinaAttribute2);
95
+ }
96
+ }
97
+ }
98
+ if (fieldName && fieldName !== lastHoveredField) {
99
+ lastHoveredField = fieldName;
100
+ if (isInTinaIframe) {
101
+ parent.postMessage(
102
+ { type: "field:hovered", fieldName },
103
+ window.location.origin
104
+ );
105
+ }
106
+ }
107
+ };
108
+ const style = document.createElement("style");
109
+ style.type = "text/css";
110
+ style.textContent = `
69
111
  [data-tina-field] {
70
112
  outline: 2px dashed rgba(34,150,254,0.5);
71
113
  transition: box-shadow ease-out 150ms;
@@ -75,6 +117,15 @@
75
117
  outline: 2px solid rgba(34,150,254,1);
76
118
  cursor: pointer;
77
119
  }
120
+ [data-tina-field-focused] {
121
+ outline: 2px dashed #C2410C !important;
122
+ box-shadow: none !important;
123
+ }
124
+ [data-tina-field-focused]:hover {
125
+ box-shadow: inset 100vi 100vh rgba(194, 65, 12, 0.3) !important;
126
+ outline: 2px solid #C2410C !important;
127
+ cursor: pointer;
128
+ }
78
129
  [data-tina-field-overlay] {
79
130
  outline: 2px dashed rgba(34,150,254,0.5);
80
131
  position: relative;
@@ -95,161 +146,203 @@
95
146
  [data-tina-field-overlay]:hover::after {
96
147
  opacity: 1;
97
148
  }
149
+ [data-tina-field-overlay][data-tina-field-focused]::after {
150
+ background-color: rgba(194, 65, 12, 0.3);
151
+ opacity: 1;
152
+ }
98
153
  `;
99
- document.head.appendChild(style);
100
- document.body.classList.add("__tina-quick-editing-enabled");
101
- document.addEventListener("click", mouseDownHandler, true);
102
- return () => {
103
- document.removeEventListener("click", mouseDownHandler, true);
104
- document.body.classList.remove("__tina-quick-editing-enabled");
105
- style.remove();
106
- };
154
+ document.head.appendChild(style);
155
+ document.body.classList.add("__tina-quick-editing-enabled");
156
+ let lastHoveredField = null;
157
+ document.addEventListener("click", mouseDownHandler, true);
158
+ document.addEventListener("mouseenter", mouseEnterHandler, true);
159
+ return () => {
160
+ document.removeEventListener("click", mouseDownHandler, true);
161
+ document.removeEventListener("mouseenter", mouseEnterHandler, true);
162
+ document.body.classList.remove("__tina-quick-editing-enabled");
163
+ style.remove();
164
+ };
165
+ }
166
+ }, [quickEditEnabled, isInTinaIframe]);
167
+ React.useEffect(() => {
168
+ if (props == null ? void 0 : props.experimental___selectFormByFormId) {
169
+ parent.postMessage({
170
+ type: "user-select-form",
171
+ formId: props.experimental___selectFormByFormId()
172
+ });
173
+ }
174
+ }, [id]);
175
+ const lastFocusedFieldRef = React.useRef(null);
176
+ React.useEffect(() => {
177
+ const { experimental___selectFormByFormId, ...rest } = props;
178
+ parent.postMessage({ type: "open", ...rest, id }, window.location.origin);
179
+ const handleMessage = (event) => {
180
+ if (event.data.type === "quickEditEnabled") {
181
+ setQuickEditEnabled(event.data.value);
107
182
  }
108
- }, [quickEditEnabled, isInTinaIframe]);
109
- React.useEffect(() => {
110
- if (props == null ? void 0 : props.experimental___selectFormByFormId) {
111
- parent.postMessage({
112
- type: "user-select-form",
113
- formId: props.experimental___selectFormByFormId()
114
- });
183
+ if (event.data.id === id && event.data.type === "updateData") {
184
+ const rawData = event.data.data;
185
+ const newlyProcessedData = addMetadata(
186
+ id,
187
+ JSON.parse(JSON.stringify(rawData)),
188
+ []
189
+ );
190
+ setData(newlyProcessedData);
191
+ setIsInTinaIframe(true);
192
+ const anyTinaField = document.querySelector("[data-tina-field]");
193
+ if (anyTinaField) {
194
+ parent.postMessage(
195
+ { type: "quick-edit", value: true },
196
+ window.location.origin
197
+ );
198
+ } else {
199
+ parent.postMessage(
200
+ { type: "quick-edit", value: false },
201
+ window.location.origin
202
+ );
203
+ }
115
204
  }
116
- }, [id]);
117
- React.useEffect(() => {
118
- const { experimental___selectFormByFormId, ...rest } = props;
119
- parent.postMessage({ type: "open", ...rest, id }, window.location.origin);
120
- const handleMessage = (event) => {
121
- if (event.data.type === "quickEditEnabled") {
122
- setQuickEditEnabled(event.data.value);
123
- }
124
- if (event.data.id === id && event.data.type === "updateData") {
125
- const rawData = event.data.data;
126
- const newlyProcessedData = addMetadata(
127
- id,
128
- JSON.parse(JSON.stringify(rawData)),
129
- []
205
+ if (event.data.type === "field:set-focused") {
206
+ const newFieldName = event.data.fieldName;
207
+ if (newFieldName === lastFocusedFieldRef.current) {
208
+ return;
209
+ }
210
+ lastFocusedFieldRef.current = newFieldName;
211
+ const allTinaFields = document.querySelectorAll("[data-tina-field]");
212
+ allTinaFields.forEach((el) => {
213
+ el.removeAttribute("data-tina-field-focused");
214
+ });
215
+ if (newFieldName) {
216
+ let targetElement = document.querySelector(
217
+ `[data-tina-field="${newFieldName}"]`
130
218
  );
131
- setData(newlyProcessedData);
132
- setIsInTinaIframe(true);
133
- const anyTinaField = document.querySelector("[data-tina-field]");
134
- if (anyTinaField) {
135
- parent.postMessage(
136
- { type: "quick-edit", value: true },
137
- window.location.origin
138
- );
139
- } else {
140
- parent.postMessage(
141
- { type: "quick-edit", value: false },
142
- window.location.origin
143
- );
219
+ if (!targetElement) {
220
+ const allFields = Array.from(allTinaFields);
221
+ targetElement = allFields.find((el) => {
222
+ const fieldValue = el.getAttribute("data-tina-field");
223
+ return fieldValue && fieldValue.endsWith(newFieldName.split("---")[1]);
224
+ });
144
225
  }
145
- }
146
- };
147
- window.addEventListener("message", handleMessage);
148
- return () => {
149
- window.removeEventListener("message", handleMessage);
150
- parent.postMessage({ type: "close", id }, window.location.origin);
151
- };
152
- }, [id, setQuickEditEnabled]);
153
- return { data, isClient };
154
- }
155
- function useEditState() {
156
- const [edit, setEdit] = React.useState(false);
157
- React.useEffect(() => {
158
- if (typeof window !== "undefined") {
159
- parent.postMessage({ type: "isEditMode" }, window.location.origin);
160
- window.addEventListener("message", (event) => {
161
- var _a;
162
- if (((_a = event.data) == null ? void 0 : _a.type) === "tina:editMode") {
163
- setEdit(true);
226
+ if (targetElement) {
227
+ targetElement.setAttribute("data-tina-field-focused", "true");
228
+ const rect = targetElement.getBoundingClientRect();
229
+ const isInViewport = rect.top >= 0 && rect.left >= 0 && rect.bottom <= window.innerHeight && rect.right <= window.innerWidth;
230
+ if (!isInViewport) {
231
+ targetElement.scrollIntoView({
232
+ behavior: "smooth",
233
+ block: "center"
234
+ });
235
+ }
164
236
  }
165
- });
166
- }
167
- }, []);
168
- return { edit };
169
- }
170
- const tinaField = (object, property, index) => {
171
- const contentSource = object == null ? void 0 : object._content_source;
172
- if (!contentSource) {
173
- return "";
174
- }
175
- const { queryId, path } = contentSource;
176
- if (!property) {
177
- return `${queryId}---${path.join(".")}`;
178
- }
179
- const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
180
- return `${queryId}---${fullPath.join(".")}`;
181
- };
182
- const addMetadata = (id, obj, path = []) => {
183
- if (obj === null) {
184
- return obj;
185
- }
186
- if (isScalarOrUndefined(obj)) {
187
- return obj;
188
- }
189
- if (obj instanceof String) {
190
- return obj.valueOf();
191
- }
192
- if (Array.isArray(obj)) {
193
- return obj.map(
194
- (item, index) => addMetadata(id, item, [...path, index])
195
- );
196
- }
197
- const transformedObj = {};
198
- for (const [key, value] of Object.entries(obj)) {
199
- const currentPath = [...path, key];
200
- if ([
201
- "__typename",
202
- "_sys",
203
- "_internalSys",
204
- "_values",
205
- "_internalValues",
206
- "_content_source",
207
- "_tina_metadata"
208
- ].includes(key)) {
209
- transformedObj[key] = value;
210
- } else {
211
- transformedObj[key] = addMetadata(id, value, currentPath);
237
+ }
212
238
  }
239
+ };
240
+ window.addEventListener("message", handleMessage);
241
+ return () => {
242
+ window.removeEventListener("message", handleMessage);
243
+ parent.postMessage({ type: "close", id }, window.location.origin);
244
+ };
245
+ }, [id, setQuickEditEnabled]);
246
+ return { data, isClient };
247
+ }
248
+ function useEditState() {
249
+ const [edit, setEdit] = React.useState(false);
250
+ React.useEffect(() => {
251
+ if (typeof window !== "undefined") {
252
+ parent.postMessage({ type: "isEditMode" }, window.location.origin);
253
+ window.addEventListener("message", (event) => {
254
+ var _a;
255
+ if (((_a = event.data) == null ? void 0 : _a.type) === "tina:editMode") {
256
+ setEdit(true);
257
+ }
258
+ });
213
259
  }
214
- if (transformedObj && typeof transformedObj === "object" && "type" in transformedObj && transformedObj.type === "root") {
215
- return transformedObj;
216
- }
217
- return { ...transformedObj, _content_source: { queryId: id, path } };
218
- };
219
- function isScalarOrUndefined(value) {
220
- const type = typeof value;
221
- if (type === "string")
222
- return true;
223
- if (type === "number")
224
- return true;
225
- if (type === "boolean")
226
- return true;
227
- if (type === "undefined")
228
- return true;
229
- if (value == null)
230
- return true;
231
- if (value instanceof String)
232
- return true;
233
- if (value instanceof Number)
234
- return true;
235
- if (value instanceof Boolean)
236
- return true;
237
- return false;
260
+ }, []);
261
+ return { edit };
262
+ }
263
+ const tinaField = (object, property, index) => {
264
+ const contentSource = object == null ? void 0 : object._content_source;
265
+ if (!contentSource) {
266
+ return "";
238
267
  }
239
- const hashFromQuery = (input) => {
240
- let hash = 0;
241
- for (let i = 0; i < input.length; i++) {
242
- const char = input.charCodeAt(i);
243
- hash = (hash << 5) - hash + char & 4294967295;
268
+ const { queryId, path } = contentSource;
269
+ if (!property) {
270
+ return `${queryId}---${path.join(".")}`;
271
+ }
272
+ const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
273
+ return `${queryId}---${fullPath.join(".")}`;
274
+ };
275
+ const addMetadata = (id, obj, path = []) => {
276
+ if (obj === null) {
277
+ return obj;
278
+ }
279
+ if (isScalarOrUndefined(obj)) {
280
+ return obj;
281
+ }
282
+ if (obj instanceof String) {
283
+ return obj.valueOf();
284
+ }
285
+ if (Array.isArray(obj)) {
286
+ return obj.map(
287
+ (item, index) => addMetadata(id, item, [...path, index])
288
+ );
289
+ }
290
+ const transformedObj = {};
291
+ for (const [key, value] of Object.entries(obj)) {
292
+ const currentPath = [...path, key];
293
+ if ([
294
+ "__typename",
295
+ "_sys",
296
+ "_internalSys",
297
+ "_values",
298
+ "_internalValues",
299
+ "_content_source",
300
+ "_tina_metadata"
301
+ ].includes(key)) {
302
+ transformedObj[key] = value;
303
+ } else {
304
+ transformedObj[key] = addMetadata(id, value, currentPath);
244
305
  }
245
- const nonNegativeHash = Math.abs(hash);
246
- const alphanumericHash = nonNegativeHash.toString(36);
247
- return alphanumericHash;
248
- };
249
- exports2.addMetadata = addMetadata;
250
- exports2.hashFromQuery = hashFromQuery;
251
- exports2.tinaField = tinaField;
252
- exports2.useEditState = useEditState;
253
- exports2.useTina = useTina;
254
- Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
255
- });
306
+ }
307
+ if (transformedObj && typeof transformedObj === "object" && "type" in transformedObj && transformedObj.type === "root") {
308
+ return transformedObj;
309
+ }
310
+ return { ...transformedObj, _content_source: { queryId: id, path } };
311
+ };
312
+ function isScalarOrUndefined(value) {
313
+ const type = typeof value;
314
+ if (type === "string")
315
+ return true;
316
+ if (type === "number")
317
+ return true;
318
+ if (type === "boolean")
319
+ return true;
320
+ if (type === "undefined")
321
+ return true;
322
+ if (value == null)
323
+ return true;
324
+ if (value instanceof String)
325
+ return true;
326
+ if (value instanceof Number)
327
+ return true;
328
+ if (value instanceof Boolean)
329
+ return true;
330
+ return false;
331
+ }
332
+ const hashFromQuery = (input) => {
333
+ let hash = 0;
334
+ for (let i = 0; i < input.length; i++) {
335
+ const char = input.charCodeAt(i);
336
+ hash = (hash << 5) - hash + char & 4294967295;
337
+ }
338
+ const nonNegativeHash = Math.abs(hash);
339
+ const alphanumericHash = nonNegativeHash.toString(36);
340
+ return alphanumericHash;
341
+ };
342
+ export {
343
+ addMetadata,
344
+ hashFromQuery,
345
+ tinaField,
346
+ useEditState,
347
+ useTina
348
+ };
@@ -58,9 +58,15 @@ type BaseComponents = {
58
58
  lic?: {
59
59
  children: JSX.Element;
60
60
  };
61
+ /**
62
+ * @deprecated Use `blockquote` instead. This was incorrectly named and will be removed in a future version.
63
+ */
61
64
  block_quote?: {
62
65
  children: JSX.Element;
63
66
  };
67
+ blockquote?: {
68
+ children: JSX.Element;
69
+ };
64
70
  code_block?: {
65
71
  lang?: string;
66
72
  value: string;