@tinacms/app 0.0.0-003e348-20251023020516

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.
package/src/index.css ADDED
@@ -0,0 +1,388 @@
1
+ @import "global.css";
2
+ @import "preflight.css";
3
+ @tailwind base;
4
+ @tailwind components;
5
+ @tailwind utilities;
6
+
7
+ /* Tailwind reset clobbers some playground styles */
8
+ .graphiql-execute-button {
9
+ @apply bg-blue-600 !important;
10
+ }
11
+
12
+ .icon-parent svg {
13
+ fill: currentColor;
14
+ }
15
+
16
+ .font-libre-baskerville {
17
+ font-family: "Libre Baskerville", serif;
18
+ }
19
+
20
+ body {
21
+ margin: 0;
22
+ padding: 0;
23
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
24
+ "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
25
+ sans-serif;
26
+ -webkit-font-smoothing: antialiased;
27
+ -moz-osx-font-smoothing: grayscale;
28
+ }
29
+
30
+ code {
31
+ font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
32
+ monospace;
33
+ }
34
+
35
+ div.graphiql-explorer-root > div:last-child {
36
+ display: none;
37
+ }
38
+
39
+ .graphiql-container {
40
+ height: 100vh !important;
41
+ width: 100vw !important;
42
+ }
43
+
44
+ /* if the last block has margin-bottom it makes the text box larger but some of it isn't clickable */
45
+ .tina-prose [data-slate-editor="true"] {
46
+ padding-bottom: 0.5em;
47
+ /* Outline is placed on the parent element for styling consistency with other elements */
48
+ outline: none;
49
+ }
50
+ /* prose adds backticks, which look like they should be editable */
51
+ .tina-prose [data-slate-editor="true"] .slate-code::before {
52
+ content: "";
53
+ }
54
+ .tina-prose [data-slate-editor="true"] .slate-code::after {
55
+ content: "";
56
+ }
57
+ .tina-prose [data-slate-editor="true"] .slate-code_block {
58
+ margin: 0;
59
+ }
60
+ /* code lines as part of a block don't need the same background formatting */
61
+ .tina-prose [data-slate-editor="true"] .slate-code_block .slate-code {
62
+ background: none;
63
+ }
64
+ /* prose makes the first p in a block slightly larger */
65
+ .tina-prose [data-slate-editor="true"] p:first-of-type {
66
+ font-size: 1em;
67
+ }
68
+
69
+ /* experimental floating toolbar doesn't need a large text area */
70
+ .with-toolbar [data-slate-editor="true"] {
71
+ min-height: 72px;
72
+ }
73
+
74
+ @keyframes color-popup-keyframes {
75
+ 0% {
76
+ transform: translate3d(-50%, 0, 0) scale3d(0.5, 0.5, 1);
77
+ }
78
+ 100% {
79
+ transform: translate3d(-50%, 8px, 0) scale3d(1, 1, 1);
80
+ }
81
+ }
82
+
83
+ @keyframes color-popup-open-top-keyframes {
84
+ 0% {
85
+ transform: translate3d(-50%, -100%, 0) scale3d(0.5, 0.5, 1);
86
+ }
87
+ 100% {
88
+ transform: translate3d(-50%, calc(-100% - 8px), 0) scale3d(1, 1, 1);
89
+ }
90
+ }
91
+
92
+ @keyframes loading-dots-scale-up-and-down {
93
+ 0% {
94
+ transform: scale(0.1);
95
+ }
96
+
97
+ 50% {
98
+ transform: scale(1);
99
+ }
100
+
101
+ 90% {
102
+ transform: scale(0.1);
103
+ }
104
+
105
+ 100% {
106
+ transform: scale(0.1);
107
+ }
108
+ }
109
+
110
+ .color-picker-clip-path::before,
111
+ .color-picker-clip-path::after {
112
+ clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
113
+ }
114
+
115
+ .color-picker-on-top-clip-path::before,
116
+ .color-picker-on-top-clip-path::after {
117
+ clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
118
+ }
119
+
120
+ .tina-date-field .rdt {
121
+ position: relative;
122
+ }
123
+
124
+ .tina-date-field .rdtPicker {
125
+ display: none;
126
+ position: absolute;
127
+ width: 100%;
128
+ max-width: 350px;
129
+ padding: 4px;
130
+ margin-top: 4px;
131
+ z-index: 99999 !important;
132
+ background: var(--tina-color-grey-0);
133
+ border-radius: var(--tina-radius-small);
134
+ box-shadow: var(--tina-shadow-big);
135
+ border: 1px solid var(--tina-color-grey-2);
136
+ }
137
+
138
+ .tina-date-field .rdtOpen .rdtPicker {
139
+ display: block;
140
+ }
141
+
142
+ .tina-date-field .rdtStatic .rdtPicker {
143
+ box-shadow: none;
144
+ position: static;
145
+ }
146
+
147
+ .tina-date-field .rdtPicker .rdtTimeToggle {
148
+ text-align: center;
149
+ }
150
+
151
+ .tina-date-field .rdtPicker table {
152
+ width: 100%;
153
+ margin: 0;
154
+ }
155
+
156
+ .tina-date-field .rdtPicker td,
157
+ .rdtPicker th {
158
+ text-align: center;
159
+ height: 28px;
160
+ }
161
+
162
+ .tina-date-field .rdtPicker td {
163
+ cursor: pointer;
164
+ }
165
+
166
+ .tina-date-field .rdtPicker td.rdtDay:hover,
167
+ .tina-date-field .rdtPicker td.rdtHour:hover,
168
+ .tina-date-field .rdtPicker td.rdtMinute:hover,
169
+ .tina-date-field .rdtPicker td.rdtSecond:hover,
170
+ .tina-date-field .rdtPicker .rdtTimeToggle:hover {
171
+ background: var(--tina-color-grey-2);
172
+ color: var(--tina-color-primary);
173
+ border-radius: var(--tina-radius-small);
174
+ cursor: pointer;
175
+ }
176
+
177
+ .tina-date-field .rdtPicker td.rdtDay:hover:active,
178
+ .tina-date-field .rdtPicker td.rdtHour:hover:active,
179
+ .tina-date-field .rdtPicker td.rdtMinute:hover:active,
180
+ .tina-date-field .rdtPicker td.rdtSecond:hover:active,
181
+ .tina-date-field .rdtPicker .rdtTimeToggle:hover:active {
182
+ background: var(--tina-color-primary);
183
+ color: var(--tina-color-grey-0);
184
+ border-radius: var(--tina-radius-small);
185
+ }
186
+
187
+ .tina-date-field .rdtPicker td.rdtOld,
188
+ .rdtPicker td.rdtNew {
189
+ color: var(--tina-color-grey-6);
190
+ }
191
+
192
+ .tina-date-field .rdtPicker td.rdtToday {
193
+ position: relative;
194
+ }
195
+
196
+ .tina-date-field .rdtPicker td.rdtToday:before {
197
+ content: "";
198
+ display: inline-block;
199
+ border-left: 7px solid transparent;
200
+ border-bottom: 7px solid var(--tina-color-primary);
201
+ border-radius: 20px;
202
+ border-top-color: rgba(0, 0, 0, 0.2);
203
+ position: absolute;
204
+ bottom: 4px;
205
+ right: 4px;
206
+ }
207
+
208
+ .tina-date-field .rdtPicker td.rdtActive,
209
+ .rdtPicker td.rdtActive:hover {
210
+ background-color: var(--tina-color-primary);
211
+ color: var(--tina-color-grey-0);
212
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
213
+ }
214
+
215
+ .tina-date-field .rdtPicker td.rdtActive.rdtToday:before {
216
+ border-bottom-color: var(--tina-color-grey-0);
217
+ }
218
+
219
+ .tina-date-field .rdtPicker td.rdtDisabled,
220
+ .rdtPicker td.rdtDisabled:hover {
221
+ background: none;
222
+ color: var(--tina-color-grey-6);
223
+ cursor: not-allowed;
224
+ }
225
+
226
+ .tina-date-field .rdtPicker td span.rdtOld {
227
+ color: var(--tina-color-grey-6);
228
+ }
229
+
230
+ .tina-date-field .rdtPicker td span.rdtDisabled,
231
+ .rdtPicker td span.rdtDisabled:hover {
232
+ background: none;
233
+ color: var(--tina-color-grey-6);
234
+ cursor: not-allowed;
235
+ }
236
+
237
+ .tina-date-field .rdtPicker th {
238
+ border-bottom: 1px solid var(--tina-color-grey-1);
239
+ }
240
+
241
+ .tina-date-field .rdtPicker .dow {
242
+ width: 14.2857%;
243
+ border-bottom: none;
244
+ cursor: default;
245
+ }
246
+
247
+ .tina-date-field .rdtPicker th.rdtSwitch {
248
+ width: 100px;
249
+ }
250
+
251
+ .tina-date-field .rdtPicker th.rdtNext,
252
+ .rdtPicker th.rdtPrev {
253
+ font-size: 21px;
254
+ vertical-align: top;
255
+ }
256
+
257
+ .tina-date-field .rdtPrev span,
258
+ .rdtNext span {
259
+ display: block;
260
+ -webkit-touch-callout: none;
261
+ /* iOS Safari */
262
+ -webkit-user-select: none;
263
+ /* Chrome/Safari/Opera */
264
+ -khtml-user-select: none;
265
+ /* Konqueror */
266
+ -moz-user-select: none;
267
+ /* Firefox */
268
+ -ms-user-select: none;
269
+ /* Internet Explorer/Edge */
270
+ user-select: none;
271
+ }
272
+
273
+ .tina-date-field .rdtPicker th.rdtDisabled,
274
+ .rdtPicker th.rdtDisabled:hover {
275
+ background: none;
276
+ color: var(--tina-color-grey-6);
277
+ cursor: not-allowed;
278
+ }
279
+
280
+ .tina-date-field .rdtPicker thead tr:first-child th {
281
+ cursor: pointer;
282
+ }
283
+
284
+ .tina-date-field .rdtPicker thead tr:first-child th:hover {
285
+ background: var(--tina-color-grey-2);
286
+ color: var(--tina-color-primary);
287
+ border-radius: var(--tina-radius-small);
288
+ }
289
+
290
+ .tina-date-field .rdtPicker tfoot {
291
+ border-top: 1px solid var(--tina-color-grey-1);
292
+ }
293
+
294
+ .tina-date-field .rdtPicker button {
295
+ border: none;
296
+ background: none;
297
+ cursor: pointer;
298
+ }
299
+
300
+ .tina-date-field .rdtPicker button:hover {
301
+ background: var(--tina-color-grey-2);
302
+ color: var(--tina-color-primary);
303
+ border-radius: var(--tina-radius-small);
304
+ }
305
+
306
+ .tina-date-field .rdtPicker thead button {
307
+ width: 100%;
308
+ height: 100%;
309
+ }
310
+
311
+ .tina-date-field td.rdtMonth,
312
+ td.rdtYear {
313
+ height: 50px;
314
+ width: 25%;
315
+ cursor: pointer;
316
+ }
317
+
318
+ .tina-date-field td.rdtMonth:hover,
319
+ td.rdtYear:hover {
320
+ background: var(--tina-color-grey-2);
321
+ color: var(--tina-color-primary);
322
+ border-radius: var(--tina-radius-small);
323
+ }
324
+
325
+ .tina-date-field .rdtCounters {
326
+ display: inline-block;
327
+ }
328
+
329
+ .tina-date-field .rdtCounters > div {
330
+ float: left;
331
+ }
332
+
333
+ .tina-date-field .rdtCounter {
334
+ height: 100px;
335
+ }
336
+
337
+ .tina-date-field .rdtCounter {
338
+ width: 40px;
339
+ }
340
+
341
+ .tina-date-field .rdtCounterSeparator {
342
+ line-height: 100px;
343
+ }
344
+
345
+ .tina-date-field .rdtCounter .rdtBtn {
346
+ height: 40%;
347
+ line-height: 40px;
348
+ cursor: pointer;
349
+ display: block;
350
+ -webkit-touch-callout: none;
351
+ /* iOS Safari */
352
+ -webkit-user-select: none;
353
+ /* Chrome/Safari/Opera */
354
+ -khtml-user-select: none;
355
+ /* Konqueror */
356
+ -moz-user-select: none;
357
+ /* Firefox */
358
+ -ms-user-select: none;
359
+ /* Internet Explorer/Edge */
360
+ user-select: none;
361
+ }
362
+
363
+ .tina-date-field .rdtCounter .rdtBtn:hover {
364
+ background: var(--tina-color-grey-2);
365
+ color: var(--tina-color-primary);
366
+ border-radius: var(--tina-radius-small);
367
+ }
368
+
369
+ .tina-date-field .rdtCounter .rdtCount {
370
+ height: 20%;
371
+ font-size: 1.2em;
372
+ }
373
+
374
+ .tina-date-field .rdtMilli {
375
+ vertical-align: middle;
376
+ padding-left: 8px;
377
+ width: 48px;
378
+ }
379
+
380
+ .tina-date-field .rdtMilli input {
381
+ width: 100%;
382
+ font-size: 1.2em;
383
+ margin-top: 37px;
384
+ }
385
+
386
+ .tina-date-field .rdtTime td {
387
+ cursor: default;
388
+ }
@@ -0,0 +1,49 @@
1
+ import { Field, Form, FormOptions, TinaCMS, TinaField } from 'tinacms';
2
+
3
+ export type FieldType = Field & TinaField;
4
+ export type FormValues = Record<string, unknown>;
5
+ export type FormType = Form<FormValues, FieldType>;
6
+
7
+ type FormCreator = (formConfig: FormOptions<any>) => Form;
8
+ interface GlobalFormOptions {
9
+ icon?: any;
10
+ layout: 'fullscreen' | 'popup';
11
+ }
12
+ type GlobalFormCreator = (
13
+ formConfig: FormOptions<any>,
14
+ options?: GlobalFormOptions
15
+ ) => Form;
16
+ interface GlobalFormOptions {
17
+ icon?: any;
18
+ layout: 'fullscreen' | 'popup';
19
+ }
20
+ export interface FormifyArgs {
21
+ formConfig: FormOptions<any>;
22
+ createForm: FormCreator;
23
+ createGlobalForm: FormCreator;
24
+ skip?: () => void;
25
+ }
26
+
27
+ export type FormifyCallback = (args: FormifyArgs, cms: TinaCMS) => Form | void;
28
+ export type onSubmitArgs = {
29
+ /**
30
+ * @deprecated queryString is actually a mutation string, use `mutationString` instead
31
+ */
32
+ queryString: string;
33
+ mutationString: string;
34
+ variables: object;
35
+ };
36
+
37
+ export const createForm = (formConfig: FormOptions<any, any>) => {
38
+ return new Form(formConfig);
39
+ };
40
+ export const createGlobalForm: GlobalFormCreator = (
41
+ formConfig,
42
+ options?: { icon?: any; layout: 'fullscreen' | 'popup' }
43
+ ) => {
44
+ const form = new Form({
45
+ ...formConfig,
46
+ global: { global: true, ...options },
47
+ });
48
+ return form;
49
+ };
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { TinaCMS } from 'tinacms';
3
+
4
+ const ErrorModalContent = (props: { title: string; errors: string[] }) => {
5
+ const { title, errors } = props;
6
+ return (
7
+ <>
8
+ <div>{title}</div>
9
+ <ul>
10
+ {errors.map((error, i) => (
11
+ <li key={i}>{error}</li>
12
+ ))}
13
+ </ul>
14
+ </>
15
+ );
16
+ };
17
+
18
+ export const showErrorModal = (
19
+ title: string,
20
+ errors: string[],
21
+ cms: TinaCMS
22
+ ) => {
23
+ cms.alerts.error(() => <ErrorModalContent title={title} errors={errors} />);
24
+ };