@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.
Files changed (170) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/blocks/activity-feed-01/activity-feed-01.d.ts +120 -190
  3. package/dist/blocks/activity-feed-01/activity-feed-01.d.ts.map +1 -1
  4. package/dist/blocks/activity-feed-01/activity-feed-01.js +107 -97
  5. package/dist/blocks/activity-feed-01/index.d.ts +1 -1
  6. package/dist/blocks/activity-feed-01/index.d.ts.map +1 -1
  7. package/dist/blocks/auth-form-01/auth-form.d.ts +86 -53
  8. package/dist/blocks/auth-form-01/auth-form.d.ts.map +1 -1
  9. package/dist/blocks/auth-form-01/auth-form.js +95 -31
  10. package/dist/blocks/auth-form-01/index.d.ts +1 -1
  11. package/dist/blocks/auth-form-01/index.d.ts.map +1 -1
  12. package/dist/blocks/calendar-01/calendar.d.ts +28 -0
  13. package/dist/blocks/calendar-01/calendar.d.ts.map +1 -1
  14. package/dist/blocks/calendar-01/calendar.js +15 -1
  15. package/dist/blocks/card-index-01/card-index.d.ts +225 -0
  16. package/dist/blocks/card-index-01/card-index.d.ts.map +1 -0
  17. package/dist/blocks/card-index-01/card-index.js +154 -0
  18. package/dist/blocks/card-index-01/index.d.ts +3 -0
  19. package/dist/blocks/card-index-01/index.d.ts.map +1 -0
  20. package/dist/blocks/card-index-01/index.js +1 -0
  21. package/dist/blocks/chart-card-01/chart-card-01.d.ts +23 -21
  22. package/dist/blocks/chart-card-01/chart-card-01.d.ts.map +1 -1
  23. package/dist/blocks/chart-card-01/chart-card-01.js +46 -1
  24. package/dist/blocks/chart-card-01/index.d.ts +1 -1
  25. package/dist/blocks/chart-card-01/index.d.ts.map +1 -1
  26. package/dist/blocks/chart-group-01/chart-group-01.d.ts +3 -3
  27. package/dist/blocks/chart-group-01/chart-group-01.d.ts.map +1 -1
  28. package/dist/blocks/contact-01/contact.d.ts +30 -82
  29. package/dist/blocks/contact-01/contact.d.ts.map +1 -1
  30. package/dist/blocks/contact-01/contact.js +59 -30
  31. package/dist/blocks/contact-01/index.d.ts +1 -1
  32. package/dist/blocks/contact-01/index.d.ts.map +1 -1
  33. package/dist/blocks/dashboard-01/dashboard-01.d.ts +26 -71
  34. package/dist/blocks/dashboard-01/dashboard-01.d.ts.map +1 -1
  35. package/dist/blocks/dashboard-01/dashboard-01.js +34 -23
  36. package/dist/blocks/dashboard-01/index.d.ts +1 -1
  37. package/dist/blocks/dashboard-01/index.d.ts.map +1 -1
  38. package/dist/blocks/data-table-01/data-table.d.ts +276 -59
  39. package/dist/blocks/data-table-01/data-table.d.ts.map +1 -1
  40. package/dist/blocks/data-table-01/data-table.js +217 -35
  41. package/dist/blocks/data-table-01/index.d.ts +1 -1
  42. package/dist/blocks/data-table-01/index.d.ts.map +1 -1
  43. package/dist/blocks/directory-01/directory-01.d.ts +23 -2
  44. package/dist/blocks/directory-01/directory-01.d.ts.map +1 -1
  45. package/dist/blocks/directory-01/directory-01.js +3 -3
  46. package/dist/blocks/empty-state-01/empty-state.d.ts +60 -21
  47. package/dist/blocks/empty-state-01/empty-state.d.ts.map +1 -1
  48. package/dist/blocks/empty-state-01/empty-state.js +52 -17
  49. package/dist/blocks/index-detail-01/index-detail.d.ts +85 -0
  50. package/dist/blocks/index-detail-01/index-detail.d.ts.map +1 -0
  51. package/dist/blocks/index-detail-01/index-detail.js +58 -0
  52. package/dist/blocks/index-detail-01/index.d.ts +3 -0
  53. package/dist/blocks/index-detail-01/index.d.ts.map +1 -0
  54. package/dist/blocks/index-detail-01/index.js +1 -0
  55. package/dist/blocks/index.d.ts +20 -8
  56. package/dist/blocks/index.d.ts.map +1 -1
  57. package/dist/blocks/index.js +7 -0
  58. package/dist/blocks/issue-detail-01/issue-detail.d.ts +18 -0
  59. package/dist/blocks/issue-detail-01/issue-detail.d.ts.map +1 -1
  60. package/dist/blocks/issue-detail-01/issue-detail.js +18 -0
  61. package/dist/blocks/nothing-chosen-01/index.d.ts +3 -0
  62. package/dist/blocks/nothing-chosen-01/index.d.ts.map +1 -0
  63. package/dist/blocks/nothing-chosen-01/index.js +1 -0
  64. package/dist/blocks/nothing-chosen-01/nothing-chosen.d.ts +119 -0
  65. package/dist/blocks/nothing-chosen-01/nothing-chosen.d.ts.map +1 -0
  66. package/dist/blocks/nothing-chosen-01/nothing-chosen.js +79 -0
  67. package/dist/blocks/project-dashboard-01/index.d.ts +1 -1
  68. package/dist/blocks/project-dashboard-01/index.d.ts.map +1 -1
  69. package/dist/blocks/project-dashboard-01/project-dashboard.d.ts +21 -27
  70. package/dist/blocks/project-dashboard-01/project-dashboard.d.ts.map +1 -1
  71. package/dist/blocks/project-dashboard-01/project-dashboard.js +45 -5
  72. package/dist/blocks/provisioning-01/index.d.ts +1 -1
  73. package/dist/blocks/provisioning-01/index.d.ts.map +1 -1
  74. package/dist/blocks/provisioning-01/provisioning.d.ts +9 -97
  75. package/dist/blocks/provisioning-01/provisioning.d.ts.map +1 -1
  76. package/dist/blocks/provisioning-01/provisioning.js +26 -13
  77. package/dist/blocks/record-detail-01/index.d.ts +3 -0
  78. package/dist/blocks/record-detail-01/index.d.ts.map +1 -0
  79. package/dist/blocks/record-detail-01/index.js +1 -0
  80. package/dist/blocks/record-detail-01/record-detail.d.ts +239 -0
  81. package/dist/blocks/record-detail-01/record-detail.d.ts.map +1 -0
  82. package/dist/blocks/record-detail-01/record-detail.js +150 -0
  83. package/dist/blocks/record-form-01/index.d.ts +3 -0
  84. package/dist/blocks/record-form-01/index.d.ts.map +1 -0
  85. package/dist/blocks/record-form-01/index.js +1 -0
  86. package/dist/blocks/record-form-01/record-form.d.ts +148 -0
  87. package/dist/blocks/record-form-01/record-form.d.ts.map +1 -0
  88. package/dist/blocks/record-form-01/record-form.js +107 -0
  89. package/dist/blocks/record-grid-01/index.d.ts +3 -0
  90. package/dist/blocks/record-grid-01/index.d.ts.map +1 -0
  91. package/dist/blocks/record-grid-01/index.js +1 -0
  92. package/dist/blocks/record-grid-01/record-grid.d.ts +145 -0
  93. package/dist/blocks/record-grid-01/record-grid.d.ts.map +1 -0
  94. package/dist/blocks/record-grid-01/record-grid.js +114 -0
  95. package/dist/blocks/record-wizard-01/index.d.ts +3 -0
  96. package/dist/blocks/record-wizard-01/index.d.ts.map +1 -0
  97. package/dist/blocks/record-wizard-01/index.js +1 -0
  98. package/dist/blocks/record-wizard-01/record-wizard.d.ts +152 -0
  99. package/dist/blocks/record-wizard-01/record-wizard.d.ts.map +1 -0
  100. package/dist/blocks/record-wizard-01/record-wizard.js +144 -0
  101. package/dist/blocks/settings-members-01/settings-members.d.ts +2 -1
  102. package/dist/blocks/settings-members-01/settings-members.d.ts.map +1 -1
  103. package/dist/blocks/settings-panel-01/index.d.ts +1 -1
  104. package/dist/blocks/settings-panel-01/index.d.ts.map +1 -1
  105. package/dist/blocks/settings-panel-01/settings-panel.d.ts +165 -67
  106. package/dist/blocks/settings-panel-01/settings-panel.d.ts.map +1 -1
  107. package/dist/blocks/settings-panel-01/settings-panel.js +92 -33
  108. package/dist/blocks/signup-01/index.d.ts +1 -1
  109. package/dist/blocks/signup-01/index.d.ts.map +1 -1
  110. package/dist/blocks/signup-01/signup-01.d.ts +10 -84
  111. package/dist/blocks/signup-01/signup-01.d.ts.map +1 -1
  112. package/dist/blocks/signup-01/signup-01.js +41 -23
  113. package/dist/blocks/stats-01/index.d.ts +5 -5
  114. package/dist/blocks/stats-01/index.d.ts.map +1 -1
  115. package/dist/blocks/stats-01/index.js +4 -4
  116. package/dist/blocks/stats-01/stats.d.ts +49 -14
  117. package/dist/blocks/stats-01/stats.d.ts.map +1 -1
  118. package/dist/blocks/stats-01/stats.js +65 -15
  119. package/dist/blocks/trend-01/index.d.ts +1 -1
  120. package/dist/blocks/trend-01/index.d.ts.map +1 -1
  121. package/dist/blocks/trend-01/trend.d.ts +26 -73
  122. package/dist/blocks/trend-01/trend.d.ts.map +1 -1
  123. package/dist/blocks/trend-01/trend.js +47 -30
  124. package/dist/catalog.d.ts.map +1 -1
  125. package/dist/catalog.js +93 -3
  126. package/dist/components/ui/metric.d.ts +4 -2
  127. package/dist/components/ui/metric.d.ts.map +1 -1
  128. package/dist/index.d.ts +10 -0
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +6 -0
  131. package/dist/lib/field-render.d.ts +107 -0
  132. package/dist/lib/field-render.d.ts.map +1 -0
  133. package/dist/lib/field-render.js +251 -0
  134. package/dist/lib/spec.d.ts +609 -0
  135. package/dist/lib/spec.d.ts.map +1 -0
  136. package/dist/lib/spec.js +1 -0
  137. package/dist/live/index.d.ts +2 -0
  138. package/dist/live/index.d.ts.map +1 -1
  139. package/dist/live/index.js +6 -0
  140. package/dist/live/message-thread-01/index.d.ts +3 -0
  141. package/dist/live/message-thread-01/index.d.ts.map +1 -0
  142. package/dist/live/message-thread-01/index.js +1 -0
  143. package/dist/live/message-thread-01/message-thread.d.ts +282 -0
  144. package/dist/live/message-thread-01/message-thread.d.ts.map +1 -0
  145. package/dist/live/message-thread-01/message-thread.js +221 -0
  146. package/dist/live/run-stream-01/run-stream.d.ts +2 -1
  147. package/dist/live/run-stream-01/run-stream.d.ts.map +1 -1
  148. package/dist/live/run-stream-01/run-stream.js +1 -7
  149. package/dist/live/status.d.ts +27 -0
  150. package/dist/live/status.d.ts.map +1 -0
  151. package/dist/live/status.js +15 -0
  152. package/dist/live/tool-call-row.d.ts +26 -0
  153. package/dist/live/tool-call-row.d.ts.map +1 -0
  154. package/dist/live/tool-call-row.js +60 -0
  155. package/dist/live/tool-ledger-01/tool-ledger.d.ts.map +1 -1
  156. package/dist/live/tool-ledger-01/tool-ledger.js +2 -42
  157. package/dist/pages/contact-page/index.d.ts +7 -7
  158. package/dist/pages/contact-page/index.d.ts.map +1 -1
  159. package/dist/pages/contact-page/index.js +17 -5
  160. package/dist/pages/document-page/document-page.d.ts +146 -0
  161. package/dist/pages/document-page/document-page.d.ts.map +1 -0
  162. package/dist/pages/document-page/document-page.js +80 -0
  163. package/dist/pages/document-page/index.d.ts +3 -0
  164. package/dist/pages/document-page/index.d.ts.map +1 -0
  165. package/dist/pages/document-page/index.js +1 -0
  166. package/dist/pages/index.d.ts +2 -0
  167. package/dist/pages/index.d.ts.map +1 -1
  168. package/dist/pages/index.js +6 -0
  169. package/dist/styles.css +35 -3
  170. 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;AAOnE;;;;;;;;;;;;;;;;;;;;;;;;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;AA+FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,+BAwNnB;AAED,eAAe,YAAY,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 `ContactField` is a union.** A consumer's form data is
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 union is built once, inside this module, and the one
26
- * shape it cannot build is refused here with a message that names the Page's own
27
- * prop. That is `AboutPage`'s arrangement for the same pair of link fields, and the
28
- * cost is the same: a caller who wants the compile error rather than the thrown one
29
- * types their fields against `ContactField` and passes the result here, which
30
- * works because the two are structurally the same.
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,EAEpB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGpG;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAA;IACV,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;IACb,kFAAkF;IAClF,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAA;IACtD,iEAAiE;IACjE,QAAQ,EAAE,OAAO,CAAA;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACtC,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;GAKG;AACH,KAAK,sBAAsB,GAAG;IAC5B,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAA;IACV;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,yEAAyE;IACzE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GACzB,CAAC,sBAAsB,GAAG;IACxB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAA;IACf,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAC,GACF,CAAC,sBAAsB,GAAG;IACxB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,KAAK,CAAA;IACf,iEAAiE;IACjE,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB,CAAC,CAAA;AAEN;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,oFAAoF;IACpF,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;;;OAMG;IACH,KAAK,EAAE,SAAS,CAAA;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;;;;;;;OAQG;IACH,IAAI,EAAE;QACJ,0BAA0B;QAC1B,KAAK,EAAE,SAAS,CAAA;QAChB,2EAA2E;QAC3E,WAAW,CAAC,EAAE,SAAS,CAAA;KACxB,CAAA;IACD;;;;;;OAMG;IACH,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACnC;;;;;;OAMG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,6GAA6G;IAC7G,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,CACA;IACE;;;OAGG;IACH,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACrC;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,CAAA;CACrB,GACD;IACE,6DAA6D;IAC7D,OAAO,CAAC,EAAE,KAAK,CAAA;IACf,2DAA2D;IAC3D,YAAY,CAAC,EAAE,KAAK,CAAA;CACrB,CACJ,CAAA;AAgED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,WAAW,EACX,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,WAAW,EACX,OAAO,EACP,MAAM,EACN,OAAO,EACP,YAAY,EACZ,MAAM,EACN,YAAmB,EACnB,SAAS,GACV,EAAE,gBAAgB,+BAsHlB;AAED,eAAe,WAAW,CAAA"}
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
- id: field.id,
20
+ key: field.id,
20
21
  label: field.label,
21
22
  required: field.required,
22
- description: field.description,
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, type: field.type };
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, type: 'select', options: options.map((option) => ({ ...option })) };
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,3 @@
1
+ export { DocumentPage, default } from './document-page.js';
2
+ export type { DocumentPageProps, DocumentPageDocument, DocumentPageRegion, } from './document-page.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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';
@@ -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;AAOrB,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"}
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"}
@@ -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;