diff --git a/Cargo.lock b/Cargo.lock
index 91219c5..3ce6976 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -691,6 +691,47 @@ version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+[[package]]
+name = "jiff"
+version = "0.2.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4603d3033e49e2b0e31229fcab20a5d40089c607d975cd9c80551dc69eed9102"
+dependencies = [
+ "jiff-static",
+ "jiff-tzdb-platform",
+ "log",
+ "portable-atomic",
+ "portable-atomic-util",
+ "serde_core",
+ "windows-link",
+]
+
+[[package]]
+name = "jiff-static"
+version = "0.2.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "782d32378dddf207193ac91cefb848ad41abb58195c95168e1291227a0832b47"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "jiff-tzdb"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076"
+
+[[package]]
+name = "jiff-tzdb-platform"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8"
+dependencies = [
+ "jiff-tzdb",
+]
+
[[package]]
name = "jni"
version = "0.22.4"
@@ -945,6 +986,21 @@ version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
+[[package]]
+name = "portable-atomic"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
+
+[[package]]
+name = "portable-atomic-util"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
+dependencies = [
+ "portable-atomic",
+]
+
[[package]]
name = "potential_utf"
version = "0.1.5"
@@ -1328,6 +1384,7 @@ dependencies = [
"async-trait",
"futures-core",
"futures-util",
+ "jiff",
"rusqlite",
"santi-provider",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index eed8b6f..f0e278d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -25,6 +25,7 @@ bytes = "1"
dotenvy = "0.15"
futures-core = "0.3"
futures-util = "0.3"
+jiff = "0.2"
mini-stim-proto-client = { path = "proto/crates/client" }
mini-stim-proto-server = { path = "proto/crates/server" }
mini-stim-proto-transport = { path = "proto/crates/transport" }
diff --git a/apps/client/soma/web/src/components/ChatHeader.tsx b/apps/client/soma/web/src/components/ChatHeader.tsx
index bdc298f..1b41c5d 100644
--- a/apps/client/soma/web/src/components/ChatHeader.tsx
+++ b/apps/client/soma/web/src/components/ChatHeader.tsx
@@ -44,8 +44,7 @@ export function ChatHeader(props: {
return (
-
- SESSION
+
{editing ? (
) : (
)}
-
- {props.busy ? "sending" : "idle"}
-
- {props.selectedSessionId ? {props.connection} : null}
- {!props.selectedSessionId ? new : null}
+ {props.busy ? (
+ sending
+ ) : null}
+ {props.connection === "error" ? (
+ reconnecting
+ ) : null}
diff --git a/apps/client/soma/web/src/components/SessionRail.tsx b/apps/client/soma/web/src/components/SessionRail.tsx
index 6ba1e6b..d2ae79e 100644
--- a/apps/client/soma/web/src/components/SessionRail.tsx
+++ b/apps/client/soma/web/src/components/SessionRail.tsx
@@ -9,6 +9,7 @@ import {
ScrollArea,
Stack,
Text,
+ Timestamp,
} from "@mini-stim/components";
import type { Session } from "@mini-stim/hooks";
@@ -25,8 +26,8 @@ export function SessionRail(props: {
- WORKSPACE
- mini-stim
+ mini-stim
+ Local-first AI chat
- CONVERSATIONS
+ Conversations
{props.sessions.length}
@@ -47,24 +48,24 @@ export function SessionRail(props: {
{props.sessions.map((session) => {
const selected = session.id === props.selectedSessionId;
+ const label = sessionLabel(session);
return (
@@ -85,16 +86,3 @@ export function SessionRail(props: {
function sessionLabel(session: { id: string; title?: string | null }) {
return session.title?.trim() || session.id;
}
-
-function formatSessionStamp(value: string) {
- const date = new Date(value);
- if (Number.isNaN(date.getTime())) {
- return value;
- }
- return new Intl.DateTimeFormat(undefined, {
- month: "short",
- day: "numeric",
- hour: "numeric",
- minute: "2-digit",
- }).format(date);
-}
diff --git a/apps/client/soma/web/src/components/TimelineItemView.tsx b/apps/client/soma/web/src/components/TimelineItemView.tsx
index 3938f73..d96a21c 100644
--- a/apps/client/soma/web/src/components/TimelineItemView.tsx
+++ b/apps/client/soma/web/src/components/TimelineItemView.tsx
@@ -4,6 +4,7 @@ import {
Stack,
Surface,
Text,
+ Timestamp,
} from "@mini-stim/components";
import type { TimelineItem } from "@mini-stim/hooks";
@@ -26,9 +27,7 @@ export function TimelineItemView(props: {
{roleLabel(role)}
-
- {formatStamp(item.createdAt)}
-
+
{item.message.content_text}
@@ -124,14 +123,3 @@ function roleLabel(role: string) {
}
return "ASSISTANT";
}
-
-function formatStamp(value: string) {
- const date = new Date(value);
- if (Number.isNaN(date.getTime())) {
- return value;
- }
- return new Intl.DateTimeFormat(undefined, {
- hour: "numeric",
- minute: "2-digit",
- }).format(date);
-}
diff --git a/apps/server/soma/crates/santi-core/Cargo.toml b/apps/server/soma/crates/santi-core/Cargo.toml
index 4e626be..a1dcdbb 100644
--- a/apps/server/soma/crates/santi-core/Cargo.toml
+++ b/apps/server/soma/crates/santi-core/Cargo.toml
@@ -9,6 +9,7 @@ async-stream.workspace = true
async-trait.workspace = true
futures-core.workspace = true
futures-util.workspace = true
+jiff.workspace = true
rusqlite.workspace = true
santi-provider.workspace = true
serde.workspace = true
diff --git a/apps/server/soma/crates/santi-core/src/model.rs b/apps/server/soma/crates/santi-core/src/model.rs
index 10b76c9..54ab001 100644
--- a/apps/server/soma/crates/santi-core/src/model.rs
+++ b/apps/server/soma/crates/santi-core/src/model.rs
@@ -340,12 +340,20 @@ pub struct SessionRuntimeSnapshot {
}
pub fn timestamp_now() -> Timestamp {
- use std::time::{SystemTime, UNIX_EPOCH};
-
- let duration = SystemTime::now()
- .duration_since(UNIX_EPOCH)
- .expect("system clock before unix epoch");
- format!("{}-{:03}", duration.as_secs(), duration.subsec_millis())
+ use jiff::fmt::temporal::DateTimePrinter;
+
+ // RFC3339 / ISO 8601 UTC with fixed millisecond precision. Fixed-width
+ // fractional digits keep the string lexicographically sortable, which the
+ // store and the browser projection both rely on (timestamps are used as
+ // `ORDER BY` / `localeCompare` sort keys). A `jiff::Timestamp` is UTC, so
+ // the printed form ends in `Z`.
+ let now = jiff::Timestamp::now();
+ let mut buf = String::new();
+ DateTimePrinter::new()
+ .precision(Some(3))
+ .print_timestamp(&now, &mut buf)
+ .expect("formatting a timestamp into a String cannot fail");
+ buf
}
pub fn prefixed_id(prefix: &str) -> String {
diff --git a/packages/components/package.json b/packages/components/package.json
index 0696afe..e4a4481 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -11,6 +11,7 @@
"typecheck": "tsc --noEmit -p tsconfig.json"
},
"dependencies": {
+ "dayjs": "^1.11.21",
"lucide-react": "^1.17.0",
"react": "^19.2.7"
},
diff --git a/packages/components/src/atoms/Badge/Badge.scss b/packages/components/src/atoms/Badge/Badge.scss
index 23b18c2..18a32d4 100644
--- a/packages/components/src/atoms/Badge/Badge.scss
+++ b/packages/components/src/atoms/Badge/Badge.scss
@@ -1,45 +1,53 @@
.msBadge {
--ms-badge-bg: var(--ms-color-badge-neutral-bg);
+ --ms-badge-border: var(--ms-color-badge-neutral-border);
--ms-badge-text: var(--ms-color-badge-neutral-text);
display: inline-flex;
align-items: center;
+ justify-content: center;
min-width: 0;
- border: 1px solid var(--ms-color-border);
+ min-height: 1.5rem;
+ border: 1px solid var(--ms-badge-border);
border-radius: 999px;
background: var(--ms-badge-bg);
color: var(--ms-badge-text);
- font-weight: 600;
- letter-spacing: 0.02em;
+ font-weight: 650;
+ letter-spacing: 0.01em;
line-height: 1.15;
+ white-space: nowrap;
&--size-sm {
- padding: 0.1875rem 0.5rem;
+ padding: 0.125rem 0.5rem;
font-size: var(--ms-font-size-xs);
}
&--size-md {
- padding: 0.25rem 0.625rem;
+ padding: 0.1875rem 0.625rem;
font-size: var(--ms-font-size-sm);
}
&--tone-neutral {
--ms-badge-bg: var(--ms-color-badge-neutral-bg);
+ --ms-badge-border: var(--ms-color-badge-neutral-border);
--ms-badge-text: var(--ms-color-badge-neutral-text);
}
&--tone-accent {
--ms-badge-bg: var(--ms-color-badge-accent-bg);
+ --ms-badge-border: var(--ms-color-badge-accent-border);
--ms-badge-text: var(--ms-color-badge-accent-text);
}
&--tone-success {
--ms-badge-bg: var(--ms-color-badge-success-bg);
+ --ms-badge-border: var(--ms-color-badge-success-border);
--ms-badge-text: var(--ms-color-badge-success-text);
}
&--tone-danger {
--ms-badge-bg: var(--ms-color-badge-danger-bg);
+ --ms-badge-border: var(--ms-color-badge-danger-border);
--ms-badge-text: var(--ms-color-badge-danger-text);
}
}
diff --git a/packages/components/src/atoms/Button/Button.scss b/packages/components/src/atoms/Button/Button.scss
index 0a766cd..b5593e5 100644
--- a/packages/components/src/atoms/Button/Button.scss
+++ b/packages/components/src/atoms/Button/Button.scss
@@ -25,6 +25,7 @@ $button-sizes: (
--ms-button-text: var(--ms-color-button-text);
--ms-button-hover-bg: var(--ms-color-button-hover-bg);
--ms-button-hover-border: var(--ms-color-border-strong);
+ --ms-button-hover-shadow: var(--ms-shadow-button);
display: inline-flex;
position: relative;
@@ -47,6 +48,7 @@ $button-sizes: (
&:not(:disabled):hover {
background: var(--ms-button-hover-bg);
border-color: var(--ms-button-hover-border);
+ box-shadow: var(--ms-button-hover-shadow);
transform: translateY(-1px);
}
@@ -93,11 +95,12 @@ $button-sizes: (
}
&--variant-outline {
- --ms-button-bg: var(--ms-color-button-bg);
+ --ms-button-bg: var(--ms-color-button-subtle-bg);
--ms-button-border: var(--ms-color-button-border);
--ms-button-text: var(--ms-color-text);
--ms-button-hover-bg: var(--ms-color-button-hover-bg);
--ms-button-hover-border: var(--ms-color-border-strong);
+ --ms-button-hover-shadow: var(--ms-shadow-card);
}
&--variant-ghost {
@@ -121,18 +124,19 @@ $button-sizes: (
&--variant-rail,
&--variant-rail-selected {
justify-content: flex-start;
- border-radius: var(--ms-radius-xl);
+ border-radius: calc(var(--ms-radius-xl) - var(--ms-space-1));
box-shadow: none;
text-align: left;
- padding-block: var(--ms-space-3);
+ padding-block: calc(var(--ms-space-2) + var(--ms-space-1));
}
&--variant-rail {
- --ms-button-bg: transparent;
- --ms-button-border: transparent;
+ --ms-button-bg: rgba(255, 255, 255, 0.52);
+ --ms-button-border: var(--ms-color-border-faint);
--ms-button-text: var(--ms-color-text);
--ms-button-hover-bg: var(--ms-color-rail-hover-bg);
- --ms-button-hover-border: transparent;
+ --ms-button-hover-border: var(--ms-color-rail-hover-border);
+ --ms-button-hover-shadow: var(--ms-shadow-card);
}
&--variant-rail-selected {
@@ -141,11 +145,12 @@ $button-sizes: (
--ms-button-text: var(--ms-color-text-strong);
--ms-button-hover-bg: var(--ms-color-selected-hover-bg);
--ms-button-hover-border: var(--ms-color-rail-active-border);
+ --ms-button-hover-shadow: var(--ms-shadow-card);
&::before {
content: "";
position: absolute;
- inset: 0 auto 0 0;
+ inset: 0.5rem auto 0.5rem 0;
width: 0.1875rem;
border-radius: 999px;
background: var(--ms-color-rail-active-indicator);
diff --git a/packages/components/src/atoms/Grid/Grid.scss b/packages/components/src/atoms/Grid/Grid.scss
index 3254992..6418a26 100644
--- a/packages/components/src/atoms/Grid/Grid.scss
+++ b/packages/components/src/atoms/Grid/Grid.scss
@@ -18,7 +18,7 @@ $grid-gaps: (
}
&--template-sidebar-main {
- grid-template-columns: minmax(18rem, 22rem) minmax(0, 1fr);
+ grid-template-columns: minmax(16.5rem, 19rem) minmax(0, 1fr);
@media (max-width: 48rem) {
grid-template-columns: 1fr;
diff --git a/packages/components/src/atoms/Text/Text.tsx b/packages/components/src/atoms/Text/Text.tsx
index 71dddfa..1d60778 100644
--- a/packages/components/src/atoms/Text/Text.tsx
+++ b/packages/components/src/atoms/Text/Text.tsx
@@ -4,8 +4,11 @@ import { cx } from "../../internal/cx";
import "./Text.scss";
type TextProps = ComponentPropsWithoutRef<"span"> & {
+ // `dateTime` is only meaningful on tag="time"; allow it without widening the
+ // whole prop surface to a polymorphic union.
+ dateTime?: string;
size?: "xs" | "sm" | "md" | "lg";
- tag?: "p" | "span" | "small";
+ tag?: "p" | "span" | "small" | "time";
tone?: "default" | "strong" | "muted" | "subtle";
truncate?: boolean;
};
diff --git a/packages/components/src/atoms/Timestamp/Timestamp.tsx b/packages/components/src/atoms/Timestamp/Timestamp.tsx
new file mode 100644
index 0000000..f62c1a4
--- /dev/null
+++ b/packages/components/src/atoms/Timestamp/Timestamp.tsx
@@ -0,0 +1,56 @@
+import { useMemo } from "react";
+
+import dayjs from "dayjs";
+import localizedFormat from "dayjs/plugin/localizedFormat";
+import relativeTime from "dayjs/plugin/relativeTime";
+import utc from "dayjs/plugin/utc";
+
+import { Text } from "../Text/Text";
+
+dayjs.extend(utc);
+dayjs.extend(relativeTime);
+dayjs.extend(localizedFormat);
+
+type TimestampProps = {
+ // ISO 8601 string (UTC, e.g. "2026-06-11T09:35:45.087Z").
+ value: string;
+ // "relative" → "3 minutes ago"; "absolute" → localized date-time.
+ variant?: "relative" | "absolute";
+ size?: "xs" | "sm" | "md" | "lg";
+ tone?: "default" | "strong" | "muted" | "subtle";
+ truncate?: boolean;
+};
+
+export function Timestamp({
+ value,
+ variant = "relative",
+ size = "xs",
+ tone = "subtle",
+ truncate = false,
+}: TimestampProps) {
+ const { display, absolute, dateTime } = useMemo(() => {
+ const parsed = dayjs(value);
+ if (!parsed.isValid()) {
+ return { display: value, absolute: value, dateTime: undefined };
+ }
+ const absolute = parsed.format("LLL");
+ return {
+ display: variant === "relative" ? parsed.fromNow() : absolute,
+ absolute,
+ dateTime: parsed.toISOString(),
+ };
+ }, [value, variant]);
+
+ return (
+
+ {display}
+
+ );
+}
diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts
index 243f739..10e00a4 100644
--- a/packages/components/src/index.ts
+++ b/packages/components/src/index.ts
@@ -20,3 +20,4 @@ export { Stack } from "./atoms/Stack/Stack";
export { Surface } from "./atoms/Surface/Surface";
export { Text } from "./atoms/Text/Text";
export { TextArea } from "./atoms/TextArea/TextArea";
+export { Timestamp } from "./atoms/Timestamp/Timestamp";
diff --git a/packages/components/src/patterns/SectionStackLayout/SectionStackLayout.scss b/packages/components/src/patterns/SectionStackLayout/SectionStackLayout.scss
index bd862f5..8228c65 100644
--- a/packages/components/src/patterns/SectionStackLayout/SectionStackLayout.scss
+++ b/packages/components/src/patterns/SectionStackLayout/SectionStackLayout.scss
@@ -4,7 +4,7 @@
flex-direction: column;
min-width: 0;
min-height: 0;
- padding: var(--ms-space-3);
+ padding: calc(var(--ms-space-2) + var(--ms-space-1));
&__top,
&__middle,
@@ -38,7 +38,7 @@
}
&__top::after {
- bottom: calc(var(--ms-space-3) * -0.5);
+ bottom: calc((var(--ms-space-2) + var(--ms-space-1)) * -0.5);
}
&__top > *,
diff --git a/packages/components/src/theme/default.scss b/packages/components/src/theme/default.scss
index 765cdc0..f3036c7 100644
--- a/packages/components/src/theme/default.scss
+++ b/packages/components/src/theme/default.scss
@@ -9,9 +9,9 @@
color: var(--ms-color-text);
background: var(--ms-color-canvas);
font-family: var(--ms-font-family-sans);
- --ms-shell-padding: var(--ms-space-3);
- --ms-shell-gap: calc(var(--ms-space-3) * 0.8);
- --ms-shell-radius: calc(var(--ms-radius-xl) - var(--ms-space-1));
+ --ms-shell-padding: calc(var(--ms-space-2) + var(--ms-space-1));
+ --ms-shell-gap: var(--ms-space-2);
+ --ms-shell-radius: calc(var(--ms-radius-xl) - var(--ms-space-2));
--ms-shell-shadow: var(--ms-shadow-shell);
}
@@ -29,9 +29,9 @@ body,
body {
margin: 0;
background:
- radial-gradient(circle at top left, rgba(255, 255, 255, 0.88), transparent 24rem),
- radial-gradient(circle at bottom right, rgba(196, 214, 231, 0.26), transparent 20rem),
- linear-gradient(180deg, #eef4f8 0%, var(--ms-color-canvas) 100%);
+ radial-gradient(circle at top left, rgba(255, 255, 255, 0.82), transparent 21rem),
+ radial-gradient(circle at bottom right, rgba(179, 197, 214, 0.22), transparent 18rem),
+ linear-gradient(180deg, #edf2f7 0%, var(--ms-color-canvas) 100%);
color: var(--ms-color-text);
font-family: var(--ms-font-family-sans);
overflow: hidden;
diff --git a/packages/components/src/theme/tokens.border.scss b/packages/components/src/theme/tokens.border.scss
index fabcffc..c47b4ba 100644
--- a/packages/components/src/theme/tokens.border.scss
+++ b/packages/components/src/theme/tokens.border.scss
@@ -1,6 +1,10 @@
:root {
- --ms-shadow-shell: 0 18px 42px -28px rgba(36, 56, 74, 0.28);
- --ms-shadow-card: 0 10px 24px -22px rgba(34, 51, 66, 0.3);
+ --ms-shadow-shell:
+ 0 0 0 1px rgba(129, 147, 164, 0.08),
+ 0 16px 34px -28px rgba(25, 42, 59, 0.34);
+ --ms-shadow-card:
+ 0 0 0 1px rgba(123, 143, 161, 0.06),
+ 0 8px 18px -18px rgba(28, 44, 59, 0.22);
--ms-shadow-button: none;
- --ms-shadow-focus: 0 0 0 3px rgba(44, 108, 163, 0.14);
+ --ms-shadow-focus: 0 0 0 3px rgba(36, 93, 143, 0.14);
}
diff --git a/packages/components/src/theme/tokens.colors.scss b/packages/components/src/theme/tokens.colors.scss
index 1009910..c575054 100644
--- a/packages/components/src/theme/tokens.colors.scss
+++ b/packages/components/src/theme/tokens.colors.scss
@@ -1,51 +1,52 @@
:root {
- --ms-color-canvas: #e7edf3;
- --ms-color-panel: #f6f9fc;
+ --ms-color-canvas: #e4ebf1;
+ --ms-color-panel: #f3f7fb;
--ms-color-panel-raised: #fbfdff;
- --ms-color-panel-subtle: #eef3f8;
+ --ms-color-panel-subtle: #e9eff5;
--ms-color-surface: #ffffff;
- --ms-color-surface-muted-bg: #f4f8fb;
- --ms-color-surface-muted-border: #d5e0ea;
- --ms-color-surface-inset-bg: #edf3f8;
- --ms-color-surface-inset-border: #d4dde7;
- --ms-color-text: #16202a;
- --ms-color-text-strong: #101922;
- --ms-color-text-muted: #5f7080;
- --ms-color-text-subtle: #778898;
- --ms-color-border: #d3dde7;
- --ms-color-border-strong: #a8b7c5;
- --ms-color-border-faint: rgba(161, 178, 194, 0.24);
- --ms-color-frame-border: rgba(140, 162, 180, 0.28);
+ --ms-color-surface-muted-bg: #eef3f8;
+ --ms-color-surface-muted-border: #ccd8e4;
+ --ms-color-surface-inset-bg: #e8eef4;
+ --ms-color-surface-inset-border: #cad5e0;
+ --ms-color-text: #1b2834;
+ --ms-color-text-strong: #121c26;
+ --ms-color-text-muted: #57697a;
+ --ms-color-text-subtle: #718496;
+ --ms-color-border: #cad6e1;
+ --ms-color-border-strong: #9caebe;
+ --ms-color-border-faint: rgba(133, 152, 171, 0.24);
+ --ms-color-frame-border: rgba(116, 140, 165, 0.22);
--ms-color-button-bg: #ffffff;
- --ms-color-button-subtle-bg: #fbfdff;
- --ms-color-button-hover-bg: #eef4f9;
- --ms-color-button-border: #c5d1dc;
- --ms-color-button-text: #1c2a35;
- --ms-color-ghost-hover-bg: rgba(91, 116, 139, 0.08);
- --ms-color-rail-hover-bg: rgba(74, 99, 124, 0.08);
- --ms-color-rail-active-bg: #e1ebf5;
- --ms-color-rail-active-border: #c5d6e7;
- --ms-color-rail-active-indicator: #2c6899;
- --ms-color-accent: #2a6598;
- --ms-color-accent-border: #2a6598;
- --ms-color-accent-hover: #225884;
+ --ms-color-button-subtle-bg: #f8fbfd;
+ --ms-color-button-hover-bg: #edf3f8;
+ --ms-color-button-border: #bccbd8;
+ --ms-color-button-text: #162532;
+ --ms-color-ghost-hover-bg: rgba(69, 96, 123, 0.08);
+ --ms-color-rail-hover-bg: #eef3f7;
+ --ms-color-rail-hover-border: #d4dee8;
+ --ms-color-rail-active-bg: #e3ebf4;
+ --ms-color-rail-active-border: #bccbd9;
+ --ms-color-rail-active-indicator: #255f92;
+ --ms-color-accent: #245d8f;
+ --ms-color-accent-border: #245d8f;
+ --ms-color-accent-hover: #1c4f7b;
--ms-color-accent-text: #ffffff;
- --ms-color-selected-bg: #e3edf7;
- --ms-color-selected-hover-bg: #dae7f3;
- --ms-color-selected-border: #a8c3dc;
- --ms-color-selected-indicator: #2b648f;
+ --ms-color-selected-bg: #e1eaf3;
+ --ms-color-selected-hover-bg: #d8e3ee;
+ --ms-color-selected-border: #aac0d4;
+ --ms-color-selected-indicator: #265d8e;
- --ms-color-input-bg: #fdfefe;
- --ms-color-input-dock-bg: #f7fbfe;
- --ms-color-input-border: #cad6e0;
+ --ms-color-input-bg: #fcfeff;
+ --ms-color-input-dock-bg: #f5f8fb;
+ --ms-color-input-border: #c1cfdb;
--ms-color-input-focus-bg: #ffffff;
--ms-color-dock-bg: rgba(244, 248, 252, 0.96);
- --ms-color-dock-border: #d6e1eb;
+ --ms-color-dock-border: #cdd9e4;
- --ms-color-surface-accent-bg: #dbe8f4;
- --ms-color-surface-accent-border: #a7c1d7;
- --ms-color-surface-accent-text: #163a54;
+ --ms-color-surface-accent-bg: #d8e6f2;
+ --ms-color-surface-accent-border: #9fb9cf;
+ --ms-color-surface-accent-text: #16374f;
--ms-color-surface-warning-bg: #fff4e4;
--ms-color-surface-warning-border: #ead1a5;
@@ -59,16 +60,20 @@
--ms-color-danger-border: #e2aaaa;
--ms-color-danger-text: #8d2222;
- --ms-color-code-bg: #edf4f9;
- --ms-color-code-border: #cdd9e4;
+ --ms-color-code-bg: #edf3f8;
+ --ms-color-code-border: #c8d4de;
--ms-color-code-text: #22323e;
- --ms-color-badge-neutral-bg: #eaf1f6;
- --ms-color-badge-neutral-text: #476173;
- --ms-color-badge-accent-bg: #dbe8f4;
- --ms-color-badge-accent-text: #1a4565;
- --ms-color-badge-success-bg: #dff1e8;
- --ms-color-badge-success-text: #21553d;
- --ms-color-badge-danger-bg: #fff0f0;
+ --ms-color-badge-neutral-bg: #eef3f7;
+ --ms-color-badge-neutral-border: #d5dde6;
+ --ms-color-badge-neutral-text: #425768;
+ --ms-color-badge-accent-bg: #e0ebf4;
+ --ms-color-badge-accent-border: #bed0df;
+ --ms-color-badge-accent-text: #204761;
+ --ms-color-badge-success-bg: #e3f0e9;
+ --ms-color-badge-success-border: #c6dbd0;
+ --ms-color-badge-success-text: #28553f;
+ --ms-color-badge-danger-bg: #fff1f1;
+ --ms-color-badge-danger-border: #edc6c6;
--ms-color-badge-danger-text: #8d2222;
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 19d0329..0f973e5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -57,6 +57,9 @@ importers:
packages/components:
dependencies:
+ dayjs:
+ specifier: ^1.11.21
+ version: 1.11.21
lucide-react:
specifier: ^1.17.0
version: 1.17.0(react@19.2.7)
@@ -656,6 +659,9 @@ packages:
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+ dayjs@1.11.21:
+ resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==}
+
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -1594,6 +1600,8 @@ snapshots:
csstype@3.2.3: {}
+ dayjs@1.11.21: {}
+
debug@4.4.3:
dependencies:
ms: 2.1.3