@wildwinter/app-shell 0.39.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/about.css +5 -5
  2. package/dist/about.css.map +1 -1
  3. package/dist/anchored.css +5 -5
  4. package/dist/anchored.css.map +1 -1
  5. package/dist/chunk-DS4XXAZS.js +56 -0
  6. package/dist/chunk-DS4XXAZS.js.map +1 -0
  7. package/dist/{chunk-K2AOLQW4.js → chunk-EHR2KBZC.js} +3 -3
  8. package/dist/{chunk-K2AOLQW4.js.map → chunk-EHR2KBZC.js.map} +1 -1
  9. package/dist/{chunk-S4KWQLYN.js → chunk-OPZPFOPS.js} +4 -4
  10. package/dist/{chunk-S4KWQLYN.js.map → chunk-OPZPFOPS.js.map} +1 -1
  11. package/dist/{chunk-L5HOBEKL.js → chunk-R3NXPHRZ.js} +3 -3
  12. package/dist/{chunk-L5HOBEKL.js.map → chunk-R3NXPHRZ.js.map} +1 -1
  13. package/dist/{chunk-KGAMP5LW.js → chunk-SDOKZTAR.js} +3 -3
  14. package/dist/{chunk-KGAMP5LW.js.map → chunk-SDOKZTAR.js.map} +1 -1
  15. package/dist/{chunk-C6UVQYKI.js → chunk-SEWJLUOD.js} +3 -3
  16. package/dist/{chunk-C6UVQYKI.js.map → chunk-SEWJLUOD.js.map} +1 -1
  17. package/dist/{chunk-XZYZXY7I.js → chunk-UG2P777F.js} +36 -3
  18. package/dist/chunk-UG2P777F.js.map +1 -0
  19. package/dist/{chunk-2NMVIM54.js → chunk-YRFJLJUH.js} +3 -3
  20. package/dist/{chunk-2NMVIM54.js.map → chunk-YRFJLJUH.js.map} +1 -1
  21. package/dist/chunk-YWMSQFXX.js +146 -0
  22. package/dist/chunk-YWMSQFXX.js.map +1 -0
  23. package/dist/comments.css +11 -11
  24. package/dist/comments.css.map +1 -1
  25. package/dist/confirm.css +2 -2
  26. package/dist/confirm.css.map +1 -1
  27. package/dist/context-menu.cjs.map +1 -1
  28. package/dist/context-menu.css +1 -1
  29. package/dist/context-menu.css.map +1 -1
  30. package/dist/context-menu.js +2 -2
  31. package/dist/controls.css +70 -11
  32. package/dist/controls.css.map +1 -1
  33. package/dist/dialog.cjs.map +1 -1
  34. package/dist/dialog.css +3 -2
  35. package/dist/dialog.css.map +1 -1
  36. package/dist/dialog.js +2 -2
  37. package/dist/identity.css +2 -2
  38. package/dist/identity.css.map +1 -1
  39. package/dist/index.cjs +257 -13
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +39 -6
  42. package/dist/index.d.ts +39 -6
  43. package/dist/index.js +17 -13
  44. package/dist/index.js.map +1 -1
  45. package/dist/job.css +1 -1
  46. package/dist/job.css.map +1 -1
  47. package/dist/keys.cjs +155 -0
  48. package/dist/keys.cjs.map +1 -0
  49. package/dist/keys.css +41 -0
  50. package/dist/keys.css.map +1 -0
  51. package/dist/keys.d.cts +57 -0
  52. package/dist/keys.d.ts +57 -0
  53. package/dist/keys.js +3 -0
  54. package/dist/keys.js.map +1 -0
  55. package/dist/link-status.cjs.map +1 -1
  56. package/dist/link-status.css +8 -8
  57. package/dist/link-status.css.map +1 -1
  58. package/dist/link-status.js +2 -2
  59. package/dist/notes-editor.css +7 -7
  60. package/dist/notes-editor.css.map +1 -1
  61. package/dist/pane-shell.css +7 -2
  62. package/dist/pane-shell.css.map +1 -1
  63. package/dist/problems.cjs +61 -0
  64. package/dist/problems.cjs.map +1 -0
  65. package/dist/problems.d.cts +57 -0
  66. package/dist/problems.d.ts +57 -0
  67. package/dist/problems.js +3 -0
  68. package/dist/problems.js.map +1 -0
  69. package/dist/property-list.cjs.map +1 -1
  70. package/dist/property-list.js +2 -2
  71. package/dist/save.css +1 -1
  72. package/dist/save.css.map +1 -1
  73. package/dist/settings.css +13 -13
  74. package/dist/settings.css.map +1 -1
  75. package/dist/stale.css +1 -1
  76. package/dist/stale.css.map +1 -1
  77. package/dist/stepper.css +13 -4
  78. package/dist/stepper.css.map +1 -1
  79. package/dist/toast.css +5 -5
  80. package/dist/toast.css.map +1 -1
  81. package/dist/tokens.css +2 -1
  82. package/dist/tokens.css.map +1 -1
  83. package/dist/tool-window.css +3 -2
  84. package/dist/tool-window.css.map +1 -1
  85. package/dist/tooltip.css +3 -3
  86. package/dist/tooltip.css.map +1 -1
  87. package/dist/updater-view.cjs.map +1 -1
  88. package/dist/updater-view.js +3 -3
  89. package/dist/updater.css +5 -5
  90. package/dist/updater.css.map +1 -1
  91. package/dist/vc.css +1 -1
  92. package/dist/vc.css.map +1 -1
  93. package/dist/welcome.cjs.map +1 -1
  94. package/dist/welcome.css +21 -21
  95. package/dist/welcome.css.map +1 -1
  96. package/dist/welcome.js +2 -2
  97. package/package.json +15 -1
  98. package/dist/chunk-XZYZXY7I.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -403,18 +403,18 @@ function tagChips(holder, onChange) {
403
403
  input.placeholder = "Add value";
404
404
  input.spellcheck = false;
405
405
  const makeChip = (v) => {
406
- const chip = el("span", "shell-tag", v);
406
+ const chip2 = el("span", "shell-tag", v);
407
407
  const x = el("button", "shell-tag-x", iconNode("close", CHIP_ICON));
408
408
  x.type = "button";
409
409
  x.dataset["tip"] = `Remove ${v}`;
410
410
  x.setAttribute("aria-label", `Remove ${v}`);
411
411
  x.addEventListener("click", () => {
412
412
  holder.values = (holder.values ?? []).filter((o) => o !== v);
413
- chip.remove();
413
+ chip2.remove();
414
414
  onChange?.();
415
415
  });
416
- chip.append(x);
417
- return chip;
416
+ chip2.append(x);
417
+ return chip2;
418
418
  };
419
419
  const commit = () => {
420
420
  const v = input.value.trim();
@@ -455,9 +455,9 @@ function stageChips(holder, onChange) {
455
455
  for (const c of Array.from(wrap.children)) if (c !== input) c.remove();
456
456
  const stages = holder.stages ?? [];
457
457
  stages.forEach((v, i) => {
458
- const chip = el("span", "shell-tag", `${i + 1}. ${v}`);
459
- chip.dataset["stage"] = v;
460
- chip.append(
458
+ const chip2 = el("span", "shell-tag", `${i + 1}. ${v}`);
459
+ chip2.dataset["stage"] = v;
460
+ chip2.append(
461
461
  control(
462
462
  "back",
463
463
  `Move ${v} earlier`,
@@ -490,8 +490,8 @@ function stageChips(holder, onChange) {
490
490
  rebuild();
491
491
  onChange?.();
492
492
  });
493
- chip.append(x);
494
- wrap.insertBefore(chip, input);
493
+ chip2.append(x);
494
+ wrap.insertBefore(chip2, input);
495
495
  });
496
496
  };
497
497
  const commit = () => {
@@ -550,6 +550,39 @@ function wireReorder(el2, id, axis, onMove) {
550
550
  if (reorderDragId && reorderDragId !== id) onMove(reorderDragId, before, id);
551
551
  });
552
552
  }
553
+ function metaLine(parts) {
554
+ const row = el("span", "shell-meta");
555
+ for (const part of parts) {
556
+ if (part === null || part === void 0 || part === "") continue;
557
+ const seg = el("span", "shell-meta-part");
558
+ seg.append(part);
559
+ row.append(seg);
560
+ }
561
+ return row;
562
+ }
563
+ function breadcrumb(parts) {
564
+ const trail = el("nav", "shell-crumbs");
565
+ trail.setAttribute("aria-label", "Where this is");
566
+ parts.forEach((part, i) => {
567
+ const crumb = typeof part === "string" ? { label: part } : part;
568
+ const last = i === parts.length - 1;
569
+ if (i > 0) {
570
+ const sep = iconNode("forward", 12);
571
+ sep.classList.add("shell-crumb-sep");
572
+ trail.append(sep);
573
+ }
574
+ if (crumb.onClick && !last) {
575
+ const b = el("button", { className: "shell-crumb shell-crumb-link", text: crumb.label, onClick: crumb.onClick });
576
+ b.type = "button";
577
+ trail.append(b);
578
+ } else {
579
+ const s = el("span", "shell-crumb", crumb.label);
580
+ if (last) s.setAttribute("aria-current", "location");
581
+ trail.append(s);
582
+ }
583
+ });
584
+ return trail;
585
+ }
553
586
 
554
587
  // src/colour.ts
555
588
  var PALETTE_SIZE = 12;
@@ -571,6 +604,149 @@ function colourFor(name) {
571
604
  return PALETTE[colourIndex(name)];
572
605
  }
573
606
 
607
+ // src/keys.ts
608
+ var override;
609
+ function setKeyPlatform(platform) {
610
+ override = platform;
611
+ }
612
+ function keyPlatform() {
613
+ if (override) return override;
614
+ if (typeof navigator !== "undefined") {
615
+ const s = `${navigator.platform ?? ""} ${navigator.userAgent ?? ""}`;
616
+ if (/mac|iphone|ipad/i.test(s)) return "mac";
617
+ if (/win/i.test(s)) return "win";
618
+ if (s.trim()) return "linux";
619
+ }
620
+ const p = typeof process !== "undefined" ? process.platform : void 0;
621
+ return p === "darwin" ? "mac" : p === "win32" ? "win" : "linux";
622
+ }
623
+ var MAC_ORDER = ["ctrl", "alt", "shift", "mod"];
624
+ var OTHER_ORDER = ["mod", "ctrl", "alt", "shift"];
625
+ var MAC_MOD = { ctrl: "\u2303", alt: "\u2325", shift: "\u21E7", mod: "\u2318" };
626
+ var OTHER_MOD = { ctrl: "Ctrl", alt: "Alt", shift: "Shift", mod: "Ctrl" };
627
+ var MODIFIER_ALIASES = {
628
+ mod: "mod",
629
+ cmd: "mod",
630
+ command: "mod",
631
+ meta: "mod",
632
+ super: "mod",
633
+ ctrl: "ctrl",
634
+ control: "ctrl",
635
+ alt: "alt",
636
+ option: "alt",
637
+ opt: "alt",
638
+ shift: "shift"
639
+ };
640
+ var NAMED = {
641
+ enter: { mac: "\u21A9", other: "Enter" },
642
+ return: { mac: "\u21A9", other: "Enter" },
643
+ esc: { mac: "esc", other: "Esc" },
644
+ escape: { mac: "esc", other: "Esc" },
645
+ up: { mac: "\u2191", other: "Up" },
646
+ down: { mac: "\u2193", other: "Down" },
647
+ left: { mac: "\u2190", other: "Left" },
648
+ right: { mac: "\u2192", other: "Right" },
649
+ backspace: { mac: "\u232B", other: "Backspace" },
650
+ delete: { mac: "\u2326", other: "Del" },
651
+ del: { mac: "\u2326", other: "Del" },
652
+ tab: { mac: "\u21E5", other: "Tab" },
653
+ space: { mac: "Space", other: "Space" },
654
+ home: { mac: "\u2196", other: "Home" },
655
+ end: { mac: "\u2198", other: "End" },
656
+ pageup: { mac: "\u21DE", other: "PgUp" },
657
+ pagedown: { mac: "\u21DF", other: "PgDn" }
658
+ };
659
+ var PORTABLE_MODS = /* @__PURE__ */ new Set(["mod", "ctrl", "alt", "shift"]);
660
+ function parse(combo) {
661
+ const parts = combo.split("+");
662
+ const mods = [];
663
+ let key;
664
+ for (let i = 0; i < parts.length; i++) {
665
+ const raw = parts[i] ?? "";
666
+ if (raw === "" && i > 0) {
667
+ key = "+";
668
+ continue;
669
+ }
670
+ const mod = MODIFIER_ALIASES[raw.toLowerCase()];
671
+ if (mod) {
672
+ if (!mods.includes(mod)) mods.push(mod);
673
+ continue;
674
+ }
675
+ key = raw;
676
+ }
677
+ return { mods, key };
678
+ }
679
+ function isKeyCombo(value) {
680
+ const plus = value.length > 2 && value.endsWith("++");
681
+ const parts = (plus ? value.slice(0, -2) : value).split("+");
682
+ let keys = plus ? 1 : 0;
683
+ for (const raw of parts) {
684
+ if (raw === "") return false;
685
+ const word = raw.toLowerCase();
686
+ if (PORTABLE_MODS.has(word)) continue;
687
+ if (raw.length === 1 || word in NAMED) {
688
+ keys++;
689
+ continue;
690
+ }
691
+ return false;
692
+ }
693
+ return keys === 1;
694
+ }
695
+ function keyLegend(key, mac) {
696
+ const named = NAMED[key.toLowerCase()];
697
+ if (named) return mac ? named.mac : named.other;
698
+ return key.length === 1 ? key.toUpperCase() : key;
699
+ }
700
+ function keyLabel(combo, platform = keyPlatform()) {
701
+ const mac = platform === "mac";
702
+ const { mods, key } = parse(combo);
703
+ const order = mac ? MAC_ORDER : OTHER_ORDER;
704
+ const words = order.filter((m) => mods.includes(m)).map((m) => (mac ? MAC_MOD : OTHER_MOD)[m]);
705
+ const seen = /* @__PURE__ */ new Set();
706
+ const modWords = words.filter((w) => seen.has(w) ? false : (seen.add(w), true));
707
+ const legend = key === void 0 ? [] : [keyLegend(key, mac)];
708
+ return mac ? [...modWords, ...legend].join("") : [...modWords, ...legend].join("+");
709
+ }
710
+ function keyLegends(combo, platform = keyPlatform()) {
711
+ if (platform === "mac") return [keyLabel(combo, platform)];
712
+ const { mods, key } = parse(combo);
713
+ const seen = /* @__PURE__ */ new Set();
714
+ const words = OTHER_ORDER.filter((m) => mods.includes(m)).map((m) => OTHER_MOD[m]).filter((w) => seen.has(w) ? false : (seen.add(w), true));
715
+ return key === void 0 ? words : [...words, keyLegend(key, false)];
716
+ }
717
+ function chip(legend) {
718
+ const k = document.createElement("kbd");
719
+ k.className = "shell-kbd";
720
+ k.textContent = legend;
721
+ return k;
722
+ }
723
+ function keyHint(combo, opts = {}) {
724
+ const platform = opts.platform ?? keyPlatform();
725
+ const legends = combo.trim().split(/\s+/).flatMap((c) => keyLegends(c, platform));
726
+ if (legends.length === 1) return chip(legends[0]);
727
+ const group = document.createElement("span");
728
+ group.className = "shell-keys";
729
+ for (const legend of legends) group.append(chip(legend));
730
+ return group;
731
+ }
732
+ function hintBar(items, opts = {}) {
733
+ const bar = document.createElement("div");
734
+ bar.className = "shell-hintbar";
735
+ for (const item of items) {
736
+ const hint = document.createElement("span");
737
+ hint.className = "shell-hint";
738
+ const label2 = document.createElement("span");
739
+ label2.className = "shell-hint-label";
740
+ label2.textContent = item.label;
741
+ hint.append(keyHint(item.keys, opts), label2);
742
+ bar.append(hint);
743
+ }
744
+ return bar;
745
+ }
746
+ function tipWithKey(text, combo, platform = keyPlatform()) {
747
+ return `${text} (${keyLabel(combo, platform)})`;
748
+ }
749
+
574
750
  // src/pane-shell.ts
575
751
  var DEFAULT_MAX = (w) => Math.min(640, w - 420);
576
752
  var openVar = { nav: "--nav-open-w", inspector: "--insp-open-w" };
@@ -616,9 +792,10 @@ function mountPaneShell(host, opts) {
616
792
  if (!offered("nav")) navToggle.remove();
617
793
  if (!offered("inspector")) inspToggle.remove();
618
794
  const defaultTip = (side, isOpen) => {
619
- const noun = cfg[side].label ?? side;
620
- const hint = cfg[side].shortcutHint ? ` (${cfg[side].shortcutHint})` : "";
621
- return `${isOpen ? "Hide" : "Show"} ${noun}${hint}`;
795
+ const text = `${isOpen ? "Hide" : "Show"} ${cfg[side].label ?? side}`;
796
+ const hint = cfg[side].shortcutHint;
797
+ if (!hint) return text;
798
+ return isKeyCombo(hint) ? tipWithKey(text, hint) : `${text} (${hint})`;
622
799
  };
623
800
  const tipFor = opts.tipFor ?? defaultTip;
624
801
  function applyToggleGlyph(side, button) {
@@ -779,6 +956,59 @@ var VIEW_MENU = {
779
956
  colourTheme: { label: "Colour Theme" }
780
957
  };
781
958
 
959
+ // src/problems.ts
960
+ function problemName(p, dangling = false) {
961
+ if (p.title) return `\u201C${p.title}\u201D`;
962
+ if (dangling && p.where) return `(id ${p.where})`;
963
+ return "This";
964
+ }
965
+ function describeProblem(problem, table = {}) {
966
+ const entry = problem.code ? table[problem.code] : void 0;
967
+ if (entry) {
968
+ const copy = entry(problem);
969
+ const text = copy.dangling && !problem.title && problem.where && !copy.text.includes(`(id ${problem.where})`) ? `${copy.text} (id ${problem.where})` : copy.text;
970
+ return copy.next ? { text, next: copy.next } : { text };
971
+ }
972
+ const message = problem.message.replace(/\s*\[[^\]]*\]\s*$/, "").trim();
973
+ return { text: problem.title ? `${problem.title}: ${message}` : message };
974
+ }
975
+ function problemLine(problem, table) {
976
+ const { text, next } = describeProblem(problem, table);
977
+ return next ? `${text} ${next}` : text;
978
+ }
979
+ var defaultProblemCopy = {
980
+ "duplicate-gameid": (p) => ({
981
+ text: `The Game ID on ${problemName(p)} is already used elsewhere.`,
982
+ next: "Each one must be unique; change one of them."
983
+ }),
984
+ "invalid-gameid": (p) => ({
985
+ text: `The Game ID on ${problemName(p)} isn't valid.`,
986
+ next: "Use lowercase letters, digits and hyphens."
987
+ }),
988
+ "dangling-reference": (p) => ({
989
+ text: `${problemName(p, true)} points at something that no longer exists.`,
990
+ next: "Choose where it goes.",
991
+ dangling: true
992
+ }),
993
+ "unknown-property": (p) => ({
994
+ text: `${problemName(p)} uses a property that isn't set up yet.`,
995
+ next: "Declare it in the project settings, or fix the name."
996
+ }),
997
+ "missing-name": (p) => ({ text: `${problemName(p)} needs a name.` }),
998
+ "empty": (p) => ({
999
+ text: `${problemName(p)} is empty.`,
1000
+ next: "Add something inside it, or remove it."
1001
+ }),
1002
+ "stale-build": (p) => ({
1003
+ text: `Your playable build${p.path ? ` (${p.path})` : ""} is out of date.`,
1004
+ next: "It refreshes the next time you publish."
1005
+ }),
1006
+ "merge-conflict": (p) => ({
1007
+ text: `${p.path ?? "This file"} still has an unresolved merge conflict in it.`,
1008
+ next: "Resolve it in your version control tool, then reopen the project."
1009
+ })
1010
+ };
1011
+
782
1012
  // src/settings.ts
783
1013
  function expandableRow(opts) {
784
1014
  const row = el("div", "set-row");
@@ -2400,7 +2630,7 @@ function renderStepperBar(host, opts) {
2400
2630
  "button",
2401
2631
  { className: "stepbar-cur", tip: opts.tips?.go ?? "Go to this", onClick: () => opts.onGo(index) },
2402
2632
  item.kind === void 0 ? null : el("span", { className: `stepbar-cat${item.kindClass ? ` ${item.kindClass}` : ""}`, text: item.kind }),
2403
- item.where === void 0 ? null : el("span", { className: "stepbar-where", text: item.where }),
2633
+ item.where === void 0 ? null : typeof item.where === "string" ? el("span", { className: "stepbar-where", text: item.where }) : el("span", "stepbar-where", item.where),
2404
2634
  el("span", { className: "stepbar-msg", text: item.text })
2405
2635
  ),
2406
2636
  ...actions,
@@ -2854,6 +3084,7 @@ exports.VIEW_MENU = VIEW_MENU;
2854
3084
  exports.askIdentity = askIdentity;
2855
3085
  exports.bindPropertyName = bindPropertyName;
2856
3086
  exports.bindPropertyRef = bindPropertyRef;
3087
+ exports.breadcrumb = breadcrumb;
2857
3088
  exports.closeAnchoredPanel = closeAnchoredPanel;
2858
3089
  exports.closeWithExit = closeWithExit;
2859
3090
  exports.colourFor = colourFor;
@@ -2865,6 +3096,8 @@ exports.createNavHistory = createNavHistory;
2865
3096
  exports.createSaveController = createSaveController;
2866
3097
  exports.debounce = debounce;
2867
3098
  exports.defaultControl = defaultControl;
3099
+ exports.defaultProblemCopy = defaultProblemCopy;
3100
+ exports.describeProblem = describeProblem;
2868
3101
  exports.dialogFrame = dialogFrame;
2869
3102
  exports.dismissToast = dismissToast;
2870
3103
  exports.dupGuard = dupGuard;
@@ -2878,6 +3111,7 @@ exports.followButton = followButton;
2878
3111
  exports.formatCount = formatCount;
2879
3112
  exports.gameIdify = gameIdify;
2880
3113
  exports.hideTip = hideTip;
3114
+ exports.hintBar = hintBar;
2881
3115
  exports.historyNav = historyNav;
2882
3116
  exports.icon = icon;
2883
3117
  exports.iconBtn = iconBtn;
@@ -2889,14 +3123,20 @@ exports.initTooltips = initTooltips;
2889
3123
  exports.isCaseOnlyPropertyName = isCaseOnlyPropertyName;
2890
3124
  exports.isEditableTarget = isEditableTarget;
2891
3125
  exports.isIconName = isIconName;
3126
+ exports.isKeyCombo = isKeyCombo;
2892
3127
  exports.isValidGameId = isValidGameId;
2893
3128
  exports.isValidPropertyName = isValidPropertyName;
3129
+ exports.keyHint = keyHint;
3130
+ exports.keyLabel = keyLabel;
3131
+ exports.keyLegends = keyLegends;
3132
+ exports.keyPlatform = keyPlatform;
2894
3133
  exports.labelled = labelled;
2895
3134
  exports.linkAddress = linkAddress;
2896
3135
  exports.linkStatusClass = linkStatusClass;
2897
3136
  exports.linkStatusTip = linkStatusTip;
2898
3137
  exports.lockControls = lockControls;
2899
3138
  exports.lockNotice = lockNotice;
3139
+ exports.metaLine = metaLine;
2900
3140
  exports.mountJobProgress = mountJobProgress;
2901
3141
  exports.mountLinkStatus = mountLinkStatus;
2902
3142
  exports.mountPaneShell = mountPaneShell;
@@ -2914,6 +3154,8 @@ exports.paintVcBadges = paintVcBadges;
2914
3154
  exports.pinButton = pinButton;
2915
3155
  exports.placeAnchored = placeAnchored;
2916
3156
  exports.plural = plural;
3157
+ exports.problemLine = problemLine;
3158
+ exports.problemName = problemName;
2917
3159
  exports.propertyNameProblem = propertyNameProblem;
2918
3160
  exports.propertyNameify = propertyNameify;
2919
3161
  exports.propertyRefProblem = propertyRefProblem;
@@ -2923,6 +3165,7 @@ exports.revalidatePropertyRefs = revalidatePropertyRefs;
2923
3165
  exports.revealRow = revealRow;
2924
3166
  exports.revealRowWhenReady = revealRowWhenReady;
2925
3167
  exports.saveIndicator = saveIndicator;
3168
+ exports.setKeyPlatform = setKeyPlatform;
2926
3169
  exports.showAbout = showAbout;
2927
3170
  exports.showUpdaterDialog = showUpdaterDialog;
2928
3171
  exports.stageChips = stageChips;
@@ -2930,6 +3173,7 @@ exports.staleBar = staleBar;
2930
3173
  exports.tagChips = tagChips;
2931
3174
  exports.tipAt = tipAt;
2932
3175
  exports.tipBold = tipBold;
3176
+ exports.tipWithKey = tipWithKey;
2933
3177
  exports.toast = toast;
2934
3178
  exports.toolWindowHead = toolWindowHead;
2935
3179
  exports.vcBadgeFor = vcBadgeFor;