@realiizlabs/admin 0.15.4 → 0.15.6

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.
@@ -1116,7 +1116,7 @@ function makeHandlers(ctx) {
1116
1116
  }
1117
1117
 
1118
1118
  // src/version.ts
1119
- var ADMIN_VERSION = "0.15.4" ;
1119
+ var ADMIN_VERSION = "0.15.6" ;
1120
1120
 
1121
1121
  // src/studio/update.ts
1122
1122
  var PACKAGE_NAME = "@realiizlabs/admin";
@@ -1104,7 +1104,7 @@ function makeHandlers(ctx) {
1104
1104
  }
1105
1105
 
1106
1106
  // src/version.ts
1107
- var ADMIN_VERSION = "0.15.4" ;
1107
+ var ADMIN_VERSION = "0.15.6" ;
1108
1108
 
1109
1109
  // src/studio/update.ts
1110
1110
  var PACKAGE_NAME = "@realiizlabs/admin";
@@ -495,7 +495,7 @@ var SHELL_CSS = `
495
495
  /* ---- account menu --------------------------------------------------- */
496
496
  .rz-avatar__img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }
497
497
  .rz-tabs { display: flex; gap: .25rem; border-bottom: 1px solid var(--border); margin: 0 0 1.5rem; flex-wrap: wrap; }
498
- .rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; }
498
+ .rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; white-space: nowrap; }
499
499
  .rz-tabs__tab:hover { color: var(--text-primary); }
500
500
  .rz-tabs__tab[aria-selected="true"] { color: var(--text-primary); border-bottom-color: var(--signal); font-weight: 600; }
501
501
  .rz-tabs__tab:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px; border-radius: 4px; }
@@ -516,22 +516,33 @@ var SHELL_CSS = `
516
516
  .rz-seg button { font: inherit; font-size: .75rem; padding: .15rem .55rem; line-height: 1.3; background: transparent; color: var(--text-secondary); border: 0; cursor: pointer; }
517
517
  .rz-seg button[aria-pressed="true"] { background: var(--surface-3); color: var(--text-primary); }
518
518
 
