@nanisoft/prism-ui 0.16.1 → 1.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/dist/.tsbuildinfo +1 -1
- package/dist/blocks/activity-feed-01/activity-feed-01.d.ts +120 -190
- package/dist/blocks/activity-feed-01/activity-feed-01.d.ts.map +1 -1
- package/dist/blocks/activity-feed-01/activity-feed-01.js +107 -97
- package/dist/blocks/activity-feed-01/index.d.ts +1 -1
- package/dist/blocks/activity-feed-01/index.d.ts.map +1 -1
- package/dist/blocks/auth-form-01/auth-form.d.ts +86 -53
- package/dist/blocks/auth-form-01/auth-form.d.ts.map +1 -1
- package/dist/blocks/auth-form-01/auth-form.js +95 -31
- package/dist/blocks/auth-form-01/index.d.ts +1 -1
- package/dist/blocks/auth-form-01/index.d.ts.map +1 -1
- package/dist/blocks/calendar-01/calendar.d.ts +28 -0
- package/dist/blocks/calendar-01/calendar.d.ts.map +1 -1
- package/dist/blocks/calendar-01/calendar.js +15 -1
- package/dist/blocks/card-index-01/card-index.d.ts +225 -0
- package/dist/blocks/card-index-01/card-index.d.ts.map +1 -0
- package/dist/blocks/card-index-01/card-index.js +154 -0
- package/dist/blocks/card-index-01/index.d.ts +3 -0
- package/dist/blocks/card-index-01/index.d.ts.map +1 -0
- package/dist/blocks/card-index-01/index.js +1 -0
- package/dist/blocks/chart-card-01/chart-card-01.d.ts +23 -21
- package/dist/blocks/chart-card-01/chart-card-01.d.ts.map +1 -1
- package/dist/blocks/chart-card-01/chart-card-01.js +46 -1
- package/dist/blocks/chart-card-01/index.d.ts +1 -1
- package/dist/blocks/chart-card-01/index.d.ts.map +1 -1
- package/dist/blocks/chart-group-01/chart-group-01.d.ts +3 -3
- package/dist/blocks/chart-group-01/chart-group-01.d.ts.map +1 -1
- package/dist/blocks/contact-01/contact.d.ts +30 -82
- package/dist/blocks/contact-01/contact.d.ts.map +1 -1
- package/dist/blocks/contact-01/contact.js +59 -30
- package/dist/blocks/contact-01/index.d.ts +1 -1
- package/dist/blocks/contact-01/index.d.ts.map +1 -1
- package/dist/blocks/dashboard-01/dashboard-01.d.ts +26 -71
- package/dist/blocks/dashboard-01/dashboard-01.d.ts.map +1 -1
- package/dist/blocks/dashboard-01/dashboard-01.js +34 -23
- package/dist/blocks/dashboard-01/index.d.ts +1 -1
- package/dist/blocks/dashboard-01/index.d.ts.map +1 -1
- package/dist/blocks/data-table-01/data-table.d.ts +276 -59
- package/dist/blocks/data-table-01/data-table.d.ts.map +1 -1
- package/dist/blocks/data-table-01/data-table.js +217 -35
- package/dist/blocks/data-table-01/index.d.ts +1 -1
- package/dist/blocks/data-table-01/index.d.ts.map +1 -1
- package/dist/blocks/directory-01/directory-01.d.ts +23 -2
- package/dist/blocks/directory-01/directory-01.d.ts.map +1 -1
- package/dist/blocks/directory-01/directory-01.js +3 -3
- package/dist/blocks/empty-state-01/empty-state.d.ts +60 -21
- package/dist/blocks/empty-state-01/empty-state.d.ts.map +1 -1
- package/dist/blocks/empty-state-01/empty-state.js +52 -17
- package/dist/blocks/index-detail-01/index-detail.d.ts +85 -0
- package/dist/blocks/index-detail-01/index-detail.d.ts.map +1 -0
- package/dist/blocks/index-detail-01/index-detail.js +58 -0
- package/dist/blocks/index-detail-01/index.d.ts +3 -0
- package/dist/blocks/index-detail-01/index.d.ts.map +1 -0
- package/dist/blocks/index-detail-01/index.js +1 -0
- package/dist/blocks/index.d.ts +20 -8
- package/dist/blocks/index.d.ts.map +1 -1
- package/dist/blocks/index.js +7 -0
- package/dist/blocks/issue-detail-01/issue-detail.d.ts +18 -0
- package/dist/blocks/issue-detail-01/issue-detail.d.ts.map +1 -1
- package/dist/blocks/issue-detail-01/issue-detail.js +18 -0
- package/dist/blocks/nothing-chosen-01/index.d.ts +3 -0
- package/dist/blocks/nothing-chosen-01/index.d.ts.map +1 -0
- package/dist/blocks/nothing-chosen-01/index.js +1 -0
- package/dist/blocks/nothing-chosen-01/nothing-chosen.d.ts +119 -0
- package/dist/blocks/nothing-chosen-01/nothing-chosen.d.ts.map +1 -0
- package/dist/blocks/nothing-chosen-01/nothing-chosen.js +79 -0
- package/dist/blocks/project-dashboard-01/index.d.ts +1 -1
- package/dist/blocks/project-dashboard-01/index.d.ts.map +1 -1
- package/dist/blocks/project-dashboard-01/project-dashboard.d.ts +21 -27
- package/dist/blocks/project-dashboard-01/project-dashboard.d.ts.map +1 -1
- package/dist/blocks/project-dashboard-01/project-dashboard.js +45 -5
- package/dist/blocks/provisioning-01/index.d.ts +1 -1
- package/dist/blocks/provisioning-01/index.d.ts.map +1 -1
- package/dist/blocks/provisioning-01/provisioning.d.ts +9 -97
- package/dist/blocks/provisioning-01/provisioning.d.ts.map +1 -1
- package/dist/blocks/provisioning-01/provisioning.js +26 -13
- package/dist/blocks/record-detail-01/index.d.ts +3 -0
- package/dist/blocks/record-detail-01/index.d.ts.map +1 -0
- package/dist/blocks/record-detail-01/index.js +1 -0
- package/dist/blocks/record-detail-01/record-detail.d.ts +239 -0
- package/dist/blocks/record-detail-01/record-detail.d.ts.map +1 -0
- package/dist/blocks/record-detail-01/record-detail.js +150 -0
- package/dist/blocks/record-form-01/index.d.ts +3 -0
- package/dist/blocks/record-form-01/index.d.ts.map +1 -0
- package/dist/blocks/record-form-01/index.js +1 -0
- package/dist/blocks/record-form-01/record-form.d.ts +148 -0
- package/dist/blocks/record-form-01/record-form.d.ts.map +1 -0
- package/dist/blocks/record-form-01/record-form.js +107 -0
- package/dist/blocks/record-grid-01/index.d.ts +3 -0
- package/dist/blocks/record-grid-01/index.d.ts.map +1 -0
- package/dist/blocks/record-grid-01/index.js +1 -0
- package/dist/blocks/record-grid-01/record-grid.d.ts +145 -0
- package/dist/blocks/record-grid-01/record-grid.d.ts.map +1 -0
- package/dist/blocks/record-grid-01/record-grid.js +114 -0
- package/dist/blocks/record-wizard-01/index.d.ts +3 -0
- package/dist/blocks/record-wizard-01/index.d.ts.map +1 -0
- package/dist/blocks/record-wizard-01/index.js +1 -0
- package/dist/blocks/record-wizard-01/record-wizard.d.ts +152 -0
- package/dist/blocks/record-wizard-01/record-wizard.d.ts.map +1 -0
- package/dist/blocks/record-wizard-01/record-wizard.js +144 -0
- package/dist/blocks/settings-members-01/settings-members.d.ts +2 -1
- package/dist/blocks/settings-members-01/settings-members.d.ts.map +1 -1
- package/dist/blocks/settings-panel-01/index.d.ts +1 -1
- package/dist/blocks/settings-panel-01/index.d.ts.map +1 -1
- package/dist/blocks/settings-panel-01/settings-panel.d.ts +165 -67
- package/dist/blocks/settings-panel-01/settings-panel.d.ts.map +1 -1
- package/dist/blocks/settings-panel-01/settings-panel.js +92 -33
- package/dist/blocks/signup-01/index.d.ts +1 -1
- package/dist/blocks/signup-01/index.d.ts.map +1 -1
- package/dist/blocks/signup-01/signup-01.d.ts +10 -84
- package/dist/blocks/signup-01/signup-01.d.ts.map +1 -1
- package/dist/blocks/signup-01/signup-01.js +41 -23
- package/dist/blocks/stats-01/index.d.ts +5 -5
- package/dist/blocks/stats-01/index.d.ts.map +1 -1
- package/dist/blocks/stats-01/index.js +4 -4
- package/dist/blocks/stats-01/stats.d.ts +49 -14
- package/dist/blocks/stats-01/stats.d.ts.map +1 -1
- package/dist/blocks/stats-01/stats.js +65 -15
- package/dist/blocks/trend-01/index.d.ts +1 -1
- package/dist/blocks/trend-01/index.d.ts.map +1 -1
- package/dist/blocks/trend-01/trend.d.ts +26 -73
- package/dist/blocks/trend-01/trend.d.ts.map +1 -1
- package/dist/blocks/trend-01/trend.js +47 -30
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +93 -3
- package/dist/components/ui/metric.d.ts +4 -2
- package/dist/components/ui/metric.d.ts.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/lib/field-render.d.ts +107 -0
- package/dist/lib/field-render.d.ts.map +1 -0
- package/dist/lib/field-render.js +251 -0
- package/dist/lib/spec.d.ts +609 -0
- package/dist/lib/spec.d.ts.map +1 -0
- package/dist/lib/spec.js +1 -0
- package/dist/live/index.d.ts +2 -0
- package/dist/live/index.d.ts.map +1 -1
- package/dist/live/index.js +6 -0
- package/dist/live/message-thread-01/index.d.ts +3 -0
- package/dist/live/message-thread-01/index.d.ts.map +1 -0
- package/dist/live/message-thread-01/index.js +1 -0
- package/dist/live/message-thread-01/message-thread.d.ts +282 -0
- package/dist/live/message-thread-01/message-thread.d.ts.map +1 -0
- package/dist/live/message-thread-01/message-thread.js +221 -0
- package/dist/live/run-stream-01/run-stream.d.ts +2 -1
- package/dist/live/run-stream-01/run-stream.d.ts.map +1 -1
- package/dist/live/run-stream-01/run-stream.js +1 -7
- package/dist/live/status.d.ts +27 -0
- package/dist/live/status.d.ts.map +1 -0
- package/dist/live/status.js +15 -0
- package/dist/live/tool-call-row.d.ts +26 -0
- package/dist/live/tool-call-row.d.ts.map +1 -0
- package/dist/live/tool-call-row.js +60 -0
- package/dist/live/tool-ledger-01/tool-ledger.d.ts.map +1 -1
- package/dist/live/tool-ledger-01/tool-ledger.js +2 -42
- package/dist/pages/contact-page/index.d.ts +7 -7
- package/dist/pages/contact-page/index.d.ts.map +1 -1
- package/dist/pages/contact-page/index.js +17 -5
- package/dist/pages/document-page/document-page.d.ts +146 -0
- package/dist/pages/document-page/document-page.d.ts.map +1 -0
- package/dist/pages/document-page/document-page.js +80 -0
- package/dist/pages/document-page/index.d.ts +3 -0
- package/dist/pages/document-page/index.d.ts.map +1 -0
- package/dist/pages/document-page/index.js +1 -0
- package/dist/pages/index.d.ts +2 -0
- package/dist/pages/index.d.ts.map +1 -1
- package/dist/pages/index.js +6 -0
- package/dist/styles.css +35 -3
- package/package.json +7 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* The ink each state is stated in, and the tick beside it.
|
|
5
|
+
*
|
|
6
|
+
* The tick is the state's own first letter rather than a glyph this file invented,
|
|
7
|
+
* so there is nothing to translate and nothing to learn twice: `f` is the failed
|
|
8
|
+
* call in every locale, and it is a letter rather than a shape, so it survives a
|
|
9
|
+
* monochrome render and a screen at 200 per cent the way a hairline does not.
|
|
10
|
+
*
|
|
11
|
+
* `queued` and `cancelled` share the muted ink, and the letters are what tell them
|
|
12
|
+
* apart. That is the same trade `Status` makes and states: a wider palette on a
|
|
13
|
+
* surface a reader scans is a wider set of colours they have to learn, and the
|
|
14
|
+
* cost of a shared ink is one letter.
|
|
15
|
+
*/
|
|
16
|
+
const STATE_INK = {
|
|
17
|
+
queued: 'text-muted-foreground',
|
|
18
|
+
running: 'text-foreground',
|
|
19
|
+
succeeded: 'text-success',
|
|
20
|
+
failed: 'text-destructive',
|
|
21
|
+
cancelled: 'text-muted-foreground',
|
|
22
|
+
};
|
|
23
|
+
/** The tick each state draws, so the five are told apart without relying on colour. */
|
|
24
|
+
const STATE_MARK = {
|
|
25
|
+
queued: 'q',
|
|
26
|
+
running: 'r',
|
|
27
|
+
succeeded: 's',
|
|
28
|
+
failed: 'f',
|
|
29
|
+
cancelled: 'c',
|
|
30
|
+
};
|
|
31
|
+
/** The clock a row reads, in UTC, because the surface holds no locale to format in. */
|
|
32
|
+
export const clockOf = (at) => new Date(at).toISOString().slice(11, 19);
|
|
33
|
+
/**
|
|
34
|
+
* One tool call, drawn as the ledger draws it.
|
|
35
|
+
*
|
|
36
|
+
* **This is the tool-call row the `live` Kind owns, and it is shared rather than
|
|
37
|
+
* copied.** `ToolLedger01` draws one row per call in its ledger, and a
|
|
38
|
+
* conversation's tool-call part draws the same row inside a message, so the two
|
|
39
|
+
* surfaces cannot drift into two shapes for one call. `ToolLedger01` renders this
|
|
40
|
+
* inside its own `<li>`; the message thread renders it inside a part. The
|
|
41
|
+
* Component owns no `<li>`, so it can sit in either list without nesting one.
|
|
42
|
+
*
|
|
43
|
+
* **The duration is the difference between two sightings of the same call, and
|
|
44
|
+
* only when there are two.** `openedAt` is the moment the surface first saw the
|
|
45
|
+
* call's `id`; a call seen once has no second timestamp and draws no duration,
|
|
46
|
+
* because a zero is a claim that a call took no time. The sentence is the
|
|
47
|
+
* consumer's, on `call.durationLabel`, and the arithmetic is one subtraction of
|
|
48
|
+
* the consumer's own `at` values. There is no clock in this file.
|
|
49
|
+
*/
|
|
50
|
+
export function ToolCallRow({ call, openedAt }) {
|
|
51
|
+
// The difference between two sightings of the same call, and only when there
|
|
52
|
+
// are two. The sentence is the consumer's, the arithmetic is one subtraction of
|
|
53
|
+
// the consumer's own timestamps, and there is no clock in this file.
|
|
54
|
+
const elapsed = call.at - openedAt;
|
|
55
|
+
const duration = elapsed > 0 && call.durationLabel !== undefined
|
|
56
|
+
? call.durationLabel(elapsed, { id: call.id, name: call.name })
|
|
57
|
+
: null;
|
|
58
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2 gap-y-1", children: [_jsx("span", { "aria-hidden": "true", className: cn('font-mono text-xs', STATE_INK[call.state]), children: STATE_MARK[call.state] }), _jsx("time", { dateTime: new Date(openedAt).toISOString(), className: "text-muted-foreground font-mono text-xs tabular-nums", children: clockOf(openedAt) }), _jsx("span", { className: "text-foreground text-sm font-medium", children: call.name }), call.spanLabel ? (_jsx("span", { "data-slot": "tool-ledger-span", className: "border-border text-muted-foreground rounded border px-1 font-mono text-xs", children: call.spanLabel })) : null, duration === null ? null : (_jsx("span", { "data-slot": "tool-ledger-duration", className: "text-muted-foreground ml-auto font-mono text-xs tabular-nums", children: duration }))] }), call.argumentsText === undefined ? null : (_jsx("span", { "data-slot": "tool-ledger-arguments", className: "text-muted-foreground font-mono text-xs break-words", children: call.argumentsText })), call.resultText === undefined ? null : (_jsx("span", { "data-slot": "tool-ledger-result", className: "text-muted-foreground text-pretty text-xs", children: call.resultText })), call.errorText === undefined ? null : (_jsx("span", { "data-slot": "tool-ledger-error", className: "text-destructive text-pretty text-xs", children: call.errorText })), call.link === undefined ? null : (_jsx("a", { "data-slot": "tool-ledger-link", href: call.link.href, className: "text-foreground self-start rounded-sm text-xs underline-offset-4 hover:underline", children: call.link.label }))] }));
|
|
59
|
+
}
|
|
60
|
+
export default ToolCallRow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-ledger.d.ts","sourceRoot":"","sources":["../../../src/live/tool-ledger-01/tool-ledger.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"tool-ledger.d.ts","sourceRoot":"","sources":["../../../src/live/tool-ledger-01/tool-ledger.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAQnE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;AAEvF;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB;;;;;;OAMG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;;OAOG;IACH,EAAE,EAAE,MAAM,CAAA;IACV,sDAAsD;IACtD,KAAK,EAAE,aAAa,CAAA;IACpB;;;;;;;;;;;;;;;;;OAiBG;IACH,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAA;IAC1E;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE;QACL,qBAAqB;QACrB,IAAI,EAAE,MAAM,CAAA;QACZ,6BAA6B;QAC7B,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;AAE1E;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;;;;OAQG;IACH,SAAS,EAAE,aAAa,CAAA;IACxB;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC/B;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;OAOG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;;;;;;OAOG;IACH,KAAK,EAAE,SAAS,CAAA;IAChB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACxC;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,CACA;IAAE,YAAY,CAAC,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,GACjE;IAAE,YAAY,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAClE,CAAA;AA8DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8FG;AACH,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,SAAS,EACT,cAAc,EACd,KAAK,EACL,KAAK,EACL,KAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,MAAM,EACN,SAAS,GACV,EAAE,iBAAiB,+BAgInB;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -5,6 +5,7 @@ import { Button } from '../../components/ui/button.js';
|
|
|
5
5
|
import { LiveRegion } from '../../components/ui/live-region.js';
|
|
6
6
|
import { ScrollArea } from '../../components/ui/scroll-area.js';
|
|
7
7
|
import { cn } from '../../lib/utils.js';
|
|
8
|
+
import { ToolCallRow } from '../tool-call-row.js';
|
|
8
9
|
/**
|
|
9
10
|
* The one source of truth for order, so a late call with an earlier `at` sorts
|
|
10
11
|
* there and two runs of the same suite render the same ledger. Ties break on
|
|
@@ -27,36 +28,6 @@ function seedOf(calls, limit) {
|
|
|
27
28
|
const dropped = rows.length - limit;
|
|
28
29
|
return { rows: rows.slice(dropped), dropped };
|
|
29
30
|
}
|
|
30
|
-
/**
|
|
31
|
-
* The ink each state is stated in, and the tick beside it.
|
|
32
|
-
*
|
|
33
|
-
* The tick is the state's own first letter rather than a glyph this file invented,
|
|
34
|
-
* so there is nothing to translate and nothing to learn twice: `f` is the failed
|
|
35
|
-
* call in every locale, and it is a letter rather than a shape, so it survives a
|
|
36
|
-
* monochrome render and a screen at 200 per cent the way a hairline does not.
|
|
37
|
-
*
|
|
38
|
-
* `queued` and `cancelled` share the muted ink, and the letters are what tell them
|
|
39
|
-
* apart. That is the same trade `Status` makes and states: a wider palette on a
|
|
40
|
-
* surface a reader scans is a wider set of colours they have to learn, and the
|
|
41
|
-
* cost of a shared ink is one letter.
|
|
42
|
-
*/
|
|
43
|
-
const STATE_INK = {
|
|
44
|
-
queued: 'text-muted-foreground',
|
|
45
|
-
running: 'text-foreground',
|
|
46
|
-
succeeded: 'text-success',
|
|
47
|
-
failed: 'text-destructive',
|
|
48
|
-
cancelled: 'text-muted-foreground',
|
|
49
|
-
};
|
|
50
|
-
/** The tick each state draws, so the five are told apart without relying on colour. */
|
|
51
|
-
const STATE_MARK = {
|
|
52
|
-
queued: 'q',
|
|
53
|
-
running: 'r',
|
|
54
|
-
succeeded: 's',
|
|
55
|
-
failed: 'f',
|
|
56
|
-
cancelled: 'c',
|
|
57
|
-
};
|
|
58
|
-
/** The clock a row reads, in UTC, because the surface holds no locale to format in. */
|
|
59
|
-
const clockOf = (at) => new Date(at).toISOString().slice(11, 19);
|
|
60
31
|
/** One call merged into the ledger, and what fell off the top doing it. */
|
|
61
32
|
function merge(rows, call, limit) {
|
|
62
33
|
const at = rows.findIndex((row) => row.call.id === call.id);
|
|
@@ -229,17 +200,6 @@ export function ToolLedger01({ subscribe, callbacks, resubscribeKey, label, empt
|
|
|
229
200
|
stop();
|
|
230
201
|
};
|
|
231
202
|
}, [subscribe, resubscribeKey, limit]);
|
|
232
|
-
return (_jsxs("section", { "data-slot": "tool-ledger", className: cn('border-border flex flex-col gap-4 rounded-lg border p-4', className), children: [LiveRegion({ politeness: 'polite', children: newest }), droppedLabel === undefined && pauseControl !== true ? null : (_jsxs("div", { "data-slot": "tool-ledger-bar", className: "flex flex-wrap items-center gap-3", children: [run.dropped > 0 && droppedLabel !== undefined ? (_jsx("p", { "data-slot": "tool-ledger-dropped", className: "text-muted-foreground text-xs", children: droppedLabel(run.dropped) })) : null, pauseControl !== true ? null : (_jsx(Button, { "data-slot": "tool-ledger-pause", type: "button", variant: "outline", size: "sm", "aria-pressed": held, className: "ml-auto", onClick: () => setHeld(!heldRef.current), children: held ? resumeLabel : pauseLabel }))] })), rows.length === 0 ? (_jsx("p", { "data-slot": "tool-ledger-empty", className: "text-muted-foreground text-sm", children: empty })) : (_jsx(ScrollArea, { label: label, className: "max-h-96", children: _jsx("ol", { "data-slot": "tool-ledger-calls", className: "flex flex-col", children: rows.map((row) => {
|
|
233
|
-
const { call } = row;
|
|
234
|
-
// The difference between two sightings of the same call, and only when
|
|
235
|
-
// there are two. The sentence is the consumer's, the arithmetic is one
|
|
236
|
-
// subtraction of the consumer's own timestamps, and there is no clock
|
|
237
|
-
// in this file.
|
|
238
|
-
const elapsed = call.at - row.openedAt;
|
|
239
|
-
const duration = elapsed > 0 && call.durationLabel !== undefined
|
|
240
|
-
? call.durationLabel(elapsed, { id: call.id, name: call.name })
|
|
241
|
-
: null;
|
|
242
|
-
return (_jsxs("li", { "data-slot": "tool-ledger-call", "data-state": call.state, className: "border-border flex flex-col gap-1 border-b py-3 last:border-b-0", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2 gap-y-1", children: [_jsx("span", { "aria-hidden": "true", className: cn('font-mono text-xs', STATE_INK[call.state]), children: STATE_MARK[call.state] }), _jsx("time", { dateTime: new Date(row.openedAt).toISOString(), className: "text-muted-foreground font-mono text-xs tabular-nums", children: clockOf(row.openedAt) }), _jsx("span", { className: "text-foreground text-sm font-medium", children: call.name }), call.spanLabel ? (_jsx("span", { "data-slot": "tool-ledger-span", className: "border-border text-muted-foreground rounded border px-1 font-mono text-xs", children: call.spanLabel })) : null, duration === null ? null : (_jsx("span", { "data-slot": "tool-ledger-duration", className: "text-muted-foreground ml-auto font-mono text-xs tabular-nums", children: duration }))] }), call.argumentsText === undefined ? null : (_jsx("span", { "data-slot": "tool-ledger-arguments", className: "text-muted-foreground font-mono text-xs break-words", children: call.argumentsText })), call.resultText === undefined ? null : (_jsx("span", { "data-slot": "tool-ledger-result", className: "text-muted-foreground text-pretty text-xs", children: call.resultText })), call.errorText === undefined ? null : (_jsx("span", { "data-slot": "tool-ledger-error", className: "text-destructive text-pretty text-xs", children: call.errorText })), call.link === undefined ? null : (_jsx("a", { "data-slot": "tool-ledger-link", href: call.link.href, className: "text-foreground self-start rounded-sm text-xs underline-offset-4 hover:underline", children: call.link.label }))] }, call.id));
|
|
243
|
-
}) }) }))] }));
|
|
203
|
+
return (_jsxs("section", { "data-slot": "tool-ledger", className: cn('border-border flex flex-col gap-4 rounded-lg border p-4', className), children: [LiveRegion({ politeness: 'polite', children: newest }), droppedLabel === undefined && pauseControl !== true ? null : (_jsxs("div", { "data-slot": "tool-ledger-bar", className: "flex flex-wrap items-center gap-3", children: [run.dropped > 0 && droppedLabel !== undefined ? (_jsx("p", { "data-slot": "tool-ledger-dropped", className: "text-muted-foreground text-xs", children: droppedLabel(run.dropped) })) : null, pauseControl !== true ? null : (_jsx(Button, { "data-slot": "tool-ledger-pause", type: "button", variant: "outline", size: "sm", "aria-pressed": held, className: "ml-auto", onClick: () => setHeld(!heldRef.current), children: held ? resumeLabel : pauseLabel }))] })), rows.length === 0 ? (_jsx("p", { "data-slot": "tool-ledger-empty", className: "text-muted-foreground text-sm", children: empty })) : (_jsx(ScrollArea, { label: label, className: "max-h-96", children: _jsx("ol", { "data-slot": "tool-ledger-calls", className: "flex flex-col", children: rows.map((row) => (_jsx("li", { "data-slot": "tool-ledger-call", "data-state": row.call.state, className: "border-border flex flex-col gap-1 border-b py-3 last:border-b-0", children: _jsx(ToolCallRow, { call: row.call, openedAt: row.openedAt }) }, row.call.id))) }) }))] }));
|
|
244
204
|
}
|
|
245
205
|
export default ToolLedger01;
|
|
@@ -18,16 +18,16 @@ export type ContactPageOption = {
|
|
|
18
18
|
/**
|
|
19
19
|
* One declared field of the contact form.
|
|
20
20
|
*
|
|
21
|
-
* **Flat, on purpose, where `
|
|
21
|
+
* **Flat, on purpose, where `FieldSpec` is a union.** A consumer's form data is
|
|
22
22
|
* flat: a record read out of a content type, a CMS entry or a JSON file has one
|
|
23
23
|
* shape with an optional `options` key, and a caller that had to narrow their own
|
|
24
24
|
* record before they could hand it to a page would be doing the Block's type work
|
|
25
|
-
* at every call site. So the
|
|
26
|
-
* shape it cannot build is refused here with
|
|
27
|
-
* prop. That is `AboutPage`'s arrangement for
|
|
28
|
-
* cost is the same: a caller who wants the
|
|
29
|
-
* types their fields
|
|
30
|
-
*
|
|
25
|
+
* at every call site. So the flat record is converted to the shared specification
|
|
26
|
+
* once, inside this module, and the one shape it cannot build is refused here with
|
|
27
|
+
* a message that names the Page's own prop. That is `AboutPage`'s arrangement for
|
|
28
|
+
* the same pair of link fields, and the cost is the same: a caller who wants the
|
|
29
|
+
* compile error rather than the thrown one types their fields as `FieldSpec` and
|
|
30
|
+
* composes `Contact01` directly.
|
|
31
31
|
*/
|
|
32
32
|
export type ContactPageField = {
|
|
33
33
|
/** The caller's key for this field, and the key the value arrives under. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/contact-page/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,EAEL,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/contact-page/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { Contact01, } from '../../blocks/contact-01/index.js';
|
|
|
4
4
|
import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card.js';
|
|
5
5
|
import { CtaLink } from '../../components/ui/cta-link.js';
|
|
6
6
|
import { Section, SectionHeading, childLevel } from '../../components/ui/section.js';
|
|
7
|
+
import { FieldKindName } from '../../lib/field-render.js';
|
|
7
8
|
import { cn } from '../../lib/utils.js';
|
|
8
9
|
/**
|
|
9
10
|
* One declared field as `Contact01` draws it, with the two shapes kept apart.
|
|
@@ -16,15 +17,26 @@ import { cn } from '../../lib/utils.js';
|
|
|
16
17
|
*/
|
|
17
18
|
function asContactField(field) {
|
|
18
19
|
const shared = {
|
|
19
|
-
|
|
20
|
+
key: field.id,
|
|
20
21
|
label: field.label,
|
|
21
22
|
required: field.required,
|
|
22
|
-
|
|
23
|
+
help: field.description,
|
|
23
24
|
placeholder: field.placeholder,
|
|
24
25
|
autoComplete: field.autoComplete,
|
|
25
26
|
};
|
|
27
|
+
if (field.type === 'textarea')
|
|
28
|
+
return { ...shared, kind: FieldKindName.textarea, rows: 4 };
|
|
29
|
+
/*
|
|
30
|
+
`text`, `email` and `tel` all draw Prism's `Input`, which is the control this
|
|
31
|
+
package ships for a run of characters; the platform's own `type` attributes are
|
|
32
|
+
not part of the shared vocabulary, so asking for an email is asking for an
|
|
33
|
+
`Input` with the `autoComplete` hint a password manager reads. `inputMode` and
|
|
34
|
+
`type` are the platform's, and the caller who needs a numeric keypad reaches for
|
|
35
|
+
the `NumberField` kind on the Block directly rather than through this Page's
|
|
36
|
+
flat prop.
|
|
37
|
+
*/
|
|
26
38
|
if (field.type !== 'select')
|
|
27
|
-
return { ...shared,
|
|
39
|
+
return { ...shared, kind: FieldKindName.input };
|
|
28
40
|
const options = field.options ?? [];
|
|
29
41
|
if (options.length === 0) {
|
|
30
42
|
throw new Error(`ContactPage: the field "${field.id}" is a select and passes no options, so the control would render with ` +
|
|
@@ -32,7 +44,7 @@ function asContactField(field) {
|
|
|
32
44
|
'there and focusable. Pass the choices, or declare the field as a text field and check the answer in ' +
|
|
33
45
|
'your own handler.');
|
|
34
46
|
}
|
|
35
|
-
return { ...shared,
|
|
47
|
+
return { ...shared, kind: FieldKindName.nativeSelect, options: options.map((option) => ({ ...option })) };
|
|
36
48
|
}
|
|
37
49
|
/**
|
|
38
50
|
* The two checks the office union makes for a TypeScript caller, run here for the
|
|
@@ -125,7 +137,7 @@ export function ContactPage({ eyebrow, title, description, form, fields, onSubmi
|
|
|
125
137
|
*/
|
|
126
138
|
const BandHeading = childLevel(headingLevel);
|
|
127
139
|
const OfficeHeading = childLevel(BandHeading);
|
|
128
|
-
return (_jsxs("div", { "data-slot": "contact-page", className: cn(className), children: [_jsx(Section, { "data-slot": "contact-page-heading", children: _jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description }) }), _jsx(Contact01, { title: form.title, description: form.description, fields: fields.map(asContactField), onSubmit: onSubmit, submitLabel: submitLabel, consent: consent, status: status, variant: "stacked", headingLevel: BandHeading }), offices === undefined ? null : (_jsxs(Section, { "data-slot": "contact-page-offices", children: [_jsx(SectionHeading, { as: BandHeading, align: "left", title: officesLabel, className: "mb-10" }), _jsx("div", { "data-slot": "contact-page-office-row", className: "grid items-start gap-6 md:grid-cols-2 lg:grid-cols-3", children: offices.map((office) => (_jsxs(Card, { "data-slot": "contact-page-office", "data-office": office.id, className: "h-full", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { as: OfficeHeading, children: office.name }) }), _jsxs(CardContent, { className: "flex flex-col items-start gap-4", children: [_jsx("address", { "data-slot": "contact-page-office-address", className: "text-muted-foreground flex flex-col gap-1 not-italic text-sm", children: office.lines.map((line, index) => (
|
|
140
|
+
return (_jsxs("div", { "data-slot": "contact-page", className: cn(className), children: [_jsx(Section, { "data-slot": "contact-page-heading", children: _jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description }) }), _jsx(Contact01, { title: form.title, description: form.description, groups: [{ fields: fields.map(asContactField) }], onSubmit: onSubmit, submitLabel: submitLabel, consent: consent, status: status, variant: "stacked", headingLevel: BandHeading }), offices === undefined ? null : (_jsxs(Section, { "data-slot": "contact-page-offices", children: [_jsx(SectionHeading, { as: BandHeading, align: "left", title: officesLabel, className: "mb-10" }), _jsx("div", { "data-slot": "contact-page-office-row", className: "grid items-start gap-6 md:grid-cols-2 lg:grid-cols-3", children: offices.map((office) => (_jsxs(Card, { "data-slot": "contact-page-office", "data-office": office.id, className: "h-full", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { as: OfficeHeading, children: office.name }) }), _jsxs(CardContent, { className: "flex flex-col items-start gap-4", children: [_jsx("address", { "data-slot": "contact-page-office-address", className: "text-muted-foreground flex flex-col gap-1 not-italic text-sm", children: office.lines.map((line, index) => (
|
|
129
141
|
/*
|
|
130
142
|
Positional, because a postal line is display content and a
|
|
131
143
|
business with two branches on one street can legitimately
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
2
|
+
import { ActivityFeed01 } from '../../blocks/activity-feed-01/index.js';
|
|
3
|
+
import { Compare01 } from '../../blocks/compare-01/index.js';
|
|
4
|
+
import { DataTable01 } from '../../blocks/data-table-01/index.js';
|
|
5
|
+
import { MemberList01 } from '../../blocks/member-list-01/index.js';
|
|
6
|
+
import { RecordDetail01 } from '../../blocks/record-detail-01/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* A props type with the heading level removed, distributed over a union.
|
|
9
|
+
*
|
|
10
|
+
* `Omit` does not distribute over a union: `Omit<A | B, K>` keeps only the keys
|
|
11
|
+
* the two arms share, so `Omit<DataTable01Props, 'headingLevel'>` would drop the
|
|
12
|
+
* selection arm's own members and a caller could no longer pass `selectable`. The
|
|
13
|
+
* conditional distributes, so each arm loses only its heading level.
|
|
14
|
+
*/
|
|
15
|
+
type WithoutHeading<T> = T extends unknown ? Omit<T, 'headingLevel'> : never;
|
|
16
|
+
/**
|
|
17
|
+
* The document read in full, plus its body.
|
|
18
|
+
*
|
|
19
|
+
* It is the props of `RecordDetail01` minus the two the Page decides for it. The
|
|
20
|
+
* `title`, `eyebrow`, `description`, `fields`, `actions` and `relations` are the
|
|
21
|
+
* record's own, unchanged, so the Page mints no document type: a document is a
|
|
22
|
+
* record, and the record detail is the Block that draws one. `headingLevel` is
|
|
23
|
+
* removed because the Page owns the document's `h1`, and `children` is replaced by
|
|
24
|
+
* `body` so the Page can hold the body to the reading measure rather than pass it
|
|
25
|
+
* through untouched.
|
|
26
|
+
*/
|
|
27
|
+
export type DocumentPageDocument = Omit<ComponentProps<typeof RecordDetail01>, 'headingLevel' | 'children'> & {
|
|
28
|
+
/**
|
|
29
|
+
* The document's body: the authored copy between the document's facts and its
|
|
30
|
+
* regions.
|
|
31
|
+
*
|
|
32
|
+
* The Page wraps it in `Prose`, so the measure and the block rhythm are the
|
|
33
|
+
* system's and the words are the caller's. Omit it for a document that is only
|
|
34
|
+
* its facts and its regions.
|
|
35
|
+
*/
|
|
36
|
+
body?: ReactNode;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* One region beside the document body, as the caller's own content.
|
|
40
|
+
*
|
|
41
|
+
* **The union is by arrangement and not by subject matter, and that is the whole
|
|
42
|
+
* of what keeps the Page from minting a document type.** A `version`, a `comment`
|
|
43
|
+
* and a `source` are each a product's word for its own record, and a member naming
|
|
44
|
+
* one of them on a Prism type would promise that every consumer's document holds
|
|
45
|
+
* those things. What the Page knows is which settled Block draws a region: an
|
|
46
|
+
* `activity` is `ActivityFeed01`, a `table` is `DataTable01`, `members` is
|
|
47
|
+
* `MemberList01` and `comparison` is `Compare01`. A version list and a source list
|
|
48
|
+
* are both a `table` with the caller's own columns; a comment thread is `members`
|
|
49
|
+
* or a `table`; the evidence matrix is `comparison`. So the six document variants
|
|
50
|
+
* and the research workspace are one Page under different content, exactly as the
|
|
51
|
+
* decision recorded, and the difference between them is which region the caller
|
|
52
|
+
* put in the list.
|
|
53
|
+
*
|
|
54
|
+
* `key` is the caller's stable key for the region, because a region list is an
|
|
55
|
+
* ordered list and React needs an identity per entry that survives a reorder.
|
|
56
|
+
*/
|
|
57
|
+
export type DocumentPageRegion = {
|
|
58
|
+
key: string;
|
|
59
|
+
block: 'activity';
|
|
60
|
+
props: WithoutHeading<ComponentProps<typeof ActivityFeed01>>;
|
|
61
|
+
} | {
|
|
62
|
+
key: string;
|
|
63
|
+
block: 'table';
|
|
64
|
+
props: WithoutHeading<ComponentProps<typeof DataTable01>>;
|
|
65
|
+
} | {
|
|
66
|
+
key: string;
|
|
67
|
+
block: 'members';
|
|
68
|
+
props: WithoutHeading<ComponentProps<typeof MemberList01>>;
|
|
69
|
+
} | {
|
|
70
|
+
key: string;
|
|
71
|
+
block: 'comparison';
|
|
72
|
+
props: WithoutHeading<ComponentProps<typeof Compare01>>;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* The props a DocumentPage takes.
|
|
76
|
+
*
|
|
77
|
+
* The document is one prop and the regions are another, because the document read
|
|
78
|
+
* in full is the whole of the page and the regions are what the caller opens
|
|
79
|
+
* beside its body. Every word, value, column, member and arm is the caller's: the
|
|
80
|
+
* Page ships no sentence, holds no document, fetches nothing and owns no editor,
|
|
81
|
+
* no share, no export and no permission.
|
|
82
|
+
*/
|
|
83
|
+
export type DocumentPageProps = {
|
|
84
|
+
/** The document read in full, with its body. The Page gives it the page's `h1`. */
|
|
85
|
+
document: DocumentPageDocument;
|
|
86
|
+
/**
|
|
87
|
+
* The regions beside the body, in the order a reader should meet them. Omit the
|
|
88
|
+
* prop for a document that is only its body, which is the deliverable case.
|
|
89
|
+
*/
|
|
90
|
+
regions?: readonly DocumentPageRegion[];
|
|
91
|
+
/**
|
|
92
|
+
* Layout only, exactly as on every Component. Changing a Prism-owned visual
|
|
93
|
+
* property from here is prohibited.
|
|
94
|
+
*/
|
|
95
|
+
className?: string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* A whole document screen: the document read in full with its body, and one or
|
|
99
|
+
* more regions beside it.
|
|
100
|
+
*
|
|
101
|
+
* **This is a Page authored beside `DocsShell`, and neither of that Page's two
|
|
102
|
+
* rules is relaxed.** `DocsShell` states that a section is a label and not a
|
|
103
|
+
* control, and that a group with no index is a label and not a route. Both are
|
|
104
|
+
* statements about a documentation site's navigation tree, where a section is a
|
|
105
|
+
* topic a reader may reach in any order. This workspace never asks that question:
|
|
106
|
+
* its status is a state of a region of one document and belongs to the Block that
|
|
107
|
+
* draws the region, and its route is the document's own contents. So the two are
|
|
108
|
+
* separate Items, no consumer of `DocsShell` is affected, and this Page owns the
|
|
109
|
+
* document's `h1` because a route renders it for a document and nothing frames it.
|
|
110
|
+
*
|
|
111
|
+
* **One Page draws all seven screens, because the difference between the six
|
|
112
|
+
* document variants and the research workspace is content rather than
|
|
113
|
+
* structure.** The record is the same thing in every one of them: an authored
|
|
114
|
+
* document with a title, a body and a set of things attached to it. What separates
|
|
115
|
+
* them is which region is open beside the body, which is the caller's content, so
|
|
116
|
+
* a version list, a comment thread, a source list, an output list and an evidence
|
|
117
|
+
* matrix are regions of one Page rather than six Items. The Page is the
|
|
118
|
+
* arrangement that places the document and one or more of those regions, and it
|
|
119
|
+
* ships none of their words.
|
|
120
|
+
*
|
|
121
|
+
* **It composes settled Items and mints no document, version, comment or source
|
|
122
|
+
* type.** The document read in full is `RecordDetail01`, and the body is `Prose`.
|
|
123
|
+
* A version list is `ActivityFeed01` or a `table` region; a comment thread is a
|
|
124
|
+
* `members` region or a `table`; a source list and an output list are `table`
|
|
125
|
+
* regions with the caller's per-row destination; the evidence comparison matrix is
|
|
126
|
+
* `Compare01` as a `comparison` region. Nothing here declares a shape named after
|
|
127
|
+
* a product's record, because a document is a record and every attached thing is
|
|
128
|
+
* the caller's own rows.
|
|
129
|
+
*
|
|
130
|
+
* **The editor, the fetch, the retention, the share, the export and the permission
|
|
131
|
+
* are the consumer's.** The Page owns no editor, so an annotation anchored to a
|
|
132
|
+
* passage, a version created, a comment resolved and a document sent are all
|
|
133
|
+
* behaviour and all the caller's. It fetches nothing, so it holds no document, no
|
|
134
|
+
* version history and no source; it owns no retention, no archive and no recovery,
|
|
135
|
+
* which are properties of the caller's store; and it owns no permission, because
|
|
136
|
+
* who may read or comment is the caller's store. Every figure, word and node is a
|
|
137
|
+
* prop.
|
|
138
|
+
*
|
|
139
|
+
* It is a client Component because the Blocks it composes hold state: a table
|
|
140
|
+
* holds its selection and a member list attaches a handler. That is a property of
|
|
141
|
+
* this composition and not of the data, and the caller still owns every row, every
|
|
142
|
+
* callback and every word.
|
|
143
|
+
*/
|
|
144
|
+
export declare function DocumentPage({ document, regions, className }: DocumentPageProps): import("react").JSX.Element;
|
|
145
|
+
export default DocumentPage;
|
|
146
|
+
//# sourceMappingURL=document-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-page.d.ts","sourceRoot":"","sources":["../../../src/pages/document-page/document-page.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAK9D;;;;;;;GAOG;AACH,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,KAAK,CAAA;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,cAAc,CAAC,OAAO,cAAc,CAAC,EACrC,cAAc,GAAG,UAAU,CAC5B,GAAG;IACF;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IACE,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,UAAU,CAAA;IACjB,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC,CAAA;CAC7D,GACD;IACE,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAC1D,GACD;IACE,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,CAAA;CAC3D,GACD;IACE,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC,CAAA;CACxD,CAAA;AAEL;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mFAAmF;IACnF,QAAQ,EAAE,oBAAoB,CAAA;IAC9B;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAA;IACvC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BA2B/E;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Fragment } from 'react';
|
|
4
|
+
import { ActivityFeed01 } from '../../blocks/activity-feed-01/index.js';
|
|
5
|
+
import { Compare01 } from '../../blocks/compare-01/index.js';
|
|
6
|
+
import { DataTable01 } from '../../blocks/data-table-01/index.js';
|
|
7
|
+
import { MemberList01 } from '../../blocks/member-list-01/index.js';
|
|
8
|
+
import { RecordDetail01 } from '../../blocks/record-detail-01/index.js';
|
|
9
|
+
import { Prose } from '../../components/ui/prose.js';
|
|
10
|
+
import { Section } from '../../components/ui/section.js';
|
|
11
|
+
import { cn } from '../../lib/utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* One region, drawn by the Block its arrangement names.
|
|
14
|
+
*
|
|
15
|
+
* The heading level is set here rather than taken from the caller, so every region
|
|
16
|
+
* is a section one level under the document's `h1` and the outline cannot be
|
|
17
|
+
* flattened by a caller who passed the wrong level to a Block.
|
|
18
|
+
*/
|
|
19
|
+
function renderRegion(region) {
|
|
20
|
+
if (region.block === 'activity')
|
|
21
|
+
return _jsx(ActivityFeed01, { ...region.props, headingLevel: "h2" });
|
|
22
|
+
if (region.block === 'table')
|
|
23
|
+
return _jsx(DataTable01, { ...region.props, headingLevel: "h2" });
|
|
24
|
+
if (region.block === 'members')
|
|
25
|
+
return _jsx(MemberList01, { ...region.props, headingLevel: "h2" });
|
|
26
|
+
return _jsx(Compare01, { ...region.props, headingLevel: "h2" });
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A whole document screen: the document read in full with its body, and one or
|
|
30
|
+
* more regions beside it.
|
|
31
|
+
*
|
|
32
|
+
* **This is a Page authored beside `DocsShell`, and neither of that Page's two
|
|
33
|
+
* rules is relaxed.** `DocsShell` states that a section is a label and not a
|
|
34
|
+
* control, and that a group with no index is a label and not a route. Both are
|
|
35
|
+
* statements about a documentation site's navigation tree, where a section is a
|
|
36
|
+
* topic a reader may reach in any order. This workspace never asks that question:
|
|
37
|
+
* its status is a state of a region of one document and belongs to the Block that
|
|
38
|
+
* draws the region, and its route is the document's own contents. So the two are
|
|
39
|
+
* separate Items, no consumer of `DocsShell` is affected, and this Page owns the
|
|
40
|
+
* document's `h1` because a route renders it for a document and nothing frames it.
|
|
41
|
+
*
|
|
42
|
+
* **One Page draws all seven screens, because the difference between the six
|
|
43
|
+
* document variants and the research workspace is content rather than
|
|
44
|
+
* structure.** The record is the same thing in every one of them: an authored
|
|
45
|
+
* document with a title, a body and a set of things attached to it. What separates
|
|
46
|
+
* them is which region is open beside the body, which is the caller's content, so
|
|
47
|
+
* a version list, a comment thread, a source list, an output list and an evidence
|
|
48
|
+
* matrix are regions of one Page rather than six Items. The Page is the
|
|
49
|
+
* arrangement that places the document and one or more of those regions, and it
|
|
50
|
+
* ships none of their words.
|
|
51
|
+
*
|
|
52
|
+
* **It composes settled Items and mints no document, version, comment or source
|
|
53
|
+
* type.** The document read in full is `RecordDetail01`, and the body is `Prose`.
|
|
54
|
+
* A version list is `ActivityFeed01` or a `table` region; a comment thread is a
|
|
55
|
+
* `members` region or a `table`; a source list and an output list are `table`
|
|
56
|
+
* regions with the caller's per-row destination; the evidence comparison matrix is
|
|
57
|
+
* `Compare01` as a `comparison` region. Nothing here declares a shape named after
|
|
58
|
+
* a product's record, because a document is a record and every attached thing is
|
|
59
|
+
* the caller's own rows.
|
|
60
|
+
*
|
|
61
|
+
* **The editor, the fetch, the retention, the share, the export and the permission
|
|
62
|
+
* are the consumer's.** The Page owns no editor, so an annotation anchored to a
|
|
63
|
+
* passage, a version created, a comment resolved and a document sent are all
|
|
64
|
+
* behaviour and all the caller's. It fetches nothing, so it holds no document, no
|
|
65
|
+
* version history and no source; it owns no retention, no archive and no recovery,
|
|
66
|
+
* which are properties of the caller's store; and it owns no permission, because
|
|
67
|
+
* who may read or comment is the caller's store. Every figure, word and node is a
|
|
68
|
+
* prop.
|
|
69
|
+
*
|
|
70
|
+
* It is a client Component because the Blocks it composes hold state: a table
|
|
71
|
+
* holds its selection and a member list attaches a handler. That is a property of
|
|
72
|
+
* this composition and not of the data, and the caller still owns every row, every
|
|
73
|
+
* callback and every word.
|
|
74
|
+
*/
|
|
75
|
+
export function DocumentPage({ document, regions, className }) {
|
|
76
|
+
const { body, ...record } = document;
|
|
77
|
+
const list = regions ?? [];
|
|
78
|
+
return (_jsx(Section, { "data-slot": "document-page", className: cn(className), children: _jsxs("article", { "data-slot": "document-page-article", className: "flex flex-col gap-12", children: [_jsx(RecordDetail01, { ...record, headingLevel: "h1", children: body === undefined ? null : _jsx(Prose, { children: body }) }), list.length === 0 ? null : (_jsx("div", { "data-slot": "document-page-regions", className: "flex flex-col gap-12", children: list.map((region) => (_jsx(Fragment, { children: renderRegion(region) }, region.key))) }))] }) }));
|
|
79
|
+
}
|
|
80
|
+
export default DocumentPage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/document-page/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACvD,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DocumentPage, default } from './document-page.js';
|
package/dist/pages/index.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ export { BlogPostPage } from './blog-post-page/index.js';
|
|
|
25
25
|
export type { BlogPostPageProps, BlogPostTag, BlogPostNeighbour, BlogPostTrailLabels } from './blog-post-page/index.js';
|
|
26
26
|
export { DocsShell } from './docs-shell/index.js';
|
|
27
27
|
export type { DocsShellProps, DocsNavEntry, DocsNavPage, DocsNavGroup, DocsNavDivider, DocsPagerLabels, } from './docs-shell/index.js';
|
|
28
|
+
export { DocumentPage } from './document-page/index.js';
|
|
29
|
+
export type { DocumentPageProps, DocumentPageDocument, DocumentPageRegion, } from './document-page/index.js';
|
|
28
30
|
export { AboutPage } from './about-page/index.js';
|
|
29
31
|
export { CareersPage } from './careers-page/index.js';
|
|
30
32
|
export { ChangelogPage } from './changelog-page/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC9G,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC9G,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAA;AAQrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AAOxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/pages/index.js
CHANGED
|
@@ -18,6 +18,12 @@ export { AuthPage } from './auth-page/index.js';
|
|
|
18
18
|
export { NotFoundPage } from './not-found-page/index.js';
|
|
19
19
|
export { BlogPostPage } from './blog-post-page/index.js';
|
|
20
20
|
export { DocsShell } from './docs-shell/index.js';
|
|
21
|
+
/*
|
|
22
|
+
* The document and research workspace. A Page authored beside `DocsShell`, so
|
|
23
|
+
* neither of that Page's two rules is relaxed: a section stays a label and not a
|
|
24
|
+
* control, and a group with no index stays a label and not a route. It composes
|
|
25
|
+
* settled Items and mints no document, version, comment or source type. */
|
|
26
|
+
export { DocumentPage } from './document-page/index.js';
|
|
21
27
|
/*
|
|
22
28
|
* the ten screens the 2026-09 expansion added.
|
|
23
29
|
* Derived by the maintainer rather than authored: each entry is read out of the Item own
|
package/dist/styles.css
CHANGED
|
@@ -428,9 +428,6 @@
|
|
|
428
428
|
.my-1 {
|
|
429
429
|
margin-block: var(--spacing-1);
|
|
430
430
|
}
|
|
431
|
-
.my-6 {
|
|
432
|
-
margin-block: var(--spacing-6);
|
|
433
|
-
}
|
|
434
431
|
.-ms-px {
|
|
435
432
|
margin-inline-start: -1px;
|
|
436
433
|
}
|
|
@@ -482,6 +479,9 @@
|
|
|
482
479
|
.mt-auto {
|
|
483
480
|
margin-top: auto;
|
|
484
481
|
}
|
|
482
|
+
.mb-0 {
|
|
483
|
+
margin-bottom: var(--spacing-0);
|
|
484
|
+
}
|
|
485
485
|
.mb-1 {
|
|
486
486
|
margin-bottom: var(--spacing-1);
|
|
487
487
|
}
|
|
@@ -1121,6 +1121,9 @@
|
|
|
1121
1121
|
.grid-cols-\[minmax\(0\,1fr\)_auto\] {
|
|
1122
1122
|
grid-template-columns: minmax(0,1fr) auto;
|
|
1123
1123
|
}
|
|
1124
|
+
.grid-cols-\[minmax\(0\,2fr\)_minmax\(0\,3fr\)\] {
|
|
1125
|
+
grid-template-columns: minmax(0,2fr) minmax(0,3fr);
|
|
1126
|
+
}
|
|
1124
1127
|
.flex-col {
|
|
1125
1128
|
flex-direction: column;
|
|
1126
1129
|
}
|
|
@@ -1253,6 +1256,16 @@
|
|
|
1253
1256
|
.gap-y-8 {
|
|
1254
1257
|
row-gap: var(--spacing-8);
|
|
1255
1258
|
}
|
|
1259
|
+
:where(.divide-y > :not(:last-child)) {
|
|
1260
|
+
--tw-divide-y-reverse: 0;
|
|
1261
|
+
border-bottom-style: var(--tw-border-style);
|
|
1262
|
+
border-top-style: var(--tw-border-style);
|
|
1263
|
+
border-top-width: calc(1px * var(--tw-divide-y-reverse));
|
|
1264
|
+
border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
|
|
1265
|
+
}
|
|
1266
|
+
:where(.divide-border > :not(:last-child)) {
|
|
1267
|
+
border-color: var(--border);
|
|
1268
|
+
}
|
|
1256
1269
|
.self-center {
|
|
1257
1270
|
align-self: center;
|
|
1258
1271
|
}
|
|
@@ -1872,6 +1885,9 @@
|
|
|
1872
1885
|
.px-8 {
|
|
1873
1886
|
padding-inline: var(--spacing-8);
|
|
1874
1887
|
}
|
|
1888
|
+
.py-0 {
|
|
1889
|
+
padding-block: var(--spacing-0);
|
|
1890
|
+
}
|
|
1875
1891
|
.py-0\.5 {
|
|
1876
1892
|
padding-block: var(--spacing-0\.5);
|
|
1877
1893
|
}
|
|
@@ -2004,12 +2020,18 @@
|
|
|
2004
2020
|
.text-center {
|
|
2005
2021
|
text-align: center;
|
|
2006
2022
|
}
|
|
2023
|
+
.text-end {
|
|
2024
|
+
text-align: end;
|
|
2025
|
+
}
|
|
2007
2026
|
.text-left {
|
|
2008
2027
|
text-align: left;
|
|
2009
2028
|
}
|
|
2010
2029
|
.text-right {
|
|
2011
2030
|
text-align: right;
|
|
2012
2031
|
}
|
|
2032
|
+
.text-start {
|
|
2033
|
+
text-align: start;
|
|
2034
|
+
}
|
|
2013
2035
|
.align-bottom {
|
|
2014
2036
|
vertical-align: bottom;
|
|
2015
2037
|
}
|
|
@@ -3855,6 +3877,10 @@
|
|
|
3855
3877
|
.\[\&_ul\]\:pl-6 ul {
|
|
3856
3878
|
padding-left: var(--spacing-6);
|
|
3857
3879
|
}
|
|
3880
|
+
.\[\&\+\&\]\:border-t + .\[\&\+\&\]\:border-t {
|
|
3881
|
+
border-top-style: var(--tw-border-style);
|
|
3882
|
+
border-top-width: 1px;
|
|
3883
|
+
}
|
|
3858
3884
|
.\[\&\:\:-webkit-search-cancel-button\]\:appearance-none::-webkit-search-cancel-button {
|
|
3859
3885
|
appearance: none;
|
|
3860
3886
|
}
|
|
@@ -4600,6 +4626,11 @@
|
|
|
4600
4626
|
syntax: "*";
|
|
4601
4627
|
inherits: false;
|
|
4602
4628
|
}
|
|
4629
|
+
@property --tw-divide-y-reverse {
|
|
4630
|
+
syntax: "*";
|
|
4631
|
+
inherits: false;
|
|
4632
|
+
initial-value: 0;
|
|
4633
|
+
}
|
|
4603
4634
|
@property --tw-border-style {
|
|
4604
4635
|
syntax: "*";
|
|
4605
4636
|
inherits: false;
|
|
@@ -4887,6 +4918,7 @@
|
|
|
4887
4918
|
--tw-rotate-z: initial;
|
|
4888
4919
|
--tw-skew-x: initial;
|
|
4889
4920
|
--tw-skew-y: initial;
|
|
4921
|
+
--tw-divide-y-reverse: 0;
|
|
4890
4922
|
--tw-border-style: solid;
|
|
4891
4923
|
--tw-gradient-position: initial;
|
|
4892
4924
|
--tw-gradient-from: #0000;
|