tinacms 0.61.1 → 0.64.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,78 @@
1
1
  # tinacms
2
2
 
3
+ ## 0.64.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 28010a026: Adds tailwind styles to Admin Layout
8
+ - Updated dependencies [e8ca82899]
9
+ - @tinacms/toolkit@0.56.7
10
+
11
+ ## 0.64.0
12
+
13
+ ### Minor Changes
14
+
15
+ - 4a3990c7e: Cloudinary media store now serves images over `https` by default. This can now be configured though the handler provided.
16
+
17
+ To revert to the old behavior:
18
+
19
+ ```ts
20
+ export default createMediaHandler(
21
+ {
22
+ // ...
23
+ },
24
+ {
25
+ useHttps: false,
26
+ }
27
+ )
28
+ ```
29
+
30
+ The default for `useHttps` is `true`
31
+
32
+ ## 0.63.0
33
+
34
+ ### Minor Changes
35
+
36
+ - 3897ec5d9: Replace `branch`, `clientId`, `isLocalClient` props with single `apiURL`. When working locally, this should be `http://localhost:4001/graphql`. For Tina Cloud, use `https://content.tinajs.io/content/<my-client-id>/github/<my-branch>`
37
+
38
+ ```tsx
39
+ // _app.tsx
40
+ // ...
41
+ <TinaCMS apiURL={process.env.NEXT_PUBLIC_TINA_API_URL} {...pageProps}>
42
+ {livePageProps => <Component {...livePageProps} />}
43
+ </TinaCMS>
44
+ ```
45
+
46
+ DEPRECATION NOTICE: `branch`, `clientId`, `isLocalClient` props will be deprecated in the future
47
+
48
+ ### Patch Changes
49
+
50
+ - 96e4a77e2: Fixed types
51
+ - b5c22503a: Changes messaging on login page for TinaAdmin when in local-mode
52
+ - Updated dependencies [60f939f34]
53
+ - @tinacms/toolkit@0.56.6
54
+
55
+ ## 0.62.0
56
+
57
+ ### Minor Changes
58
+
59
+ - 70da62fe8: deprecated the use of `getStaticPropsForTina`
60
+
61
+ ### Patch Changes
62
+
63
+ - 0afa75df1: 2342 - [TinaAdmin] Truncates the `filename` column for the Document List View
64
+ - 7dafce89d: Fixed issue where content creator was invalid
65
+ - 3de8c6165: Enabled branch creation in branch switcher
66
+ - fee183f8f: add "switch to default branch" recover option to error boundary
67
+ - 5c070a83f: feat: Add UI banner for when in localMode
68
+ - Updated dependencies [ddf81a4fd]
69
+ - Updated dependencies [20260a82d]
70
+ - Updated dependencies [0370147fb]
71
+ - Updated dependencies [3de8c6165]
72
+ - Updated dependencies [2eaad97bf]
73
+ - Updated dependencies [5c070a83f]
74
+ - @tinacms/toolkit@0.56.5
75
+
3
76
  ## 0.61.1
4
77
 
5
78
  ### Patch Changes
@@ -42,6 +42,7 @@ export declare class Client {
42
42
  private options;
43
43
  events: EventBus;
44
44
  constructor({ tokenStorage, ...options }: ServerOptions);
45
+ get isLocalMode(): boolean;
45
46
  setBranch(branchName: string): void;
46
47
  addPendingContent: (props: any) => Promise<unknown>;
47
48
  getSchema: () => Promise<GraphQLSchema>;
package/dist/index.es.js CHANGED
@@ -29,7 +29,7 @@ var __objRest = (source, exclude) => {
29
29
  }
30
30
  return target;
31
31
  };
32
- import { EventBus, StyleReset, Modal, ModalPopup, ModalHeader, ModalBody, ModalActions, Button, LoadingDots, useLocalStorage, TinaCMS, BranchSwitcherPlugin, BranchDataProvider, TinaProvider, useCMS, useBranchData, FormMetaPlugin, Form, GlobalFormPlugin, FullscreenFormBuilder } from "@tinacms/toolkit";
32
+ import { EventBus, Modal, ModalPopup, ModalHeader, ModalBody, ModalActions, Button, LoadingDots, useLocalStorage, TinaCMS, BranchSwitcherPlugin, BranchDataProvider, TinaProvider, useCMS, useBranchData, FormMetaPlugin, Form, GlobalFormPlugin, FullscreenFormBuilder } from "@tinacms/toolkit";
33
33
  export * from "@tinacms/toolkit";
34
34
  import { TypeInfo, visit, visitWithTypeInfo, getNamedType, GraphQLObjectType, isLeafType, GraphQLUnionType, isScalarType, getIntrospectionQuery, buildClientSchema, print } from "graphql";
35
35
  import set from "lodash.set";
@@ -39,6 +39,7 @@ import styled from "styled-components";
39
39
  import * as yup from "yup";
40
40
  import { setEditing, useEditState } from "@tinacms/sharedctx";
41
41
  import { getIn, setIn } from "final-form";
42
+ import UrlPattern from "url-pattern";
42
43
  import { NavLink, useLocation, useParams, Link, useNavigate, BrowserRouter, Routes, Route } from "react-router-dom";
43
44
  import { Menu, Transition } from "@headlessui/react";
44
45
  function popupWindow(url, title, window2, w, h) {
@@ -374,6 +375,11 @@ function assertIsUnionType(type) {
374
375
  throw new Error(`Expected an instance of GraphQLUnionType for type ${type.name}`);
375
376
  }
376
377
  }
378
+ const captureBranchName = /^refs\/heads\/(.*)/;
379
+ const parseRefForBranchName = (ref) => {
380
+ const matches = ref.match(captureBranchName);
381
+ return matches[1];
382
+ };
377
383
  class Client {
378
384
  constructor(_a) {
379
385
  var _b = _a, { tokenStorage = "MEMORY" } = _b, options = __objRest(_b, ["tokenStorage"]);
@@ -464,6 +470,9 @@ mutation addPendingDocumentMutation(
464
470
  break;
465
471
  }
466
472
  }
473
+ get isLocalMode() {
474
+ return this.contentApiUrl.includes("localhost");
475
+ }
467
476
  setBranch(branchName) {
468
477
  var _a, _b, _c;
469
478
  const encodedBranch = encodeURIComponent(branchName);
@@ -591,15 +600,15 @@ mutation addPendingDocumentMutation(
591
600
  try {
592
601
  const res = await this.fetchWithToken(url, {
593
602
  method: "POST",
594
- body: {
603
+ body: JSON.stringify({
595
604
  baseBranch,
596
605
  branchName
597
- },
606
+ }),
598
607
  headers: {
599
608
  "Content-Type": "application/json"
600
609
  }
601
610
  });
602
- return JSON.stringify(res);
611
+ return await res.json().then((r) => parseRefForBranchName(r.data.ref));
603
612
  } catch (error) {
604
613
  console.error("There was an error creating a new branch.", error);
605
614
  return null;
@@ -624,11 +633,11 @@ class LocalClient extends Client {
624
633
  }
625
634
  }
626
635
  function ModalBuilder(modalProps) {
627
- return /* @__PURE__ */ React.createElement(StyleReset, null, /* @__PURE__ */ React.createElement(Modal, null, /* @__PURE__ */ React.createElement(ModalPopup, null, /* @__PURE__ */ React.createElement(ModalHeader, null, modalProps.title), /* @__PURE__ */ React.createElement(ModalBody, {
636
+ return /* @__PURE__ */ React.createElement(Modal, null, /* @__PURE__ */ React.createElement(ModalPopup, null, /* @__PURE__ */ React.createElement(ModalHeader, null, modalProps.title), /* @__PURE__ */ React.createElement(ModalBody, {
628
637
  padded: true
629
638
  }, /* @__PURE__ */ React.createElement("p", null, modalProps.message), modalProps.error && /* @__PURE__ */ React.createElement(ErrorLabel, null, modalProps.error)), /* @__PURE__ */ React.createElement(ModalActions, null, modalProps.actions.map((action) => /* @__PURE__ */ React.createElement(AsyncButton, __spreadValues({
630
639
  key: action.name
631
- }, action)))))));
640
+ }, action))))));
632
641
  }
