@moul-dev/ui 2026.8.18 → 2026.8.21

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.
@@ -0,0 +1,208 @@
1
+ import { StyleXStyles } from '@stylexjs/stylex';
2
+ import { Key } from 'react-aria-components';
3
+ import type * as React from 'react';
4
+ export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
5
+ export interface LogItem {
6
+ id: string | number;
7
+ timestamp?: string;
8
+ level?: LogLevel | string;
9
+ message: string;
10
+ attributes?: Record<string, string | number | boolean | null | undefined>;
11
+ raw?: string;
12
+ lineNumber?: number;
13
+ }
14
+ export type LogFilterLevel = LogLevel | 'all';
15
+ export interface LogsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style' | 'title' | 'onCopy'> {
16
+ /**
17
+ * Array of parsed log items or raw log strings.
18
+ */
19
+ data?: (LogItem | string)[];
20
+ /**
21
+ * Raw multiline text containing log lines (e.g. from server.log).
22
+ */
23
+ text?: string;
24
+ /**
25
+ * Optional title shown in the log header toolbar.
26
+ */
27
+ title?: React.ReactNode;
28
+ /**
29
+ * Whether to show the top toolbar with search, filters, and actions.
30
+ * @default true
31
+ */
32
+ showToolbar?: boolean;
33
+ /**
34
+ * Whether to show line numbers in the table.
35
+ * @default true
36
+ */
37
+ showLineNumbers?: boolean;
38
+ /**
39
+ * Whether to show timestamps.
40
+ * @default true
41
+ */
42
+ showTimestamps?: boolean;
43
+ /**
44
+ * Whether to show severity level badges.
45
+ * @default true
46
+ */
47
+ showLevels?: boolean;
48
+ /**
49
+ * Whether to render structured attribute chips in the message cell.
50
+ * @default true
51
+ */
52
+ showAttributes?: boolean;
53
+ /**
54
+ * How the inspector panel is displayed when a log row is selected.
55
+ * - 'drawer': opens a slide-out drawer from the side/bottom
56
+ * - 'inline': renders an inline details panel beneath the table
57
+ * - 'none': disables the inspector
58
+ * @default 'drawer'
59
+ */
60
+ inspectorMode?: 'drawer' | 'inline' | 'none';
61
+ /**
62
+ * Whether to show an inspector / details panel for selected log rows.
63
+ * @deprecated Use `inspectorMode` instead.
64
+ */
65
+ showInspector?: boolean;
66
+ /**
67
+ * Controlled open state for the drawer inspector.
68
+ */
69
+ isInspectorOpen?: boolean;
70
+ /**
71
+ * Default open state for the drawer inspector (initial uncontrolled state).
72
+ * Note: Changing this prop post-mount does not reset internal state; use `isInspectorOpen` for controlled state.
73
+ * @default false
74
+ */
75
+ defaultInspectorOpen?: boolean;
76
+ /**
77
+ * Callback fired when the drawer inspector opens or closes.
78
+ */
79
+ onInspectorOpenChange?: (isOpen: boolean) => void;
80
+ /**
81
+ * Drawer placement direction when inspectorMode is 'drawer'.
82
+ * @default 'right'
83
+ */
84
+ drawerPlacement?: 'top' | 'bottom' | 'left' | 'right';
85
+ /**
86
+ * Drawer size when inspectorMode is 'drawer'.
87
+ * @default 'md'
88
+ */
89
+ drawerSize?: 'sm' | 'md' | 'lg' | 'full';
90
+ /**
91
+ * Callback fired when a log row is clicked.
92
+ */
93
+ onRowClick?: (log: LogItem) => void;
94
+ /**
95
+ * Display logs in a compact table density.
96
+ * @default false
97
+ */
98
+ compact?: boolean;
99
+ /**
100
+ * Wrap long log message lines instead of truncating with ellipsis.
101
+ * @default true
102
+ */
103
+ wrapLines?: boolean;
104
+ /**
105
+ * Search input placeholder.
106
+ * @default 'Filter logs...'
107
+ */
108
+ searchPlaceholder?: string;
109
+ /**
110
+ * Maximum height of the scrollable logs container.
111
+ */
112
+ maxHeight?: string | number;
113
+ /**
114
+ * React Aria Table selection mode.
115
+ * @default 'single'
116
+ */
117
+ selectionMode?: 'none' | 'single' | 'multiple';
118
+ /**
119
+ * Currently selected log keys.
120
+ */
121
+ selectedKeys?: 'all' | Iterable<Key>;
122
+ /**
123
+ * Default selected log keys (initial uncontrolled state).
124
+ * Note: Changing this prop post-mount does not reset internal state; use `selectedKeys` for controlled state.
125
+ */
126
+ defaultSelectedKeys?: 'all' | Iterable<Key>;
127
+ /**
128
+ * Handler fired when row selection changes.
129
+ */
130
+ onSelectionChange?: (keys: 'all' | Set<Key>) => void;
131
+ /**
132
+ * Controlled filter level.
133
+ */
134
+ filterLevel?: LogFilterLevel;
135
+ /**
136
+ * Default filter level (initial uncontrolled state).
137
+ * Note: Changing this prop post-mount does not reset internal state; use `filterLevel` for controlled state.
138
+ * @default 'all'
139
+ */
140
+ defaultFilterLevel?: LogFilterLevel;
141
+ /**
142
+ * Callback fired when active filter level changes.
143
+ */
144
+ onFilterLevelChange?: (level: LogFilterLevel) => void;
145
+ /**
146
+ * Controlled search query.
147
+ */
148
+ searchQuery?: string;
149
+ /**
150
+ * Default search query (initial uncontrolled state).
151
+ * Note: Changing this prop post-mount does not reset internal state; use `searchQuery` for controlled state.
152
+ */
153
+ defaultSearchQuery?: string;
154
+ /**
155
+ * Callback fired when search query changes.
156
+ */
157
+ onSearchQueryChange?: (query: string) => void;
158
+ /**
159
+ * Callback fired when the clear button is pressed.
160
+ */
161
+ onClear?: () => void;
162
+ /**
163
+ * Callback fired when download logs button is pressed.
164
+ */
165
+ onDownload?: () => void;
166
+ /**
167
+ * Callback fired when copy button is pressed.
168
+ */
169
+ onCopy?: (text: string) => void;
170
+ /**
171
+ * Controlled follow / auto-scroll mode to tail the latest logs.
172
+ */
173
+ follow?: boolean;
174
+ /**
175
+ * Default follow / auto-scroll state (initial uncontrolled state).
176
+ * Note: Changing this prop post-mount does not reset internal state; use `follow` for controlled state.
177
+ * @default false
178
+ */
179
+ defaultFollow?: boolean;
180
+ /**
181
+ * Callback fired when follow / auto-scroll state changes (e.g. paused when scrolled up).
182
+ */
183
+ onFollowChange?: (follow: boolean) => void;
184
+ /**
185
+ * Whether to show the Follow toggle button in the top toolbar.
186
+ * @default true
187
+ */
188
+ showFollowButton?: boolean;
189
+ /**
190
+ * Whether to highlight search term matches in log messages and inspector.
191
+ * @default true
192
+ */
193
+ highlightMatches?: boolean;
194
+ /**
195
+ * Custom StyleX styles.
196
+ */
197
+ style?: StyleXStyles;
198
+ /**
199
+ * Custom CSS class name.
200
+ */
201
+ className?: string;
202
+ /**
203
+ * Accessible label for the table.
204
+ * @default 'Server Logs'
205
+ */
206
+ 'aria-label'?: string;
207
+ }
208
+ export type LogsViewerProps = LogsProps;
@@ -0,0 +1,3 @@
1
+ import { LogItem } from './Logs.types';
2
+ export declare const SERVER_LOG_RAW = "2026/08/19 11:16:49 INFO Starting mould engine server addr=\"http://localhost:8090\" env=\"development\" version=\"dev\"\n2026/08/19 11:16:49 INFO Request tracking flusher started component=\"analytics\"\n2026/08/19 11:16:50 DEBU Flushed request records component=\"analytics\" count=12\n2026/08/19 11:16:52 INFO HTTP request bytes_sent=48 ip=\"127.0.0.1\" latency=\"182.4\u00B5s\" method=\"GET\" path=\"/api/health\" status=200\n2026/08/19 11:16:55 INFO HTTP request bytes_sent=1420 email=\"alex@example.com\" ip=\"192.168.1.45\" latency=\"3.12ms\" method=\"GET\" path=\"/api/mouls/posts/records\" status=200 user_id=\"usr_01j7k9p2\"\n2026/08/19 11:17:02 WARN HTTP request bytes_sent=68 ip=\"192.168.1.45\" latency=\"410.5\u00B5s\" method=\"GET\" path=\"/api/mouls/nonexistent/records\" status=404 error=\"moul 'nonexistent' not found\"\n2026/08/19 11:17:08 WARN Request tracking channel full, dropping request component=\"analytics\" path=\"/api/events\"\n2026/08/19 11:17:15 WARN Background job failed, scheduled for retry error=\"dial tcp: lookup smtp.mailgun.org: no such host\" jobID=\"job_01j7k8a\" nextAttemptAt=\"2026-08-19 11:18:15\" worker=\"SendEmail\"\n2026/08/19 11:17:21 ERRO HTTP request bytes_sent=112 email=\"alex@example.com\" ip=\"192.168.1.80\" latency=\"14.85ms\" method=\"POST\" path=\"/api/mouls/orders/records\" status=500 user_id=\"usr_01j7k9p2\" error=\"database locked (sqlite busy)\"\n2026/08/19 11:17:25 ERRO After-webhook execution failed err=\"Post \\\"https://webhook.site/test\\\": context deadline exceeded\" url=\"https://webhook.site/test\"\n2026/08/19 11:17:30 ERRO Failed to start Litestream replication err=\"credentials not set in environment (AWS_ACCESS_KEY_ID)\"\n2026/08/19 11:17:40 INFO Cleaned up old requests count=42\n2026/08/19 11:17:40 INFO Cleaned up old visits count=15\n2026/08/19 11:17:40 INFO Cleaned up expired revoked tokens count=0\n2026/08/19 11:17:55 INFO Stopping Litestream replication...\n2026/08/19 11:17:55 INFO Server stopped gracefully\n2026/08/19 11:18:02 FATA Server failed to run err=\"listen tcp :8090: bind: address already in use\"";
3
+ export declare const SERVER_LOGS: LogItem[];
@@ -0,0 +1,4 @@
1
+ export { SERVER_LOG_RAW, SERVER_LOGS } from './exampleLogs';
2
+ export { HighlightText, type HighlightTextProps, LogAttributeChip, type LogAttributeChipProps, LogCopyIconButton, type LogCopyIconButtonProps, LogLevelBadge, type LogLevelBadgeProps, Logs, LogsViewer, } from './Logs';
3
+ export type { LogFilterLevel, LogItem, LogLevel, LogsProps, LogsViewerProps, } from './Logs.types';
4
+ export { normalizeLogLevel, parseAttributes, parseLogLine, parseLogs, stripAttributes, } from './parseLogs';
@@ -0,0 +1,21 @@
1
+ import { LogItem, LogLevel } from './Logs.types';
2
+ /**
3
+ * Normalizes any log level string into standard LogLevel.
4
+ */
5
+ export declare function normalizeLogLevel(levelStr?: string): LogLevel;
6
+ /**
7
+ * Parses key="value" or key=value key-value pairs from a log string.
8
+ */
9
+ export declare function parseAttributes(text: string): Record<string, string | number | boolean | null>;
10
+ /**
11
+ * Strips key=value pairs from the string to obtain the clean base message.
12
+ */
13
+ export declare function stripAttributes(text: string): string;
14
+ /**
15
+ * Parses a single log line into a structured LogItem.
16
+ */
17
+ export declare function parseLogLine(rawLine: string, index?: number): LogItem;
18
+ /**
19
+ * Parses raw text or list of log strings into LogItem[].
20
+ */
21
+ export declare function parseLogs(input?: string | (LogItem | string)[]): LogItem[];
@@ -11,12 +11,20 @@ export declare const styles: Readonly<{
11
11
  readonly alignItems: stylex.StyleXClassNameFor<"alignItems", "stretch">;
12
12
  readonly borderWidth: stylex.StyleXClassNameFor<"borderWidth", "1px">;
13
13
  readonly borderStyle: stylex.StyleXClassNameFor<"borderStyle", "solid">;
14
+ readonly borderColor: stylex.StyleXClassNameFor<"borderColor", string>;
15
+ readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", string>;
14
16
  readonly boxShadow: stylex.StyleXClassNameFor<"boxShadow", string>;
15
17
  readonly overflow: stylex.StyleXClassNameFor<"overflow", "hidden">;
16
18
  readonly boxSizing: stylex.StyleXClassNameFor<"boxSizing", "border-box">;
17
19
  readonly transitionProperty: stylex.StyleXClassNameFor<"transitionProperty", "border-color, box-shadow">;
18
20
  readonly transitionDuration: stylex.StyleXClassNameFor<"transitionDuration", "0.15s">;
19
21
  readonly transitionTimingFunction: stylex.StyleXClassNameFor<"transitionTimingFunction", "ease-in-out">;
22
+ readonly ':hover': stylex.StyleXClassNameFor<":hover", {
23
+ readonly borderColor: stylex.StyleXVar<string>;
24
+ }>;
25
+ readonly '@media (prefers-reduced-motion: reduce)': stylex.StyleXClassNameFor<"@media (prefers-reduced-motion: reduce)", {
26
+ readonly transitionProperty: "none";
27
+ }>;
20
28
  }>;
