@danxbot/ui 15.28.0 → 15.29.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/theme.css CHANGED
@@ -45,197 +45,197 @@
45
45
  @source "./index.js";
46
46
 
47
47
  /* from src/styles/authored.css */
48
- @theme inline {
49
- /* --- Surfaces + structure --- */
50
- --color-canvas: var(--canvas);
51
- --color-canvas-subtle: var(--canvas-subtle);
52
- --color-surface: var(--surface);
53
- --color-surface-sunken: var(--surface-sunken);
54
- --color-surface-raised: var(--surface-raised);
55
- --color-surface-overlay: var(--surface-overlay);
56
- --color-surface-inset: var(--surface-inset);
57
- --color-surface-hover: var(--surface-hover);
58
- --color-surface-active: var(--surface-active);
59
- --color-surface-selected: var(--surface-selected);
60
-
61
- --color-border-subtle: var(--border-subtle);
62
- --color-border: var(--border);
63
- --color-border-strong: var(--border-strong);
64
- --color-border-interactive: var(--border-interactive);
65
-
66
- /* --- Content --- */
67
- --color-primary: var(--text-primary);
68
- --color-secondary: var(--text-secondary);
69
- --color-tertiary: var(--text-tertiary);
70
- --color-disabled: var(--text-disabled);
71
- --color-inverse: var(--text-inverse);
72
-
73
- /* --- Accent (celadon) --- */
74
- --color-accent: var(--accent);
75
- --color-accent-hover: var(--accent-hover);
76
- --color-accent-active: var(--accent-active);
77
- --color-accent-subtle: var(--accent-subtle);
78
- --color-accent-subtle-hover: var(--accent-subtle-hover);
79
- --color-accent-border: var(--accent-border);
80
- --color-accent-text: var(--accent-text);
81
- --color-accent-contrast: var(--accent-contrast);
82
-
83
- /* --- Brand (ember) --- */
84
- --color-brand: var(--brand);
85
- --color-brand-hover: var(--brand-hover);
86
- --color-brand-subtle: var(--brand-subtle);
87
- --color-brand-text: var(--brand-text);
88
- --color-brand-contrast: var(--brand-contrast);
89
-
90
- /* --- Status --- */
91
- --color-success: var(--success);
92
- --color-success-subtle: var(--success-subtle);
93
- --color-success-text: var(--success-text);
94
- --color-success-border: var(--success-border);
95
-
96
- --color-warning: var(--warning);
97
- --color-warning-subtle: var(--warning-subtle);
98
- --color-warning-subtle-hover: var(--warning-subtle-hover);
99
- --color-warning-text: var(--warning-text);
100
- --color-warning-border: var(--warning-border);
101
-
102
- --color-danger: var(--danger);
103
- --color-danger-hover: var(--danger-hover);
104
- --color-danger-subtle: var(--danger-subtle);
105
- --color-danger-text: var(--danger-text);
106
- --color-danger-border: var(--danger-border);
107
- --color-danger-contrast: var(--danger-contrast);
108
-
109
- /* --- Chart palette (DX-3963): eight ordered categorical hues + one sequential --- */
110
- --color-chart-1: var(--chart-1);
111
- --color-chart-2: var(--chart-2);
112
- --color-chart-3: var(--chart-3);
113
- --color-chart-4: var(--chart-4);
114
- --color-chart-5: var(--chart-5);
115
- --color-chart-6: var(--chart-6);
116
- --color-chart-7: var(--chart-7);
117
- --color-chart-8: var(--chart-8);
118
- --color-chart-seq: var(--chart-seq);
119
-
120
- /* --- Confidence (a 1-5 self-rating, one colour per level) --- */
121
- --color-confidence-1: var(--confidence-1);
122
- --color-confidence-2: var(--confidence-2);
123
- --color-confidence-3: var(--confidence-3);
124
- --color-confidence-4: var(--confidence-4);
125
- --color-confidence-5: var(--confidence-5);
126
- --color-confidence-none: var(--confidence-none);
127
-
128
- --color-info: var(--info);
129
- --color-info-subtle: var(--info-subtle);
130
- --color-info-text: var(--info-text);
131
- --color-info-border: var(--info-border);
132
-
133
- /* DX-3662 — the 8th tone: a quieter grey for a CLOSED/inert fact (a
134
- terminated card, a retired record) — distinct from `--neutral`
135
- (`text-tertiary`/`bg-tertiary`, the "not yet decided" grey every OTHER
136
- pending/undetermined state already draws from). Both are on the same
137
- near-zero-chroma axis on purpose (an inert fact and an undecided one are
138
- both "no signal", just at different points in a lifecycle) but pinned to
139
- different `L`s so they stay tellable apart side by side — see
140
- `muted-quieter-than-neutral.test.ts` for the measured contrast-ranking
141
- floor this promises (DX-3696 — the file this comment used to cite,
142
- `token-distance.test.ts`, does not exist in this repo). */
143
- --color-muted: var(--muted);
144
- --color-muted-subtle: var(--muted-subtle);
145
- --color-muted-text: var(--muted-text);
146
- --color-muted-border: var(--muted-border);
147
-
148
- /* --- Fields --- */
149
- --color-field: var(--field-bg);
150
- --color-field-hover: var(--field-bg-hover);
151
- --color-field-border: var(--field-border);
152
- --color-field-border-hover: var(--field-border-hover);
153
- --color-field-placeholder: var(--field-placeholder);
154
-
155
- --color-scrim: var(--scrim);
156
- --color-veil: var(--veil);
157
- --color-focus-halo: var(--focus-halo);
158
- --color-control-knob: var(--control-knob);
159
- --color-control-knob-on: var(--control-knob-on);
160
- --color-switch-track-off: var(--switch-track-off);
161
- --color-focus-ring: var(--focus-ring);
162
-
163
- /* --- Type --- */
164
- --font-display: var(--font-display);
165
- --font-sans: var(--font-sans);
166
- --font-mono: var(--font-mono);
167
-
168
- --text-2xs: var(--text-2xs);
169
- --text-xs: var(--text-xs);
170
- --text-sm: var(--text-sm);
171
- --text-base: var(--text-base);
172
- --text-md: var(--text-md);
173
- --text-lg: var(--text-lg);
174
- --text-xl: var(--text-xl);
175
- --text-2xl: var(--text-2xl);
176
- --text-3xl: var(--text-3xl);
177
- --text-4xl: var(--text-4xl);
178
- --text-5xl: var(--text-5xl);
179
-
180
- /* Remap Tailwind's weight utilities onto the non-integer ramp, so
181
- `font-medium` / `font-bold` pick up 510 / 680 rather than 500 / 700. */
182
- --font-weight-normal: var(--weight-normal);
183
- --font-weight-medium: var(--weight-medium);
184
- --font-weight-semibold: var(--weight-semibold);
185
- --font-weight-bold: var(--weight-bold);
186
-
187
- --leading-tight: var(--leading-tight);
188
- --leading-snug: var(--leading-snug);
189
- --leading-normal: var(--leading-normal);
190
- --leading-relaxed: var(--leading-relaxed);
191
-
192
- --tracking-tighter: var(--tracking-tighter);
193
- --tracking-tight: var(--tracking-tight);
194
- --tracking-normal: var(--tracking-normal);
195
- --tracking-wide: var(--tracking-wide);
196
- --tracking-widest: var(--tracking-widest);
197
-
198
- /* --- Shape --- */
199
- --radius-xs: var(--radius-xs);
200
- --radius-sm: var(--radius-sm);
201
- --radius-md: var(--radius-md);
202
- --radius-lg: var(--radius-lg);
203
- --radius-xl: var(--radius-xl);
204
- --radius-2xl: var(--radius-2xl);
205
- --radius-3xl: var(--radius-3xl);
206
-
207
- /* --- Control heights, exposed as sizing utilities (h-control-md etc.) --- */
208
- /* Tailwind's spacing BASE, retargeted through the size multiplier.
209
- This one line is what makes every `p-4`, `gap-3`, `size-5` in every
210
- component respond to the size control — without it the utilities keep
211
- Tailwind's fixed 0.25rem and only the hand-written control heights move,
212
- which is why the first version of the control read as "changes padding
213
- slightly" and nothing else. */
214
- --spacing: calc(0.25rem * var(--ui-scale));
215
-
216
- --spacing-control-xs: var(--control-xs);
217
- --spacing-control-sm: var(--control-sm);
218
- --spacing-control-md: var(--control-md);
219
- --spacing-control-lg: var(--control-lg);
220
- --spacing-control-xl: var(--control-xl);
221
-
222
- /* --- Elevation --- */
223
- --shadow-xs: var(--shadow-xs);
224
- --shadow-sm: var(--shadow-sm);
225
- --shadow-knob: var(--shadow-knob);
226
- --shadow-md: var(--shadow-md);
227
- --shadow-lg: var(--shadow-lg);
228
- --shadow-xl: var(--shadow-xl);
229
- --shadow-tooltip: var(--shadow-tooltip);
230
- --shadow-glow-accent: var(--shadow-glow-accent);
231
-
232
- /* --- Motion ---
233
- The curves, durations and `animate-*` utilities are owned by motion.css,
234
- which declares them directly in Tailwind's own namespaces. All that is
235
- left here is retargeting the framework's bare `transition` default off
236
- its Material-1-era `cubic-bezier(0.4, 0, 0.2, 1)` @ 150ms. */
237
- --default-transition-duration: var(--dur-base);
238
- --default-transition-timing-function: var(--ease-standard);
48
+ @theme inline {
49
+ /* --- Surfaces + structure --- */
50
+ --color-canvas: var(--canvas);
51
+ --color-canvas-subtle: var(--canvas-subtle);
52
+ --color-surface: var(--surface);
53
+ --color-surface-sunken: var(--surface-sunken);
54
+ --color-surface-raised: var(--surface-raised);
55
+ --color-surface-overlay: var(--surface-overlay);
56
+ --color-surface-inset: var(--surface-inset);
57
+ --color-surface-hover: var(--surface-hover);
58
+ --color-surface-active: var(--surface-active);
59
+ --color-surface-selected: var(--surface-selected);
60
+
61
+ --color-border-subtle: var(--border-subtle);
62
+ --color-border: var(--border);
63
+ --color-border-strong: var(--border-strong);
64
+ --color-border-interactive: var(--border-interactive);
65
+
66
+ /* --- Content --- */
67
+ --color-primary: var(--text-primary);
68
+ --color-secondary: var(--text-secondary);
69
+ --color-tertiary: var(--text-tertiary);
70
+ --color-disabled: var(--text-disabled);
71
+ --color-inverse: var(--text-inverse);
72
+
73
+ /* --- Accent (celadon) --- */
74
+ --color-accent: var(--accent);
75
+ --color-accent-hover: var(--accent-hover);
76
+ --color-accent-active: var(--accent-active);
77
+ --color-accent-subtle: var(--accent-subtle);
78
+ --color-accent-subtle-hover: var(--accent-subtle-hover);
79
+ --color-accent-border: var(--accent-border);
80
+ --color-accent-text: var(--accent-text);
81
+ --color-accent-contrast: var(--accent-contrast);
82
+
83
+ /* --- Brand (ember) --- */
84
+ --color-brand: var(--brand);
85
+ --color-brand-hover: var(--brand-hover);
86
+ --color-brand-subtle: var(--brand-subtle);
87
+ --color-brand-text: var(--brand-text);
88
+ --color-brand-contrast: var(--brand-contrast);
89
+
90
+ /* --- Status --- */
91
+ --color-success: var(--success);
92
+ --color-success-subtle: var(--success-subtle);
93
+ --color-success-text: var(--success-text);
94
+ --color-success-border: var(--success-border);
95
+
96
+ --color-warning: var(--warning);
97
+ --color-warning-subtle: var(--warning-subtle);
98
+ --color-warning-subtle-hover: var(--warning-subtle-hover);
99
+ --color-warning-text: var(--warning-text);
100
+ --color-warning-border: var(--warning-border);
101
+
102
+ --color-danger: var(--danger);
103
+ --color-danger-hover: var(--danger-hover);
104
+ --color-danger-subtle: var(--danger-subtle);
105
+ --color-danger-text: var(--danger-text);
106
+ --color-danger-border: var(--danger-border);
107
+ --color-danger-contrast: var(--danger-contrast);
108
+
109
+ /* --- Chart palette (DX-3963): eight ordered categorical hues + one sequential --- */
110
+ --color-chart-1: var(--chart-1);
111
+ --color-chart-2: var(--chart-2);
112
+ --color-chart-3: var(--chart-3);
113
+ --color-chart-4: var(--chart-4);
114
+ --color-chart-5: var(--chart-5);
115
+ --color-chart-6: var(--chart-6);
116
+ --color-chart-7: var(--chart-7);
117
+ --color-chart-8: var(--chart-8);
118
+ --color-chart-seq: var(--chart-seq);
119
+
120
+ /* --- Confidence (a 1-5 self-rating, one colour per level) --- */
121
+ --color-confidence-1: var(--confidence-1);
122
+ --color-confidence-2: var(--confidence-2);
123
+ --color-confidence-3: var(--confidence-3);
124
+ --color-confidence-4: var(--confidence-4);
125
+ --color-confidence-5: var(--confidence-5);
126
+ --color-confidence-none: var(--confidence-none);
127
+
128
+ --color-info: var(--info);
129
+ --color-info-subtle: var(--info-subtle);
130
+ --color-info-text: var(--info-text);
131
+ --color-info-border: var(--info-border);
132
+
133
+ /* DX-3662 — the 8th tone: a quieter grey for a CLOSED/inert fact (a
134
+ terminated card, a retired record) — distinct from `--neutral`
135
+ (`text-tertiary`/`bg-tertiary`, the "not yet decided" grey every OTHER
136
+ pending/undetermined state already draws from). Both are on the same
137
+ near-zero-chroma axis on purpose (an inert fact and an undecided one are
138
+ both "no signal", just at different points in a lifecycle) but pinned to
139
+ different `L`s so they stay tellable apart side by side — see
140
+ `muted-quieter-than-neutral.test.ts` for the measured contrast-ranking
141
+ floor this promises (DX-3696 — the file this comment used to cite,
142
+ `token-distance.test.ts`, does not exist in this repo). */
143
+ --color-muted: var(--muted);
144
+ --color-muted-subtle: var(--muted-subtle);
145
+ --color-muted-text: var(--muted-text);
146
+ --color-muted-border: var(--muted-border);
147
+
148
+ /* --- Fields --- */
149
+ --color-field: var(--field-bg);
150
+ --color-field-hover: var(--field-bg-hover);
151
+ --color-field-border: var(--field-border);
152
+ --color-field-border-hover: var(--field-border-hover);
153
+ --color-field-placeholder: var(--field-placeholder);
154
+
155
+ --color-scrim: var(--scrim);
156
+ --color-veil: var(--veil);
157
+ --color-focus-halo: var(--focus-halo);
158
+ --color-control-knob: var(--control-knob);
159
+ --color-control-knob-on: var(--control-knob-on);
160
+ --color-switch-track-off: var(--switch-track-off);
161
+ --color-focus-ring: var(--focus-ring);
162
+
163
+ /* --- Type --- */
164
+ --font-display: var(--font-display);
165
+ --font-sans: var(--font-sans);
166
+ --font-mono: var(--font-mono);
167
+
168
+ --text-2xs: var(--text-2xs);
169
+ --text-xs: var(--text-xs);
170
+ --text-sm: var(--text-sm);
171
+ --text-base: var(--text-base);
172
+ --text-md: var(--text-md);
173
+ --text-lg: var(--text-lg);
174
+ --text-xl: var(--text-xl);
175
+ --text-2xl: var(--text-2xl);
176
+ --text-3xl: var(--text-3xl);
177
+ --text-4xl: var(--text-4xl);
178
+ --text-5xl: var(--text-5xl);
179
+
180
+ /* Remap Tailwind's weight utilities onto the non-integer ramp, so
181
+ `font-medium` / `font-bold` pick up 510 / 680 rather than 500 / 700. */
182
+ --font-weight-normal: var(--weight-normal);
183
+ --font-weight-medium: var(--weight-medium);
184
+ --font-weight-semibold: var(--weight-semibold);
185
+ --font-weight-bold: var(--weight-bold);
186
+
187
+ --leading-tight: var(--leading-tight);
188
+ --leading-snug: var(--leading-snug);
189
+ --leading-normal: var(--leading-normal);
190
+ --leading-relaxed: var(--leading-relaxed);
191
+
192
+ --tracking-tighter: var(--tracking-tighter);
193
+ --tracking-tight: var(--tracking-tight);
194
+ --tracking-normal: var(--tracking-normal);
195
+ --tracking-wide: var(--tracking-wide);
196
+ --tracking-widest: var(--tracking-widest);
197
+
198
+ /* --- Shape --- */
199
+ --radius-xs: var(--radius-xs);
200
+ --radius-sm: var(--radius-sm);
201
+ --radius-md: var(--radius-md);
202
+ --radius-lg: var(--radius-lg);
203
+ --radius-xl: var(--radius-xl);
204
+ --radius-2xl: var(--radius-2xl);
205
+ --radius-3xl: var(--radius-3xl);
206
+
207
+ /* --- Control heights, exposed as sizing utilities (h-control-md etc.) --- */
208
+ /* Tailwind's spacing BASE, retargeted through the size multiplier.
209
+ This one line is what makes every `p-4`, `gap-3`, `size-5` in every
210
+ component respond to the size control — without it the utilities keep
211
+ Tailwind's fixed 0.25rem and only the hand-written control heights move,
212
+ which is why the first version of the control read as "changes padding
213
+ slightly" and nothing else. */
214
+ --spacing: calc(0.25rem * var(--ui-scale));
215
+
216
+ --spacing-control-xs: var(--control-xs);
217
+ --spacing-control-sm: var(--control-sm);
218
+ --spacing-control-md: var(--control-md);
219
+ --spacing-control-lg: var(--control-lg);
220
+ --spacing-control-xl: var(--control-xl);
221
+
222
+ /* --- Elevation --- */
223
+ --shadow-xs: var(--shadow-xs);
224
+ --shadow-sm: var(--shadow-sm);
225
+ --shadow-knob: var(--shadow-knob);
226
+ --shadow-md: var(--shadow-md);
227
+ --shadow-lg: var(--shadow-lg);
228
+ --shadow-xl: var(--shadow-xl);
229
+ --shadow-tooltip: var(--shadow-tooltip);
230
+ --shadow-glow-accent: var(--shadow-glow-accent);
231
+
232
+ /* --- Motion ---
233
+ The curves, durations and `animate-*` utilities are owned by motion.css,
234
+ which declares them directly in Tailwind's own namespaces. All that is
235
+ left here is retargeting the framework's bare `transition` default off
236
+ its Material-1-era `cubic-bezier(0.4, 0, 0.2, 1)` @ 150ms. */
237
+ --default-transition-duration: var(--dur-base);
238
+ --default-transition-timing-function: var(--ease-standard);
239
239
  }
240
240
 
241
241
  /* from src/styles/tokens.css */
@@ -0,0 +1,23 @@
1
+ import { type MouseEvent } from "react";
2
+ import { type LegalDocumentValue } from "../lib/legal-document";
3
+ export interface LegalDocumentProps {
4
+ document: LegalDocumentValue;
5
+ /**
6
+ * The element the title line is. `h1` when the document is the page's own
7
+ * heading, `p` when something else (an app shell's top bar) already owns the
8
+ * page's one `h1`.
9
+ */
10
+ titleAs?: "h1" | "p";
11
+ /** Names the contents list, and is the collapsed control's text until a section is current. */
12
+ contentsLabel?: string;
13
+ /**
14
+ * Runs when a contents link is clicked, with the section's anchor id and the
15
+ * click. The links are real `<a href="#section-N">`, which a path-based
16
+ * router leaves to the browser. A router that owns the fragment itself (a
17
+ * hash router) suppresses the browser's jump here, as `SectionNav` documents
18
+ * for its own rows, and scrolls the section into view instead.
19
+ */
20
+ onNavigate?: (anchor: string, event: MouseEvent<HTMLAnchorElement>) => void;
21
+ className?: string;
22
+ }
23
+ export declare function LegalDocument({ document: legal, titleAs: Title, contentsLabel, onNavigate, className, }: LegalDocumentProps): import("react").JSX.Element;
@@ -42,6 +42,8 @@ export { Menu, MenuItem, MenuGroup, MenuRadioGroup, MenuRadioItem, MenuCheckboxI
42
42
  export { ThemeMenu, type ThemeMenuProps } from "./components/ThemeMenu";
43
43
  export { AppShell, type AppShellProps, type NavItem, type NavSection, } from "./components/AppShell";
44
44
  export { SectionNav, type SectionNavProps } from "./components/SectionNav";
45
+ export { LegalDocument, type LegalDocumentProps } from "./components/LegalDocument";
46
+ export { countUnconfirmed, legalSectionAnchor, splitUnconfirmed, type LegalBlock, type LegalDocumentValue, type LegalSection, type LegalTextRun, } from "./lib/legal-document";
45
47
  export { FileUpload, type FileUploadProps, type UploadFile } from "./components/FileUpload";
46
48
  export { ImageUploadField, type ImageUploadFieldProps, type ImageUploadFieldShape, type ImageUploadFieldSize, } from "./components/ImageUploadField";
47
49
  export { DatePicker, type DatePickerProps, type DateRange } from "./components/DatePicker";
@@ -0,0 +1,82 @@
1
+ /**
2
+ * A legal document as DATA, plus the four pure decisions the `LegalDocument`
3
+ * component makes about it. DX-4022.
4
+ *
5
+ * No React in this file on purpose: the `LegalDocumentValue` shape is what a
6
+ * server holds and serves, so the `./pure` entry re-exports the types and a
7
+ * back end can type its content module without importing the design system's
8
+ * component graph.
9
+ *
10
+ * The shape mirrors a legal text and adds nothing to it: a title block,
11
+ * numbered sections, and in each section the paragraphs and bullet lists in
12
+ * document order. A paragraph that opens a numbered clause ("4.2 Beta
13
+ * confidentiality. ...") carries that opening as `clause`, split off only so
14
+ * a renderer can set it as a run-in heading and give it an anchor;
15
+ * `${number} ${heading} ${text}` is the paragraph as written. Nothing in the
16
+ * component writes a word of the document, which is what lets a verbatim check
17
+ * compare the page against its source and expect an exact match.
18
+ */
19
+ export interface LegalDocumentValue {
20
+ /** The document's own title line, e.g. "TERMS OF USE". */
21
+ title: string;
22
+ /** The company line under the title. */
23
+ issuer: string;
24
+ /** As written in the document, so it may still be an unfilled `[DATE]`. */
25
+ effectiveDate: string;
26
+ /** Which version of the text this is, as an acceptance would record it. */
27
+ version: string;
28
+ sections: readonly LegalSection[];
29
+ }
30
+ export interface LegalSection {
31
+ /** "1", "2", ... the number the document gives the section, and what "Section N" cites. */
32
+ number: string;
33
+ title: string;
34
+ blocks: readonly LegalBlock[];
35
+ }
36
+ export type LegalBlock = {
37
+ kind: "paragraph";
38
+ /** A numbered clause's opening words, when the paragraph starts one. */
39
+ clause?: {
40
+ number: string;
41
+ heading: string;
42
+ };
43
+ text: string;
44
+ } | {
45
+ kind: "list";
46
+ items: readonly string[];
47
+ };
48
+ /**
49
+ * The fragment a section or clause is linked by: "7" is `section-7`, "7.2" is
50
+ * `section-7-2`.
51
+ *
52
+ * Keyed on the NUMBER, never the title: "Section 7" is how a document cites
53
+ * itself (and how a lawyer cites it in an email), so a link survives a heading
54
+ * being reworded in a later version.
55
+ */
56
+ export declare function legalSectionAnchor(number: string): string;
57
+ /** One run of a paragraph: plain text, or a value the document left unfilled. */
58
+ export interface LegalTextRun {
59
+ text: string;
60
+ unconfirmed: boolean;
61
+ }
62
+ /**
63
+ * Split text into plain runs and square-bracketed placeholder runs.
64
+ *
65
+ * A draft marks every value it has not settled (a date, a notice period, a
66
+ * dollar cap) by writing it in square brackets. Those spans are kept verbatim,
67
+ * brackets included; this only finds them so they can be SHOWN as unconfirmed
68
+ * rather than read as agreed terms. Concatenating the runs' text always gives
69
+ * back the input unchanged.
70
+ */
71
+ export declare function splitUnconfirmed(text: string): LegalTextRun[];
72
+ /** How many placeholder values a document still carries. */
73
+ export declare function countUnconfirmed(document: LegalDocumentValue): number;
74
+ /**
75
+ * Whether a run of text is written in capitals throughout.
76
+ *
77
+ * Disclaimers and liability limits are set in capitals on purpose (that is what
78
+ * makes them conspicuous in the legal sense), so the renderer keeps every
79
+ * letter as written and makes the block easier to read instead: a rule beside
80
+ * it, looser tracking. A short all-caps fragment is not a paragraph of it.
81
+ */
82
+ export declare function isAllCaps(text: string): boolean;
@@ -42,3 +42,4 @@ export { formatBytes, formatTokens, formatCompactNumber } from "./lib/format";
42
42
  export { formatDate, parseDate, formatDateTime, parseDateTime, type FormatDateTimeOptions, type ParseDateTimeOptions, formatCurrency, parseCurrency, formatNumber, parseNumber, type FormatNumberOptions, formatBoolean, parseBoolean, type FormatBooleanOptions, } from "./lib/values";
43
43
  export { confidenceLevel, CONFIDENCE_LEVEL_LABELS, type ConfidenceLevel } from "./lib/confidence";
44
44
  export { CHART_SERIES_COUNT, CHART_SERIES_TOKENS, CHART_SEQUENTIAL_TOKEN, CHART_SEQUENTIAL_COLOR, chartSeriesColor, } from "./lib/chart-palette";
45
+ export type { LegalBlock, LegalDocumentValue, LegalSection } from "./lib/legal-document";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danxbot/ui",
3
- "version": "15.28.0",
3
+ "version": "15.29.0",
4
4
  "type": "module",
5
5
  "description": "Danxbot — a domain-agnostic React design system with motion as a first-class primitive.",
6
6
  "license": "MIT",