633
642
  const ErrorLabel = styled.p`
634
643
  color: var(--tina-color-error) !important;
@@ -1009,24 +1018,10 @@ function useGraphqlForms({
1009
1018
  name: "tina-admin-link",
1010
1019
  Component: () => /* @__PURE__ */ React.createElement("a", {
1011
1020
  href: `/admin/collections/${result._internalSys.collection.name}/${result._internalSys.filename}`,
1012
- style: {
1013
- display: "flex",
1014
- alignItems: "center",
1015
- padding: "10px 20px",
1016
- borderTop: "1px solid var(--tina-color-grey-2)",
1017
- textTransform: "uppercase",
1018
- fontSize: "11px",
1019
- fontWeight: 500,
1020
- background: "var(--tina-color-grey-0)"
1021
- }
1021
+ className: "flex items-center px-5 py-2 border-t border-b shadow border-gray-100 uppercase text-xs font-medium bg-white hover:bg-gray-50 hover:text-blue-500 transition-colors duration-100 ease-out"
1022
1022
  }, /* @__PURE__ */ React.createElement(BiLinkExternal, {
1023
- style: {
1024
- height: "1.25em",
1025
- width: "auto",
1026
- opacity: "0.8",
1027
- marginRight: "8px"
1028
- }
1029
- }), " ", "Edit in Tina Admin")
1023
+ className: "h-4 w-auto opacity-80 mr-2"
1024
+ }), " Edit in Tina Admin")
1030
1025
  });
1031
1026
  cms.plugins.add(TinaAdminLink);
1032
1027
  }
@@ -1154,8 +1149,8 @@ function useGraphqlForms({
1154
1149
  }, [queryString, JSON.stringify(variables), currentBranch]);
1155
1150
  return [data, isLoading];
1156
1151
  }
1157
- const transformDocumentIntoMutationRequestPayload = (document2, instructions) => {
1158
- const _a = document2, { _collection, __typename, _template } = _a, rest = __objRest(_a, ["_collection", "__typename", "_template"]);
1152
+ const transformDocumentIntoMutationRequestPayload = (document, instructions) => {
1153
+ const _a = document, { _collection, __typename, _template } = _a, rest = __objRest(_a, ["_collection", "__typename", "_template"]);
1159
1154
  const params = transformParams(rest);
1160
1155
  const paramsWithTemplate = instructions.includeTemplate ? { [_template]: params } : params;
1161
1156
  return instructions.includeCollection ? { [_collection]: paramsWithTemplate } : paramsWithTemplate;
@@ -1370,7 +1365,7 @@ const useDocumentCreatorPlugin = (args) => {
1370
1365
  }));
1371
1366
  };
1372
1367
  run();
1373
- }, [cms, values == null ? void 0 : values.collection]);
1368
+ }, [cms]);
1374
1369
  React.useEffect(() => {
1375
1370
  if (plugin) {
1376
1371
  cms.plugins.add(plugin);
@@ -1382,6 +1377,19 @@ const useDocumentCreatorPlugin = (args) => {
1382
1377
  };
1383
1378
  }, [plugin]);
1384
1379
  };
1380
+ var styles = ".tina-tailwind {\n\n /* gray-600 from tailwind config */\n}\n\n/**\nUse a better box model (opinionated).\n*/\n\n.tina-tailwind *,\n.tina-tailwind ::before,\n.tina-tailwind ::after {\n box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n.tina-tailwind html {\n -moz-tab-size: 4;\n tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\n.tina-tailwind html {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\nRemove the margin in all browsers.\n*/\n\n.tina-tailwind body {\n margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\n.tina-tailwind body {\n font-family:\n system-ui,\n -apple-system, /* Firefox supports this but not yet `system-ui` */\n 'Segoe UI',\n Roboto,\n Helvetica,\n Arial,\n sans-serif,\n 'Apple Color Emoji',\n 'Segoe UI Emoji';\n}\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\n.tina-tailwind hr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n}\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\n.tina-tailwind abbr[title] {\n text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\n.tina-tailwind b,\n.tina-tailwind strong {\n font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\n.tina-tailwind code,\n.tina-tailwind kbd,\n.tina-tailwind samp,\n.tina-tailwind pre {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Consolas,\n 'Liberation Mono',\n Menlo,\n monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\n.tina-tailwind small {\n font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\n.tina-tailwind sub,\n.tina-tailwind sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\n/*\nText-level semantics\n====================\n*/\n\n.tina-tailwind sub {\n bottom: -0.25em;\n}\n\n/*\nGrouping content\n================\n*/\n\n.tina-tailwind sup {\n top: -0.5em;\n}\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\n.tina-tailwind table {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n}\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\n.tina-tailwind button,\n.tina-tailwind input,\n.tina-tailwind optgroup,\n.tina-tailwind select,\n.tina-tailwind textarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\n.tina-tailwind button,\n.tina-tailwind select { /* 1 */\n text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\n.tina-tailwind button,\n.tina-tailwind [type='button'],\n.tina-tailwind [type='reset'],\n.tina-tailwind [type='submit'] {\n -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n.tina-tailwind ::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n.tina-tailwind :-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n.tina-tailwind :-moz-ui-invalid {\n box-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\n.tina-tailwind legend {\n padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\n.tina-tailwind progress {\n vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n.tina-tailwind ::-webkit-inner-spin-button,\n.tina-tailwind ::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n.tina-tailwind [type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n.tina-tailwind ::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n.tina-tailwind ::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\n.tina-tailwind summary {\n display: list-item;\n}\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\n.tina-tailwind blockquote,\n.tina-tailwind dl,\n.tina-tailwind dd,\n.tina-tailwind h1,\n.tina-tailwind h2,\n.tina-tailwind h3,\n.tina-tailwind h4,\n.tina-tailwind h5,\n.tina-tailwind h6,\n.tina-tailwind hr,\n.tina-tailwind figure,\n.tina-tailwind p,\n.tina-tailwind pre {\n margin: 0;\n}\n\n/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n.tina-tailwind button {\n background-color: transparent;\n background-image: none;\n}\n\n/*\nInteractive\n===========\n*/\n\n.tina-tailwind fieldset {\n margin: 0;\n padding: 0;\n}\n\n/*\nForms\n=====\n*/\n\n.tina-tailwind ol,\n.tina-tailwind ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * 1. Use the user's configured `sans` font-family (with Tailwind's default\n * sans-serif font stack as a fallback) as a sane default.\n * 2. Use Tailwind's default \"normal\" line-height so the user isn't forced\n * to override it to ensure consistency even when using the default theme.\n */\n\n.tina-tailwind html {\n font-family: Inter var, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n/**\n * Inherit font-family and line-height from `html` so users can set them as\n * a class directly on the `html` element.\n */\n\n.tina-tailwind body {\n font-family: inherit;\n line-height: inherit;\n}\n\n/**\n * 1. Prevent padding and border from affecting element width.\n *\n * We used to set this in the html element and inherit from\n * the parent element for everything else. This caused issues\n * in shadow-dom-enhanced elements like <details> where the content\n * is wrapped by a div with box-sizing set to `content-box`.\n *\n * https://github.com/mozdevs/cssremedy/issues/4\n *\n *\n * 2. Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it's border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n.tina-tailwind *,\n.tina-tailwind ::before,\n.tina-tailwind ::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: currentColor; /* 2 */\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\n.tina-tailwind hr {\n border-top-width: 1px;\n}\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\n.tina-tailwind img {\n border-style: solid;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n.tina-tailwind textarea {\n resize: vertical;\n}\n\n/*\nTabular data\n============\n*/\n\n.tina-tailwind input::placeholder,\n.tina-tailwind textarea::placeholder {\n opacity: 1;\n color: #918c9e;\n}\n\n/*\nSections\n========\n*/\n\n.tina-tailwind button,\n.tina-tailwind [role=\"button\"] {\n cursor: pointer;\n}\n\n/**\n * Override legacy focus reset from Normalize with modern Firefox focus styles.\n *\n * This is actually an improvement over the new defaults in Firefox in our testing,\n * as it triggers the better focus styles even for links, which still use a dotted\n * outline in Firefox by default.\n */\n\n.tina-tailwind :-moz-focusring {\n outline: auto;\n}\n\n/*\nDocument\n========\n*/\n\n.tina-tailwind table {\n border-collapse: collapse;\n}\n\n/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n.tina-tailwind h1,\n.tina-tailwind h2,\n.tina-tailwind h3,\n.tina-tailwind h4,\n.tina-tailwind h5,\n.tina-tailwind h6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\n.tina-tailwind a {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don't inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\n.tina-tailwind button,\n.tina-tailwind input,\n.tina-tailwind optgroup,\n.tina-tailwind select,\n.tina-tailwind textarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured 'mono' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * 'mono' font family.\n */\n\n.tina-tailwind pre,\n.tina-tailwind code,\n.tina-tailwind kbd,\n.tina-tailwind samp {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n/**\n * 1. Make replaced elements `display: block` by default as that's\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n * \n * 2. Add `vertical-align: middle` to align replaced elements more\n * sensibly by default when overriding `display` by adding a\n * utility like `inline`.\n *\n * This can trigger a poorly considered linting error in some\n * tools but is included by design.\n * \n * https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210\n */\n\n.tina-tailwind img,\n.tina-tailwind svg,\n.tina-tailwind video,\n.tina-tailwind canvas,\n.tina-tailwind audio,\n.tina-tailwind iframe,\n.tina-tailwind embed,\n.tina-tailwind object {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their intrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\n.tina-tailwind img,\n.tina-tailwind video {\n max-width: 100%;\n height: auto;\n}\n\n/**\n * Ensure the default browser behavior of the `hidden` attribute.\n */\n\n.tina-tailwind [hidden] {\n display: none;\n}\n\n/* ! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com */\n\n.tina-tailwind *, .tina-tailwind ::before, .tina-tailwind ::after {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.tina-tailwind *, .tina-tailwind ::before, .tina-tailwind ::after {\n --tw-border-opacity: 1;\n border-color: rgba(225, 221, 236, var(--tw-border-opacity));\n}\n\n.tina-tailwind *, .tina-tailwind ::before, .tina-tailwind ::after {\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n}\n\n.tina-tailwind *, .tina-tailwind ::before, .tina-tailwind ::after {\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(0, 132, 255, 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n}\n\n.tina-tailwind *, .tina-tailwind ::before, .tina-tailwind ::after {\n --tw-blur: var(--tw-empty,/*!*/ /*!*/);\n --tw-brightness: var(--tw-empty,/*!*/ /*!*/);\n --tw-contrast: var(--tw-empty,/*!*/ /*!*/);\n --tw-grayscale: var(--tw-empty,/*!*/ /*!*/);\n --tw-hue-rotate: var(--tw-empty,/*!*/ /*!*/);\n --tw-invert: var(--tw-empty,/*!*/ /*!*/);\n --tw-saturate: var(--tw-empty,/*!*/ /*!*/);\n --tw-sepia: var(--tw-empty,/*!*/ /*!*/);\n --tw-drop-shadow: var(--tw-empty,/*!*/ /*!*/);\n --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.tina-tailwind .static {\n position: static !important;\n}\n\n.tina-tailwind .fixed {\n position: fixed !important;\n}\n\n.tina-tailwind .absolute {\n position: absolute !important;\n}\n\n.tina-tailwind .relative {\n position: relative !important;\n}\n\n.tina-tailwind .bottom-3 {\n bottom: 12px !important;\n}\n\n.tina-tailwind .right-5 {\n right: 20px !important;\n}\n\n.tina-tailwind .right-0 {\n right: 0px !important;\n}\n\n.tina-tailwind .z-50 {\n z-index: 50 !important;\n}\n\n.tina-tailwind .mr-2 {\n margin-right: 8px !important;\n}\n\n.tina-tailwind .-ml-1 {\n margin-left: -4px !important;\n}\n\n.tina-tailwind .mr-1\\.5 {\n margin-right: 6px !important;\n}\n\n.tina-tailwind .mr-1 {\n margin-right: 4px !important;\n}\n\n.tina-tailwind .mb-3 {\n margin-bottom: 12px !important;\n}\n\n.tina-tailwind .ml-1 {\n margin-left: 4px !important;\n}\n\n.tina-tailwind .mt-2 {\n margin-top: 8px !important;\n}\n\n.tina-tailwind .mt-8 {\n margin-top: 32px !important;\n}\n\n.tina-tailwind .mb-0\\.5 {\n margin-bottom: 2px !important;\n}\n\n.tina-tailwind .mb-0 {\n margin-bottom: 0px !important;\n}\n\n.tina-tailwind .block {\n display: block !important;\n}\n\n.tina-tailwind .inline-block {\n display: inline-block !important;\n}\n\n.tina-tailwind .flex {\n display: flex !important;\n}\n\n.tina-tailwind .inline-flex {\n display: inline-flex !important;\n}\n\n.tina-tailwind .table {\n display: table !important;\n}\n\n.tina-tailwind .h-screen {\n height: 100vh !important;\n}\n\n.tina-tailwind .h-4 {\n height: 16px !important;\n}\n\n.tina-tailwind .h-auto {\n height: auto !important;\n}\n\n.tina-tailwind .h-6 {\n height: 24px !important;\n}\n\n.tina-tailwind .h-5 {\n height: 20px !important;\n}\n\n.tina-tailwind .w-auto {\n width: auto !important;\n}\n\n.tina-tailwind .w-full {\n width: 100% !important;\n}\n\n.tina-tailwind .w-10 {\n width: 40px !important;\n}\n\n.tina-tailwind .w-80 {\n width: 320px !important;\n}\n\n.tina-tailwind .w-2\\/3 {\n width: 66.666667% !important;\n}\n\n.tina-tailwind .w-6 {\n width: 24px !important;\n}\n\n.tina-tailwind .w-56 {\n width: 224px !important;\n}\n\n.tina-tailwind .min-w-full {\n min-width: 100% !important;\n}\n\n.tina-tailwind .max-w-lg {\n max-width: 32rem !important;\n}\n\n.tina-tailwind .max-w-screen-md {\n max-width: 768px !important;\n}\n\n.tina-tailwind .max-w-xs {\n max-width: 20rem !important;\n}\n\n.tina-tailwind .flex-1 {\n flex: 1 1 0% !important;\n}\n\n.tina-tailwind .flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.tina-tailwind .origin-top-right {\n transform-origin: top right !important;\n}\n\n.tina-tailwind .translate-y-full {\n --tw-translate-y: 100% !important;\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .-translate-y-2 {\n --tw-translate-y: -8px !important;\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .translate-y-0 {\n --tw-translate-y: 0px !important;\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .rotate-90 {\n --tw-rotate: 90deg !important;\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .rotate-0 {\n --tw-rotate: 0deg !important;\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .scale-95 {\n --tw-scale-x: .95 !important;\n --tw-scale-y: .95 !important;\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .scale-100 {\n --tw-scale-x: 1 !important;\n --tw-scale-y: 1 !important;\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .transform {\n transform: var(--tw-transform) !important;\n}\n\n.tina-tailwind .flex-col {\n flex-direction: column !important;\n}\n\n.tina-tailwind .items-end {\n align-items: flex-end !important;\n}\n\n.tina-tailwind .items-center {\n align-items: center !important;\n}\n\n.tina-tailwind .items-stretch {\n align-items: stretch !important;\n}\n\n.tina-tailwind .justify-start {\n justify-content: flex-start !important;\n}\n\n.tina-tailwind .justify-end {\n justify-content: flex-end !important;\n}\n\n.tina-tailwind .justify-center {\n justify-content: center !important;\n}\n\n.tina-tailwind .justify-between {\n justify-content: space-between !important;\n}\n\n.tina-tailwind .gap-0\\.5 {\n gap: 2px !important;\n}\n\n.tina-tailwind .gap-0 {\n gap: 0px !important;\n}\n\n.tina-tailwind .gap-4 {\n gap: 16px !important;\n}\n\n.tina-tailwind .gap-1 {\n gap: 4px !important;\n}\n\n.tina-tailwind .gap-3 {\n gap: 12px !important;\n}\n\n.tina-tailwind .gap-1\\.5 {\n gap: 6px !important;\n}\n\n.tina-tailwind .divide-y > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-y-reverse: 0 !important;\n border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))) !important;\n border-bottom-width: calc(1px * var(--tw-divide-y-reverse)) !important;\n}\n\n.tina-tailwind .overflow-hidden {\n overflow: hidden !important;\n}\n\n.tina-tailwind .overflow-y-auto {\n overflow-y: auto !important;\n}\n\n.tina-tailwind .overflow-ellipsis {\n text-overflow: ellipsis !important;\n}\n\n.tina-tailwind .whitespace-nowrap {\n white-space: nowrap !important;\n}\n\n.tina-tailwind .rounded-lg {\n border-radius: 8px !important;\n}\n\n.tina-tailwind .rounded-full {\n border-radius: 9999px !important;\n}\n\n.tina-tailwind .rounded-md {\n border-radius: 6px !important;\n}\n\n.tina-tailwind .border {\n border-width: 1px !important;\n}\n\n.tina-tailwind .border-t {\n border-top-width: 1px !important;\n}\n\n.tina-tailwind .border-b {\n border-bottom-width: 1px !important;\n}\n\n.tina-tailwind .border-r {\n border-right-width: 1px !important;\n}\n\n.tina-tailwind .border-gray-100 {\n --tw-border-opacity: 1 !important;\n border-color: rgba(237, 236, 243, var(--tw-border-opacity)) !important;\n}\n\n.tina-tailwind .border-gray-200 {\n --tw-border-opacity: 1 !important;\n border-color: rgba(225, 221, 236, var(--tw-border-opacity)) !important;\n}\n\n.tina-tailwind .border-transparent {\n border-color: transparent !important;\n}\n\n.tina-tailwind .bg-white {\n --tw-bg-opacity: 1 !important;\n background-color: rgba(255, 255, 255, var(--tw-bg-opacity)) !important;\n}\n\n.tina-tailwind .bg-gray-50 {\n --tw-bg-opacity: 1 !important;\n background-color: rgba(246, 246, 249, var(--tw-bg-opacity)) !important;\n}\n\n.tina-tailwind .bg-transparent {\n background-color: transparent !important;\n}\n\n.tina-tailwind .bg-gradient-to-b {\n background-image: linear-gradient(to bottom, var(--tw-gradient-stops)) !important;\n}\n\n.tina-tailwind .from-blue-900 {\n --tw-gradient-from: #1D2C6C !important;\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(29, 44, 108, 0)) !important;\n}\n\n.tina-tailwind .from-white {\n --tw-gradient-from: #fff !important;\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(255, 255, 255, 0)) !important;\n}\n\n.tina-tailwind .to-gray-900 {\n --tw-gradient-to: #252336 !important;\n}\n\n.tina-tailwind .to-gray-50 {\n --tw-gradient-to: #F6F6F9 !important;\n}\n\n.tina-tailwind .px-5 {\n padding-left: 20px !important;\n padding-right: 20px !important;\n}\n\n.tina-tailwind .py-2 {\n padding-top: 8px !important;\n padding-bottom: 8px !important;\n}\n\n.tina-tailwind .px-4 {\n padding-left: 16px !important;\n padding-right: 16px !important;\n}\n\n.tina-tailwind .py-6 {\n padding-top: 24px !important;\n padding-bottom: 24px !important;\n}\n\n.tina-tailwind .py-4 {\n padding-top: 16px !important;\n padding-bottom: 16px !important;\n}\n\n.tina-tailwind .px-6 {\n padding-left: 24px !important;\n padding-right: 24px !important;\n}\n\n.tina-tailwind .py-1 {\n padding-top: 4px !important;\n padding-bottom: 4px !important;\n}\n\n.tina-tailwind .py-7 {\n padding-top: 28px !important;\n padding-bottom: 28px !important;\n}\n\n.tina-tailwind .px-8 {\n padding-left: 32px !important;\n padding-right: 32px !important;\n}\n\n.tina-tailwind .py-2\\.5 {\n padding-top: 10px !important;\n padding-bottom: 10px !important;\n}\n\n.tina-tailwind .py-14 {\n padding-top: 56px !important;\n padding-bottom: 56px !important;\n}\n\n.tina-tailwind .py-3 {\n padding-top: 12px !important;\n padding-bottom: 12px !important;\n}\n\n.tina-tailwind .py-1\\.5 {\n padding-top: 6px !important;\n padding-bottom: 6px !important;\n}\n\n.tina-tailwind .py-10 {\n padding-top: 40px !important;\n padding-bottom: 40px !important;\n}\n\n.tina-tailwind .pt-16 {\n padding-top: 64px !important;\n}\n\n.tina-tailwind .pb-10 {\n padding-bottom: 40px !important;\n}\n\n.tina-tailwind .text-left {\n text-align: left !important;\n}\n\n.tina-tailwind .text-center {\n text-align: center !important;\n}\n\n.tina-tailwind .font-sans {\n font-family: Inter var, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !important;\n}\n\n.tina-tailwind .text-xs {\n font-size: 13px !important;\n line-height: 1.33 !important;\n}\n\n.tina-tailwind .text-2xl {\n font-size: 24px !important;\n line-height: 1.33 !important;\n}\n\n.tina-tailwind .text-base {\n font-size: 16px !important;\n line-height: 1.5 !important;\n}\n\n.tina-tailwind .text-lg {\n font-size: 18px !important;\n line-height: 1.55 !important;\n}\n\n.tina-tailwind .text-sm {\n font-size: 14px !important;\n line-height: 1.43 !important;\n}\n\n.tina-tailwind .text-3xl {\n font-size: 30px !important;\n line-height: 1.2 !important;\n}\n\n.tina-tailwind .text-4xl {\n font-size: 36px !important;\n line-height: 1.1 !important;\n}\n\n.tina-tailwind .font-medium {\n font-weight: 500 !important;\n}\n\n.tina-tailwind .font-bold {\n font-weight: 700 !important;\n}\n\n.tina-tailwind .uppercase {\n text-transform: uppercase !important;\n}\n\n.tina-tailwind .italic {\n font-style: italic !important;\n}\n\n.tina-tailwind .leading-normal {\n line-height: 1.5 !important;\n}\n\n.tina-tailwind .leading-4 {\n line-height: 16px !important;\n}\n\n.tina-tailwind .leading-5 {\n line-height: 20px !important;\n}\n\n.tina-tailwind .tracking-wide {\n letter-spacing: 0.025em !important;\n}\n\n.tina-tailwind .text-gray-700 {\n --tw-text-opacity: 1 !important;\n color: rgba(67, 62, 82, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-gray-800 {\n --tw-text-opacity: 1 !important;\n color: rgba(54, 49, 69, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-gray-600 {\n --tw-text-opacity: 1 !important;\n color: rgba(86, 81, 101, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-blue-400 {\n --tw-text-opacity: 1 !important;\n color: rgba(34, 150, 254, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-blue-600 {\n --tw-text-opacity: 1 !important;\n color: rgba(5, 116, 228, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-white {\n --tw-text-opacity: 1 !important;\n color: rgba(255, 255, 255, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-gray-400 {\n --tw-text-opacity: 1 !important;\n color: rgba(145, 140, 158, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-gray-300 {\n --tw-text-opacity: 1 !important;\n color: rgba(178, 173, 190, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .text-gray-500 {\n --tw-text-opacity: 1 !important;\n color: rgba(113, 108, 127, var(--tw-text-opacity)) !important;\n}\n\n.tina-tailwind .underline {\n text-decoration: underline !important;\n}\n\n.tina-tailwind .opacity-80 {\n opacity: .8 !important;\n}\n\n.tina-tailwind .opacity-50 {\n opacity: .5 !important;\n}\n\n.tina-tailwind .opacity-100 {\n opacity: 1 !important;\n}\n\n.tina-tailwind .opacity-0 {\n opacity: 0 !important;\n}\n\n.tina-tailwind .opacity-90 {\n opacity: .9 !important;\n}\n\n.tina-tailwind .opacity-70 {\n opacity: .7 !important;\n}\n\n.tina-tailwind .shadow {\n --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) !important;\n}\n\n.tina-tailwind .shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) !important;\n}\n\n.tina-tailwind .shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) !important;\n}\n\n.tina-tailwind .ring-1 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) !important;\n}\n\n.tina-tailwind .ring-black {\n --tw-ring-opacity: 1 !important;\n --tw-ring-color: rgba(0, 0, 0, var(--tw-ring-opacity)) !important;\n}\n\n.tina-tailwind .ring-opacity-5 {\n --tw-ring-opacity: .05 !important;\n}\n\n.tina-tailwind .filter {\n filter: var(--tw-filter) !important;\n}\n\n.tina-tailwind .transition-colors {\n transition-property: background-color, border-color, color, fill, stroke !important;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;\n transition-duration: 150ms !important;\n}\n\n.tina-tailwind .transition-opacity {\n transition-property: opacity !important;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;\n transition-duration: 150ms !important;\n}\n\n.tina-tailwind .transition-all {\n transition-property: all !important;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;\n transition-duration: 150ms !important;\n}\n\n.tina-tailwind .transition {\n transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter !important;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;\n transition-duration: 150ms !important;\n}\n\n.tina-tailwind .duration-100 {\n transition-duration: 100ms !important;\n}\n\n.tina-tailwind .duration-150 {\n transition-duration: 150ms !important;\n}\n\n.tina-tailwind .duration-300 {\n transition-duration: 300ms !important;\n}\n\n.tina-tailwind .duration-75 {\n transition-duration: 75ms !important;\n}\n\n.tina-tailwind .ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1) !important;\n}\n\n.tina-tailwind .ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;\n}\n\n.tina-tailwind .ease-in {\n transition-timing-function: cubic-bezier(0.4, 0, 1, 1) !important;\n}\n\n.tina-tailwind {\n color: #565165;\n}\n\n.hover\\:bg-gray-50:hover {\n --tw-bg-opacity: 1 !important;\n background-color: rgba(246, 246, 249, var(--tw-bg-opacity)) !important;\n}\n\n.hover\\:text-blue-500:hover {\n --tw-text-opacity: 1 !important;\n color: rgba(0, 132, 255, var(--tw-text-opacity)) !important;\n}\n\n.hover\\:text-blue-600:hover {\n --tw-text-opacity: 1 !important;\n color: rgba(5, 116, 228, var(--tw-text-opacity)) !important;\n}\n\n.hover\\:opacity-100:hover {\n opacity: 1 !important;\n}\n\n.hover\\:opacity-80:hover {\n opacity: .8 !important;\n}\n\n.focus\\:outline-none:focus {\n outline: 2px solid transparent !important;\n outline-offset: 2px !important;\n}\n\n.group:hover .group-hover\\:opacity-100 {\n opacity: 1 !important;\n}\n\n.group:hover .group-hover\\:opacity-80 {\n opacity: .8 !important;\n}\n\n@media (min-width: 640px) {\n\n .sm\\:rounded-lg {\n border-radius: 8px !important;\n }\n}\n\n@media (min-width: 1024px) {\n\n .lg\\:w-96 {\n width: 384px !important;\n }\n}\n";
1381
+ const errorButtonStyles = {
1382
+ background: "#eb6337",
1383
+ padding: "12px 18px",
1384
+ cursor: "pointer",
1385
+ borderRadius: "50px",
1386
+ textTransform: "uppercase",
1387
+ letterSpacing: "2px",
1388
+ fontWeight: "bold",
1389
+ border: "none",
1390
+ color: "white",
1391
+ margin: "1rem 0"
1392
+ };
1385
1393
  const SetupHooks = (props) => {
1386
1394
  const cms = useCMS();
1387
1395
  const [payload, isLoading] = useGraphqlForms({
@@ -1411,6 +1419,8 @@ class ErrorBoundary extends React.Component {
1411
1419
  return { hasError: true, message: error.message };
1412
1420
  }
1413
1421
  render() {
1422
+ const branchData = window.localStorage.getItem("tinacms-current-branch");
1423
+ const hasBranchData = branchData && branchData.length > 0;
1414
1424
  if (this.state.hasError && !this.state.pageRefresh) {
1415
1425
  return /* @__PURE__ */ React.createElement("div", {
1416
1426
  style: {
@@ -1431,25 +1441,21 @@ class ErrorBoundary extends React.Component {
1431
1441
  }
1432
1442
  }, /* @__PURE__ */ React.createElement("h3", {
1433
1443
  style: { color: "#eb6337" }
1434
- }, "TinaCMS Render Error"), /* @__PURE__ */ React.createElement("p", null, "Tina caught an error while updating the page:"), /* @__PURE__ */ React.createElement("pre", null, this.state.message), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("p", null, `If you've just updated the form, undo your most recent changes and click "refresh". If after a few refreshes, you're still encountering this error. There is a bigger issue with the site. Please reach out to your site admin.`), /* @__PURE__ */ React.createElement("div", {
1435
- style: { padding: "10px 0" }
1436
- }, /* @__PURE__ */ React.createElement("button", {
1437
- style: {
1438
- background: "#eb6337",
1439
- padding: "12px 18px",
1440
- cursor: "pointer",
1441
- borderRadius: "50px",
1442
- textTransform: "uppercase",
1443
- letterSpacing: "2px",
1444
- fontWeight: "bold",
1445
- border: "none",
1446
- color: "white"
1447
- },
1444
+ }, "TinaCMS Render Error"), /* @__PURE__ */ React.createElement("p", null, "Tina caught an error while updating the page:"), /* @__PURE__ */ React.createElement("pre", {
1445
+ style: { marginTop: "1rem", overflowX: "auto" }
1446
+ }, this.state.message), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("p", null, `If you've just updated the form, undo your most recent changes and click "refresh". If after a few refreshes, you're still encountering this error. There is a bigger issue with the site. Please reach out to your site admin.`), /* @__PURE__ */ React.createElement("button", {
1447
+ style: errorButtonStyles,
1448
1448
  onClick: () => {
1449
1449
  this.setState({ pageRefresh: true });
1450
1450
  setTimeout(() => this.setState({ hasError: false, pageRefresh: false }), 3e3);
1451
1451
  }
1452
- }, "Refresh"))));
1452
+ }, "Refresh"), hasBranchData && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("p", null, `If you're using the branch switcher, you may currently be on a "stale" branch that has been deleted or whose content is not compatible with the latest version of the site's layout. Click the button below to switch back to the default branch for this deployment.`), /* @__PURE__ */ React.createElement("button", {
1453
+ style: errorButtonStyles,
1454
+ onClick: () => {
1455
+ window.localStorage.removeItem("tinacms-current-branch");
1456
+ window.location.reload();
1457
+ }
1458
+ }, "Switch to default branch"))));
1453
1459
  }
1454
1460
  if (this.state.pageRefresh) {
1455
1461
  return /* @__PURE__ */ React.createElement(Loader, null, "Let's try that again.");
@@ -1457,20 +1463,29 @@ class ErrorBoundary extends React.Component {
1457
1463
  return this.props.children;
1458
1464
  }
1459
1465
  }
1466
+ const parseURL = (url) => {
1467
+ if (url.includes("localhost")) {
1468
+ return { branch: null, isLocalClient: true, clientId: null };
1469
+ }
1470
+ const tinaHost = "content.tinajs.io";
1471
+ const params = new URL(url);
1472
+ const pattern = new UrlPattern("/content/:clientId/github/:branch");
1473
+ const result = pattern.match(params.pathname);
1474
+ if (params.host !== tinaHost) {
1475
+ throw new Error(`The only supported hosts are ${tinaHost} or localhost, but received ${params.host}.`);
1476
+ }
1477
+ return __spreadProps(__spreadValues({}, result), {
1478
+ isLocalClient: false
1479
+ });
1480
+ };
1460
1481
  const TinaCMSProvider2 = (_c) => {
1461
1482
  var _d = _c, {
1462
1483
  children,
1463
- branch,
1464
- clientId,
1465
- isLocalClient,
1466
1484
  cmsCallback,
1467
1485
  mediaStore,
1468
1486
  tinaioConfig
1469
1487
  } = _d, props = __objRest(_d, [
1470
1488
  "children",
1471
- "branch",
1472
- "clientId",
1473
- "isLocalClient",
1474
1489
  "cmsCallback",
1475
1490
  "mediaStore",
1476
1491
  "tinaioConfig"
@@ -1478,6 +1493,15 @@ const TinaCMSProvider2 = (_c) => {
1478
1493
  if (typeof props.query === "string") {
1479
1494
  props.query;
1480
1495
  }
1496
+ const validOldSetup = new Boolean(props == null ? void 0 : props.isLocalClient) || new Boolean(props == null ? void 0 : props.clientId) && new Boolean(props == null ? void 0 : props.branch);
1497
+ if (!props.apiURL && !validOldSetup) {
1498
+ throw new Error(`apiURL is a required field`);
1499
+ }
1500
+ const { branch, clientId, isLocalClient } = props.apiURL ? parseURL(props.apiURL) : {
1501
+ branch: props.branch,
1502
+ clientId: props.clientId,
1503
+ isLocalClient: props.isLocalClient
1504
+ };
1481
1505
  return /* @__PURE__ */ React.createElement(TinaCloudProvider, {
1482
1506
  branch,
1483
1507
  clientId,
@@ -1485,7 +1509,7 @@ const TinaCMSProvider2 = (_c) => {
1485
1509
  isLocalClient,
1486
1510
  cmsCallback,
1487
1511
  mediaStore
1488
- }, props.query ? /* @__PURE__ */ React.createElement(SetupHooks, __spreadProps(__spreadValues({
1512
+ }, /* @__PURE__ */ React.createElement("style", null, styles), props.query ? /* @__PURE__ */ React.createElement(SetupHooks, __spreadProps(__spreadValues({
1489
1513
  key: props.query
1490
1514
  }, props), {
1491
1515
  query: props.query || ""
@@ -1619,10 +1643,10 @@ const staticRequest = async ({
1619
1643
  if (!is_server()) {
1620
1644
  console.warn(`Whoops! Looks like you are using \`staticRequest\` in the browser to fetch data.
1621
1645
 
1622
- The local server is not available outside of \`getStaticProps\` or \`getStaticPaths\` functions.
1646
+ The local server is not available outside of \`getStaticProps\` or \`getStaticPaths\` functions.
1623
1647
  This function should only be called on the server at build time.
1624
1648
 
1625
- This will work when developing locally but NOT when deployed to production.
1649
+ This will work when developing locally but NOT when deployed to production.
1626
1650
  `);
