summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/style.css
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-08-15 02:34:19 +0200
committerChristophe Besson <cbesson@gmail.com>2026-08-15 02:34:19 +0200
commit84b032c65e17267d41e04605e79eea82a6f5a59f (patch)
treeeb7708a72944bb15540e103b4319242199af6fbb /packages/meshbay-hub/src/meshbay_hub/static/style.css
parent5338894f7fec9e1a60affb0e2ff3b9797bcbc968 (diff)
downloadmeshbay-84b032c65e17267d41e04605e79eea82a6f5a59f.tar.gz
feat(groups): editable description, and one source of operator authority
A description could only be set the moment a group was created, so every group made before anyone thought of one stayed blank for good. The owner can now edit it from the group's page, and PATCH /v1/groups/{id} takes it. That endpoint takes the description and nothing else, deliberately. The name, the visibility and the join policy are the terms members joined on; a private group that can quietly become public is not the group they agreed to be in. Changing those needs a decision about who gets told, not a field on a form — there is a test saying so. Separately, the legacy operator key is gone. `admin_pk_ed25519` in node.toml named the operator before the roster existed and was kept so that an existing deployment would keep working; nothing uses it, and a second source of node authority is not something to carry around out of politeness. Authority is the roster, read fresh on every check. It is removed rather than ignored: a config that still names the key gets a warning at startup pointing at the file. Dropping it in silence would refuse invites and file deletion with a signature error that looks like a bug somewhere else — which is exactly how finding M3 presented. Two tests were verifying admin operations by naming a key in the context, which was the legacy path. They now pair an operator into a roster, the way an operator does. The authority test anchored on the deleted function and passed vacuously once it disappeared; it states the invariant against the verifier and the daemon instead. Also defined .btn-secondary, used in four places and styled in none. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/style.css')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/style.css47
1 files changed, 47 insertions, 0 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/style.css b/packages/meshbay-hub/src/meshbay_hub/static/style.css
index fab4f55..f83b433 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/style.css
+++ b/packages/meshbay-hub/src/meshbay_hub/static/style.css
@@ -1157,6 +1157,53 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
.admin-btn.danger:hover { border-color: var(--error); }
.admin-btn:disabled { opacity: 0.4; cursor: not-allowed; }
+/* Used in four places and never defined, so it rendered as a bare browser
+ button next to styled ones. Same shape as .admin-btn, quieter. */
+.btn-secondary {
+ padding: 4px 10px;
+ border: 1px solid transparent;
+ border-radius: 5px;
+ background: none;
+ color: var(--text-secondary);
+ font-size: 0.82em;
+ cursor: pointer;
+ white-space: nowrap;
+}
+.btn-secondary:hover { border-color: var(--border); color: var(--text); }
+.btn-secondary:disabled { opacity: 0.4; cursor: not-allowed; }
+
+/* Text that acts as a button: the "add a description" affordance should not
+ compete with the group's name for attention. */
+.link-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 2px;
+ padding: 0;
+ border: none;
+ background: none;
+ color: var(--text-dim);
+ font-size: 0.8em;
+ cursor: pointer;
+}
+.link-btn:hover { color: var(--accent); }
+
+/* The header is a flex row, so a textarea in it collapses to its content
+ width unless told otherwise. */
+.group-desc-edit { margin: 4px 0 6px; width: min(460px, 60vw); min-width: 260px; }
+.group-desc-edit textarea {
+ width: 100%;
+ padding: 6px 8px;
+ border: 1px solid var(--border);
+ border-radius: 5px;
+ background: var(--bg-surface);
+ color: var(--text);
+ font: inherit;
+ font-size: 0.85em;
+ resize: vertical;
+}
+.group-desc-edit textarea:focus { outline: none; border-color: var(--border-focus); }
+.group-desc-edit div { display: flex; gap: 6px; margin-top: 4px; }
+
.admin-role-select {
padding: 3px 6px;
border: 1px solid var(--border);