diff --git a/CHANGELOG.md b/CHANGELOG.md index 1734e30..df2abd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to Primora. Format follows [Keep a Changelog](https://keepac ## [Unreleased] +### Added + +- **Slugs auto-derive from names** — typing an organization, project, bucket, or collection name now fills its slug (`TDvorak` → `tdvorak`); hand-editing the slug stops the derivation, and manual edits are sanitized as you type. Edit forms stay manual. + ## [0.8.3] - 2026-09-28 ### Added diff --git a/apps/frontend/src/App.tsx b/apps/frontend/src/App.tsx index d25f05d..880ffa2 100644 --- a/apps/frontend/src/App.tsx +++ b/apps/frontend/src/App.tsx @@ -28,6 +28,7 @@ import { Show, createEffect, createMemo, createResource, createSignal, onCleanup import { authClient, fetchApiToken } from "./lib/auth-client"; import { configureApiToken, errorMessage } from "./lib/api"; import { isDemoMode, disableDemoMode, enableDemoMode, demoSession, demoService } from "./lib/demo-mode"; +import { applySlugField } from "./lib/slug"; import { AgentSetupModal, AppShell, @@ -1670,14 +1671,14 @@ export default function App() { label="Organization name" placeholder="Acme Corporation" value={organizationInput().name} - onInput={(e) => setOrganizationInput((c) => ({ ...c, name: e.currentTarget.value }))} + onInput={(e) => setOrganizationInput((c) => applySlugField(c, "name", e.currentTarget.value))} required /> setOrganizationInput((c) => ({ ...c, slug: e.currentTarget.value }))} + onInput={(e) => setOrganizationInput((c) => applySlugField(c, "slug", e.currentTarget.value))} required />