1627
1651
  }
1628
1652
  return client.request(query, { variables });
@@ -1635,7 +1659,8 @@ function gql(strings, ...args) {
1635
1659
  return str;
1636
1660
  }
1637
1661
  const Layout = ({ children }) => {
1638
- return /* @__PURE__ */ React.createElement("div", {
1662
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("style", null, styles), /* @__PURE__ */ React.createElement("div", {
1663
+ className: "tina-tailwind",
1639
1664
  style: {
1640
1665
  position: "fixed",
1641
1666
  top: 0,
@@ -1644,9 +1669,10 @@ const Layout = ({ children }) => {
1644
1669
  height: "100%",
1645
1670
  overflow: "auto",
1646
1671
  background: "#F6F6F9",
1672
+ fontFamily: "'Inter', sans-serif",
1647
1673
  zIndex: 9999
1648
1674
  }
1649
- }, children);
1675
+ }, children));
1650
1676
  };
1651
1677
  function ImFilesEmpty(props) {
1652
1678
  return GenIcon({ "tag": "svg", "attr": { "version": "1.1", "viewBox": "0 0 16 16" }, "child": [{ "tag": "path", "attr": { "d": "M14.341 5.579c-0.347-0.473-0.831-1.027-1.362-1.558s-1.085-1.015-1.558-1.362c-0.806-0.591-1.197-0.659-1.421-0.659h-5.75c-0.689 0-1.25 0.561-1.25 1.25v11.5c0 0.689 0.561 1.25 1.25 1.25h9.5c0.689 0 1.25-0.561 1.25-1.25v-7.75c0-0.224-0.068-0.615-0.659-1.421zM12.271 4.729c0.48 0.48 0.856 0.912 1.134 1.271h-2.406v-2.405c0.359 0.278 0.792 0.654 1.271 1.134v0zM14 14.75c0 0.136-0.114 0.25-0.25 0.25h-9.5c-0.136 0-0.25-0.114-0.25-0.25v-11.5c0-0.135 0.114-0.25 0.25-0.25 0 0 5.749-0 5.75 0v3.5c0 0.276 0.224 0.5 0.5 0.5h3.5v7.75z" } }, { "tag": "path", "attr": { "d": "M9.421 0.659c-0.806-0.591-1.197-0.659-1.421-0.659h-5.75c-0.689 0-1.25 0.561-1.25 1.25v11.5c0 0.604 0.43 1.109 1 1.225v-12.725c0-0.135 0.115-0.25 0.25-0.25h7.607c-0.151-0.124-0.297-0.238-0.437-0.341z" } }] })(props);
@@ -1766,7 +1792,7 @@ const AuthTemplate = ({
1766
1792
  return /* @__PURE__ */ React.createElement("div", {
1767
1793
  className: "h-screen w-full bg-gradient-to-b from-blue-900 to-gray-900 flex items-center justify-center px-4 py-6"
1768
1794
  }, /* @__PURE__ */ React.createElement("div", {
1769
- className: "bg-white rounded-lg overflow-hidden shadow-lg w-full max-w-md"
1795
+ className: "bg-white rounded-lg overflow-hidden shadow-lg w-full max-w-lg"
1770
1796
  }, /* @__PURE__ */ React.createElement("div", {
1771
1797
  className: "px-5 py-4 border-b border-gray-150"
1772
1798
  }, /* @__PURE__ */ React.createElement("h2", {
@@ -1791,9 +1817,7 @@ const AuthTemplate = ({
1791
1817
  const LoginPage = () => {
1792
1818
  const { setEdit } = useEditState();
1793
1819
  const login = () => setEdit(true);
1794
- return /* @__PURE__ */ React.createElement(AuthTemplate, {
1795
- message: "Please log in to Tina Cloud to access your content."
1796
- }, /* @__PURE__ */ React.createElement("a", {
1820
+ return /* @__PURE__ */ React.createElement(AuthTemplate, null, /* @__PURE__ */ React.createElement("a", {
1797
1821
  href: "/",
1798
1822
  className: "flex-1 text-center inline-flex justify-center items-center px-8 py-3 shadow-sm text-sm leading-4 font-medium rounded-full text-gray-600 border border-gray-150 hover:opacity-80 hover:bg-gray-50 focus:outline-none focus:shadow-outline-blue transition duration-150 ease-out"
1799
1823
  }, /* @__PURE__ */ React.createElement(MdOutlineArrowBack, {
@@ -1805,7 +1829,7 @@ const LoginPage = () => {
1805
1829
  style: { background: "#0084FF" }
1806
1830
  }, /* @__PURE__ */ React.createElement(BiLogIn, {
1807
1831
  className: "w-6 h-auto mr-1.5 opacity-80"
1808
- }), " Log in"));
1832
+ }), " Enter edit-mode"));
1809
1833
  };
1810
1834
  const logout = () => {
1811
1835
  setEditing(false);
@@ -1963,37 +1987,37 @@ const CollectionListPage = () => {
1963
1987
  className: "min-w-full"
1964
1988
  }, /* @__PURE__ */ React.createElement("tbody", {
1965
1989
  className: "bg-white divide-y divide-gray-150"
1966
- }, documents.map((document2) => {
1967
- const livesiteRoute = routeMapping ? routeMapping.mapper(collection, document2.node) : void 0;
1990
+ }, documents.map((document) => {
1991
+ const livesiteRoute = routeMapping ? routeMapping.mapper(collection, document.node) : void 0;
1968
1992
  return /* @__PURE__ */ React.createElement("tr", {
1969
- key: document2.node.sys.relativePath
1993
+ key: document.node.sys.relativePath
1970
1994
  }, /* @__PURE__ */ React.createElement("td", {
1971
1995
  className: "px-5 py-3 whitespace-nowrap"
1972
1996
  }, /* @__PURE__ */ React.createElement("span", {
1973
1997
  className: "block text-xs mb-0.5 text-gray-400 uppercase"
1974
1998
  }, "Filename"), /* @__PURE__ */ React.createElement(Link, {
1975
- to: `${location2.pathname}/${document2.node.sys.filename}`,
1976
- className: "h-5 leading-5 block"
1999
+ to: `${location2.pathname}/${document.node.sys.filename}`,
2000
+ className: "h-5 leading-5 flex max-w-xs"
1977
2001
  }, /* @__PURE__ */ React.createElement("span", {
1978
- className: "leading-5 font-medium text-base overflow-ellipsis overflow-hidden whitespace-nowrap text-gray-700"
1979
- }, document2.node.sys.filename), /* @__PURE__ */ React.createElement("span", {
1980
- className: "leading-5 text-base font-medium text-gray-300"
1981
- }, document2.node.sys.extension))), /* @__PURE__ */ React.createElement("td", {
2002
+ className: "flex-shrink-1 leading-5 font-medium text-base overflow-ellipsis overflow-hidden whitespace-nowrap text-gray-700"
2003
+ }, document.node.sys.filename), /* @__PURE__ */ React.createElement("span", {
2004
+ className: "flex-shrink-0 leading-5 text-base font-medium text-gray-300"
2005
+ }, document.node.sys.extension))), /* @__PURE__ */ React.createElement("td", {
1982
2006
  className: "px-5 py-3 whitespace-nowrap"
1983
2007
  }, /* @__PURE__ */ React.createElement("span", {
1984
2008
  className: "block text-xs mb-0.5 text-gray-400 uppercase"
1985
2009
  }, "Template"), /* @__PURE__ */ React.createElement("span", {
1986
2010
  className: "h-5 block leading-5 font-regular text-base overflow-ellipsis overflow-hidden whitespace-nowrap text-gray-500"
1987
- }, document2.node.sys.template)), /* @__PURE__ */ React.createElement("td", {
2011
+ }, document.node.sys.template)), /* @__PURE__ */ React.createElement("td", {
1988
2012
  className: "px-5 py-3 whitespace-nowrap flex gap-3 items-center justify-end"
1989
2013
  }, livesiteRoute && /* @__PURE__ */ React.createElement("a", {
1990
2014
  href: livesiteRoute,
1991
- className: "flex gap-1.5 items-center px-4 py-1.5 rounded-full transition-all ease-out duration-150 text-gray-500 hover:text-blue-500"
2015
+ className: "flex gap-1.5 items-center text-base px-4 py-1.5 rounded-full transition-all ease-out duration-150 text-gray-500 hover:text-blue-500"
1992
2016
  }, /* @__PURE__ */ React.createElement(BiLinkExternal, {
1993
2017
  className: "inline-block h-5 w-auto opacity-70"
1994
2018
  }), " ", "View"), /* @__PURE__ */ React.createElement(Link, {
1995
- to: `${location2.pathname}/${document2.node.sys.filename}`,
1996
- className: "flex gap-1.5 items-center px-4 py-1.5 rounded-full border border-gray-150 transition-all ease-out duration-150 text-gray-700 hover:bg-gray-50 hover:text-blue-500"
2019
+ to: `${location2.pathname}/${document.node.sys.filename}`,
2020
+ className: "flex gap-1.5 items-center text-base px-4 py-1.5 rounded-full border border-gray-150 transition-all ease-out duration-150 text-gray-700 hover:bg-gray-50 hover:text-blue-500"
1997
2021
  }, /* @__PURE__ */ React.createElement(BiEdit, {
1998
2022
  className: "inline-block h-5 w-auto opacity-70"
1999
2023
  }), " ", "Edit")));
@@ -2056,10 +2080,8 @@ const createDocument = async (cms, collection, template, mutationInfo, values) =
2056
2080
  });
2057
2081
  await cms.api.tina.request(`mutation($collection: String!, $relativePath: String!, $params: DocumentMutation!) {
2058
2082
  createDocument(
2059
- collection: $collection,
2060
- relativePath: $relativePath,
2061
- params: $params
2062
- ){__typename}
2083
+ collection: $collection,
2084
+ relativePath: $relativePath,
2063
2085
  }`, {
2064
2086
  variables: {
2065
2087
  collection: collection.name,
@@ -2106,7 +2128,7 @@ const CollectionCreatePage = () => {
2106
2128
  }));
2107
2129
  };
2108
2130
  const useGetDocument = (cms, collectionName, relativePath) => {
2109
- const [document2, setDocument] = useState(void 0);
2131
+ const [document, setDocument] = useState(void 0);
2110
2132
  useEffect(() => {
2111
2133
  const fetchDocument = async () => {
2112
2134
  const response = await cms.api.tina.request(`
@@ -2122,7 +2144,7 @@ const useGetDocument = (cms, collectionName, relativePath) => {
2122
2144
  };
2123
2145
  fetchDocument();
2124
2146
  }, [cms, collectionName, relativePath]);
2125
- return document2;
2147
+ return document;
2126
2148
  };
2127
2149
  const GetDocument = ({
2128
2150
  cms,
@@ -2130,11 +2152,11 @@ const GetDocument = ({
2130
2152
  relativePath,
2131
2153
  children
2132
2154
  }) => {
2133
- const document2 = useGetDocument(cms, collectionName, relativePath);
2134
- if (!document2) {
2155
+ const document = useGetDocument(cms, collectionName, relativePath);
2156
+ if (!document) {
2135
2157
  return null;
2136
2158
  }
2137
- return /* @__PURE__ */ React.createElement(React.Fragment, null, children(document2));
2159
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, children(document));
2138
2160
  };
2139
2161
  const updateDocument = async (cms, relativePath, collection, mutationInfo, values) => {
2140
2162
  const { includeCollection, includeTemplate } = mutationInfo;
@@ -2168,12 +2190,12 @@ const CollectionUpdatePage = () => {
2168
2190
  cms,
2169
2191
  collectionName: collection.name,
2170
2192
  relativePath
2171
- }, (document2) => {
2193
+ }, (document) => {
2172
2194
  const form = new Form({
2173
2195
  id: "update-form",
2174
2196
  label: "form",
2175
- fields: document2.form.fields,
2176
- initialValues: document2.values,
2197
+ fields: document.form.fields,
2198
+ initialValues: document.values,
2177
2199
  onSubmit: async (values) => {
2178
2200
  await updateDocument(cms, relativePath, collection, mutationInfo, values);
2179
2201
  navigate(`/collections/${collection.name}`);
@@ -2190,20 +2212,6 @@ const CollectionUpdatePage = () => {
2190
2212
  });
2191
2213
  }));
2192
2214
  };
2193
- const useEmbedTailwind = () => {
2194
- useEffect(() => {
2195
- const isSSR = typeof window === "undefined";
2196
- if (!isSSR) {
2197
- const head = document.head;
2198
- const link = document.createElement("link");
2199
- link.id = "tina-admin-stylesheet";
2200
- link.type = "text/css";
2201
- link.rel = "stylesheet";
2202
- link.href = "https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css";
2203
- head.appendChild(link);
2204
- }
2205
- }, []);
2206
- };
2207
2215
  const Redirect = () => {
2208
2216
  React.useEffect(() => {
2209
2217
  if (window) {
@@ -2213,7 +2221,6 @@ const Redirect = () => {
2213
2221
  return null;
2214
2222
  };
2215
2223
  const TinaAdmin = () => {
2216
- useEmbedTailwind();
2217
2224
  const isSSR = typeof window === "undefined";
2218
2225
  const { edit } = useEditState();
2219
2226
  if (isSSR) {