overplay 4.1.0 → 4.3.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.3.0 — 2026-10-17
4
+
5
+ - Dashboard: manage MCP access in each project’s Settings. The MCP Server page lists enabled projects by team, with links to their settings. Project owners and admins keep the same permissions.
6
+ - Publishing: one checked release pipeline deploys Cloudflare, publishes npm, updates the Community mirror, and verifies each output before creating the GitHub release.
7
+
8
+ ## 4.2.0 — 2026-10-17
9
+
10
+ - Widget Settings has two tabs: **General** (panel, notifications and the shortcut) and **Appearance** (theme, pins and the comments button).
11
+ - Opening the sidebar with the shortcut no longer shows a focus ring on the Settings button. Focus moves to the panel; Tab still reaches every button.
12
+ - Website: new pages **How It Works** and **MCP Server** in the header. The MCP Server page lists all 20 MCP tools by permission. The New pill on the landing page opens it.
13
+ - Website: Pricing, Docs, How It Works and MCP Server share one page header (label, title, text, buttons).
14
+ - Dashboard: the usage bars on Plan & Billing use the full width. Team rows no longer push the arrow out of the card on hover, and Teams in the sidebar has a two-people icon.
15
+
3
16
  ## 4.1.0 — 2026-10-17
4
17
 
5
18
  - New default shortcut to open and close comments: **Alt+C** (**Option+C** on Mac). It works on any keyboard layout. Alt+Shift+C still works, but on Windows Alt+Shift can switch the keyboard language. Settings shows Option on Mac. Set `keyboardShortcut` to keep another key.
