You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
482c2db Thanks @constLiakos! - Reference catalogs per ADR-0024: ./countries is now the complete officially assigned ISO 3166-1 alpha-2 list (249 entries, CLDR English names, code-derived flags, GB — not UK — for the United Kingdom, plus findCountry/pickCountries/countryDisplayName), and a new ./languages subpath ships the ISO 639-1 superset (43 entries with nativeName endonyms and optional flags, plus findLanguage/isLanguageCode/pickLanguages/languageDisplayName). No alias maps or normalization shims — clean break. scripts/export-catalogs.mjs emits the backend-facing JSON templates. ProviderForm's country field now uses the library Combobox (searchable, clearable — the catalog is ~250 entries) instead of a native <select>; the countryOptions contract is unchanged, with new optional countrySearchPlaceholder/countryEmptyLabel/countryClearLabel label props.
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
e24b449 Thanks @constLiakos! - ChatMessage: new actions.errorExtra slot — an app-composed node rendered inside the error card (e.g. an "Open AI settings" link for not-configured failures). It sits next to the Retry button when the error is retryable and renders alone otherwise.
70797f0 Thanks @constLiakos! - ProfileSwitcher redesign: the trigger becomes an avatar chip (round
avatar + name + chevron, UserMenu-style) instead of an outline button;
the panel moves to the Menu aesthetic (w-80, backdrop-blur-xl, --as-shadow-pop) with a titled header + profile count. Rows are roomier
(size-8 ringed avatars, font-medium names) with pill badges — the
accent-tinted Current pill replaces the bare check text, Default gets a
muted pill — and the row actions compact to size-7 ghost icon buttons
(delete hovers to danger). The create row gains an inline + prefix icon, ↓/↑/Home/End now walk the rows, and loading gets as-anim-fade + role="status". No API changes: every label, icon and callback prop is
unchanged.
237dcc7 Thanks @constLiakos! - UserMenu: removed the legacy flat identity props (name, email, avatarUrl) — pass the structured user prop instead (every family app already does). New themeLayout prop ('auto' | 'submenu' | 'inline', default 'auto') makes the appearance-section layout explicit instead of inferred from themeLabels cardinality. Single-option toggle rows now report system → light when toggled off (was dark).
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
71caea1 Thanks @constLiakos! - UserMenu: a full theme set (light/dark/system labels) now renders as a checkable Theme submenu whose trigger shows the active theme — mirroring the Languages submenu, so the appearance section is two uniform rows instead of one row next to three. Fewer labels keep the previous inline rows (single dark label keeps toggle semantics). New labels.theme trigger label (English default 'Theme').
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
329e05e Thanks @constLiakos! - Next-gen menu skin (plan 16 UX polish): menu surfaces upgraded to rounded-xl with raised-surface background, --as-shadow-pop shadow and backdrop blur (p-1.5, min-w-56/min-w-44); items get rounded-lg hover/highlight states; MenuSubContent now renders the full overlay surface and MenuSubTrigger gains a trailing chevron; MenuSub/MenuSubTrigger/MenuSubContent exported from the family barrel; UserMenu languages moved into a Languages submenu with the active language on the sub-trigger, status pill as a full-width row and w-60 panel; as-anim-pop refined (fade + slide + scale, spring-ish ease).
022886a Thanks @constLiakos! - UserMenu upgraded to the full family identity-dropdown pattern: user
structured identity (+ roleBadge), switcher slot for app-composed
Profile/Tenant switchers, status pill, built-in appearance section
(theme/onThemeChange, language/onLanguageChange + languages) and a
dedicated danger onLogout row. Legacy flat name/email/avatarUrl
props and the items/onItemSelect contract are unchanged.
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
f0cadf3 Thanks @constLiakos! - admin-user-table gains AdminUserTable, a presentational + controlled admin user management table (identity-auth §12): email with "(you)" marker, activity count, role/status badges and per-row promote/demote, activate/deactivate, inline password reset (min-length gate) and force logout, with loading/empty/error states and guard-rail 403s surfaced through label-driven messages (describeAdminUserError). Strings and icons pass in as props with English defaults, tokens only. First consumer is study's admin Users tab (just-in-time exception); career adopts in Phase 3.
0487713 Thanks @constLiakos! - login-form + register-form gain LoginForm and RegisterForm, the family-standard auth surfaces (identity-auth §12, plan 16 U1): presentational + controlled forms with labelled email/password fields, password visibility toggles, loading/error props (apps map API errors), HTML5 + min-length validation, link slots for the SPA mode switch (onRegister/registerHref, forgotHref, onLogin/loginHref — omitting them hides the action, covering career's registration-disabled P3c), plus confirm-password mismatch and an optional full-name field on RegisterForm. No remember-me: HttpOnly cookies make session lifetime server-owned. Strings and icons pass in as props with English defaults, tokens only. First consumers are study's LoginOverlay and career's LoginScreen (plan 16 Phase 5 closeout, same-commit deletes of their local form markup).
756e70b Thanks @constLiakos! - auth-gate gains AuthGate, the shared session gate (identity-auth §4,
plan 16 Phase 5 closeout): the gate owns the checking → authenticated | anonymous boot machine and its rendering, the app owns the endpoints — boot (cookie → refresh → desktop exchange) resolves the session, login/checking come in as app-composed nodes, resetKey replays the
machine for mid-session 401s, post-login transitions and forced drops, onStatusChange reports transitions out. A rejecting boot reads as
anonymous (never wedged on checking). First consumers are study's SessionGate (local AuthGate state machine deleted) and career's SessionGate (local ProtectedRoute gate deleted; dropToLogin() keeps
its zero-round-trip semantics by answering the replayed boot from the
store verdict).
51307ba Thanks @constLiakos! - profile-switcher gains ProfileSwitcher, a presentational + controlled profile switcher (identity-auth §6/§12): current-profile trigger and labelled panel listing the user's profiles with select, create, inline rename, optional set-Default and delete flows, plus loading/empty/error states. Strings and icons pass in as props with English defaults, tokens only. First consumer is career's app chrome (plan 16 P3b); study adopts its ProfileDialog parity later.
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
46be477 Thanks @constLiakos! - chat-hitl gains a presentational density: 'compact' | 'full' prop on HitlProposalCard, FieldDiff and FieldSummary (default full, so existing consumers are unchanged). Compact density caps the visible rows behind a "Show all N fields" expander (CappedRows, never a silent truncation) and shrinks long-text diff/summary bodies; full density renders everything. Lets space-constrained chat surfaces (bubble/docked) stay scannable while wide surfaces and preview modals show the complete proposal.
Patch Changes
8ea6dbd Thanks @constLiakos! - Fix chat-transcript stick-to-bottom fighting the reader on fast streams: upward scroll intent (wheel-up, touch drag up, scroll-up keys) now cancels the follow synchronously and any upward scroll event breaks it, so a partial scroll-up inside scrollThresholdPx no longer gets re-pinned to the bottom before the user finished reading; scrolling back to the bottom (or the jump pill) re-arms the follow
c582841 Thanks @constLiakos! - DetailValue panes grow with content instead of cropping: the pairs rows, value chips and the preformatted fallback moved from max-h-40 to max-h-96, so a tool response or trace payload is readable in full without scrolling past a cut-off stub.
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
7ab64aa Thanks @constLiakos! - Add the fourth family member everywhere: new DesktopMark logo (exported
from the root and @neuronection/assistant-ui/logo), FamilyApp widened
with 'desktop' (usable as AboutPanel's familyCurrent and FamilyBadge's current), and the default FamilyBadge member grid now
lists Desktop Assistant — four cards in a 2×2 responsive grid
(sm:grid-cols-2, was sm:grid-cols-3).
FieldDiff/FieldSummary render structured collection values (lists of
plain objects — plan 99's skills/achievements/links rows) as chip rows
with the entry's label + role/level suffix; scalar strings and string
arrays render exactly as before. HitlProposalCard gains an optional onPreview?: () => void slot (ADR-006 tier 3 — the library owns the
button + a11y, the app owns what a preview is) shown on pending and
approved/reverted cards, and the terminal reverted status variant for
undone approved cards (plan 99). New stories: Reverted, PreviewSlot.
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Minor Changes
4093020 Thanks @constLiakos! - Add ModalBody to the Modal compound: a padded body region (px-6 pb-6,
mergable via className, data-as="modal-body") that sits between ModalHeader (p-6 pb-4) and ModalFooter (p-6 pt-0). The modal layout
now owns its full spacing — consumers no longer hand-roll px-6 pb-6
wrappers on the content between header and footer (this was the de-facto
pattern in every family app, and FormModal already used it internally).
Story + docs + tests updated; no visual regression in existing usage.
cfcf89a Thanks @constLiakos! - Refresh the default elevation tokens to softer two-layer ambient+key shadows
(--as-shadow-1..3 — lower alpha, wider ambient spread: a calmer "floating
surface" feel) and deepen --as-success from oklch(0.62 0.15 152) to
oklch(0.55 0.15 152) so white --as-success-fg text meets WCAG AA (4.51:1,
was 3.41:1). A new automated contrast gate (tests/tokens-contrast.test.ts)
converts the light :root tokens OKLCH → sRGB → WCAG relative luminance and
asserts every fg/background text pair stays at 4.5:1 or better, so future
token edits cannot silently regress accessibility. Components consume the
tokens — no API changes; apps that re-map these tokens in their own theme.css are unaffected until they adopt the new defaults.