@jacshuo/onyx 2.5.0 → 2.7.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.
@@ -1,6 +1,7 @@
1
1
  /* TypewriterText.css — cursor animations */
2
2
 
3
3
  /* ── Block cursor blink ────────────────────────────────── */
4
+
4
5
  @keyframes tw-blink {
5
6
  0%,
6
7
  100% {
@@ -12,6 +13,7 @@
12
13
  }
13
14
 
14
15
  /* ── Gentle fade-out on completion ───────────────────────── */
16
+
15
17
  @keyframes tw-cursor-out {
16
18
  0% {
17
19
  opacity: 1;
@@ -25,6 +27,7 @@
25
27
  }
26
28
 
27
29
  /* ── Image fade-in for rich mode ─────────────────────────── */
30
+
28
31
  @keyframes tw-img-fade-in {
29
32
  from {
30
33
  opacity: 0;
@@ -37,6 +40,7 @@
37
40
  }
38
41
 
39
42
  /* ── Base cursor element ─────────────────────────────────── */
43
+
40
44
  .tw-cursor {
41
45
  display: inline-block;
42
46
  line-height: 1;
@@ -50,17 +54,20 @@
50
54
  }
51
55
 
52
56
  /* Thinking / waiting — slow, step-style blink */
57
+
53
58
  .tw-cursor--blink {
54
59
  animation: tw-blink 1s step-end infinite;
55
60
  }
56
61
 
57
62
  /* Actively typing — solid, no blink */
63
+
58
64
  .tw-cursor--solid {
59
65
  opacity: 1;
60
66
  animation: none;
61
67
  }
62
68
 
63
69
  /* Done — fade away */
70
+
64
71
  .tw-cursor--out {
65
72
  animation: tw-cursor-out 0.6s ease-out forwards;
66
73
  pointer-events: none;
@@ -71,6 +78,7 @@
71
78
  ═══════════════════════════════════════════════════════════ */
72
79
 
73
80
  /* ── Prose container ─────────────────────────────────────── */
81
+
74
82
  .tw-rich-prose {
75
83
  font-size: 0.875rem;
76
84
  line-height: 1.75;
@@ -84,6 +92,7 @@
84
92
  }
85
93
 
86
94
  /* ── Headings ────────────────────────────────────────────── */
95
+
87
96
  .tw-rich-prose h1,
88
97
  .tw-rich-prose h2,
89
98
  .tw-rich-prose h3,
@@ -109,21 +118,26 @@
109
118
  .tw-rich-prose h1 {
110
119
  font-size: 1.5rem;
111
120
  }
121
+
112
122
  .tw-rich-prose h2 {
113
123
  font-size: 1.25rem;
114
124
  }
125
+
115
126
  .tw-rich-prose h3 {
116
127
  font-size: 1.125rem;
117
128
  }
129
+
118
130
  .tw-rich-prose h4 {
119
131
  font-size: 1rem;
120
132
  }
133
+
121
134
  .tw-rich-prose h5,
122
135
  .tw-rich-prose h6 {
123
136
  font-size: 0.875rem;
124
137
  }
125
138
 
126
139
  /* ── Paragraphs ──────────────────────────────────────────── */
140
+
127
141
  .tw-rich-prose p {
128
142
  margin-top: 0.625rem;
129
143
  margin-bottom: 0.625rem;
@@ -138,6 +152,7 @@
138
152
  }
139
153
 
140
154
  /* ── Inline code ─────────────────────────────────────────── */
155
+
141
156
  .tw-rich-prose :not(pre) > code {
142
157
  background-color: var(--color-primary-100);
143
158
  color: var(--color-primary-700);
@@ -145,16 +160,21 @@
145
160
  border-radius: 0.25rem;
146
161
  font-size: 0.8125em;
147
162
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
163
+ border: 1px solid var(--color-primary-200);
148
164
  }
149
165
 
150
166
  .dark .tw-rich-prose :not(pre) > code {
151
- background-color: var(--color-primary-800);
167
+ /* primary-900 is darker than the AI bubble's primary-800 — creates visible contrast */
168
+ background-color: var(--color-primary-900);
152
169
  color: var(--color-primary-200);
170
+ border-color: var(--color-primary-700);
153
171
  }
154
172
 
155
173
  /* ── Fenced code blocks ──────────────────────────────────── */
174
+
156
175
  .tw-rich-prose pre {
157
176
  background-color: var(--color-primary-100);
177
+ border: 1px solid var(--color-primary-200);
158
178
  border-radius: 0.5rem;
159
179
  padding: 0.875rem 1rem;
160
180
  overflow-x: auto;
@@ -165,7 +185,9 @@
165
185
  }
166
186
 
167
187
  .dark .tw-rich-prose pre {
168
- background-color: var(--color-primary-800);
188
+ /* primary-900 (#0f172a) is darker than the AI bubble's primary-800 (#1e293b) */
189
+ background-color: var(--color-primary-900);
190
+ border-color: var(--color-primary-700);
169
191
  }
170
192
 
171
193
  .tw-rich-prose pre > code {
@@ -177,6 +199,7 @@
177
199
  }
178
200
 
179
201
  /* ── Blockquotes ─────────────────────────────────────────── */
202
+
180
203
  .tw-rich-prose blockquote {
181
204
  border-left: 3px solid var(--color-primary-400);
182
205
  padding: 0.375rem 0 0.375rem 1rem;
@@ -191,6 +214,7 @@
191
214
  }
192
215
 
193
216
  /* ── Lists ───────────────────────────────────────────────── */
217
+
194
218
  .tw-rich-prose ul,
195
219
  .tw-rich-prose ol {
196
220
  padding-left: 1.5rem;
@@ -215,6 +239,7 @@
215
239
  }
216
240
 
217
241
  /* ── Horizontal rule ─────────────────────────────────────── */
242
+
218
243
  .tw-rich-prose hr {
219
244
  border: none;
220
245
  border-top: 1px solid var(--color-primary-200);
@@ -226,6 +251,7 @@
226
251
  }
227
252
 
228
253
  /* ── Links ───────────────────────────────────────────────── */
254
+
229
255
  .tw-rich-prose a {
230
256
  color: var(--color-primary-600);
231
257
  text-decoration: underline;
@@ -245,6 +271,7 @@
245
271
  }
246
272
 
247
273
  /* ── strong / em baseline ────────────────────────────────── */
274
+
248
275
  .tw-rich-prose strong {
249
276
  font-weight: 700;
250
277
  }
@@ -258,12 +285,14 @@
258
285
  ═══════════════════════════════════════════════════════════ */
259
286
 
260
287
  /* Figure wrapper */
288
+
261
289
  .tw-rich-img-wrap {
262
290
  display: block;
263
291
  margin: 0.875rem 0;
264
292
  }
265
293
 
266
294
  /* Actual image */
295
+
267
296
  .tw-rich-img {
268
297
  display: block;
269
298
  max-width: 100%;
@@ -277,6 +306,7 @@
277
306
  }
278
307
 
279
308
  /* Error state overlay (hidden by default) */
309
+
280
310
  .tw-rich-img-error {
281
311
  display: none;
282
312
  flex-direction: column;
@@ -300,6 +330,7 @@
300
330
  }
301
331
 
302
332
  /* Toggle error state via JS class added by the image error handler */
333
+
303
334
  .tw-rich-img-wrap--error .tw-rich-img {
304
335
  display: none;
305
336
  }
@@ -307,3 +338,48 @@
307
338
  .tw-rich-img-wrap--error .tw-rich-img-error {
308
339
  display: flex;
309
340
  }
341
+
342
+ /* ═══════════════════════════════════════════════════════════
343
+ LATEX / KATEX — math formula rendering
344
+ Requires: @import 'katex/dist/katex.min.css' in your app CSS.
345
+ ═══════════════════════════════════════════════════════════ */
346
+
347
+ /* ── Display (block) math ────────────────────────────────── */
348
+
349
+ .tw-rich-prose .katex-display {
350
+ display: block;
351
+ margin: 0.875rem 0;
352
+ overflow-x: auto;
353
+ overflow-y: hidden;
354
+ text-align: center;
355
+ }
356
+
357
+ /* ── Inline math ─────────────────────────────────────────── */
358
+
359
+ .tw-rich-prose .katex {
360
+ font-size: 1.05em;
361
+ line-height: 1.2;
362
+ }
363
+
364
+ /* ── Dark-mode: KaTeX inherits color by default, but
365
+ the KaTeX SVG path elements need a nudge ─────────────── */
366
+
367
+ .dark .tw-rich-prose .katex {
368
+ color: inherit;
369
+ }
370
+
371
+ /* ── Fallback for failed / unsupported LaTeX ────────────── */
372
+
373
+ .tw-latex-raw {
374
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
375
+ font-size: 0.8125em;
376
+ color: var(--color-warning-600);
377
+ background-color: var(--color-warning-50);
378
+ padding: 0.1em 0.3em;
379
+ border-radius: 0.25rem;
380
+ }
381
+
382
+ .dark .tw-latex-raw {
383
+ color: var(--color-warning-400);
384
+ background-color: color-mix(in srgb, var(--color-warning-900) 40%, transparent);
385
+ }
@@ -2622,9 +2622,6 @@
2622
2622
  .whitespace-pre {
2623
2623
  white-space: pre;
2624
2624
  }
2625
- .whitespace-pre-wrap {
2626
- white-space: pre-wrap;
2627
- }
2628
2625
  .text-\(--accent\) {
2629
2626
  color: var(--accent);
2630
2627
  }
package/dist/styles.css CHANGED
@@ -2642,9 +2642,6 @@
2642
2642
  .whitespace-pre {
2643
2643
  white-space: pre;
2644
2644
  }
2645
- .whitespace-pre-wrap {
2646
- white-space: pre-wrap;
2647
- }
2648
2645
  .text-\(--accent\) {
2649
2646
  color: var(--accent);
2650
2647
  }
@@ -7081,6 +7078,260 @@
7081
7078
  .dtp-btn-confirm:active {
7082
7079
  transform: translateY(0);
7083
7080
  }
7081
+ @keyframes tw-blink {
7082
+ 0%, 100% {
7083
+ opacity: 1;
7084
+ }
7085
+ 50% {
7086
+ opacity: 0;
7087
+ }
7088
+ }
7089
+ @keyframes tw-cursor-out {
7090
+ 0% {
7091
+ opacity: 1;
7092
+ }
7093
+ 80% {
7094
+ opacity: 1;
7095
+ }
7096
+ 100% {
7097
+ opacity: 0;
7098
+ }
7099
+ }
7100
+ @keyframes tw-img-fade-in {
7101
+ from {
7102
+ opacity: 0;
7103
+ transform: translateY(5px);
7104
+ }
7105
+ to {
7106
+ opacity: 1;
7107
+ transform: translateY(0);
7108
+ }
7109
+ }
7110
+ .tw-cursor {
7111
+ display: inline-block;
7112
+ line-height: 1;
7113
+ vertical-align: baseline;
7114
+ user-select: none;
7115
+ transform: scaleY(0.88);
7116
+ transform-origin: 50% 90%;
7117
+ color: currentColor;
7118
+ }
7119
+ .tw-cursor--blink {
7120
+ animation: tw-blink 1s step-end infinite;
7121
+ }
7122
+ .tw-cursor--solid {
7123
+ opacity: 1;
7124
+ animation: none;
7125
+ }
7126
+ .tw-cursor--out {
7127
+ animation: tw-cursor-out 0.6s ease-out forwards;
7128
+ pointer-events: none;
7129
+ }
7130
+ .tw-rich-prose {
7131
+ font-size: 0.875rem;
7132
+ line-height: 1.75;
7133
+ color: var(--color-primary-900);
7134
+ word-break: break-word;
7135
+ overflow-wrap: break-word;
7136
+ }
7137
+ .dark .tw-rich-prose {
7138
+ color: var(--color-primary-100);
7139
+ }
7140
+ .tw-rich-prose h1, .tw-rich-prose h2, .tw-rich-prose h3, .tw-rich-prose h4, .tw-rich-prose h5, .tw-rich-prose h6 {
7141
+ font-weight: 700;
7142
+ line-height: 1.3;
7143
+ margin-top: 1.25rem;
7144
+ margin-bottom: 0.375rem;
7145
+ color: var(--color-primary-950);
7146
+ }
7147
+ .dark .tw-rich-prose h1, .dark .tw-rich-prose h2, .dark .tw-rich-prose h3, .dark .tw-rich-prose h4, .dark .tw-rich-prose h5, .dark .tw-rich-prose h6 {
7148
+ color: var(--color-primary-50);
7149
+ }
7150
+ .tw-rich-prose h1 {
7151
+ font-size: 1.5rem;
7152
+ }
7153
+ .tw-rich-prose h2 {
7154
+ font-size: 1.25rem;
7155
+ }
7156
+ .tw-rich-prose h3 {
7157
+ font-size: 1.125rem;
7158
+ }
7159
+ .tw-rich-prose h4 {
7160
+ font-size: 1rem;
7161
+ }
7162
+ .tw-rich-prose h5, .tw-rich-prose h6 {
7163
+ font-size: 0.875rem;
7164
+ }
7165
+ .tw-rich-prose p {
7166
+ margin-top: 0.625rem;
7167
+ margin-bottom: 0.625rem;
7168
+ }
7169
+ .tw-rich-prose p:first-child {
7170
+ margin-top: 0;
7171
+ }
7172
+ .tw-rich-prose p:last-child {
7173
+ margin-bottom: 0;
7174
+ }
7175
+ .tw-rich-prose :not(pre) > code {
7176
+ background-color: var(--color-primary-100);
7177
+ color: var(--color-primary-700);
7178
+ padding: 0.1em 0.35em;
7179
+ border-radius: 0.25rem;
7180
+ font-size: 0.8125em;
7181
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
7182
+ border: 1px solid var(--color-primary-200);
7183
+ }
7184
+ .dark .tw-rich-prose :not(pre) > code {
7185
+ background-color: var(--color-primary-900);
7186
+ color: var(--color-primary-200);
7187
+ border-color: var(--color-primary-700);
7188
+ }
7189
+ .tw-rich-prose pre {
7190
+ background-color: var(--color-primary-100);
7191
+ border: 1px solid var(--color-primary-200);
7192
+ border-radius: 0.5rem;
7193
+ padding: 0.875rem 1rem;
7194
+ overflow-x: auto;
7195
+ margin: 0.75rem 0;
7196
+ font-size: 0.8125rem;
7197
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
7198
+ line-height: 1.6;
7199
+ }
7200
+ .dark .tw-rich-prose pre {
7201
+ background-color: var(--color-primary-900);
7202
+ border-color: var(--color-primary-700);
7203
+ }
7204
+ .tw-rich-prose pre > code {
7205
+ background: none;
7206
+ padding: 0;
7207
+ font-size: inherit;
7208
+ color: inherit;
7209
+ border-radius: 0;
7210
+ }
7211
+ .tw-rich-prose blockquote {
7212
+ border-left: 3px solid var(--color-primary-400);
7213
+ padding: 0.375rem 0 0.375rem 1rem;
7214
+ margin: 0.75rem 0;
7215
+ color: var(--color-primary-600);
7216
+ font-style: italic;
7217
+ }
7218
+ .dark .tw-rich-prose blockquote {
7219
+ border-left-color: var(--color-primary-500);
7220
+ color: var(--color-primary-400);
7221
+ }
7222
+ .tw-rich-prose ul, .tw-rich-prose ol {
7223
+ padding-left: 1.5rem;
7224
+ margin: 0.5rem 0;
7225
+ }
7226
+ .tw-rich-prose ul {
7227
+ list-style: disc;
7228
+ }
7229
+ .tw-rich-prose ol {
7230
+ list-style: decimal;
7231
+ }
7232
+ .tw-rich-prose li {
7233
+ margin: 0.25rem 0;
7234
+ }
7235
+ .tw-rich-prose li > ul, .tw-rich-prose li > ol {
7236
+ margin: 0.125rem 0 0.125rem 0.25rem;
7237
+ }
7238
+ .tw-rich-prose hr {
7239
+ border: none;
7240
+ border-top: 1px solid var(--color-primary-200);
7241
+ margin: 1.25rem 0;
7242
+ }
7243
+ .dark .tw-rich-prose hr {
7244
+ border-top-color: var(--color-primary-700);
7245
+ }
7246
+ .tw-rich-prose a {
7247
+ color: var(--color-primary-600);
7248
+ text-decoration: underline;
7249
+ text-underline-offset: 2px;
7250
+ }
7251
+ .tw-rich-prose a:hover {
7252
+ color: var(--color-primary-800);
7253
+ }
7254
+ .dark .tw-rich-prose a {
7255
+ color: var(--color-primary-400);
7256
+ }
7257
+ .dark .tw-rich-prose a:hover {
7258
+ color: var(--color-primary-200);
7259
+ }
7260
+ .tw-rich-prose strong {
7261
+ font-weight: 700;
7262
+ }
7263
+ .tw-rich-prose em {
7264
+ font-style: italic;
7265
+ }
7266
+ .tw-rich-img-wrap {
7267
+ display: block;
7268
+ margin: 0.875rem 0;
7269
+ }
7270
+ .tw-rich-img {
7271
+ display: block;
7272
+ max-width: 100%;
7273
+ border-radius: 0.5rem;
7274
+ box-shadow: 0 2px 8px rgb(0 0 0 / 0.1);
7275
+ animation: tw-img-fade-in 0.4s ease-out both;
7276
+ }
7277
+ .dark .tw-rich-img {
7278
+ box-shadow: 0 2px 8px rgb(0 0 0 / 0.3);
7279
+ }
7280
+ .tw-rich-img-error {
7281
+ display: none;
7282
+ flex-direction: column;
7283
+ align-items: center;
7284
+ justify-content: center;
7285
+ gap: 0.5rem;
7286
+ padding: 1.5rem;
7287
+ border-radius: 0.5rem;
7288
+ background-color: var(--color-primary-100);
7289
+ color: var(--color-primary-400);
7290
+ font-size: 0.75rem;
7291
+ font-style: normal;
7292
+ text-align: center;
7293
+ min-height: 80px;
7294
+ max-width: 100%;
7295
+ }
7296
+ .dark .tw-rich-img-error {
7297
+ background-color: var(--color-primary-800);
7298
+ color: var(--color-primary-500);
7299
+ }
7300
+ .tw-rich-img-wrap--error .tw-rich-img {
7301
+ display: none;
7302
+ }
7303
+ .tw-rich-img-wrap--error .tw-rich-img-error {
7304
+ display: flex;
7305
+ }
7306
+ .tw-rich-prose .katex-display {
7307
+ display: block;
7308
+ margin: 0.875rem 0;
7309
+ overflow-x: auto;
7310
+ overflow-y: hidden;
7311
+ text-align: center;
7312
+ }
7313
+ .tw-rich-prose .katex {
7314
+ font-size: 1.05em;
7315
+ line-height: 1.2;
7316
+ }
7317
+ .dark .tw-rich-prose .katex {
7318
+ color: inherit;
7319
+ }
7320
+ .tw-latex-raw {
7321
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
7322
+ font-size: 0.8125em;
7323
+ color: var(--color-warning-600);
7324
+ background-color: var(--color-warning-50);
7325
+ padding: 0.1em 0.3em;
7326
+ border-radius: 0.25rem;
7327
+ }
7328
+ .dark .tw-latex-raw {
7329
+ color: var(--color-warning-400);
7330
+ background-color: color-mix(in srgb, oklch(40.8% 0.123 38.172) 40%, transparent);
7331
+ @supports (color: color-mix(in lab, red, red)) {
7332
+ background-color: color-mix(in srgb, var(--color-warning-900) 40%, transparent);
7333
+ }
7334
+ }
7084
7335
  .slider-root * {
7085
7336
  user-select: none;
7086
7337
  }
@@ -7354,6 +7605,43 @@ circle.chart-dot:hover, circle.chart-dot.chart-dot--active {
7354
7605
  font-size: 16px !important;
7355
7606
  }
7356
7607
  }
7608
+ * {
7609
+ scrollbar-width: thin;
7610
+ scrollbar-color: transparent transparent;
7611
+ }
7612
+ :hover {
7613
+ scrollbar-color: rgba(156, 163, 175, 0.4) transparent;
7614
+ }
7615
+ .dark :hover {
7616
+ scrollbar-color: rgba(75, 85, 99, 0.5) transparent;
7617
+ }
7618
+ ::-webkit-scrollbar {
7619
+ width: 6px;
7620
+ height: 6px;
7621
+ }
7622
+ ::-webkit-scrollbar-track {
7623
+ background: transparent;
7624
+ }
7625
+ ::-webkit-scrollbar-thumb {
7626
+ background: transparent;
7627
+ border-radius: 9999px;
7628
+ transition: background 0.2s;
7629
+ }
7630
+ :hover::-webkit-scrollbar-thumb {
7631
+ background: rgba(156, 163, 175, 0.4);
7632
+ }
7633
+ :hover::-webkit-scrollbar-thumb:hover {
7634
+ background: rgba(156, 163, 175, 0.6);
7635
+ }
7636
+ .dark ::-webkit-scrollbar-thumb {
7637
+ background: transparent;
7638
+ }
7639
+ .dark :hover::-webkit-scrollbar-thumb {
7640
+ background: rgba(75, 85, 99, 0.5);
7641
+ }
7642
+ .dark :hover::-webkit-scrollbar-thumb:hover {
7643
+ background: rgba(75, 85, 99, 0.7);
7644
+ }
7357
7645
  }
7358
7646
  @property --tw-translate-x {
7359
7647
  syntax: "*";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jacshuo/onyx",
3
- "version": "2.5.0",
3
+ "version": "2.7.0",
4
4
  "description": "Cross-platform React UI component library — works in web & Electron",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -99,8 +99,10 @@
99
99
  "@tiptap/pm": "^3.20.4",
100
100
  "@tiptap/react": "^3.20.4",
101
101
  "@tiptap/starter-kit": "^3.20.4",
102
+ "@types/katex": "^0.16.8",
102
103
  "class-variance-authority": "^0.7.1",
103
104
  "clsx": "^2.1.1",
105
+ "katex": "^0.16.40",
104
106
  "lucide-react": "^0.577.0",
105
107
  "marked": "^17.0.5",
106
108
  "shiki": "^4.0.2",