21
29
  readonly groupSm: Readonly<{
22
30
  readonly height: stylex.StyleXClassNameFor<"height", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
@@ -11,11 +11,19 @@ export declare const styles: Readonly<{
11
11
  readonly alignItems: stylex.StyleXClassNameFor<"alignItems", "center">;
12
12
  readonly borderWidth: stylex.StyleXClassNameFor<"borderWidth", "1px">;
13
13
  readonly borderStyle: stylex.StyleXClassNameFor<"borderStyle", "solid">;
14
+ readonly borderColor: stylex.StyleXClassNameFor<"borderColor", string>;
15
+ readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", string>;
14
16
  readonly boxShadow: stylex.StyleXClassNameFor<"boxShadow", string>;
15
17
  readonly boxSizing: stylex.StyleXClassNameFor<"boxSizing", "border-box">;
16
18
  readonly transitionProperty: stylex.StyleXClassNameFor<"transitionProperty", "border-color, box-shadow">;
17
19
  readonly transitionDuration: stylex.StyleXClassNameFor<"transitionDuration", "0.15s">;
18
20
  readonly transitionTimingFunction: stylex.StyleXClassNameFor<"transitionTimingFunction", "ease-in-out">;
21
+ readonly ':hover': stylex.StyleXClassNameFor<":hover", {
22
+ readonly borderColor: stylex.StyleXVar<string>;
23
+ }>;
24
+ readonly '@media (prefers-reduced-motion: reduce)': stylex.StyleXClassNameFor<"@media (prefers-reduced-motion: reduce)", {
25
+ readonly transitionProperty: "none";
26
+ }>;
19
27
  }>;
20
28
  readonly groupSm: Readonly<{
21
29
  readonly height: stylex.StyleXClassNameFor<"height", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
@@ -87,6 +95,21 @@ export declare const styles: Readonly<{
87
95
  readonly color: stylex.StyleXClassNameFor<"color", string>;
88
96
  readonly fontFamily: stylex.StyleXClassNameFor<"fontFamily", string>;
89
97
  readonly outline: stylex.StyleXClassNameFor<"outline", "none">;
98
+ readonly boxSizing: stylex.StyleXClassNameFor<"boxSizing", "border-box">;
99
+ readonly '::-webkit-search-cancel-button': stylex.StyleXClassNameFor<"::-webkit-search-cancel-button", {
100
+ readonly display: "none";
101
+ readonly WebkitAppearance: "none";
102
+ }>;
103
+ readonly '::-webkit-search-decoration': stylex.StyleXClassNameFor<"::-webkit-search-decoration", {
104
+ readonly display: "none";
105
+ readonly WebkitAppearance: "none";
106
+ }>;
107
+ readonly '::-webkit-search-results-button': stylex.StyleXClassNameFor<"::-webkit-search-results-button", {
108
+ readonly display: "none";
109
+ }>;
110
+ readonly '::-webkit-search-results-decoration': stylex.StyleXClassNameFor<"::-webkit-search-results-decoration", {
111
+ readonly display: "none";
112
+ }>;
90
113
  }>;
91
114
  readonly inputSm: Readonly<{
92
115
  readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", 0>;
@@ -7,6 +7,7 @@ interface SidebarContextValue {
7
7
  onSelectionChange?: (key: string) => void;
8
8
  variant: 'solid' | 'glass';
9
9
  onCollapseToggle: () => void;
10
+ showCollapseToggle?: boolean;
10
11
  }
11
12
  export declare function useSidebar(): SidebarContextValue;
12
13
  export interface SidebarProps {
@@ -62,12 +63,13 @@ export interface SidebarDividerProps {
62
63
  }
63
64
  export declare const SidebarDivider: React.ForwardRefExoticComponent<SidebarDividerProps & React.RefAttributes<HTMLDivElement>>;
64
65
  export interface SidebarAsideProps {
66
+ 'aria-label'?: string;
65
67
  style?: React.CSSProperties;
66
68
  className?: string;
67
69
  children?: React.ReactNode;
68
70
  showCollapseToggle?: boolean;
69
71
  }
70
- export declare const SidebarAside: React.ForwardRefExoticComponent<SidebarAsideProps & React.RefAttributes<HTMLDivElement>>;
72
+ export declare const SidebarAside: React.ForwardRefExoticComponent<SidebarAsideProps & React.RefAttributes<HTMLElement>>;
71
73
  export interface SidebarMainProps {
72
74
  style?: StyleXStyles;
73
75
  className?: string;
@@ -33,8 +33,12 @@ export declare const styles: Readonly<{
33
33
  readonly glass: Readonly<{
34
34
  readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", string>;
35
35
  readonly borderColor: stylex.StyleXClassNameFor<"borderColor", string>;
36
- readonly backdropFilter: stylex.StyleXClassNameFor<"backdropFilter", "blur(20px)">;
37
- readonly WebkitBackdropFilter: stylex.StyleXClassNameFor<"WebkitBackdropFilter", "blur(20px)">;
36
+ readonly '@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))': stylex.StyleXClassNameFor<"@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))", {
37
+ readonly backgroundColor: stylex.StyleXVar<string>;
38
+ readonly borderColor: stylex.StyleXVar<string>;
39
+ readonly backdropFilter: "blur(20px)";
40
+ readonly WebkitBackdropFilter: "blur(20px)";
41
+ }>;
38
42
  }>;
39
43
  readonly header: Readonly<{
40
44
  readonly display: stylex.StyleXClassNameFor<"display", "flex">;
@@ -303,9 +307,9 @@ export declare const styles: Readonly<{
303
307
  }>;
304
308
  readonly layout: Readonly<{
305
309
  readonly display: stylex.StyleXClassNameFor<"display", "flex">;
306
- readonly height: stylex.StyleXClassNameFor<"height", "100vh">;
307
- readonly maxHeight: stylex.StyleXClassNameFor<"maxHeight", "100vh">;
308
- readonly width: stylex.StyleXClassNameFor<"width", "100vw">;
310
+ readonly height: stylex.StyleXClassNameFor<"height", "100%">;
311
+ readonly maxHeight: stylex.StyleXClassNameFor<"maxHeight", "100%">;
312
+ readonly width: stylex.StyleXClassNameFor<"width", "100%">;
309
313
  readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", string>;
310
314
  readonly color: stylex.StyleXClassNameFor<"color", string>;
311
315
  readonly fontFamily: stylex.StyleXClassNameFor<"fontFamily", string>;
@@ -16,6 +16,8 @@ export declare const styles: Readonly<{
16
16
  readonly borderRadius: stylex.StyleXClassNameFor<"borderRadius", string>;
17
17
  readonly borderWidth: stylex.StyleXClassNameFor<"borderWidth", "1px">;
18
18
  readonly borderStyle: stylex.StyleXClassNameFor<"borderStyle", "solid">;
19
+ readonly borderColor: stylex.StyleXClassNameFor<"borderColor", string>;
20
+ readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", string>;
19
21
  readonly color: stylex.StyleXClassNameFor<"color", string>;
20
22
  readonly fontFamily: stylex.StyleXClassNameFor<"fontFamily", string>;
21
23
  readonly fontSize: stylex.StyleXClassNameFor<"fontSize", string>;
@@ -11,6 +11,8 @@ export declare const styles: Readonly<{
11
11
  readonly width: stylex.StyleXClassNameFor<"width", "100%">;
12
12
  readonly borderWidth: stylex.StyleXClassNameFor<"borderWidth", "1px">;
13
13
  readonly borderStyle: stylex.StyleXClassNameFor<"borderStyle", "solid">;
14
+ readonly borderColor: stylex.StyleXClassNameFor<"borderColor", string>;
15
+ readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", string>;
14
16
  readonly color: stylex.StyleXClassNameFor<"color", string>;
15
17
  readonly fontFamily: stylex.StyleXClassNameFor<"fontFamily", string>;
16
18
  readonly outline: stylex.StyleXClassNameFor<"outline", "none">;
@@ -6,6 +6,6 @@ export interface ToggleButtonProps extends Omit<AriaToggleButtonProps, 'style'>
6
6
  className?: string;
7
7
  size?: 'sm' | 'md' | 'lg';
8
8
  variant?: 'primary' | 'secondary';
9
- isSquare?: boolean;
9
+ isIcon?: boolean;
10
10
  }
11
11
  export declare const ToggleButton: React.ForwardRefExoticComponent<ToggleButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -4,8 +4,10 @@ export declare const styles: Readonly<{
4
4
  readonly display: stylex.StyleXClassNameFor<"display", "inline-flex">;
5
5
  readonly alignItems: stylex.StyleXClassNameFor<"alignItems", "center">;
6
6
  readonly justifyContent: stylex.StyleXClassNameFor<"justifyContent", "center">;
7
+ readonly gap: stylex.StyleXClassNameFor<"gap", string>;
7
8
  readonly fontWeight: stylex.StyleXClassNameFor<"fontWeight", string>;
8
9
  readonly cursor: stylex.StyleXClassNameFor<"cursor", "pointer">;
10
+ readonly boxSizing: stylex.StyleXClassNameFor<"boxSizing", "border-box">;
9
11
  readonly transitionProperty: stylex.StyleXClassNameFor<"transitionProperty", "background-color, border-color, color, transform">;
10
12
  readonly transitionDuration: stylex.StyleXClassNameFor<"transitionDuration", "0.15s">;
11
13
  readonly transitionTimingFunction: stylex.StyleXClassNameFor<"transitionTimingFunction", "ease-in-out">;
@@ -26,21 +28,24 @@ export declare const styles: Readonly<{
26
28
  }>;
27
29
  }>;
28
30
  readonly sm: Readonly<{
29
- readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", string>;
31
+ readonly height: stylex.StyleXClassNameFor<"height", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
32
+ readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", 0>;
30
33
  readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", string>;
31
34
  readonly borderRadius: stylex.StyleXClassNameFor<"borderRadius", string>;
32
35
  readonly fontSize: stylex.StyleXClassNameFor<"fontSize", string>;
33
36
  readonly lineHeight: stylex.StyleXClassNameFor<"lineHeight", string>;
34
37
  }>;
35
38
  readonly md: Readonly<{
36
- readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", string>;
39
+ readonly height: stylex.StyleXClassNameFor<"height", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
40
+ readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", 0>;
37
41
  readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", string>;
38
42
  readonly borderRadius: stylex.StyleXClassNameFor<"borderRadius", string>;
39
43
  readonly fontSize: stylex.StyleXClassNameFor<"fontSize", string>;
40
44
  readonly lineHeight: stylex.StyleXClassNameFor<"lineHeight", string>;
41
45
  }>;
42
46
  readonly lg: Readonly<{
43
- readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", string>;
47
+ readonly height: stylex.StyleXClassNameFor<"height", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
48
+ readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", 0>;
44
49
  readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", string>;
45
50
  readonly borderRadius: stylex.StyleXClassNameFor<"borderRadius", string>;
46
51
  readonly fontSize: stylex.StyleXClassNameFor<"fontSize", string>;
@@ -208,16 +213,19 @@ export declare const styles: Readonly<{
208
213
  readonly selectionIndicatorSecondary: Readonly<{
209
214
  readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", string>;
210
215
  }>;
211
- readonly squareSm: Readonly<{
212
- readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", string>;
213
- readonly aspectRatio: stylex.StyleXClassNameFor<"aspectRatio", "1/1">;
216
+ readonly iconSm: Readonly<{
217
+ readonly width: stylex.StyleXClassNameFor<"width", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
218
+ readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", 0>;
219
+ readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", 0>;
214
220
  }>;
215
- readonly squareMd: Readonly<{
216
- readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", string>;
217
- readonly aspectRatio: stylex.StyleXClassNameFor<"aspectRatio", "1/1">;
221
+ readonly iconMd: Readonly<{
222
+ readonly width: stylex.StyleXClassNameFor<"width", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
223
+ readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", 0>;
224
+ readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", 0>;
218
225
  }>;
219
- readonly squareLg: Readonly<{
220
- readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", string>;
221
- readonly aspectRatio: stylex.StyleXClassNameFor<"aspectRatio", "1/1">;
226
+ readonly iconLg: Readonly<{
227
+ readonly width: stylex.StyleXClassNameFor<"width", `calc(${stylex.StyleXVar<string>} * 2 + ${stylex.StyleXVar<string>})`>;
228
+ readonly paddingInline: stylex.StyleXClassNameFor<"paddingInline", 0>;
229
+ readonly paddingBlock: stylex.StyleXClassNameFor<"paddingBlock", 0>;
222
230
  }>;
223
231
  }>;
@@ -1,4 +1,4 @@
1
- export declare const version = "2026.08.18";
1
+ export declare const version = "2026.08.21";
2
2
  export { Alert } from './components/Alert';
3
3
  export type { AlertProps, AlertVariant } from './components/Alert/Alert';
4
4
  export { AlertDialog, AlertDialogBody, AlertDialogFooter, AlertDialogHeader, } from './components/AlertDialog';
@@ -49,6 +49,8 @@ export type { LineChartProps } from './components/LineChart';
49
49
  export { LineChart } from './components/LineChart';
50
50
  export { Link } from './components/Link';
51
51
  export type { LinkProps } from './components/Link/Link';
52
+ export type { HighlightTextProps, LogAttributeChipProps, LogFilterLevel, LogItem, LogLevel, LogLevelBadgeProps, LogsProps, LogsViewerProps, } from './components/LogsViewer';
53
+ export { HighlightText, LogAttributeChip, LogLevelBadge, Logs, LogsViewer, normalizeLogLevel, parseAttributes, parseLogLine, parseLogs, SERVER_LOG_RAW, SERVER_LOGS, stripAttributes, } from './components/LogsViewer';
52
54
  export { Modal, ModalBody, ModalDialog, ModalFooter, ModalHeader, ModalOverlay, } from './components/Modal';
53
55
  export type { ModalBodyProps, ModalDialogProps, ModalFooterProps, ModalHeaderProps, ModalOverlayProps, ModalProps, } from './components/Modal/Modal';
54
56
  export { NumberField } from './components/NumberField';
@@ -101,4 +103,5 @@ export { Typography, TypographyHeading, TypographyLabel, TypographyParagraph, Ty
101
103
  export type { HeadingProps, ParagraphProps, SpanProps, TypographyLabelProps, TypographyProps, TypographyTag, } from './components/Typography/Typography';
102
104
  export type { ThemeProviderProps } from './theme/ThemeProvider';
103
105
  export { ThemeProvider } from './theme/ThemeProvider';
106
+ export type { Tokens } from './tokens/tokens.stylex';
104
107
  export { tokens } from './tokens/tokens.stylex';
@@ -119,3 +119,4 @@ export declare const tokens: stylex.VarGroup<Readonly<{
119
119
  colorChart7: string;
120
120
  colorChart8: string;
121
121
  }>, symbol>;
122
+ export type Tokens = typeof tokens;
@@ -0,0 +1,126 @@
1
+ "use client";
2
+ import "@stylexjs/stylex";
3
+ //#region src/tokens/tokens.stylex.ts
4
+ var e = {
5
+ colorNeutral50: "var(--x1ox3f4o)",
6
+ colorNeutral100: "var(--x1oziaxx)",
7
+ colorNeutral200: "var(--xekkakv)",
8
+ colorNeutral300: "var(--x4npmm6)",
9
+ colorNeutral400: "var(--x6l5ye8)",
10
+ colorNeutral500: "var(--x1s9rx7n)",
11
+ colorNeutral600: "var(--x7rwqrp)",
12
+ colorNeutral700: "var(--x1ol9w3z)",
13
+ colorNeutral800: "var(--xaubso4)",
14
+ colorNeutral900: "var(--x21z8aa)",
15
+ colorPrimary50: "var(--x1l7m7gb)",
16
+ colorPrimary100: "var(--xvy7zpp)",
17
+ colorPrimary200: "var(--x189jvvz)",
18
+ colorPrimary300: "var(--x1smr4m2)",
19
+ colorPrimary400: "var(--x1p3wd7v)",
20
+ colorPrimary500: "var(--x11vz4nw)",
21
+ colorPrimary600: "var(--x19wncxt)",
22
+ colorPrimary700: "var(--xms5kwx)",
23
+ colorPrimary800: "var(--x1f1ph2q)",
24
+ colorPrimary900: "var(--x27tw8h)",
25
+ colorError300: "var(--xywa26s)",
26
+ colorError400: "var(--x1ttemnr)",
27
+ colorError500: "var(--xgm7y0w)",
28
+ colorError600: "var(--x14tkvwa)",
29
+ colorError700: "var(--xle5duh)",
30
+ colorWarning300: "var(--xxkj1oe)",
31
+ colorWarning400: "var(--xvbe47b)",
32
+ colorWarning500: "var(--x9boa8o)",
33
+ colorWarning600: "var(--x1foz1o3)",
34
+ colorWarning700: "var(--x1i80a2t)",
35
+ colorSuccess300: "var(--x1eg0uv7)",
36
+ colorSuccess400: "var(--x1xkz733)",
37
+ colorSuccess500: "var(--xo79180)",
38
+ colorSuccess600: "var(--xftmch4)",
39
+ colorSuccess700: "var(--x6beaur)",
40
+ colorBg: "var(--x1poa4dm)",
41
+ colorBgSubtle: "var(--xg2wbmg)",
42
+ colorBgElevated: "var(--x1qnu6yg)",
43
+ colorFg: "var(--x1jfchzy)",
44
+ colorFgSubtle: "var(--xaffrw6)",
45
+ colorFgOnPrimary: "var(--x16n9mb9)",
46
+ colorBorder: "var(--x1t7g4u6)",
47
+ colorBorderSubtle: "var(--xrlp4ei)",
48
+ colorBorderFocus: "var(--x79fgis)",
49
+ colorBgGlass: "var(--x7we1u4)",
50
+ colorBorderGlass: "var(--x8ovk6j)",
51
+ colorShadow: "var(--x1qvbbfx)",
52
+ colorOverlay: "var(--x2r2dxw)",
53
+ colorAlertBgInfo: "var(--x1yncxg9)",
54
+ colorAlertBorderInfo: "var(--xgvswlc)",
55
+ colorAlertHoverInfo: "var(--xdv3703)",
56
+ colorAlertActiveInfo: "var(--x1b4xit2)",
57
+ colorAlertBgAccent: "var(--xfh678y)",
58
+ colorAlertBorderAccent: "var(--xtwqyzw)",
59
+ colorAlertHoverAccent: "var(--x2hivg9)",
60
+ colorAlertActiveAccent: "var(--x1wzp30q)",
61
+ colorAlertBgSuccess: "var(--xvq252x)",
62
+ colorAlertBorderSuccess: "var(--x1iepgx6)",
63
+ colorAlertHoverSuccess: "var(--x1gcqxgm)",
64
+ colorAlertActiveSuccess: "var(--x1epzsal)",
65
+ colorAlertBgWarning: "var(--xg2n39v)",
66
+ colorAlertBorderWarning: "var(--x1n16z78)",
67
+ colorAlertHoverWarning: "var(--xq3y2id)",
68
+ colorAlertActiveWarning: "var(--xf8i1ro)",
69
+ colorAlertBgError: "var(--x1u4wyvx)",
70
+ colorAlertBorderError: "var(--xwq48n1)",
71
+ colorAlertHoverError: "var(--x1cujurv)",
72
+ colorAlertActiveError: "var(--x3091pa)",
73
+ fontSizeXs: "var(--xpanzj7)",
74
+ fontSizeSm: "var(--xz9ra21)",
75
+ fontSizeMd: "var(--x19jnf71)",
76
+ fontSizeLg: "var(--x16hg6gx)",
77
+ fontSizeXl: "var(--xkl0paq)",
78
+ fontSizeXxl: "var(--x18r5va)",
79
+ fontSize3xl: "var(--x1cwqm9m)",
80
+ fontSize4xl: "var(--x14r6drk)",
81
+ lineHeightXs: "var(--x1vx0k0f)",
82
+ lineHeightSm: "var(--x186dp4y)",
83
+ lineHeightMd: "var(--x1bapz3m)",
84
+ lineHeightLg: "var(--x107177a)",
85
+ lineHeightXl: "var(--x1x2zchm)",
86
+ lineHeightXxl: "var(--x1t135xi)",
87
+ lineHeight3xl: "var(--xqmssti)",
88
+ lineHeight4xl: "var(--x1458rh6)",
89
+ fontWeightNormal: "var(--x1oo7w7q)",
90
+ fontWeightMedium: "var(--x1i7new4)",
91
+ fontWeightSemibold: "var(--xrtlgup)",
92
+ fontWeightBold: "var(--x1jugmoa)",
93
+ fontFamilyBase: "var(--xb7uvbd)",
94
+ spacing1: "var(--x1jforli)",
95
+ spacing2: "var(--x9epbqz)",
96
+ spacing3: "var(--x1fim08e)",
97
+ spacing4: "var(--x1djehx3)",
98
+ spacing5: "var(--xpmkuee)",
99
+ spacing6: "var(--x1xsmz2k)",
100
+ spacing7: "var(--x1aetgvy)",
101
+ spacing8: "var(--x3461u0)",
102
+ radiusNone: "var(--x10dfn0a)",
103
+ radiusSm: "var(--xcxkm4p)",
104
+ radiusMd: "var(--x11qts0k)",
105
+ radiusLg: "var(--x8ikvy7)",
106
+ radiusFull: "var(--x69bofi)",
107
+ shadowSm: "var(--x1nbpjwp)",
108
+ shadowMd: "var(--xi6zbv0)",
109
+ shadowLg: "var(--xckknmd)",
110
+ zIndexBase: "var(--x1x05ep0)",
111
+ zIndexDropdown: "var(--x1r4igc)",
112
+ zIndexModal: "var(--xjyalnt)",
113
+ zIndexTooltip: "var(--x1yamzkk)",
114
+ zIndexToast: "var(--xd3kluz)",
115
+ colorChart1: "var(--x1sjgkb4)",
116
+ colorChart2: "var(--xndyysw)",
117
+ colorChart3: "var(--x97jlmp)",
118
+ colorChart4: "var(--x1te5qoh)",
119
+ colorChart5: "var(--x174xad0)",
120
+ colorChart6: "var(--xljzat3)",
121
+ colorChart7: "var(--x76stw)",
122
+ colorChart8: "var(--x2x0qih)",
123
+ __varGroupHash__: "x1x2wves"
124
+ };
125
+ //#endregion
126
+ export { e as tokens };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moul-dev/ui",
3
- "version": "2026.08.18",
3
+ "version": "2026.08.21",
4
4
  "description": "Accessible, zero-runtime React component library built on React Aria and StyleX",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -39,6 +39,14 @@
39
39
  "types": "./dist/src/index.d.ts",
40
40
  "import": "./dist/moul-ui.js"
41
41
  },
42
+ "./tokens": {
43
+ "types": "./dist/src/tokens/tokens.stylex.d.ts",
44
+ "import": "./dist/tokens.stylex.js"
45
+ },
46
+ "./tokens.stylex": {
47
+ "types": "./dist/src/tokens/tokens.stylex.d.ts",
48
+ "import": "./dist/tokens.stylex.js"
49
+ },
42
50
  "./style": {
43
51
  "style": "./dist/assets/stylex.css",
44
52
  "default": "./dist/assets/stylex.css"
@@ -61,6 +69,7 @@
61
69
  "react-dom": "^18.0.0 || ^19.0.0"
62
70
  },
63
71
  "dependencies": {
72
+ "@phosphor-icons/react": "^2.1.10",
64
73
  "@stylexjs/stylex": "^0.19.0",
65
74
  "input-otp": "^1.4.2",
66
75
  "react-aria": "^3.50.0",