web: converge shell visual language and emit ISO timestamps from core - #17
Merged
Merged
Conversation
Continue the low-chroma tool-surface direction: tighten shell density, hairline + whisper-shadow containment, denser rail rows with clearer default/selected differentiation, compact badge/chip language, and single-line truncation for long titles in constrained chrome. Fix a real display bug: core emits `<unix-seconds>-<millis>` stamps, not ISO dates, so `new Date(value)` fell through to printing the raw string (e.g. `1781170545-087`) in both the rail and the transcript. Add a shared `parseCoreStamp` helper in web — product-semantic knowledge of the core contract belongs here, not in the business-blind component layer. Quiet the header chip system: drop the always-on idle/open/new chips and show only meaningful states (sending, reconnecting). Normalize the leftover all-caps `CONVERSATIONS` rail label to match the calmer descriptor language. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Push the timestamp display problem back to its correct ownership layers
instead of patching it in web.
Source (santi-core): `timestamp_now` produced `<unix-seconds>-<millis>`
strings, not ISO dates. Switch to jiff with fixed millisecond precision
(`DateTimePrinter::precision(Some(3))`), emitting RFC3339 UTC like
`2026-06-11T12:06:58.539Z`. Fixed-width fractional digits keep the value
lexicographically sortable, which both the SQLite `ORDER BY` and the browser
projection `localeCompare` sort keys rely on. The `Timestamp = String` alias
is unchanged, so the generated OpenAPI contract is untouched — only the
runtime value's semantics change. This also aligns the server with the
optimistic projection in mqueue, which already emitted ISO via
`new Date().toISOString()`.
Component layer: add a business-blind `Timestamp` atom backed by dayjs
(relativeTime + utc + localizedFormat). It renders a semantic `<time>` with
a machine-readable `dateTime`, shows smart relative text by default
("a few seconds ago"), and always carries the absolute local time in `title`
on hover. dayjs is generic display capability, not business logic, so it
belongs in components. `Text` gains a `time` tag and a `dateTime` prop.
Web: drop the now-redundant `coreStamp.ts` bypass added last round and render
session/message stamps through the `Timestamp` atom.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two commits from the product-detail followup round:
f6518e8shell visual language convergence — quiet-by-default header chips (onlysending/reconnectingrender), de-capsedConversations, computed shell-level theme variables (--ms-shell-padding/gap/radius/shadow),SectionStackLayoutpattern for right-panel section ownership,TextAreaautosize extracted to hooks with overscroll/box-model/bottom-anchor fixes, rail/header truncation polish.c1578daISO 8601 timestamps from core —timestamp_now()now emits RFC3339 UTC with fixed 3-digit millisecond precision via jiff (fixed width is load-bearing: timestamps are lexicographic sort keys in SQLiteORDER BYand browserlocaleCompare). New business-blindTimestampatom (dayjs) renders relative time with absolute local time on hover; the web-localcoreStamp.tsbypass is deleted. Contracts regeneration produces zero diff (theTimestamp = Stringalias is unchanged).Test plan
...Ztimestamps, rail/transcript show relative time with absolutetitle, ordering consistent🤖 Generated with Claude Code