commit d10a890139b04cb925828f405f8fad565ef7f3ca
parent 30ee5697965dc7b0355f15803effda18bd14f2b1
Author: finwo <finwo@pm.me>
Date: Mon, 28 Sep 2026 20:17:47 +0200
Space out row actions and give them a button of their own
Diffstat:
3 files changed, 40 insertions(+), 25 deletions(-)
diff --git a/web/src/global.css b/web/src/global.css
@@ -165,6 +165,17 @@ button.link {
text-decoration: underline;
}
+button.quiet {
+ padding: 0.3rem 0.7rem;
+ background: none;
+ color: var(--fg);
+ border: 1px solid var(--line);
+}
+
+button.quiet:hover { border-color: var(--accent); color: var(--accent); }
+
+.rowactions { display: flex; flex-wrap: wrap; gap: 0.4rem; }
+
.actions { display: flex; align-items: center; gap: 0.75rem; margin: 1rem 0; }
.pager { display: flex; align-items: center; gap: 1rem; margin-top: 1rem; color: var(--muted); }
diff --git a/web/src/screen/project.tsx b/web/src/screen/project.tsx
@@ -208,19 +208,21 @@ export const Project: m.Component = {
{vnode.state.shown[v.name] ? vnode.state.values[v.name] : '***'}
</td>
<td>
- <button class="link" onclick={() => toggleValue(v.name)}>
- {vnode.state.shown[v.name] ? 'hide' : 'view'}
- </button>
- <button class="link" onclick={() => copyValue(v.name)}>copy</button>
- <button
- class="link"
- onclick={async () => {
- await del(`/projects/${id}/variables/${encodeURIComponent(v.name)}`);
- await vnode.state.load();
- }}
- >
- remove
- </button>
+ <div class="rowactions">
+ <button class="quiet" onclick={() => toggleValue(v.name)}>
+ {vnode.state.shown[v.name] ? 'hide' : 'view'}
+ </button>
+ <button class="quiet" onclick={() => copyValue(v.name)}>copy</button>
+ <button
+ class="quiet"
+ onclick={async () => {
+ await del(`/projects/${id}/variables/${encodeURIComponent(v.name)}`);
+ await vnode.state.load();
+ }}
+ >
+ remove
+ </button>
+ </div>
</td>
</tr>
))}
diff --git a/web/src/screen/users.tsx b/web/src/screen/users.tsx
@@ -114,17 +114,19 @@ export const Users: m.Component = {
<td><When at={u.last_login_at} /></td>
<td>
{admin && u.id !== session.user?.id
- ? [
- <button class="link" onclick={() => change(u.id, { disabled: !u.disabled })}>
- {u.disabled ? 'enable' : 'disable'}
- </button>,
- <button
- class="link"
- onclick={async () => { await del(`/users/${u.id}`); await vnode.state.load(); }}
- >
- remove
- </button>,
- ]
+ ? (
+ <div class="rowactions">
+ <button class="quiet" onclick={() => change(u.id, { disabled: !u.disabled })}>
+ {u.disabled ? 'enable' : 'disable'}
+ </button>
+ <button
+ class="quiet"
+ onclick={async () => { await del(`/users/${u.id}`); await vnode.state.load(); }}
+ >
+ remove
+ </button>
+ </div>
+ )
: null}
</td>
</tr>
@@ -185,7 +187,7 @@ export const Sessions: m.Component = {
<td><When at={s.expires_at} /></td>
<td>
<button
- class="link"
+ class="quiet"
onclick={async () => { await del(`/sessions/${s.id}`); await vnode.state.load(); }}
>
revoke