tinacms 0.0.0-c6a6335-20250416234606 → 0.0.0-c706b9f-20251222081038

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 (183) hide show
  1. package/dist/admin/api.d.ts +4 -1
  2. package/dist/admin/components/{Sidebar.d.ts → AdminNav.d.ts} +0 -3
  3. package/dist/admin/components/Page.d.ts +3 -9
  4. package/dist/admin/components/ui/tooltip.d.ts +7 -0
  5. package/dist/admin/pages/CollectionCreatePage.d.ts +1 -1
  6. package/dist/admin/pages/CollectionListPage.d.ts +2 -2
  7. package/dist/admin/pages/DashboardPage.d.ts +0 -3
  8. package/dist/admin/pages/ScreenPage.d.ts +0 -3
  9. package/dist/auth/AuthModal.d.ts +1 -4
  10. package/dist/auth/TinaCloudProvider.d.ts +0 -1
  11. package/dist/cache/node-cache.d.ts +6 -2
  12. package/dist/client.js +240 -181
  13. package/dist/index.js +122385 -33672
  14. package/dist/internalClient/index.d.ts +48 -30
  15. package/dist/react.d.ts +13 -6
  16. package/dist/react.js +295 -196
  17. package/dist/rich-text/index.d.ts +6 -0
  18. package/dist/rich-text/index.js +234 -224
  19. package/dist/rich-text/prism.js +16 -18
  20. package/dist/rich-text/static.d.ts +154 -0
  21. package/dist/rich-text/{index.mjs → static.js} +99 -99
  22. package/dist/tina-cms.d.ts +1 -1
  23. package/dist/toolkit/components/ProgressBar.d.ts +11 -0
  24. package/dist/toolkit/components/active-field-indicator.d.ts +1 -0
  25. package/dist/toolkit/components/media/media-item.d.ts +11 -1
  26. package/dist/toolkit/components/ui/breadcrumb.d.ts +11 -0
  27. package/dist/toolkit/components/ui/button.d.ts +11 -0
  28. package/dist/toolkit/components/ui/calendar.d.ts +8 -0
  29. package/dist/toolkit/components/ui/date-time-picker.d.ts +111 -0
  30. package/dist/toolkit/components/ui/dropdown-menu.d.ts +25 -0
  31. package/dist/toolkit/components/ui/input.d.ts +3 -0
  32. package/dist/toolkit/components/ui/popover.d.ts +7 -0
  33. package/dist/toolkit/components/ui/select.d.ts +13 -0
  34. package/dist/toolkit/fields/components/color-picker/block-widget.d.ts +3 -0
  35. package/dist/toolkit/fields/components/color-picker/color-input.d.ts +35 -0
  36. package/dist/toolkit/fields/components/color-picker/color-picker.d.ts +6 -2
  37. package/dist/toolkit/fields/components/color-picker/color-utils.d.ts +37 -0
  38. package/dist/toolkit/fields/components/color-picker/sketch-widget.d.ts +3 -0
  39. package/dist/toolkit/fields/components/password-field.d.ts +1 -1
  40. package/dist/toolkit/fields/components/reference/components/button.d.ts +2 -2
  41. package/dist/toolkit/fields/components/reference/components/command.d.ts +21 -33
  42. package/dist/toolkit/fields/components/reference/components/popover.d.ts +1 -1
  43. package/dist/toolkit/fields/components/reference/model/reference-link-props.d.ts +2 -0
  44. package/dist/toolkit/fields/components/select.d.ts +2 -2
  45. package/dist/toolkit/fields/components/text-field.d.ts +1 -1
  46. package/dist/toolkit/fields/plugins/button-toggle-field-plugin.d.ts +2 -2
  47. package/dist/toolkit/fields/plugins/checkbox-group-field-plugin.d.ts +2 -2
  48. package/dist/toolkit/fields/plugins/color-field-plugin.d.ts +1 -0
  49. package/dist/toolkit/fields/plugins/date-field-plugin.d.ts +0 -2
  50. package/dist/toolkit/fields/plugins/dnd-kit-wrapper.d.ts +49 -0
  51. package/dist/toolkit/fields/plugins/group-field-plugin.d.ts +1 -1
  52. package/dist/toolkit/fields/plugins/group-list-field-plugin.d.ts +3 -1
  53. package/dist/toolkit/fields/plugins/list-field-meta.d.ts +1 -1
  54. package/dist/toolkit/fields/plugins/list-field-plugin.d.ts +3 -0
  55. package/dist/toolkit/fields/plugins/mdx-field-plugin/index.d.ts +2 -2
  56. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/editor.d.ts +20 -18
  57. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/blockquote-element.d.ts +14 -10
  58. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/button.d.ts +5 -5
  59. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block/code-block-element.d.ts +17 -0
  60. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block/error-message.d.ts +6 -0
  61. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-combobox.d.ts +6 -0
  62. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-toolbar-button.d.ts +6 -6
  63. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-leaf.d.ts +2 -11
  64. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-line-element.d.ts +14 -10
  65. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-syntax-leaf.d.ts +2 -11
  66. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/command.d.ts +112 -0
  67. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/dialog.d.ts +12 -0
  68. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/dropdown-menu.d.ts +10 -10
  69. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/floating-toolbar.d.ts +2 -2
  70. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/hr-element.d.ts +3 -0
  71. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/hr-toolbar-button.d.ts +18 -0
  72. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/icons.d.ts +2 -1
  73. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/image-toolbar-button.d.ts +6 -6
  74. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/indent-list-toolbar-button.d.ts +6 -19
  75. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/inline-combobox.d.ts +1 -1
  76. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/input.d.ts +3 -3
  77. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-element.d.ts +4 -11
  78. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-floating-toolbar.d.ts +4 -5
  79. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-toolbar-button.d.ts +4 -4
  80. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/list-element.d.ts +28 -11
  81. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-element.d.ts +3 -10
  82. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-toolbar-button.d.ts +6 -8
  83. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/paragraph-element.d.ts +15 -0
  84. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/popover.d.ts +7 -2
  85. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/quote-toolbar-button.d.ts +6 -6
  86. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/raw-markdown-toolbar-button.d.ts +6 -6
  87. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/resizable.d.ts +24 -21
  88. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/separator.d.ts +2 -2
  89. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/slash-input-element.d.ts +15 -11
  90. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/block-selection.d.ts +6 -0
  91. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-cell-element.d.ts +33 -0
  92. 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
  93. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-element.d.ts +20 -0
  94. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-row-element.d.ts +15 -0
  95. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/toolbar.d.ts +7 -7
  96. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/use-floating-toolbar-hook.d.ts +10 -0
  97. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/use-floating-toolbar-state.d.ts +22 -0
  98. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/hooks/use-create-editor.d.ts +6 -0
  99. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-block.d.ts +1 -1
  100. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-lists.d.ts +1 -1
  101. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-marks.d.ts +1 -1
  102. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-utils.d.ts +3 -5
  103. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/common.d.ts +11 -6
  104. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/formatting.d.ts +18 -2
  105. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/index.d.ts +0 -1
  106. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-html-block/index.d.ts +6 -0
  107. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-img-plugin/index.d.ts +2 -2
  108. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-invalid-markdown-plugin/index.d.ts +5 -5
  109. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-mdx-plugins/component.d.ts +7 -4
  110. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-mdx-plugins/index.d.ts +3 -5
  111. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/editor-plugins.d.ts +520 -0
  112. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/components.d.ts +263 -207
  113. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/floating-toolbar-plugin.d.ts +1 -0
  114. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-overrides.d.ts +1 -1
  115. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/transforms/is-url.d.ts +1 -2
  116. package/dist/toolkit/fields/plugins/radio-group-field-plugin.d.ts +2 -2
  117. package/dist/toolkit/fields/plugins/select-field-plugin.d.ts +2 -2
  118. package/dist/toolkit/fields/plugins/toggle-field-plugin.d.ts +2 -2
  119. package/dist/toolkit/fields/plugins/wrap-field-with-meta.d.ts +6 -2
  120. package/dist/toolkit/form-builder/create-branch-modal.d.ts +13 -0
  121. package/dist/toolkit/form-builder/editorial-workflow-constants.d.ts +17 -0
  122. package/dist/toolkit/form-builder/fields-builder.d.ts +3 -2
  123. package/dist/toolkit/form-builder/form-builder.d.ts +9 -9
  124. package/dist/toolkit/form-builder/index.d.ts +1 -0
  125. package/dist/toolkit/forms/field.d.ts +6 -2
  126. package/dist/toolkit/forms/form.d.ts +22 -3
  127. package/dist/toolkit/git-client/git-client.d.ts +25 -2
  128. package/dist/toolkit/git-client/git-file.d.ts +18 -0
  129. package/dist/toolkit/git-client/git-media-store.d.ts +13 -0
  130. package/dist/toolkit/git-client/use-git-file.d.ts +4 -0
  131. package/dist/toolkit/icons/Tina.d.ts +0 -5
  132. package/dist/toolkit/icons/TinaExtended.d.ts +4 -0
  133. package/dist/toolkit/icons/index.d.ts +1 -0
  134. package/dist/toolkit/index.d.ts +1 -1
  135. package/dist/toolkit/plugin-branch-switcher/branch-button.d.ts +4 -1
  136. package/dist/toolkit/plugin-branch-switcher/index.d.ts +0 -1
  137. package/dist/toolkit/react-modals/modal/modal-actions.d.ts +2 -1
  138. package/dist/toolkit/react-modals/modal/modal-header.d.ts +1 -1
  139. package/dist/toolkit/react-sidebar/components/NavMenuTrigger.d.ts +11 -0
  140. package/dist/toolkit/react-sidebar/components/VersionInfo.d.ts +2 -0
  141. package/dist/toolkit/react-sidebar/components/badge.d.ts +6 -0
  142. package/dist/toolkit/react-sidebar/components/callout.d.ts +5 -0
  143. package/dist/toolkit/react-sidebar/components/form-list.d.ts +1 -1
  144. package/dist/toolkit/react-sidebar/components/local-warning.d.ts +3 -1
  145. package/dist/toolkit/react-sidebar/components/nav-components.d.ts +11 -0
  146. package/dist/toolkit/react-sidebar/components/nav-context.d.ts +15 -0
  147. package/dist/toolkit/react-sidebar/components/nav.d.ts +6 -3
  148. package/dist/toolkit/react-sidebar/components/resize-handle.d.ts +0 -5
  149. package/dist/toolkit/react-sidebar/components/sidebar-body.d.ts +28 -7
  150. package/dist/toolkit/react-sidebar/components/sidebar.d.ts +0 -7
  151. package/dist/toolkit/react-sidebar/components/sync-status.d.ts +5 -8
  152. package/dist/toolkit/react-sidebar/index.d.ts +4 -1
  153. package/dist/toolkit/styles/button.d.ts +2 -2
  154. package/dist/toolkit/styles/dropdown-button.d.ts +75 -0
  155. package/dist/toolkit/styles/index.d.ts +1 -0
  156. package/dist/toolkit/tina-cms.d.ts +3 -3
  157. package/dist/toolkit/tina-state.d.ts +53 -16
  158. package/dist/unifiedClient/index.d.ts +1 -1
  159. package/dist/utils/cn.d.ts +2 -0
  160. package/dist/utils/index.d.ts +1 -0
  161. package/package.json +58 -82
  162. package/dist/admin/pages/IndexingPage.d.ts +0 -2
  163. package/dist/client.mjs +0 -132
  164. package/dist/index.mjs +0 -35107
  165. package/dist/node-cache-5e8db9f0.mjs +0 -63
  166. package/dist/react.mjs +0 -246
  167. package/dist/rich-text/prism.mjs +0 -16
  168. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-element.d.ts +0 -11
  169. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-cell-element.d.ts +0 -27
  170. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-element.d.ts +0 -14
  171. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-row-element.d.ts +0 -13
  172. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/with-correct-void-behavior.d.ts +0 -8
  173. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-code-block/index.d.ts +0 -3
  174. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-link-plugin/index.d.ts +0 -15
  175. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/custom/mermaid-plugin.d.ts +0 -2
  176. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/create-soft-break-plugin.d.ts +0 -7
  177. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/index.d.ts +0 -6
  178. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/on-key-down-soft-break.d.ts +0 -5
  179. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/types.d.ts +0 -11
  180. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/code-block/index.d.ts +0 -11
  181. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/transforms/insert-empty-block.d.ts +0 -2
  182. package/dist/toolkit/plugin-branch-switcher/branch-banner.d.ts +0 -2
  183. package/dist/toolkit/react-datetime/DateTime.d.ts +0 -135