@@ -474,7 +474,7 @@ function newActivity(comments, seen, selfId) {
474
474
  function sameComments(a, b) {
475
475
  return a.length === b.length && JSON.stringify(a) === JSON.stringify(b);
476
476
  }
477
- const version = "4.1.0";
477
+ const version = "4.3.0";
478
478
  const VERSION = version;
479
479
  const PACKAGE = "overplay";
480
480
  function updatePrompt(current, latest) {
@@ -781,7 +781,7 @@ const styles = `
781
781
  .menu-note{display:flex;align-items:center;gap:2px;margin:4px 0 0;padding:8px 10px 4px;border-top:1px solid var(--cw-line);font-size:12px;color:var(--cw-muted)}
782
782
  .footer{justify-content:space-between}
783
783
  .footer-note{font-size:13px;color:var(--cw-muted)}
784
- .settings-body{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;padding:4px 20px 12px}
784
+ .panel:focus{outline:0}.settings-tabs{grid-template-columns:1fr 1fr;margin:0 0 12px}.settings-body{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;padding:4px 20px 12px}
785
785
  .setting-group{padding:14px 0 6px}
786
786
  .setting-group+.setting-group{border-top:1px solid var(--cw-line)}
787
787
  .setting-group h3{margin:0 0 6px;font-size:12px;font-weight:650;letter-spacing:1.1px;text-transform:uppercase;color:var(--cw-muted)}
@@ -1697,6 +1697,7 @@ class Overlay {
1697
1697
  /** A newer npm version, found when the sidebar first opens. See checkForUpdate(). */
1698
1698
  __publicField(this, "update", null);
1699
1699
  __publicField(this, "updatePromptOpen", false);
1700
+ __publicField(this, "settingsTab", "general");
1700
1701
  __publicField(this, "updateChecked", false);
1701
1702
  /** The page margin we replaced to make room for the sidebar, restored when it closes. */
1702
1703
  __publicField(this, "pushed", null);
@@ -2259,7 +2260,11 @@ ${this.currentPage()}`;
2259
2260
  this.visible = true;
2260
2261
  this.render();
2261
2262
  this.trackLayoutMotion();
2262
- (_a = this.shadow.querySelector(".panel button, .launcher")) == null ? void 0 : _a.focus();
2263
+ const panel = this.shadow.querySelector(".panel");
2264
+ if (panel) {
2265
+ panel.tabIndex = -1;
2266
+ panel.focus({ preventScroll: true });
2267
+ } else (_a = this.shadow.querySelector(".launcher")) == null ? void 0 : _a.focus();
2263
2268
  this.checkForUpdate();
2264
2269
  }
2265
2270
  hide() {
@@ -3689,10 +3694,23 @@ ${this.currentPage()}`;
3689
3694
  const view = this.view("Settings", "settings");
3690
3695
  view.append(this.detailHeading("Settings", "Your choices for this project. Other people keep their own."));
3691
3696
  const current = this.settings, body = element("div", "settings-body");
3692
- const section = (title) => {
3697
+ const tabs = element("div", "tabs settings-tabs");
3698
+ tabs.setAttribute("role", "group");
3699
+ tabs.setAttribute("aria-label", "Settings section");
3700
+ for (const [id, label2] of [["general", "General"], ["appearance", "Appearance"]]) {
3701
+ const tab = button(label2, "tab", () => {
3702
+ this.settingsTab = id;
3703
+ this.render();
3704
+ });
3705
+ tab.setAttribute("aria-pressed", String(this.settingsTab === id));
3706
+ tab.dataset.focus = `settings-tab-${id}`;
3707
+ tabs.append(tab);
3708
+ }
3709
+ body.append(tabs);
3710
+ const section = (title, tab) => {
3693
3711
  const group = element("section", "setting-group");
3694
3712
  group.append(element("h3", "", title));
3695
- body.append(group);
3713
+ if (tab === this.settingsTab) body.append(group);
3696
3714
  return group;
3697
3715
  };
3698
3716
  const row = (group, label2, hint, control) => {
@@ -3728,9 +3746,9 @@ ${this.currentPage()}`;
3728
3746
  control.addEventListener("click", () => this.setSetting(name, !on));
3729
3747
  return control;
3730
3748
  };
3731
- const look = section("Appearance");
3749
+ const look = section("Theme", "appearance");
3732
3750
  row(look, "Theme", current.theme === "system" ? "Follows your device" : "", choice("theme", "Theme", [["light", "Light"], ["dark", "Dark"], ["system", "System"]]));
3733
- const pins = section("Pins");
3751
+ const pins = section("Pins", "appearance");
3734
3752
  const sample = element("div", `pin-sample${current.pinSize === "small" ? " small" : ""}${current.resolvedPins === "gray" ? " resolved-gray" : ""}`);
3735
3753
  sample.setAttribute("aria-hidden", "true");
3736
3754
  sample.style.setProperty("--cw-accent", this.pinColor());
@@ -3754,7 +3772,7 @@ ${this.currentPage()}`;
3754
3772
  row(pins, "Resolved pins", "", choice("resolvedPins", "Resolved pins", [["green", "Green"], ["gray", "Gray"]]));
3755
3773
  row(pins, "Size", "", choice("pinSize", "Pin size", [["regular", "Regular"], ["small", "Small"]]));
3756
3774
  row(pins, "Label", "", choice("pinLabel", "Pin label", [["number", "Number"], ["initials", "Initials"]]));
3757
- const floating = section("Comments button");
3775
+ const floating = section("Comments button", "appearance");
3758
3776
  const buttonSample = element("div", "launcher-sample");
3759
3777
  buttonSample.setAttribute("aria-hidden", "true");
3760
3778
  const mini = element("span", "launcher-mini");
@@ -3776,7 +3794,7 @@ ${this.currentPage()}`;
3776
3794
  }
3777
3795
  const buttonHint = current.buttonColor === "default" ? "Dark. Takes the site color while open." : current.buttonColor === "site" ? "The color of this site" : PIN_COLORS[current.buttonColor].label;
3778
3796
  row(floating, "Color", buttonHint, buttonSwatches).classList.add("wide");
3779
- const panel = section("Panel");
3797
+ const panel = section("Panel", "general");
3780
3798
  const open = element("div", "segmented");
3781
3799
  open.setAttribute("role", "group");
3782
3800
  open.setAttribute("aria-label", "Open comments");
@@ -3790,7 +3808,7 @@ ${this.currentPage()}`;
3790
3808
  }
3791
3809
  row(panel, "Open comments", "", open);
3792
3810
  row(panel, "Push the page aside", "The open panel does not cover the page.", toggle("pushContent", "Push the page aside"));
3793
- const alerts = section("Notifications and keys");
3811
+ const alerts = section("Notifications and keys", "general");
3794
3812
  row(alerts, "New activity", "Show a short notice when others comment or reply.", toggle("notifications", "Show new activity"));
3795
3813
  const keys = shortcutLabel(this.config.keyboardShortcut ?? "", /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent));
3796
3814
  row(alerts, "Keyboard shortcut", this.shortcut ? `${keys} opens and closes comments.` : "This site has no shortcut.", toggle("shortcut", "Keyboard shortcut", !this.shortcut));