@upbound/monarch-blocks 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/dist/cel-filter-bar.d.ts +187 -0
- package/dist/cel-filter-bar.js +1850 -0
- package/dist/cel-filter-bar.js.map +1 -0
- package/dist/chart.d.ts +52 -0
- package/dist/chart.js +332 -0
- package/dist/chart.js.map +1 -0
- package/dist/chat-interface.d.ts +143 -0
- package/dist/chat-interface.js +676 -0
- package/dist/chat-interface.js.map +1 -0
- package/dist/code-block.d.ts +21 -0
- package/dist/code-block.js +201 -0
- package/dist/code-block.js.map +1 -0
- package/dist/data-table.d.ts +505 -0
- package/dist/data-table.js +4725 -0
- package/dist/data-table.js.map +1 -0
- package/dist/filter-bar.d.ts +80 -0
- package/dist/filter-bar.js +590 -0
- package/dist/filter-bar.js.map +1 -0
- package/dist/floating-widget.d.ts +36 -0
- package/dist/floating-widget.js +218 -0
- package/dist/floating-widget.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +6217 -0
- package/dist/index.js.map +1 -0
- package/dist/page-header.d.ts +12 -0
- package/dist/page-header.js +120 -0
- package/dist/page-header.js.map +1 -0
- package/dist/relative-time.d.ts +60 -0
- package/dist/relative-time.js +328 -0
- package/dist/relative-time.js.map +1 -0
- package/dist/section-header.d.ts +11 -0
- package/dist/section-header.js +123 -0
- package/dist/section-header.js.map +1 -0
- package/dist/section-nav.d.ts +50 -0
- package/dist/section-nav.js +143 -0
- package/dist/section-nav.js.map +1 -0
- package/dist/timeline.d.ts +8 -0
- package/dist/timeline.js +95 -0
- package/dist/timeline.js.map +1 -0
- package/dist/types-BULiU2qC.d.ts +170 -0
- package/package.json +58 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
declare function PageHeader({ className, children, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
4
|
+
declare function PageHeaderAvatar({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
5
|
+
declare function PageHeaderContent({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
6
|
+
declare function PageHeaderTitle({ className, ...props }: React.ComponentProps<'h1'>): react_jsx_runtime.JSX.Element;
|
|
7
|
+
declare function PageHeaderDescription({ className, ...props }: React.ComponentProps<'p'>): react_jsx_runtime.JSX.Element;
|
|
8
|
+
declare function PageHeaderMeta({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
9
|
+
declare function PageHeaderActions({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
10
|
+
declare function PageHeaderTabs({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { PageHeader, PageHeaderActions, PageHeaderAvatar, PageHeaderContent, PageHeaderDescription, PageHeaderMeta, PageHeaderTabs, PageHeaderTitle };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __objRest = (source, exclude) => {
|
|
21
|
+
var target = {};
|
|
22
|
+
for (var prop in source)
|
|
23
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
24
|
+
target[prop] = source[prop];
|
|
25
|
+
if (source != null && __getOwnPropSymbols)
|
|
26
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
27
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
}
|
|
30
|
+
return target;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/lib/utils.ts
|
|
34
|
+
import { clsx } from "clsx";
|
|
35
|
+
import { extendTailwindMerge } from "tailwind-merge";
|
|
36
|
+
var twMerge = extendTailwindMerge({
|
|
37
|
+
extend: {
|
|
38
|
+
classGroups: {
|
|
39
|
+
"font-size": [
|
|
40
|
+
{
|
|
41
|
+
text: [
|
|
42
|
+
"display-hero",
|
|
43
|
+
"display-kpi-sm",
|
|
44
|
+
"display-kpi",
|
|
45
|
+
"display-kpi-lg",
|
|
46
|
+
"display-feature",
|
|
47
|
+
"h1",
|
|
48
|
+
"h2",
|
|
49
|
+
"h3",
|
|
50
|
+
"h4",
|
|
51
|
+
"body-lg",
|
|
52
|
+
"body",
|
|
53
|
+
"body-sm",
|
|
54
|
+
"caption",
|
|
55
|
+
"eyebrow"
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
function cn(...inputs) {
|
|
63
|
+
return twMerge(clsx(inputs));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// src/page-header.tsx
|
|
67
|
+
import { jsx } from "react/jsx-runtime";
|
|
68
|
+
function PageHeader(_a) {
|
|
69
|
+
var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
|
|
70
|
+
return /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({ "data-slot": "page-header", className: cn("flex w-full items-start justify-between gap-4", className) }, props), { children }));
|
|
71
|
+
}
|
|
72
|
+
function PageHeaderAvatar(_a) {
|
|
73
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
74
|
+
return /* @__PURE__ */ jsx("div", __spreadValues({ "data-slot": "page-header-avatar", className: cn("shrink-0 self-center", className) }, props));
|
|
75
|
+
}
|
|
76
|
+
function PageHeaderContent(_a) {
|
|
77
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
78
|
+
return /* @__PURE__ */ jsx("div", __spreadValues({ "data-slot": "page-header-content", className: cn("flex flex-1 flex-col gap-1", className) }, props));
|
|
79
|
+
}
|
|
80
|
+
function PageHeaderTitle(_a) {
|
|
81
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
82
|
+
return /* @__PURE__ */ jsx("h1", __spreadValues({ "data-slot": "page-header-title", className: cn("text-h1 text-foreground", className) }, props));
|
|
83
|
+
}
|
|
84
|
+
function PageHeaderDescription(_a) {
|
|
85
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
86
|
+
return /* @__PURE__ */ jsx("p", __spreadValues({ "data-slot": "page-header-description", className: cn("text-body text-muted-foreground", className) }, props));
|
|
87
|
+
}
|
|
88
|
+
function PageHeaderMeta(_a) {
|
|
89
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
90
|
+
return /* @__PURE__ */ jsx(
|
|
91
|
+
"div",
|
|
92
|
+
__spreadValues({
|
|
93
|
+
"data-slot": "page-header-meta",
|
|
94
|
+
className: cn(
|
|
95
|
+
"text-body text-muted-foreground flex flex-wrap items-center gap-4",
|
|
96
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--icon-default)",
|
|
97
|
+
className
|
|
98
|
+
)
|
|
99
|
+
}, props)
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
function PageHeaderActions(_a) {
|
|
103
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
104
|
+
return /* @__PURE__ */ jsx("div", __spreadValues({ "data-slot": "page-header-actions", className: cn("flex items-center gap-2", className) }, props));
|
|
105
|
+
}
|
|
106
|
+
function PageHeaderTabs(_a) {
|
|
107
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
108
|
+
return /* @__PURE__ */ jsx("div", __spreadValues({ "data-slot": "page-header-tabs", className: cn("border-b", className) }, props));
|
|
109
|
+
}
|
|
110
|
+
export {
|
|
111
|
+
PageHeader,
|
|
112
|
+
PageHeaderActions,
|
|
113
|
+
PageHeaderAvatar,
|
|
114
|
+
PageHeaderContent,
|
|
115
|
+
PageHeaderDescription,
|
|
116
|
+
PageHeaderMeta,
|
|
117
|
+
PageHeaderTabs,
|
|
118
|
+
PageHeaderTitle
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=page-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/page-header.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [\n {\n text: [\n 'display-hero',\n 'display-kpi-sm',\n 'display-kpi',\n 'display-kpi-lg',\n 'display-feature',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'body-lg',\n 'body',\n 'body-sm',\n 'caption',\n 'eyebrow',\n ],\n },\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@/lib/utils';\n\nfunction PageHeader({ className, children, ...props }: React.ComponentProps<'div'>) {\n return (\n <div data-slot=\"page-header\" className={cn('flex w-full items-start justify-between gap-4', className)} {...props}>\n {children}\n </div>\n );\n}\n\nfunction PageHeaderAvatar({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"page-header-avatar\" className={cn('shrink-0 self-center', className)} {...props} />;\n}\n\nfunction PageHeaderContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"page-header-content\" className={cn('flex flex-1 flex-col gap-1', className)} {...props} />;\n}\n\nfunction PageHeaderTitle({ className, ...props }: React.ComponentProps<'h1'>) {\n return <h1 data-slot=\"page-header-title\" className={cn('text-h1 text-foreground', className)} {...props} />;\n}\n\nfunction PageHeaderDescription({ className, ...props }: React.ComponentProps<'p'>) {\n return (\n <p data-slot=\"page-header-description\" className={cn('text-body text-muted-foreground', className)} {...props} />\n );\n}\n\nfunction PageHeaderMeta({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"page-header-meta\"\n className={cn(\n 'text-body text-muted-foreground flex flex-wrap items-center gap-4',\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--icon-default)\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction PageHeaderActions({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"page-header-actions\" className={cn('flex items-center gap-2', className)} {...props} />;\n}\n\nfunction PageHeaderTabs({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"page-header-tabs\" className={cn('border-b', className)} {...props} />;\n}\n\nexport {\n PageHeader,\n PageHeaderAvatar,\n PageHeaderContent,\n PageHeaderTitle,\n PageHeaderDescription,\n PageHeaderMeta,\n PageHeaderActions,\n PageHeaderTabs,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAA6B;AACtC,SAAS,2BAA2B;AAEpC,IAAM,UAAU,oBAAoB;AAAA,EAClC,QAAQ;AAAA,IACN,aAAa;AAAA,MACX,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAEM,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;AC5BI;AAFJ,SAAS,WAAW,IAAgE;AAAhE,eAAE,aAAW,SAFjC,IAEoB,IAA0B,kBAA1B,IAA0B,CAAxB,aAAW;AAC/B,SACE,oBAAC,sCAAI,aAAU,eAAc,WAAW,GAAG,iDAAiD,SAAS,KAAO,QAA3G,EACE,WACH;AAEJ;AAEA,SAAS,iBAAiB,IAAsD;AAAtD,eAAE,YAV5B,IAU0B,IAAgB,kBAAhB,IAAgB,CAAd;AAC1B,SAAO,oBAAC,wBAAI,aAAU,sBAAqB,WAAW,GAAG,wBAAwB,SAAS,KAAO,MAAO;AAC1G;AAEA,SAAS,kBAAkB,IAAsD;AAAtD,eAAE,YAd7B,IAc2B,IAAgB,kBAAhB,IAAgB,CAAd;AAC3B,SAAO,oBAAC,wBAAI,aAAU,uBAAsB,WAAW,GAAG,8BAA8B,SAAS,KAAO,MAAO;AACjH;AAEA,SAAS,gBAAgB,IAAqD;AAArD,eAAE,YAlB3B,IAkByB,IAAgB,kBAAhB,IAAgB,CAAd;AACzB,SAAO,oBAAC,uBAAG,aAAU,qBAAoB,WAAW,GAAG,2BAA2B,SAAS,KAAO,MAAO;AAC3G;AAEA,SAAS,sBAAsB,IAAoD;AAApD,eAAE,YAtBjC,IAsB+B,IAAgB,kBAAhB,IAAgB,CAAd;AAC/B,SACE,oBAAC,sBAAE,aAAU,2BAA0B,WAAW,GAAG,mCAAmC,SAAS,KAAO,MAAO;AAEnH;AAEA,SAAS,eAAe,IAAsD;AAAtD,eAAE,YA5B1B,IA4BwB,IAAgB,kBAAhB,IAAgB,CAAd;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,OACI;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB,IAAsD;AAAtD,eAAE,YA1C7B,IA0C2B,IAAgB,kBAAhB,IAAgB,CAAd;AAC3B,SAAO,oBAAC,wBAAI,aAAU,uBAAsB,WAAW,GAAG,2BAA2B,SAAS,KAAO,MAAO;AAC9G;AAEA,SAAS,eAAe,IAAsD;AAAtD,eAAE,YA9C1B,IA8CwB,IAAgB,kBAAhB,IAAgB,CAAd;AACxB,SAAO,oBAAC,wBAAI,aAAU,oBAAmB,WAAW,GAAG,YAAY,SAAS,KAAO,MAAO;AAC5F;","names":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
interface RelativeTimeProps extends Omit<React.TimeHTMLAttributes<HTMLTimeElement>, 'dateTime' | 'title'> {
|
|
5
|
+
/**
|
|
6
|
+
* The timestamp to display. Accepts a `Date`, ISO string, or unix milliseconds.
|
|
7
|
+
*/
|
|
8
|
+
date: Date | string | number;
|
|
9
|
+
/**
|
|
10
|
+
* Format variant. `default` produces full-word output ("5 minutes ago",
|
|
11
|
+
* "yesterday"). `compact` abbreviates units ("5m ago", "1d ago") for tight
|
|
12
|
+
* horizontal space like tables, KPI cards, or inline metadata.
|
|
13
|
+
*/
|
|
14
|
+
variant?: 'default' | 'compact';
|
|
15
|
+
/**
|
|
16
|
+
* Override the tooltip shown on hover. Defaults to the full localized
|
|
17
|
+
* absolute date-time string (e.g. "Monday, January 20, 2025 at 3:22 PM PST").
|
|
18
|
+
*/
|
|
19
|
+
title?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Displays a timestamp as a live-updating relative string ("5 minutes ago",
|
|
23
|
+
* "yesterday", "on Nov 18") with the absolute date in the native tooltip.
|
|
24
|
+
*
|
|
25
|
+
* Falls back to an absolute "on [Month Day]" format for dates older than 30 days
|
|
26
|
+
* so that stale timestamps remain legible at a glance.
|
|
27
|
+
*
|
|
28
|
+
* @see https://design.upbound.io/components/date-and-time
|
|
29
|
+
*/
|
|
30
|
+
declare function RelativeTime({ date, variant, title, className, ...props }: RelativeTimeProps): react_jsx_runtime.JSX.Element;
|
|
31
|
+
interface AbsoluteTimestampProps extends Omit<React.TimeHTMLAttributes<HTMLTimeElement>, 'dateTime'> {
|
|
32
|
+
/** The timestamp to display. */
|
|
33
|
+
date: Date | string | number;
|
|
34
|
+
/** Format variant matching the Content Principles absolute timestamp table. */
|
|
35
|
+
variant?: 'deadline' | 'log' | 'date' | 'range';
|
|
36
|
+
/** End date for range variant. */
|
|
37
|
+
end?: Date | string | number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Formats a date as an absolute timestamp following the Content Principles.
|
|
41
|
+
* Use for deadlines, certificate expiry, audit logs, and date-only displays.
|
|
42
|
+
*/
|
|
43
|
+
declare function AbsoluteTimestamp({ date, variant, end, className, ...props }: AbsoluteTimestampProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
interface ElapsedTimeProps extends Omit<React.TimeHTMLAttributes<HTMLTimeElement>, 'dateTime'> {
|
|
45
|
+
/** Total elapsed seconds. Ignored if startedAt is provided. */
|
|
46
|
+
seconds?: number;
|
|
47
|
+
/** Format variant matching the Content Principles elapsed time table. */
|
|
48
|
+
variant?: 'compact' | 'expanded' | 'long';
|
|
49
|
+
/** Live-tick every second for active operations. */
|
|
50
|
+
live?: boolean;
|
|
51
|
+
/** Compute elapsed from a start time instead of a fixed seconds value. */
|
|
52
|
+
startedAt?: Date | string | number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Formats a duration as elapsed time following the Content Principles.
|
|
56
|
+
* Use for reconciliation loops, build jobs, health checks, and running operations.
|
|
57
|
+
*/
|
|
58
|
+
declare function ElapsedTime({ seconds: secondsProp, variant, live, startedAt, className, ...props }: ElapsedTimeProps): react_jsx_runtime.JSX.Element;
|
|
59
|
+
|
|
60
|
+
export { AbsoluteTimestamp, type AbsoluteTimestampProps, ElapsedTime, type ElapsedTimeProps, RelativeTime, type RelativeTimeProps };
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// src/relative-time.tsx
|
|
35
|
+
import * as React from "react";
|
|
36
|
+
|
|
37
|
+
// src/lib/utils.ts
|
|
38
|
+
import { clsx } from "clsx";
|
|
39
|
+
import { extendTailwindMerge } from "tailwind-merge";
|
|
40
|
+
var twMerge = extendTailwindMerge({
|
|
41
|
+
extend: {
|
|
42
|
+
classGroups: {
|
|
43
|
+
"font-size": [
|
|
44
|
+
{
|
|
45
|
+
text: [
|
|
46
|
+
"display-hero",
|
|
47
|
+
"display-kpi-sm",
|
|
48
|
+
"display-kpi",
|
|
49
|
+
"display-kpi-lg",
|
|
50
|
+
"display-feature",
|
|
51
|
+
"h1",
|
|
52
|
+
"h2",
|
|
53
|
+
"h3",
|
|
54
|
+
"h4",
|
|
55
|
+
"body-lg",
|
|
56
|
+
"body",
|
|
57
|
+
"body-sm",
|
|
58
|
+
"caption",
|
|
59
|
+
"eyebrow"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
function cn(...inputs) {
|
|
67
|
+
return twMerge(clsx(inputs));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/hooks/use-mounted.ts
|
|
71
|
+
import { useSyncExternalStore } from "react";
|
|
72
|
+
function subscribe() {
|
|
73
|
+
return () => {
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function useMounted() {
|
|
77
|
+
return useSyncExternalStore(
|
|
78
|
+
subscribe,
|
|
79
|
+
() => true,
|
|
80
|
+
() => false
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/relative-time.tsx
|
|
85
|
+
import { jsx } from "react/jsx-runtime";
|
|
86
|
+
function formatRelativeDefault(date, locale) {
|
|
87
|
+
const now = /* @__PURE__ */ new Date();
|
|
88
|
+
const diffMs = now.getTime() - date.getTime();
|
|
89
|
+
if (diffMs < 0) {
|
|
90
|
+
const abs = Math.abs(diffMs);
|
|
91
|
+
const mins2 = Math.floor(abs / 6e4);
|
|
92
|
+
const hrs2 = Math.floor(mins2 / 60);
|
|
93
|
+
const days2 = Math.floor(hrs2 / 24);
|
|
94
|
+
if (abs < 6e4) return "just now";
|
|
95
|
+
if (mins2 < 60) return `in ${mins2} minute${mins2 === 1 ? "" : "s"}`;
|
|
96
|
+
if (hrs2 < 24) return `in ${hrs2} hour${hrs2 === 1 ? "" : "s"}`;
|
|
97
|
+
if (days2 < 7) return `in ${days2} day${days2 === 1 ? "" : "s"}`;
|
|
98
|
+
if (days2 < 30) return `in ${Math.floor(days2 / 7)} week${Math.floor(days2 / 7) === 1 ? "" : "s"}`;
|
|
99
|
+
return `on ${date.toLocaleDateString(locale, __spreadValues({
|
|
100
|
+
month: "short",
|
|
101
|
+
day: "numeric"
|
|
102
|
+
}, date.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}))}`;
|
|
103
|
+
}
|
|
104
|
+
const secs = Math.floor(diffMs / 1e3);
|
|
105
|
+
const mins = Math.floor(secs / 60);
|
|
106
|
+
const hrs = Math.floor(mins / 60);
|
|
107
|
+
const days = Math.floor(hrs / 24);
|
|
108
|
+
if (secs < 60) return "just now";
|
|
109
|
+
if (mins < 60) return `${mins} minute${mins === 1 ? "" : "s"} ago`;
|
|
110
|
+
if (hrs < 24) return `${hrs} hour${hrs === 1 ? "" : "s"} ago`;
|
|
111
|
+
if (days === 1) return "yesterday";
|
|
112
|
+
if (days < 7) return `${days} days ago`;
|
|
113
|
+
if (days < 14) return "last week";
|
|
114
|
+
if (days < 30) return `${Math.floor(days / 7)} weeks ago`;
|
|
115
|
+
return `on ${date.toLocaleDateString(locale, __spreadValues({
|
|
116
|
+
month: "short",
|
|
117
|
+
day: "numeric"
|
|
118
|
+
}, date.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}))}`;
|
|
119
|
+
}
|
|
120
|
+
function formatRelativeCompact(date, locale) {
|
|
121
|
+
const now = /* @__PURE__ */ new Date();
|
|
122
|
+
const diffMs = now.getTime() - date.getTime();
|
|
123
|
+
if (diffMs < 0) {
|
|
124
|
+
const abs = Math.abs(diffMs);
|
|
125
|
+
const mins2 = Math.floor(abs / 6e4);
|
|
126
|
+
const hrs2 = Math.floor(mins2 / 60);
|
|
127
|
+
const days2 = Math.floor(hrs2 / 24);
|
|
128
|
+
if (abs < 6e4) return "just now";
|
|
129
|
+
if (mins2 < 60) return `in ${mins2}m`;
|
|
130
|
+
if (hrs2 < 24) return `in ${hrs2}h`;
|
|
131
|
+
if (days2 < 7) return `in ${days2}d`;
|
|
132
|
+
if (days2 < 30) return `in ${Math.floor(days2 / 7)}w`;
|
|
133
|
+
return `on ${date.toLocaleDateString(locale, __spreadValues({
|
|
134
|
+
month: "short",
|
|
135
|
+
day: "numeric"
|
|
136
|
+
}, date.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}))}`;
|
|
137
|
+
}
|
|
138
|
+
const secs = Math.floor(diffMs / 1e3);
|
|
139
|
+
const mins = Math.floor(secs / 60);
|
|
140
|
+
const hrs = Math.floor(mins / 60);
|
|
141
|
+
const days = Math.floor(hrs / 24);
|
|
142
|
+
if (secs < 60) return "just now";
|
|
143
|
+
if (mins < 60) return `${mins}m ago`;
|
|
144
|
+
if (hrs < 24) return `${hrs}h ago`;
|
|
145
|
+
if (days < 7) return `${days}d ago`;
|
|
146
|
+
if (days < 30) return `${Math.floor(days / 7)}w ago`;
|
|
147
|
+
return `on ${date.toLocaleDateString(locale, __spreadValues({
|
|
148
|
+
month: "short",
|
|
149
|
+
day: "numeric"
|
|
150
|
+
}, date.getFullYear() !== now.getFullYear() ? { year: "numeric" } : {}))}`;
|
|
151
|
+
}
|
|
152
|
+
function formatRelative(date, variant, locale) {
|
|
153
|
+
return variant === "compact" ? formatRelativeCompact(date, locale) : formatRelativeDefault(date, locale);
|
|
154
|
+
}
|
|
155
|
+
function updateInterval(date) {
|
|
156
|
+
const diffMs = Math.abs(Date.now() - date.getTime());
|
|
157
|
+
const diffMin = diffMs / 6e4;
|
|
158
|
+
if (diffMin < 60) return 6e4;
|
|
159
|
+
if (diffMin < 1440) return 3e5;
|
|
160
|
+
return 36e5;
|
|
161
|
+
}
|
|
162
|
+
function absoluteTitle(date, locale) {
|
|
163
|
+
return date.toLocaleString(locale, {
|
|
164
|
+
weekday: "long",
|
|
165
|
+
year: "numeric",
|
|
166
|
+
month: "long",
|
|
167
|
+
day: "numeric",
|
|
168
|
+
hour: "numeric",
|
|
169
|
+
minute: "2-digit",
|
|
170
|
+
timeZoneName: "short"
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function RelativeTime(_a) {
|
|
174
|
+
var _b = _a, { date, variant = "default", title, className } = _b, props = __objRest(_b, ["date", "variant", "title", "className"]);
|
|
175
|
+
const d = React.useMemo(() => new Date(date), [date]);
|
|
176
|
+
const mounted = useMounted();
|
|
177
|
+
const locale = mounted ? void 0 : "en-US";
|
|
178
|
+
const [label, setLabel] = React.useState(() => formatRelative(d, variant, locale));
|
|
179
|
+
React.useEffect(() => {
|
|
180
|
+
setLabel(formatRelative(d, variant, locale));
|
|
181
|
+
const schedule = () => {
|
|
182
|
+
const id2 = window.setInterval(() => {
|
|
183
|
+
setLabel(formatRelative(d, variant, locale));
|
|
184
|
+
}, updateInterval(d));
|
|
185
|
+
return id2;
|
|
186
|
+
};
|
|
187
|
+
const id = schedule();
|
|
188
|
+
return () => window.clearInterval(id);
|
|
189
|
+
}, [d, variant, locale]);
|
|
190
|
+
return /* @__PURE__ */ jsx(
|
|
191
|
+
"time",
|
|
192
|
+
__spreadProps(__spreadValues({
|
|
193
|
+
dateTime: d.toISOString(),
|
|
194
|
+
title: title != null ? title : absoluteTitle(d, locale),
|
|
195
|
+
className: cn("tabular-nums", className)
|
|
196
|
+
}, props), {
|
|
197
|
+
children: label
|
|
198
|
+
})
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
function formatAmPm(date, options, locale) {
|
|
202
|
+
const parts = new Intl.DateTimeFormat(locale, options).formatToParts(date);
|
|
203
|
+
let result = "";
|
|
204
|
+
for (const part of parts) {
|
|
205
|
+
if (part.type === "dayPeriod") {
|
|
206
|
+
result += part.value.toLowerCase().replace(/\./g, "");
|
|
207
|
+
} else {
|
|
208
|
+
result += part.value;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
function formatAbsolute(date, variant, end, locale) {
|
|
214
|
+
var _a, _b;
|
|
215
|
+
switch (variant) {
|
|
216
|
+
case "deadline": {
|
|
217
|
+
const weekday = date.toLocaleDateString(locale, { weekday: "short" });
|
|
218
|
+
const datePart = date.toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" });
|
|
219
|
+
const timePart = formatAmPm(date, { hour: "numeric", minute: "2-digit" }, locale);
|
|
220
|
+
const tz = (_a = date.toLocaleTimeString(locale, { timeZoneName: "short" }).split(" ").pop()) != null ? _a : "";
|
|
221
|
+
return `${weekday}, ${datePart} \xB7 ${timePart} ${tz}`;
|
|
222
|
+
}
|
|
223
|
+
case "log": {
|
|
224
|
+
const datePart = date.toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" });
|
|
225
|
+
const timePart = formatAmPm(date, { hour: "numeric", minute: "2-digit" }, locale);
|
|
226
|
+
const tz = (_b = date.toLocaleTimeString(locale, { timeZoneName: "short" }).split(" ").pop()) != null ? _b : "";
|
|
227
|
+
return `${datePart}, ${timePart} ${tz}`;
|
|
228
|
+
}
|
|
229
|
+
case "range": {
|
|
230
|
+
if (!end) return date.toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" });
|
|
231
|
+
const startYear = date.getFullYear();
|
|
232
|
+
const endYear = end.getFullYear();
|
|
233
|
+
if (startYear === endYear) {
|
|
234
|
+
const start2 = date.toLocaleDateString(locale, { month: "short", day: "numeric" });
|
|
235
|
+
const endStr2 = end.toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" });
|
|
236
|
+
return `${start2} \u2013 ${endStr2}`;
|
|
237
|
+
}
|
|
238
|
+
const start = date.toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" });
|
|
239
|
+
const endStr = end.toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" });
|
|
240
|
+
return `${start} \u2013 ${endStr}`;
|
|
241
|
+
}
|
|
242
|
+
case "date":
|
|
243
|
+
default:
|
|
244
|
+
return date.toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function AbsoluteTimestamp(_a) {
|
|
248
|
+
var _b = _a, { date, variant = "date", end, className } = _b, props = __objRest(_b, ["date", "variant", "end", "className"]);
|
|
249
|
+
const d = React.useMemo(() => new Date(date), [date]);
|
|
250
|
+
const e = React.useMemo(() => end ? new Date(end) : void 0, [end]);
|
|
251
|
+
const mounted = useMounted();
|
|
252
|
+
const locale = mounted ? void 0 : "en-US";
|
|
253
|
+
return /* @__PURE__ */ jsx(
|
|
254
|
+
"time",
|
|
255
|
+
__spreadProps(__spreadValues({
|
|
256
|
+
dateTime: d.toISOString(),
|
|
257
|
+
title: absoluteTitle(d, locale),
|
|
258
|
+
className: cn("tabular-nums", className)
|
|
259
|
+
}, props), {
|
|
260
|
+
children: formatAbsolute(d, variant, e, locale)
|
|
261
|
+
})
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
function formatElapsed(totalSeconds, variant) {
|
|
265
|
+
const days = Math.floor(totalSeconds / 86400);
|
|
266
|
+
const hours = Math.floor(totalSeconds % 86400 / 3600);
|
|
267
|
+
const minutes = Math.floor(totalSeconds % 3600 / 60);
|
|
268
|
+
const seconds = Math.floor(totalSeconds % 60);
|
|
269
|
+
switch (variant) {
|
|
270
|
+
case "expanded": {
|
|
271
|
+
const parts = [];
|
|
272
|
+
if (days > 0) parts.push(`${days} day${days === 1 ? "" : "s"}`);
|
|
273
|
+
if (hours > 0) parts.push(`${hours} hour${hours === 1 ? "" : "s"}`);
|
|
274
|
+
if (minutes > 0) parts.push(`${minutes} minute${minutes === 1 ? "" : "s"}`);
|
|
275
|
+
if (seconds > 0 || parts.length === 0) parts.push(`${seconds} second${seconds === 1 ? "" : "s"}`);
|
|
276
|
+
return parts.join(", ");
|
|
277
|
+
}
|
|
278
|
+
case "long": {
|
|
279
|
+
if (days > 0) return `${days}d ${hours}h`;
|
|
280
|
+
if (hours > 0) return `${hours}h ${minutes}m`;
|
|
281
|
+
return `${minutes}m`;
|
|
282
|
+
}
|
|
283
|
+
case "compact":
|
|
284
|
+
default: {
|
|
285
|
+
if (days > 0) return `${days}d ${hours}h`;
|
|
286
|
+
if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;
|
|
287
|
+
if (minutes > 0) return `${minutes}m ${seconds}s`;
|
|
288
|
+
return `${seconds}s`;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function ElapsedTime(_a) {
|
|
293
|
+
var _b = _a, {
|
|
294
|
+
seconds: secondsProp,
|
|
295
|
+
variant = "compact",
|
|
296
|
+
live = false,
|
|
297
|
+
startedAt,
|
|
298
|
+
className
|
|
299
|
+
} = _b, props = __objRest(_b, [
|
|
300
|
+
"seconds",
|
|
301
|
+
"variant",
|
|
302
|
+
"live",
|
|
303
|
+
"startedAt",
|
|
304
|
+
"className"
|
|
305
|
+
]);
|
|
306
|
+
const startDate = React.useMemo(() => startedAt ? new Date(startedAt) : void 0, [startedAt]);
|
|
307
|
+
const computeSeconds = React.useCallback(() => {
|
|
308
|
+
if (startDate) return Math.floor((Date.now() - startDate.getTime()) / 1e3);
|
|
309
|
+
return secondsProp != null ? secondsProp : 0;
|
|
310
|
+
}, [startDate, secondsProp]);
|
|
311
|
+
const [elapsed, setElapsed] = React.useState(computeSeconds);
|
|
312
|
+
React.useEffect(() => {
|
|
313
|
+
setElapsed(computeSeconds());
|
|
314
|
+
if (!live && !startDate) return;
|
|
315
|
+
const id = window.setInterval(() => {
|
|
316
|
+
setElapsed(computeSeconds());
|
|
317
|
+
}, 1e3);
|
|
318
|
+
return () => window.clearInterval(id);
|
|
319
|
+
}, [live, startDate, computeSeconds]);
|
|
320
|
+
const iso = `PT${elapsed}S`;
|
|
321
|
+
return /* @__PURE__ */ jsx("time", __spreadProps(__spreadValues({ dateTime: iso, className: cn("tabular-nums", className) }, props), { children: formatElapsed(elapsed, variant) }));
|
|
322
|
+
}
|
|
323
|
+
export {
|
|
324
|
+
AbsoluteTimestamp,
|
|
325
|
+
ElapsedTime,
|
|
326
|
+
RelativeTime
|
|
327
|
+
};
|
|
328
|
+
//# sourceMappingURL=relative-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/relative-time.tsx","../src/lib/utils.ts","../src/hooks/use-mounted.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { useMounted } from '@/hooks/use-mounted';\n\n// ── Format helpers ─────────────────────────────────────────────────────────────\n//\n// `locale` is `undefined` (browser/runtime default — the viewer's actual\n// locale, per Monarch's \"use locale-aware formatting\" content principle) once\n// mounted client-side, and a fixed `'en-US'` for the server-rendered/first-\n// paint value — the server can't know the viewer's locale ahead of time, and\n// passing a locale that differs between server and client render would\n// hydration-mismatch. Callers gate this via `useMounted()` below, so the\n// locale-aware value replaces the fixed one right after mount (see\n// RelativeTime/AbsoluteTimestamp).\n\n/** Returns a human-readable relative label for `date` vs now. */\nfunction formatRelativeDefault(date: Date, locale: string | undefined): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n\n // Future dates\n if (diffMs < 0) {\n const abs = Math.abs(diffMs);\n const mins = Math.floor(abs / 60000);\n const hrs = Math.floor(mins / 60);\n const days = Math.floor(hrs / 24);\n if (abs < 60000) return 'just now';\n if (mins < 60) return `in ${mins} minute${mins === 1 ? '' : 's'}`;\n if (hrs < 24) return `in ${hrs} hour${hrs === 1 ? '' : 's'}`;\n if (days < 7) return `in ${days} day${days === 1 ? '' : 's'}`;\n if (days < 30) return `in ${Math.floor(days / 7)} week${Math.floor(days / 7) === 1 ? '' : 's'}`;\n return `on ${date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n ...(date.getFullYear() !== now.getFullYear() ? { year: 'numeric' } : {}),\n })}`;\n }\n\n // Past dates\n const secs = Math.floor(diffMs / 1000);\n const mins = Math.floor(secs / 60);\n const hrs = Math.floor(mins / 60);\n const days = Math.floor(hrs / 24);\n\n if (secs < 60) return 'just now';\n if (mins < 60) return `${mins} minute${mins === 1 ? '' : 's'} ago`;\n if (hrs < 24) return `${hrs} hour${hrs === 1 ? '' : 's'} ago`;\n if (days === 1) return 'yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 14) return 'last week';\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n\n // > 30 days: fall back to absolute date\n return `on ${date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n ...(date.getFullYear() !== now.getFullYear() ? { year: 'numeric' } : {}),\n })}`;\n}\n\n/**\n * Compact relative label — abbreviates units for tight horizontal space\n * (tables, KPI cards). Preserves \"ago\", \"in\", \"on\", and \"just now\" so\n * directionality and reference points stay legible at a glance.\n */\nfunction formatRelativeCompact(date: Date, locale: string | undefined): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n\n // Future dates\n if (diffMs < 0) {\n const abs = Math.abs(diffMs);\n const mins = Math.floor(abs / 60000);\n const hrs = Math.floor(mins / 60);\n const days = Math.floor(hrs / 24);\n if (abs < 60000) return 'just now';\n if (mins < 60) return `in ${mins}m`;\n if (hrs < 24) return `in ${hrs}h`;\n if (days < 7) return `in ${days}d`;\n if (days < 30) return `in ${Math.floor(days / 7)}w`;\n return `on ${date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n ...(date.getFullYear() !== now.getFullYear() ? { year: 'numeric' } : {}),\n })}`;\n }\n\n // Past dates\n const secs = Math.floor(diffMs / 1000);\n const mins = Math.floor(secs / 60);\n const hrs = Math.floor(mins / 60);\n const days = Math.floor(hrs / 24);\n\n if (secs < 60) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n if (hrs < 24) return `${hrs}h ago`;\n if (days < 7) return `${days}d ago`;\n if (days < 30) return `${Math.floor(days / 7)}w ago`;\n\n return `on ${date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n ...(date.getFullYear() !== now.getFullYear() ? { year: 'numeric' } : {}),\n })}`;\n}\n\nfunction formatRelative(date: Date, variant: 'default' | 'compact', locale: string | undefined): string {\n return variant === 'compact' ? formatRelativeCompact(date, locale) : formatRelativeDefault(date, locale);\n}\n\n/** Returns the update interval in ms appropriate for the current age. */\nfunction updateInterval(date: Date): number {\n const diffMs = Math.abs(Date.now() - date.getTime());\n const diffMin = diffMs / 60000;\n if (diffMin < 60) return 60_000; // update every minute while < 1 hour old\n if (diffMin < 1440) return 300_000; // every 5 min while < 1 day old\n return 3_600_000; // every hour otherwise\n}\n\n/** Formats an absolute tooltip title. */\nfunction absoluteTitle(date: Date, locale: string | undefined): string {\n return date.toLocaleString(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n timeZoneName: 'short',\n });\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\nexport interface RelativeTimeProps extends Omit<React.TimeHTMLAttributes<HTMLTimeElement>, 'dateTime' | 'title'> {\n /**\n * The timestamp to display. Accepts a `Date`, ISO string, or unix milliseconds.\n */\n date: Date | string | number;\n /**\n * Format variant. `default` produces full-word output (\"5 minutes ago\",\n * \"yesterday\"). `compact` abbreviates units (\"5m ago\", \"1d ago\") for tight\n * horizontal space like tables, KPI cards, or inline metadata.\n */\n variant?: 'default' | 'compact';\n /**\n * Override the tooltip shown on hover. Defaults to the full localized\n * absolute date-time string (e.g. \"Monday, January 20, 2025 at 3:22 PM PST\").\n */\n title?: string;\n}\n\n/**\n * Displays a timestamp as a live-updating relative string (\"5 minutes ago\",\n * \"yesterday\", \"on Nov 18\") with the absolute date in the native tooltip.\n *\n * Falls back to an absolute \"on [Month Day]\" format for dates older than 30 days\n * so that stale timestamps remain legible at a glance.\n *\n * @see https://design.upbound.io/components/date-and-time\n */\nexport function RelativeTime({ date, variant = 'default', title, className, ...props }: RelativeTimeProps) {\n const d = React.useMemo(() => new Date(date), [date]);\n const mounted = useMounted();\n // Fixed locale for the server-rendered/first-paint value (the server can't\n // know the viewer's locale); the viewer's actual locale once mounted.\n const locale = mounted ? undefined : 'en-US';\n\n const [label, setLabel] = React.useState<string>(() => formatRelative(d, variant, locale));\n\n React.useEffect(() => {\n // Re-compute immediately on mount (picks up the viewer's real locale, and\n // avoids the relative label going stale)\n setLabel(formatRelative(d, variant, locale));\n\n const schedule = () => {\n const id = window.setInterval(() => {\n setLabel(formatRelative(d, variant, locale));\n }, updateInterval(d));\n return id;\n };\n const id = schedule();\n return () => window.clearInterval(id);\n }, [d, variant, locale]);\n\n return (\n <time\n dateTime={d.toISOString()}\n title={title ?? absoluteTitle(d, locale)}\n className={cn('tabular-nums', className)}\n {...props}\n >\n {label}\n </time>\n );\n}\n\n// ── Absolute Timestamp ────────────────────────────────────────────────────────\n\n/** Formats am/pm per Content Principles: lowercase, space before, no periods. */\nfunction formatAmPm(date: Date, options: Intl.DateTimeFormatOptions, locale: string | undefined): string {\n const parts = new Intl.DateTimeFormat(locale, options).formatToParts(date);\n let result = '';\n for (const part of parts) {\n if (part.type === 'dayPeriod') {\n result += part.value.toLowerCase().replace(/\\./g, '');\n } else {\n result += part.value;\n }\n }\n return result;\n}\n\nfunction formatAbsolute(date: Date, variant: string, end: Date | undefined, locale: string | undefined): string {\n switch (variant) {\n case 'deadline': {\n const weekday = date.toLocaleDateString(locale, { weekday: 'short' });\n const datePart = date.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n const timePart = formatAmPm(date, { hour: 'numeric', minute: '2-digit' }, locale);\n const tz = date.toLocaleTimeString(locale, { timeZoneName: 'short' }).split(' ').pop() ?? '';\n return `${weekday}, ${datePart} \\u00b7 ${timePart} ${tz}`;\n }\n case 'log': {\n const datePart = date.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n const timePart = formatAmPm(date, { hour: 'numeric', minute: '2-digit' }, locale);\n const tz = date.toLocaleTimeString(locale, { timeZoneName: 'short' }).split(' ').pop() ?? '';\n return `${datePart}, ${timePart} ${tz}`;\n }\n case 'range': {\n if (!end) return date.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n const startYear = date.getFullYear();\n const endYear = end.getFullYear();\n if (startYear === endYear) {\n const start = date.toLocaleDateString(locale, { month: 'short', day: 'numeric' });\n const endStr = end.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n return `${start} \\u2013 ${endStr}`;\n }\n const start = date.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n const endStr = end.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n return `${start} \\u2013 ${endStr}`;\n }\n case 'date':\n default:\n return date.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n }\n}\n\nexport interface AbsoluteTimestampProps extends Omit<React.TimeHTMLAttributes<HTMLTimeElement>, 'dateTime'> {\n /** The timestamp to display. */\n date: Date | string | number;\n /** Format variant matching the Content Principles absolute timestamp table. */\n variant?: 'deadline' | 'log' | 'date' | 'range';\n /** End date for range variant. */\n end?: Date | string | number;\n}\n\n/**\n * Formats a date as an absolute timestamp following the Content Principles.\n * Use for deadlines, certificate expiry, audit logs, and date-only displays.\n */\nexport function AbsoluteTimestamp({ date, variant = 'date', end, className, ...props }: AbsoluteTimestampProps) {\n const d = React.useMemo(() => new Date(date), [date]);\n const e = React.useMemo(() => (end ? new Date(end) : undefined), [end]);\n const mounted = useMounted();\n // Fixed locale for the server-rendered/first-paint value (the server can't\n // know the viewer's locale); the viewer's actual locale once mounted.\n const locale = mounted ? undefined : 'en-US';\n\n return (\n <time\n dateTime={d.toISOString()}\n title={absoluteTitle(d, locale)}\n className={cn('tabular-nums', className)}\n {...props}\n >\n {formatAbsolute(d, variant, e, locale)}\n </time>\n );\n}\n\n// ── Elapsed Time ──────────────────────────────────────────────────────────────\n\nfunction formatElapsed(totalSeconds: number, variant: string): string {\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = Math.floor(totalSeconds % 60);\n\n switch (variant) {\n case 'expanded': {\n const parts: string[] = [];\n if (days > 0) parts.push(`${days} day${days === 1 ? '' : 's'}`);\n if (hours > 0) parts.push(`${hours} hour${hours === 1 ? '' : 's'}`);\n if (minutes > 0) parts.push(`${minutes} minute${minutes === 1 ? '' : 's'}`);\n if (seconds > 0 || parts.length === 0) parts.push(`${seconds} second${seconds === 1 ? '' : 's'}`);\n return parts.join(', ');\n }\n case 'long': {\n if (days > 0) return `${days}d ${hours}h`;\n if (hours > 0) return `${hours}h ${minutes}m`;\n return `${minutes}m`;\n }\n case 'compact':\n default: {\n if (days > 0) return `${days}d ${hours}h`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n if (minutes > 0) return `${minutes}m ${seconds}s`;\n return `${seconds}s`;\n }\n }\n}\n\nexport interface ElapsedTimeProps extends Omit<React.TimeHTMLAttributes<HTMLTimeElement>, 'dateTime'> {\n /** Total elapsed seconds. Ignored if startedAt is provided. */\n seconds?: number;\n /** Format variant matching the Content Principles elapsed time table. */\n variant?: 'compact' | 'expanded' | 'long';\n /** Live-tick every second for active operations. */\n live?: boolean;\n /** Compute elapsed from a start time instead of a fixed seconds value. */\n startedAt?: Date | string | number;\n}\n\n/**\n * Formats a duration as elapsed time following the Content Principles.\n * Use for reconciliation loops, build jobs, health checks, and running operations.\n */\nexport function ElapsedTime({\n seconds: secondsProp,\n variant = 'compact',\n live = false,\n startedAt,\n className,\n ...props\n}: ElapsedTimeProps) {\n const startDate = React.useMemo(() => (startedAt ? new Date(startedAt) : undefined), [startedAt]);\n\n const computeSeconds = React.useCallback(() => {\n if (startDate) return Math.floor((Date.now() - startDate.getTime()) / 1000);\n return secondsProp ?? 0;\n }, [startDate, secondsProp]);\n\n const [elapsed, setElapsed] = React.useState(computeSeconds);\n\n React.useEffect(() => {\n setElapsed(computeSeconds());\n\n if (!live && !startDate) return;\n\n const id = window.setInterval(() => {\n setElapsed(computeSeconds());\n }, 1000);\n return () => window.clearInterval(id);\n }, [live, startDate, computeSeconds]);\n\n const iso = `PT${elapsed}S`;\n\n return (\n <time dateTime={iso} className={cn('tabular-nums', className)} {...props}>\n {formatElapsed(elapsed, variant)}\n </time>\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [\n {\n text: [\n 'display-hero',\n 'display-kpi-sm',\n 'display-kpi',\n 'display-kpi-lg',\n 'display-feature',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'body-lg',\n 'body',\n 'body-sm',\n 'caption',\n 'eyebrow',\n ],\n },\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useSyncExternalStore } from 'react';\n\nfunction subscribe() {\n return () => {};\n}\n\n/**\n * Returns `false` on the server and during initial client hydration, then\n * `true` once mounted — for values that are only valid client-side (e.g. the\n * viewer's actual `Intl` locale, vs. a fixed locale used for the server-\n * rendered/first-paint value) without a hydration mismatch. Implemented via\n * `useSyncExternalStore` rather than `useEffect` + `setState` — the latter\n * works, but re-derives the same \"true\" value on every mount and trips\n * `react-hooks/set-state-in-effect` since there's no actual subscription.\n */\nexport function useMounted() {\n return useSyncExternalStore(\n subscribe,\n () => true,\n () => false,\n );\n}\n"],"mappings":"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","names":["mins","hrs","days","id","start","endStr"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
declare function SectionHeader({ className, children, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
4
|
+
declare function SectionHeaderContent({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
5
|
+
declare function SectionHeaderTitle({ className, ...props }: React.ComponentProps<'h2'>): react_jsx_runtime.JSX.Element;
|
|
6
|
+
declare function SectionHeaderDescription({ className, ...props }: React.ComponentProps<'p'>): react_jsx_runtime.JSX.Element;
|
|
7
|
+
declare function SectionHeaderMeta({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
8
|
+
declare function SectionHeaderActions({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
9
|
+
declare function SectionHeaderTabs({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { SectionHeader, SectionHeaderActions, SectionHeaderContent, SectionHeaderDescription, SectionHeaderMeta, SectionHeaderTabs, SectionHeaderTitle };
|