519
- /* ---- mobile: sidebar becomes a strip under the top bar --------------- */
519
+ /* ---- mobile: the sidebar becomes a fixed bottom bar, icons only ------- */
520
520
  @media (max-width: 720px) {
521
+ .rz-admin { --rz-bottombar: calc(56px + env(safe-area-inset-bottom, 0px)); }
521
522
  .rz-body { flex-direction: column; }
522
- .rz-sidebar, .rz-sidebar--collapsed { width: 100%; border-right: 0; border-bottom: 1px solid var(--border); flex-direction: row; }
523
- .rz-sidebar__nav { display: flex; padding: .35rem .25rem; overflow-x: auto; }
524
- .rz-sidebar__item { flex-direction: column; gap: .2rem; font-size: .6875rem; padding: .4rem .6rem; border-radius: 6px; }
525
- .rz-sidebar--collapsed .rz-sidebar__label { display: block; }
526
- .rz-sidebar__collapse { display: none; }
527
- .rz-sidebar__pinned { display: flex; border-top: 0; padding: .35rem .25rem; }
523
+ .rz-sidebar, .rz-sidebar--collapsed {
524
+ position: fixed; left: 0; right: 0; bottom: 0; top: auto; z-index: 30;
525
+ width: 100%; height: var(--rz-bottombar); padding-bottom: env(safe-area-inset-bottom, 0px);
526
+ flex-direction: row; align-items: stretch;
527
+ border-right: 0; border-top: 1px solid var(--border); box-shadow: 0 -6px 16px rgba(14,23,38,.06);
528
+ }
529
+ /* Both nav groups dissolve into the bar so every icon gets an equal share of the width. */
530
+ .rz-sidebar__nav, .rz-sidebar__pinned { display: contents; }
531
+ .rz-sidebar__item { flex: 1 1 0; justify-content: center; padding: 0; min-width: 0; border-radius: 0; }
532
+ .rz-sidebar__item svg { width: 22px; height: 22px; }
533
+ .rz-sidebar__item--active { background: transparent; box-shadow: inset 0 2px 0 var(--signal); }
534
+ /* Labels stay in the accessibility tree but not on screen. */
535
+ .rz-sidebar__label, .rz-sidebar--collapsed .rz-sidebar__label { display: block; position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
536
+ .rz-sidebar__collapse, .rz-sidebar__version, .rz-sidebar__item--disabled { display: none; }
528
537
  .rz-topbar__greeting { display: none; }
529
- .rz-content { padding: 18px 14px 60px; }
530
- /* The sidebar is a top strip now, so it must not be sticky-height; the topbar stays pinned. */
531
- .rz-sidebar, .rz-sidebar--collapsed { position: static; height: auto; }
532
- .rz-sidebar__item--disabled { display: none; }
533
- /* Save bar: bleed matches the narrower content padding; stack status above the buttons. */
534
- .rz-content .realiiz-form__bar { margin: 18px -14px -60px; padding: 10px 14px; flex-wrap: wrap; }
538
+ .rz-content { padding: 18px 14px calc(var(--rz-bottombar) + 24px); }
539
+ /* Section tabs: one row that scrolls sideways (bleeding to the screen edges), scrollbar hidden,
540
+ a fade on the right so it's clear there's more; the active tab is scrolled into view. */
541
+ .rz-tabs { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; margin-left: -14px; margin-right: -14px; padding: 0 14px; -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 2.5rem), transparent); mask-image: linear-gradient(90deg, #000 calc(100% - 2.5rem), transparent); }
542
+ .rz-tabs::-webkit-scrollbar { display: none; }
543
+ .rz-tabs__tab { flex: 0 0 auto; scroll-snap-align: center; }
544
+ /* Save bar: sits just above the bottom bar; bleed matches the narrower content padding; stack status above the buttons. */
545
+ .rz-content .realiiz-form__bar { bottom: var(--rz-bottombar); margin: 18px -14px calc(-1 * (var(--rz-bottombar) + 24px)); padding: 10px 14px; flex-wrap: wrap; }
535
546
  .rz-content .realiiz-form__status { flex-basis: 100%; margin-right: 0; font-size: .8rem; }
536
547
  /* Editor toolbar wraps; the Insert group drops its label and left rule to save width. */
537
548
  .rz-admin .realiiz-md__head { padding: 5px; }
@@ -678,6 +689,12 @@ function Steps({ steps }) {
678
689
  }
679
690
  function Tabs({ options, value, onChange, label = "Sections" }) {
680
691
  const list = react.useRef(null);
692
+ react.useEffect(() => {
693
+ const el = list.current;
694
+ if (!el || el.scrollWidth <= el.clientWidth) return;
695
+ const i = options.findIndex((o) => o.value === value);
696
+ el.children[i]?.scrollIntoView?.({ inline: "center", block: "nearest" });
697
+ }, [options, value]);
681
698
  const onKey = (e) => {
682
699
  const i = options.findIndex((o) => o.value === value);
683
700
  if (i < 0) return;
@@ -716,7 +733,7 @@ function Tabs({ options, value, onChange, label = "Sections" }) {
716
733
  }
717
734
 
718
735
  // src/version.ts
719
- var ADMIN_VERSION = "0.15.4" ;
736
+ var ADMIN_VERSION = "0.15.6" ;
720
737
 
721
738
  // src/studio-ui/css.ts
722
739
  var STUDIO_CSS = `
@@ -759,9 +776,22 @@ var STUDIO_CSS = `
759
776
  .rz-admin .rz-title-link .rz-arrow { opacity: 0; }
760
777
  .rz-admin .rz-title-link:hover { color: var(--signal); }
761
778
  .rz-admin .rz-title-link:hover .rz-arrow { opacity: 1; }
779
+ /* Phones: the four columns can't share the width, so each row becomes a small card \u2014
780
+ the title on its own line (wrapping to two), the address under it, then date \xB7 status \xB7
781
+ actions on one row. Same markup; only the display changes. */
762
782
  @media (max-width: 720px) {
763
- .rz-admin .rz-col-status { width: 9rem; }
764
- .rz-admin .rz-col-actions { width: 6rem; }
783
+ .rz-admin .rz-table--posts, .rz-admin .rz-table--posts tbody { display: block; }
784
+ .rz-admin .rz-table--posts colgroup, .rz-admin .rz-table--posts thead { display: none; }
785
+ .rz-admin .rz-table--posts tr { display: flex; flex-wrap: wrap; align-items: center; gap: .35rem .9rem; padding: .8rem .9rem; border-bottom: 1px solid var(--separator); }
786
+ .rz-admin .rz-table--posts tr:last-child { border-bottom: 0; }
787
+ .rz-admin .rz-table--posts td, .rz-admin .rz-table--posts td.rz-fit { display: block; width: auto; padding: 0; border: 0; white-space: nowrap; overflow: visible; }
788
+ .rz-admin .rz-table--posts .rz-title-cell { flex: 1 1 100%; min-width: 0; margin-bottom: .15rem; white-space: normal; }
789
+ .rz-admin .rz-table--posts .rz-title-cell .rz-title-text { white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; font-weight: 500; color: var(--text-primary); }
790
+ .rz-admin .rz-table--posts .rz-title-link { display: inline; }
791
+ .rz-admin .rz-table--posts .rz-slug { font-weight: 400; color: var(--text-muted); overflow-wrap: anywhere; -webkit-line-clamp: 1; }
792
+ .rz-admin [data-slugs="off"] .rz-table--posts .rz-slug { display: none; }
793
+ .rz-admin .rz-table--posts td.rz-fit { font-size: .85rem; }
794
+ .rz-admin .rz-table--posts td.rz-fit:last-child { margin-left: auto; }
765
795
  }
766
796
 
767
797
  /* Dashboard card for a section that isn't built yet: the real card, faded, buttons disabled. */
@@ -773,6 +803,9 @@ var STUDIO_CSS = `
773
803
  .rz-admin .acct-card { display: flex; flex-direction: column; gap: .9rem; }
774
804
  .rz-admin .acct-title { font-size: 1rem; font-weight: 600; margin: 0; color: var(--text-primary); }
775
805
  .rz-admin .acct-blurb { font-size: .875rem; color: var(--text-secondary); margin: -.4rem 0 0; line-height: 1.5; }
806
+ .rz-admin .acct-blurb--link { margin-top: .6rem; }
807
+ .rz-admin .acct-blurb a { color: var(--signal); text-decoration: underline; text-underline-offset: 3px; }
808
+ .rz-admin .acct-blurb a:hover { color: var(--text-primary); }
776
809
  .rz-admin .acct-field { display: flex; flex-direction: column; gap: .35rem; }
777
810
  .rz-admin .acct-label { font-size: .85rem; font-weight: 500; color: var(--text-primary); }
778
811
  .rz-admin .acct-hint { font-size: .78rem; color: var(--text-muted); }
@@ -964,11 +997,64 @@ function useDeployed(active, mergedSha) {
964
997
  }, [active, mergedSha]);
965
998
  return state;
966
999
  }
1000
+ var KEY = "rz-update-installing";
1001
+ function readInstalling() {
1002
+ try {
1003
+ const raw = sessionStorage.getItem(KEY);
1004
+ if (!raw) return null;
1005
+ const v = JSON.parse(raw);
1006
+ return typeof v.version === "string" ? v : null;
1007
+ } catch {
1008
+ return null;
1009
+ }
1010
+ }
1011
+ function writeInstalling(i) {
1012
+ try {
1013
+ if (i) sessionStorage.setItem(KEY, JSON.stringify(i));
1014
+ else sessionStorage.removeItem(KEY);
1015
+ } catch {
1016
+ }
1017
+ }
1018
+ function useInstalling() {
1019
+ const [installing, set] = react.useState(null);
1020
+ react.useEffect(() => {
1021
+ const i = readInstalling();
1022
+ if (i && i.version === ADMIN_VERSION) {
1023
+ writeInstalling(null);
1024
+ return;
1025
+ }
1026
+ set(i);
1027
+ }, []);
1028
+ const update = (i) => {
1029
+ writeInstalling(i);
1030
+ set(i);
1031
+ };
1032
+ return [installing, update];
1033
+ }
1034
+ function InstallTracker({ installing, compact = false }) {
1035
+ const deploy = useDeployed(true, installing.sha);
1036
+ const live = deploy === "live";
1037
+ const steps = [
1038
+ { label: "Updated", state: "done", note: `Studio ${installing.version}` },
1039
+ { label: "Live", state: live ? "done" : "active", note: live ? "On the site now" : deploy === "slow" ? "Taking longer than usual" : "Rebuilding, about two minutes" }
1040
+ ];
1041
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `rz-update${compact ? " rz-update--strip" : ""}`, role: "status", children: [
1042
+ /* @__PURE__ */ jsxRuntime.jsx(Steps, { steps }),
1043
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rz-update__done", children: live ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1044
+ "Studio ",
1045
+ installing.version,
1046
+ " is live. ",
1047
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "rz-update__link", onClick: () => window.location.reload(), children: "Reload Studio" }),
1048
+ " to start using it \u2014 the version at the foot of the sidebar will change."
1049
+ ] }) : "Update accepted. Nothing to do meanwhile \u2014 keep working. The website is rebuilding with the new Studio; this turns green when it's done, in about two minutes." })
1050
+ ] });
1051
+ }
967
1052
  var HIDE_KEY = "rz-update-later";
968
1053
  function canSeeUpdates(role) {
969
1054
  return role === "owner" || role === "staff";
970
1055
  }
971
1056
  function UpdateStrip({ update, role }) {
1057
+ const [installing, setInstalling] = useInstalling();
972
1058
  const [hidden, setHidden] = react.useState(true);
973
1059
  react.useEffect(() => {
974
1060
  try {
@@ -977,7 +1063,9 @@ function UpdateStrip({ update, role }) {
977
1063
  setHidden(false);
978
1064
  }
979
1065
  }, [update?.version]);
980
- if (!update || update.state !== "ready" || !canSeeUpdates(role) || hidden) return null;
1066
+ if (!canSeeUpdates(role)) return null;
1067
+ if (installing) return /* @__PURE__ */ jsxRuntime.jsx(InstallTracker, { installing, compact: true });
1068
+ if (!update || update.state !== "ready" || hidden) return null;
981
1069
  const later = () => {
982
1070
  try {
983
1071
  sessionStorage.setItem(HIDE_KEY, update.version);
@@ -985,41 +1073,24 @@ function UpdateStrip({ update, role }) {
985
1073
  }
986
1074
  setHidden(true);
987
1075
  };
988
- return /* @__PURE__ */ jsxRuntime.jsx(UpdateBody, { update, onLater: later, compact: true });
1076
+ return /* @__PURE__ */ jsxRuntime.jsx(UpdateBody, { update, onLater: later, onMerged: setInstalling, compact: true });
989
1077
  }
990
- function UpdateBody({ update, onLater, compact = false }) {
1078
+ function UpdateBody({ update, onLater, onMerged, compact = false }) {
991
1079
  const { actions } = useStudio();
992
1080
  const [showNotes, setShowNotes] = react.useState(!compact);
993
1081
  const [busy, setBusy] = react.useState(false);
994
1082
  const [outcome, setOutcome] = react.useState(null);
995
- const merged = outcome?.state === "merged";
996
- const deploy = useDeployed(merged, merged ? outcome.sha : null);
997
1083
  const run = async () => {
998
1084
  setBusy(true);
999
1085
  try {
1000
- setOutcome(await actions.updateStudio(update.number));
1086
+ const result = await actions.updateStudio(update.number);
1087
+ setOutcome(result);
1088
+ if (result.state === "merged") onMerged({ version: update.version, sha: result.sha });
1001
1089
  } finally {
1002
1090
  setBusy(false);
1003
1091
  }
1004
1092
  };
1005
- if (merged) {
1006
- const live = deploy === "live";
1007
- const steps = [
1008
- { label: "Updated", state: "done", note: `Studio ${update.version}` },
1009
- { label: "Live", state: live ? "done" : "active", note: live ? "On the site now" : deploy === "slow" ? "Taking longer than usual" : "Rebuilding, about two minutes" }
1010
- ];
1011
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `rz-update${compact ? " rz-update--strip" : ""}`, role: "status", children: [
1012
- /* @__PURE__ */ jsxRuntime.jsx(Steps, { steps }),
1013
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rz-update__done", children: live ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1014
- "Studio ",
1015
- update.version,
1016
- " is live. ",
1017
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "rz-update__link", onClick: () => window.location.reload(), children: "Reload Studio" }),
1018
- " to start using it \u2014 the version at the foot of the sidebar will change."
1019
- ] }) : "Nothing to do meanwhile \u2014 keep working. The website is rebuilding with the new Studio; the version at the foot of the sidebar changes when it's done, in about two minutes." })
1020
- ] });
1021
- }
1022
- const problem = outcome && outcome.state !== "pending" ? outcome.state === "stale" ? "The site changed since the checks ran. Try again in a minute." : outcome.state === "red" ? `The checks failed${outcome.failingCheck ? ` (${outcome.failingCheck})` : ""}. Your web team has been able to see this.` : outcome.state === "error" ? outcome.message : null : null;
1093
+ const problem = outcome && outcome.state !== "pending" && outcome.state !== "merged" ? outcome.state === "stale" ? "The site changed since the checks ran. Try again in a minute." : outcome.state === "red" ? `The checks failed${outcome.failingCheck ? ` (${outcome.failingCheck})` : ""}. Your web team has been able to see this.` : outcome.state === "error" ? outcome.message : null : null;
1023
1094
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `rz-update${compact ? " rz-update--strip" : ""}`, role: "status", children: [
1024
1095
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rz-update__row", children: [
1025
1096
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "rz-update__title", children: [
@@ -3961,25 +4032,28 @@ function BusinessTab({ initial }) {
3961
4032
  }
3962
4033
  function StudioTab({ update, version, role }) {
3963
4034
  const { supportName } = useStudio();
4035
+ const [installing, setInstalling] = useInstalling();
3964
4036
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "acct-stack", children: [
3965
4037
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "acct-card", children: [
3966
4038
  /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "acct-title", children: [
3967
4039
  "Studio ",
3968
4040
  version
3969
4041
  ] }),
3970
- !update && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "acct-blurb", children: "You\u2019re up to date. When a new version comes out, it appears here and as a strip at the top of every Studio page." }),
3971
- update?.state === "checking" && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "acct-blurb", children: [
3972
- "Studio ",
3973
- update.version,
3974
- " is on its way \u2014 the checks are still running. Come back in a couple of minutes."
3975
- ] }),
3976
- update?.state === "failed" && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "acct-blurb", children: [
3977
- "Studio ",
3978
- update.version,
3979
- " is available, but its checks failed, so it can\u2019t be installed yet.",
3980
- role === "staff" && update.failingCheck ? ` Failing check: ${update.failingCheck}.` : ` ${supportName} has been able to see this and will sort it out.`
3981
- ] }),
3982
- update?.state === "ready" && /* @__PURE__ */ jsxRuntime.jsx(UpdateBody, { update })
4042
+ installing ? /* @__PURE__ */ jsxRuntime.jsx(InstallTracker, { installing }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4043
+ !update && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "acct-blurb", children: "You\u2019re up to date. When a new version comes out, it appears here and as a strip at the top of every Studio page." }),
4044
+ update?.state === "checking" && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "acct-blurb", children: [
4045
+ "Studio ",
4046
+ update.version,
4047
+ " is on its way \u2014 the checks are still running. Come back in a couple of minutes."
4048
+ ] }),
4049
+ update?.state === "failed" && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "acct-blurb", children: [
4050
+ "Studio ",
4051
+ update.version,
4052
+ " is available, but its checks failed, so it can\u2019t be installed yet.",
4053
+ role === "staff" && update.failingCheck ? ` Failing check: ${update.failingCheck}.` : ` ${supportName} has been able to see this and will sort it out.`
4054
+ ] }),
4055
+ update?.state === "ready" && /* @__PURE__ */ jsxRuntime.jsx(UpdateBody, { update, onMerged: setInstalling })
4056
+ ] })
3983
4057
  ] }),
3984
4058
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "acct-card", children: [
3985
4059
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "acct-title", children: "How updates work" }),
@@ -3990,7 +4064,7 @@ function StudioTab({ update, version, role }) {
3990
4064
  /* @__PURE__ */ jsxRuntime.jsx("b", { children: "Update" }),
3991
4065
  ". If the update would break anything, the button never unlocks. Your site looks for new versions once a week, on Monday morning."
3992
4066
  ] }),
3993
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "acct-blurb", style: { marginTop: ".5rem" }, children: [
4067
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "acct-blurb acct-blurb--link", children: [
3994
4068
  /* @__PURE__ */ jsxRuntime.jsx("a", { href: "/admin/help#s-updates", children: "Everything about updates, in the Help center" }),
3995
4069
  " \u2014 when they arrive, what they can and can\u2019t change, and what to do if one fails."
3996
4070
  ] })
@@ -4099,7 +4173,7 @@ Open the avatar menu (top right) and choose **Sign out**.
4099
4173
 
4100
4174
  One item per kind of content this site publishes \u2014 on {siteName} that's {types}. Each opens a list of everything of that kind with its status. **Dashboard** at the top shows one card per kind with a count and how many changes are waiting. **Settings** at the bottom opens your account.
4101
4175
 
4102
- On a narrow screen the sidebar collapses to icons; press the arrow at the bottom to expand it.
4176
+ Press **Collapse** at the bottom to shrink the sidebar to icons. On a phone, the same items sit in a bar of icons along the bottom of the screen \u2014 Dashboard, each kind of content, Settings.
4103
4177
 
4104
4178
  ## A list page
4105
4179
 
@@ -5113,7 +5187,7 @@ Not from Studio. It's rarely needed, because an update can't touch your content,
5113
5187
 
5114
5188
  ## I pressed Update and nothing seems different
5115
5189
 
5116
- Two things to check. First, the tracker: **Updated** means the update was accepted; **Live** means the website has finished rebuilding, which takes about two minutes. Second, reload Studio \u2014 the number at the bottom of the sidebar should now match the version the strip offered. Until the rebuild finishes you're still running the old one, which is normal.
5190
+ That's expected for the first couple of minutes. The strip turns into a tracker: **Updated** means the update was accepted; **Live** means the website has finished rebuilding, which takes about two minutes. The tracker stays on screen (even if you move around Studio or reload) until it's live, then offers a **Reload Studio** button. Until you reload, you're still using the old version and the number at the bottom of the sidebar hasn't changed \u2014 that's normal, not a failure.
5117
5191
 
5118
5192
  ## I pressed Update twice
5119
5193
 
@@ -5622,6 +5696,7 @@ exports.ContentEditor = ContentEditor;
5622
5696
  exports.GLOSSARY = GLOSSARY;
5623
5697
  exports.HELP_ARTICLES = HELP_ARTICLES;
5624
5698
  exports.HELP_SECTIONS = HELP_SECTIONS;
5699
+ exports.InstallTracker = InstallTracker;
5625
5700
  exports.Jargon = Jargon;
5626
5701
  exports.PublishPanel = PublishPanel;
5627
5702
  exports.RemoveItem = RemoveItem;
@@ -5651,6 +5726,7 @@ exports.joinTypes = joinTypes;
5651
5726
  exports.publicDirOf = publicDirOf;
5652
5727
  exports.searchHelp = searchHelp;
5653
5728
  exports.useEntry = useEntry;
5729
+ exports.useInstalling = useInstalling;
5654
5730
  exports.useStudio = useStudio;
5655
5731
  //# sourceMappingURL=index.cjs.map
5656
5732
  //# sourceMappingURL=index.cjs.map