@@ -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';
@@ -141,6 +146,26 @@ export declare class Client {
141
146
  }[]>;
142
147
  usingProtectedBranch(): boolean;
143
148
  createBranch({ baseBranch, branchName }: BranchData): Promise<string>;
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>;
144
169
  }
145
170
  export declare const DEFAULT_LOCAL_TINA_GQL_SERVER_URL = "http://localhost:4001/graphql";
146
171
  export declare class LocalClient extends Client {
@@ -151,37 +176,30 @@ export declare class LocalClient extends Client {
151
176
  get isLocalMode(): boolean;
152
177
  }
153
178
  export declare class TinaCMSSearchClient implements SearchClient {
154
- private client;
155
- private tinaSearchConfig?;
156
- constructor(client: Client, tinaSearchConfig?: {
157
- stopwordLanguages?: string[];
158
- });
159
- query(query: string, options?: {
160
- limit?: number;
161
- cursor?: string;
162
- }): Promise<{
163
- results: any[];
164
- nextCursor: string | null;
165
- total: number;
166
- prevCursor: string | null;
167
- }>;
168
- del(ids: string[]): Promise<any>;
169
- 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>;
170
188
  supportsClientSideIndexing(): boolean;
171
189
  }
172
190
  export declare class LocalSearchClient implements SearchClient {
173
- private client;
174
- constructor(client: Client);
175
- query(query: string, options?: {
176
- limit?: number;
177
- cursor?: string;
178
- }): Promise<{
179
- results: any[];
180
- nextCursor: string | null;
181
- total: number;
182
- prevCursor: string | null;
183
- }>;
184
- del(ids: string[]): Promise<any>;
185
- 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>;
186
199
  supportsClientSideIndexing(): boolean;
187
200
  }
201
+ export type PackageVersionInfo = {
202
+ version: string;
203
+ publishedAt: string;
204
+ };
205
+ export type LatestVersionResponse = Record<string, PackageVersionInfo>;
package/dist/react.d.ts CHANGED
@@ -15,16 +15,23 @@ export declare function useEditState(): {
15
15
  * to signal to Tina which DOM element the field
16
16
  * is working with.
17
17
  */
18
- export declare const tinaField: <T extends (object & {
18
+ /**
19
+ * Generate a field identifier for Tina to associate DOM elements with form fields.
20
+ * Format: "queryId---path.to.field" or "queryId---path.to.array.index"
21
+ */
22
+ export declare const tinaField: <T extends {
19
23
  _content_source?: {
20
24
  queryId: string;
21
25
  path: (number | string)[];
22
26
  };
23
- }) | undefined | null>(object: T, property?: keyof Omit<NonNullable<T>, "__typename" | "_sys">, index?: number) => string;
24
- export declare const addMetadata: <T extends object>(id: string, object: T & {
25
- type?: string;
26
- _content_source?: unknown;
27
- }, path: (string | number)[]) => T;
27
+ } | Record<string, unknown> | null | undefined>(object: T, property?: keyof Omit<NonNullable<T>, "__typename" | "_sys">, index?: number) => string;
28
+ /**
29
+ * FIX: This function is updated to be more robust. It explicitly checks for
30
+ * `null` and `String` objects to prevent them from being processed as
31
+ * iterable objects, which is the root cause of the "Objects are not valid
32
+ * as a React child" error.
33
+ */
34
+ export declare const addMetadata: <T extends object>(id: string, obj: T, path?: (string | number)[]) => T;
28
35
  /**
29
36
  * This is a pretty rudimentary approach to hashing the query and variables to
30
37
  * ensure we treat multiple queries on the page uniquely. It's possible
package/dist/react.js CHANGED
@@ -1,67 +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
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) {
13
+ const dataCopy = JSON.parse(JSON.stringify(props.data));
14
+ return addMetadata(id, dataCopy, []);
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"
9
26
  });
10
- const id = React.useMemo(
11
- () => hashFromQuery(stringifiedQuery),
12
- [stringifiedQuery]
13
- );
14
- const [data, setData] = React.useState(props.data);
15
- const [isClient, setIsClient] = React.useState(false);
16
- const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
17
- const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
18
- React.useEffect(() => {
19
- setIsClient(true);
20
- setData(props.data);
21
- parent.postMessage({
22
- type: "url-changed"
23
- });
24
- }, [id]);
25
- React.useEffect(() => {
26
- if (quickEditEnabled) {
27
- let mouseDownHandler = function(e) {
28
- const attributeNames = e.target.getAttributeNames();
29
- const tinaAttribute = attributeNames.find(
30
- (name) => name.startsWith("data-tina-field")
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]"
31
43
  );
32
- let fieldName;
33
- if (tinaAttribute) {
34
- e.preventDefault();
35
- e.stopPropagation();
36
- fieldName = e.target.getAttribute(tinaAttribute);
37
- } else {
38
- const ancestor = e.target.closest(
39
- "[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")
40
48
  );
41
- if (ancestor) {
42
- const attributeNames2 = ancestor.getAttributeNames();
43
- const tinaAttribute2 = attributeNames2.find(
44
- (name) => name.startsWith("data-tina-field")
45
- );
46
- if (tinaAttribute2) {
47
- e.preventDefault();
48
- e.stopPropagation();
49
- fieldName = ancestor.getAttribute(tinaAttribute2);
50
- }
49
+ if (tinaAttribute2) {
50
+ e.preventDefault();
51
+ e.stopPropagation();
52
+ fieldName = ancestor.getAttribute(tinaAttribute2);
51
53
  }
52
54
  }
53
- if (fieldName) {
55
+ }
56
+ if (fieldName) {
57
+ if (lastHoveredField !== null) {
58
+ lastHoveredField = null;
54
59
  if (isInTinaIframe) {
55
60
  parent.postMessage(
56
- { type: "field:selected", fieldName },
61
+ { type: "field:hovered", fieldName: null },
57
62
  window.location.origin
58
63
  );
59
64
  }
60
65
  }
61
- };
62
- const style = document.createElement("style");
63
- style.type = "text/css";
64
- 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 = `
65
111
  [data-tina-field] {
66
112
  outline: 2px dashed rgba(34,150,254,0.5);
67
113
  transition: box-shadow ease-out 150ms;
@@ -71,6 +117,15 @@
71
117
  outline: 2px solid rgba(34,150,254,1);
72
118
  cursor: pointer;
73
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
+ }
74
129
  [data-tina-field-overlay] {
75
130
  outline: 2px dashed rgba(34,150,254,0.5);
76
131
  position: relative;
@@ -91,159 +146,203 @@
91
146
  [data-tina-field-overlay]:hover::after {
92
147
  opacity: 1;
93
148
  }
94
- `;
95
- document.head.appendChild(style);
96
- document.body.classList.add("__tina-quick-editing-enabled");
97
- document.addEventListener("click", mouseDownHandler, true);
98
- return () => {
99
- document.removeEventListener("click", mouseDownHandler, true);
100
- document.body.classList.remove("__tina-quick-editing-enabled");
101
- style.remove();
102
- };
103
- }
104
- }, [quickEditEnabled, isInTinaIframe]);
105
- React.useEffect(() => {
106
- if (props == null ? void 0 : props.experimental___selectFormByFormId) {
107
- parent.postMessage({
108
- type: "user-select-form",
109
- formId: props.experimental___selectFormByFormId()
110
- });
111
- }
112
- }, [id]);
113
- React.useEffect(() => {
114
- const { experimental___selectFormByFormId, ...rest } = props;
115
- parent.postMessage({ type: "open", ...rest, id }, window.location.origin);
116
- window.addEventListener("message", (event) => {
117
- if (event.data.type === "quickEditEnabled") {
118
- setQuickEditEnabled(event.data.value);
119
- }
120
- if (event.data.id === id && event.data.type === "updateData") {
121
- setData(event.data.data);
122
- setIsInTinaIframe(true);
123
- const anyTinaField = document.querySelector("[data-tina-field]");
124
- if (anyTinaField) {
125
- parent.postMessage(
126
- { type: "quick-edit", value: true },
127
- window.location.origin
128
- );
129
- } else {
130
- parent.postMessage(
131
- { type: "quick-edit", value: false },
132
- window.location.origin
133
- );
134
- }
149
+ [data-tina-field-overlay][data-tina-field-focused]::after {
150
+ background-color: rgba(194, 65, 12, 0.3);
151
+ opacity: 1;
135
152
  }
136
- });
153
+ `;
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);
137
159
  return () => {
138
- parent.postMessage({ type: "close", id }, window.location.origin);
160
+ document.removeEventListener("click", mouseDownHandler, true);
161
+ document.removeEventListener("mouseenter", mouseEnterHandler, true);
162
+ document.body.classList.remove("__tina-quick-editing-enabled");
163
+ style.remove();
139
164
  };
140
- }, [id, setQuickEditEnabled]);
141
- return { data, isClient };
142
- }
143
- function useEditState() {
144
- const [edit, setEdit] = React.useState(false);
145
- React.useEffect(() => {
146
- if (typeof window !== "undefined") {
147
- parent.postMessage({ type: "isEditMode" }, window.location.origin);
148
- window.addEventListener("message", (event) => {
149
- var _a;
150
- if (((_a = event.data) == null ? void 0 : _a.type) === "tina:editMode") {
151
- setEdit(true);
152
- }
153
- });
154
- }
155
- }, []);
156
- return { edit };
157
- }
158
- const tinaField = (object, property, index) => {
159
- var _a, _b, _c;
160
- if (!object) {
161
- return "";
162
165
  }
163
- if (object._content_source) {
164
- if (!property) {
165
- return [
166
- (_a = object._content_source) == null ? void 0 : _a.queryId,
167
- object._content_source.path.join(".")
168
- ].join("---");
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);
169
182
  }
170
- if (typeof index === "number") {
171
- return [
172
- (_b = object._content_source) == null ? void 0 : _b.queryId,
173
- [...object._content_source.path, property, index].join(".")
174
- ].join("---");
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
+ }
175
204
  }
176
- return [
177
- (_c = object._content_source) == null ? void 0 : _c.queryId,
178
- [...object._content_source.path, property].join(".")
179
- ].join("---");
180
- }
181
- return "";
182
- };
183
- const addMetadata = (id, object, path) => {
184
- Object.entries(object).forEach(([key, value]) => {
185
- if (Array.isArray(value)) {
186
- value.forEach((item, index) => {
187
- if (isScalarOrUndefined(item)) {
188
- return;
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}"]`
218
+ );
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
+ });
189
225
  }
190
- if (Array.isArray(item)) {
191
- return;
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
+ }
192
236
  }
193
- const itemObject = item;
194
- addMetadata(id, itemObject, [...path, key, index]);
195
- });
196
- } else {
197
- if (isScalarOrUndefined(value)) {
198
- return;
199
237
  }
200
- const itemObject = value;
201
- addMetadata(id, itemObject, [...path, key]);
202
238
  }
203
- });
204
- if ((object == null ? void 0 : object.type) === "root") {
205
- return;
206
- }
207
- object._content_source = {
208
- queryId: id,
209
- path
210
239
  };
211
- return object;
212
- };
213
- function isScalarOrUndefined(value) {
214
- const type = typeof value;
215
- if (type === "string")
216
- return true;
217
- if (type === "number")
218
- return true;
219
- if (type === "boolean")
220
- return true;
221
- if (type === "undefined")
222
- return true;
223
- if (value == null)
224
- return true;
225
- if (value instanceof String)
226
- return true;
227
- if (value instanceof Number)
228
- return true;
229
- if (value instanceof Boolean)
230
- return true;
231
- return false;
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
+ });
259
+ }
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 "";
232
267
  }
233
- const hashFromQuery = (input) => {
234
- let hash = 0;
235
- for (let i = 0; i < input.length; i++) {
236
- const char = input.charCodeAt(i);
237
- 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);
238
305
  }
239
- const nonNegativeHash = Math.abs(hash);
240
- const alphanumericHash = nonNegativeHash.toString(36);
241
- return alphanumericHash;
242
- };
243
- exports2.addMetadata = addMetadata;
244
- exports2.hashFromQuery = hashFromQuery;
245
- exports2.tinaField = tinaField;
246
- exports2.useEditState = useEditState;
247
- exports2.useTina = useTina;
248
- Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
249
- });
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
+ };