@jacshuo/onyx 2.3.0 → 2.5.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 +1,63 @@
1
- @import "../../../styles/components/CinePlayer.css";
1
+ /* ── CinePlayer animations & design tokens ──────────── */
2
+
3
+ @keyframes cp-controls-up {
4
+ from { transform: translateY(100%); opacity: 0; }
5
+ to { transform: translateY(0); opacity: 1; }
6
+ }
7
+
8
+ @keyframes cp-curtain-open {
9
+ from { clip-path: inset(0 50% 0 50%); opacity: 0; }
10
+ to { clip-path: inset(0 0 0 0); opacity: 1; }
11
+ }
12
+
13
+ @keyframes cp-curtain-close {
14
+ from { clip-path: inset(0 0 0 0); opacity: 1; }
15
+ to { clip-path: inset(0 50% 0 50%); opacity: 0; }
16
+ }
17
+
18
+ @keyframes cp-cinema-in {
19
+ from { background: rgba(0,0,0,0); }
20
+ to { background: rgba(0,0,0,0.92); }
21
+ }
22
+
23
+ @keyframes cp-cinema-out {
24
+ from { background: rgba(0,0,0,0.92); }
25
+ to { background: rgba(0,0,0,0); }
26
+ }
27
+
28
+ @keyframes cp-playlist-in {
29
+ from { transform: translateX(100%); opacity: 0; }
30
+ to { transform: translateX(0); opacity: 1; }
31
+ }
32
+
33
+ @keyframes cp-playlist-out {
34
+ from { transform: translateX(0); opacity: 1; }
35
+ to { transform: translateX(100%); opacity: 0; }
36
+ }
37
+
38
+ @keyframes cp-track-transition {
39
+ 0% { filter: brightness(0); transform: scale(1.05); }
40
+ 50% { filter: brightness(0); }
41
+ 100% { filter: brightness(1); transform: scale(1); }
42
+ }
43
+
44
+ @keyframes cp-volume-wave {
45
+ 0% { transform: scaleX(0); opacity: 1; }
46
+ 100% { transform: scaleX(1); opacity: 0; }
47
+ }
48
+
49
+ /* ── CinePlayer design tokens ───────────── */
50
+
51
+ :root {
52
+ --cp-bg: #000000;
53
+ --cp-panel-bg: rgba(0,0,0,0.85);
54
+ --cp-text: rgba(255,255,255,0.75);
55
+ --cp-text-muted: rgba(255,255,255,0.50);
56
+ --cp-text-strong: #ffffff;
57
+ --cp-border: rgba(255,255,255,0.10);
58
+ --cp-surface: rgba(255,255,255,0.05);
59
+ --cp-surface-hover: rgba(255,255,255,0.10);
60
+ --cp-overlay: rgba(0,0,0,0.30);
61
+ --cp-seek-track: rgba(255,255,255,0.20);
62
+ --cp-seek-buffer: rgba(255,255,255,0.15);
63
+ }
@@ -1 +1,39 @@
1
- @import "../../../styles/components/FileExplorer.css";
1
+ /* ── FileExplorer design tokens ──────────── */
2
+
3
+ :root {
4
+ --fe-bg: linear-gradient(145deg, rgba(255,255,255,0.99), rgba(248,248,252,0.98));
5
+ --fe-shadow: 0 4px 30px rgba(0,0,0,0.10), 0 0 0 1px rgba(0,0,0,0.04);
6
+ --fe-text: var(--color-primary-600);
7
+ --fe-text-strong: var(--color-primary-900);
8
+ --fe-text-muted: var(--color-primary-400);
9
+ --fe-border: rgba(0,0,0,0.06);
10
+ --fe-surface: rgba(0,0,0,0.015);
11
+ --fe-surface-hover: rgba(0,0,0,0.04);
12
+ --fe-input-bg: var(--color-primary-50);
13
+ --fe-input-border: var(--color-primary-200);
14
+ --fe-btn-color: rgba(0,0,0,0.45);
15
+ --fe-btn-hover: rgba(0,0,0,0.80);
16
+ --fe-btn-hover-bg: rgba(0,0,0,0.06);
17
+ --fe-badge-bg: var(--color-primary-100);
18
+ --fe-dock-bg: linear-gradient(135deg, color-mix(in srgb, var(--fe-accent, #8b5cf6) 12%, white), rgba(255,255,255,0.95));
19
+ --fe-dock-shadow: 0 0 15px color-mix(in srgb, var(--fe-accent, #8b5cf6) 15%, transparent);
20
+ }
21
+
22
+ .dark {
23
+ --fe-bg: linear-gradient(145deg, rgba(10,10,18,0.97), rgba(15,12,28,0.98));
24
+ --fe-shadow: 0 4px 60px rgba(0,0,0,0.50), 0 0 1px var(--fe-accent, #8b5cf6), inset 0 1px 0 rgba(255,255,255,0.05);
25
+ --fe-text: rgba(255,255,255,0.70);
26
+ --fe-text-strong: #ffffff;
27
+ --fe-text-muted: rgba(255,255,255,0.30);
28
+ --fe-border: rgba(255,255,255,0.06);
29
+ --fe-surface: rgba(255,255,255,0.02);
30
+ --fe-surface-hover: rgba(255,255,255,0.06);
31
+ --fe-input-bg: rgba(255,255,255,0.05);
32
+ --fe-input-border: rgba(255,255,255,0.08);
33
+ --fe-btn-color: rgba(255,255,255,0.50);
34
+ --fe-btn-hover: rgba(255,255,255,0.90);
35
+ --fe-btn-hover-bg: rgba(255,255,255,0.08);
36
+ --fe-badge-bg: rgba(255,255,255,0.05);
37
+ --fe-dock-bg: linear-gradient(135deg, color-mix(in srgb, var(--fe-accent, #8b5cf6) 20%, black), rgba(0,0,0,0.85));
38
+ --fe-dock-shadow: 0 0 20px color-mix(in srgb, var(--fe-accent, #8b5cf6) 30%, transparent);
39
+ }
@@ -1 +1,24 @@
1
- @import "../../../styles/components/FilmReel.css";
1
+ /* ── FilmReel: cinematic gallery animations ─────────── */
2
+
3
+ @keyframes film-grain-shift {
4
+ 0%, 100% { transform: translate(0, 0); }
5
+ 20% { transform: translate(-2%, 3%); }
6
+ 40% { transform: translate(3%, -2%); }
7
+ 60% { transform: translate(-1%, -3%); }
8
+ 80% { transform: translate(2%, 2%); }
9
+ }
10
+
11
+ @keyframes lightbox-backdrop-in {
12
+ from { opacity: 0; }
13
+ to { opacity: 1; }
14
+ }
15
+
16
+ @keyframes lightbox-photo-in {
17
+ from { opacity: 0; transform: scale(0.88); }
18
+ to { opacity: 1; transform: scale(1); }
19
+ }
20
+
21
+ @keyframes reveal-up {
22
+ from { opacity: 0; transform: translateY(12px); }
23
+ to { opacity: 1; transform: translateY(0); }
24
+ }
@@ -1 +1,84 @@
1
- @import "../../../styles/components/MiniPlayer.css";
1
+ /* ── MiniPlayer animations & design tokens ──────────── */
2
+
3
+ @keyframes mp-enter-bottom {
4
+ from { opacity: 0; transform: translateY(100%) scale(0.92); }
5
+ to { opacity: 1; transform: translateY(0) scale(1); }
6
+ }
7
+
8
+ @keyframes mp-exit-bottom {
9
+ from { opacity: 1; transform: translateY(0) scale(1); }
10
+ to { opacity: 0; transform: translateY(100%) scale(0.92); }
11
+ }
12
+
13
+ @keyframes mp-enter-top {
14
+ from { opacity: 0; transform: translateY(-100%) scale(0.92); }
15
+ to { opacity: 1; transform: translateY(0) scale(1); }
16
+ }
17
+
18
+ @keyframes mp-exit-top {
19
+ from { opacity: 1; transform: translateY(0) scale(1); }
20
+ to { opacity: 0; transform: translateY(-100%) scale(0.92); }
21
+ }
22
+
23
+ @keyframes mp-enter-left {
24
+ from { opacity: 0; transform: translateX(-100%) scale(0.92); }
25
+ to { opacity: 1; transform: translateX(0) scale(1); }
26
+ }
27
+
28
+ @keyframes mp-exit-left {
29
+ from { opacity: 1; transform: translateX(0) scale(1); }
30
+ to { opacity: 0; transform: translateX(-100%) scale(0.92); }
31
+ }
32
+
33
+ @keyframes mp-enter-right {
34
+ from { opacity: 0; transform: translateX(100%) scale(0.92); }
35
+ to { opacity: 1; transform: translateX(0) scale(1); }
36
+ }
37
+
38
+ @keyframes mp-exit-right {
39
+ from { opacity: 1; transform: translateX(0) scale(1); }
40
+ to { opacity: 0; transform: translateX(100%) scale(0.92); }
41
+ }
42
+
43
+ @keyframes mp-vinyl-spin {
44
+ from { transform: rotate(0deg); }
45
+ to { transform: rotate(360deg); }
46
+ }
47
+
48
+ @keyframes mp-pulse-ring {
49
+ 0% { transform: scale(1); opacity: 0.5; }
50
+ 70% { transform: scale(1.25); opacity: 0; }
51
+ 100% { transform: scale(1.25); opacity: 0; }
52
+ }
53
+
54
+ @keyframes mp-progress-glow {
55
+ 0%, 100% { filter: brightness(1); }
56
+ 50% { filter: brightness(1.4); }
57
+ }
58
+
59
+ @keyframes mp-eq-bar {
60
+ 0% { transform: scaleY(0.3); }
61
+ 100% { transform: scaleY(1); }
62
+ }
63
+
64
+ /* ── MiniPlayer design tokens ───────────── */
65
+
66
+ :root {
67
+ --mp-bg: rgba(255,255,255,0.90);
68
+ --mp-text: var(--color-primary-900);
69
+ --mp-text-muted: var(--color-primary-500);
70
+ --mp-border: rgba(148,163,184,0.60);
71
+ --mp-surface: rgba(148,163,184,0.50);
72
+ --mp-surface-hover: rgba(241,245,249,0.60);
73
+ --mp-dock-strip: rgba(148,163,184,0.40);
74
+ }
75
+
76
+ .dark {
77
+ --mp-bg: rgba(26,22,37,0.95);
78
+ --mp-text: #ffffff;
79
+ --mp-text-muted: rgba(255,255,255,0.50);
80
+ --mp-border: rgba(255,255,255,0.10);
81
+ --mp-surface: rgba(255,255,255,0.10);
82
+ --mp-surface-hover: rgba(255,255,255,0.05);
83
+ --mp-dock-strip: rgba(255,255,255,0.20);
84
+ }
@@ -24,6 +24,18 @@
24
24
  }
25
25
  }
26
26
 
27
+ /* ── Image fade-in for rich mode ─────────────────────────── */
28
+ @keyframes tw-img-fade-in {
29
+ from {
30
+ opacity: 0;
31
+ transform: translateY(5px);
32
+ }
33
+ to {
34
+ opacity: 1;
35
+ transform: translateY(0);
36
+ }
37
+ }
38
+
27
39
  /* ── Base cursor element ─────────────────────────────────── */
28
40
  .tw-cursor {
29
41
  display: inline-block;
@@ -53,3 +65,245 @@
53
65
  animation: tw-cursor-out 0.6s ease-out forwards;
54
66
  pointer-events: none;
55
67
  }
68
+
69
+ /* ═══════════════════════════════════════════════════════════
70
+ RICH MODE — prose-style Markdown rendering
71
+ ═══════════════════════════════════════════════════════════ */
72
+
73
+ /* ── Prose container ─────────────────────────────────────── */
74
+ .tw-rich-prose {
75
+ font-size: 0.875rem;
76
+ line-height: 1.75;
77
+ color: var(--color-primary-900);
78
+ word-break: break-word;
79
+ overflow-wrap: break-word;
80
+ }
81
+
82
+ .dark .tw-rich-prose {
83
+ color: var(--color-primary-100);
84
+ }
85
+
86
+ /* ── Headings ────────────────────────────────────────────── */
87
+ .tw-rich-prose h1,
88
+ .tw-rich-prose h2,
89
+ .tw-rich-prose h3,
90
+ .tw-rich-prose h4,
91
+ .tw-rich-prose h5,
92
+ .tw-rich-prose h6 {
93
+ font-weight: 700;
94
+ line-height: 1.3;
95
+ margin-top: 1.25rem;
96
+ margin-bottom: 0.375rem;
97
+ color: var(--color-primary-950);
98
+ }
99
+
100
+ .dark .tw-rich-prose h1,
101
+ .dark .tw-rich-prose h2,
102
+ .dark .tw-rich-prose h3,
103
+ .dark .tw-rich-prose h4,
104
+ .dark .tw-rich-prose h5,
105
+ .dark .tw-rich-prose h6 {
106
+ color: var(--color-primary-50);
107
+ }
108
+
109
+ .tw-rich-prose h1 {
110
+ font-size: 1.5rem;
111
+ }
112
+ .tw-rich-prose h2 {
113
+ font-size: 1.25rem;
114
+ }
115
+ .tw-rich-prose h3 {
116
+ font-size: 1.125rem;
117
+ }
118
+ .tw-rich-prose h4 {
119
+ font-size: 1rem;
120
+ }
121
+ .tw-rich-prose h5,
122
+ .tw-rich-prose h6 {
123
+ font-size: 0.875rem;
124
+ }
125
+
126
+ /* ── Paragraphs ──────────────────────────────────────────── */
127
+ .tw-rich-prose p {
128
+ margin-top: 0.625rem;
129
+ margin-bottom: 0.625rem;
130
+ }
131
+
132
+ .tw-rich-prose p:first-child {
133
+ margin-top: 0;
134
+ }
135
+
136
+ .tw-rich-prose p:last-child {
137
+ margin-bottom: 0;
138
+ }
139
+
140
+ /* ── Inline code ─────────────────────────────────────────── */
141
+ .tw-rich-prose :not(pre) > code {
142
+ background-color: var(--color-primary-100);
143
+ color: var(--color-primary-700);
144
+ padding: 0.1em 0.35em;
145
+ border-radius: 0.25rem;
146
+ font-size: 0.8125em;
147
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
148
+ }
149
+
150
+ .dark .tw-rich-prose :not(pre) > code {
151
+ background-color: var(--color-primary-800);
152
+ color: var(--color-primary-200);
153
+ }
154
+
155
+ /* ── Fenced code blocks ──────────────────────────────────── */
156
+ .tw-rich-prose pre {
157
+ background-color: var(--color-primary-100);
158
+ border-radius: 0.5rem;
159
+ padding: 0.875rem 1rem;
160
+ overflow-x: auto;
161
+ margin: 0.75rem 0;
162
+ font-size: 0.8125rem;
163
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
164
+ line-height: 1.6;
165
+ }
166
+
167
+ .dark .tw-rich-prose pre {
168
+ background-color: var(--color-primary-800);
169
+ }
170
+
171
+ .tw-rich-prose pre > code {
172
+ background: none;
173
+ padding: 0;
174
+ font-size: inherit;
175
+ color: inherit;
176
+ border-radius: 0;
177
+ }
178
+
179
+ /* ── Blockquotes ─────────────────────────────────────────── */
180
+ .tw-rich-prose blockquote {
181
+ border-left: 3px solid var(--color-primary-400);
182
+ padding: 0.375rem 0 0.375rem 1rem;
183
+ margin: 0.75rem 0;
184
+ color: var(--color-primary-600);
185
+ font-style: italic;
186
+ }
187
+
188
+ .dark .tw-rich-prose blockquote {
189
+ border-left-color: var(--color-primary-500);
190
+ color: var(--color-primary-400);
191
+ }
192
+
193
+ /* ── Lists ───────────────────────────────────────────────── */
194
+ .tw-rich-prose ul,
195
+ .tw-rich-prose ol {
196
+ padding-left: 1.5rem;
197
+ margin: 0.5rem 0;
198
+ }
199
+
200
+ .tw-rich-prose ul {
201
+ list-style: disc;
202
+ }
203
+
204
+ .tw-rich-prose ol {
205
+ list-style: decimal;
206
+ }
207
+
208
+ .tw-rich-prose li {
209
+ margin: 0.25rem 0;
210
+ }
211
+
212
+ .tw-rich-prose li > ul,
213
+ .tw-rich-prose li > ol {
214
+ margin: 0.125rem 0 0.125rem 0.25rem;
215
+ }
216
+
217
+ /* ── Horizontal rule ─────────────────────────────────────── */
218
+ .tw-rich-prose hr {
219
+ border: none;
220
+ border-top: 1px solid var(--color-primary-200);
221
+ margin: 1.25rem 0;
222
+ }
223
+
224
+ .dark .tw-rich-prose hr {
225
+ border-top-color: var(--color-primary-700);
226
+ }
227
+
228
+ /* ── Links ───────────────────────────────────────────────── */
229
+ .tw-rich-prose a {
230
+ color: var(--color-primary-600);
231
+ text-decoration: underline;
232
+ text-underline-offset: 2px;
233
+ }
234
+
235
+ .tw-rich-prose a:hover {
236
+ color: var(--color-primary-800);
237
+ }
238
+
239
+ .dark .tw-rich-prose a {
240
+ color: var(--color-primary-400);
241
+ }
242
+
243
+ .dark .tw-rich-prose a:hover {
244
+ color: var(--color-primary-200);
245
+ }
246
+
247
+ /* ── strong / em baseline ────────────────────────────────── */
248
+ .tw-rich-prose strong {
249
+ font-weight: 700;
250
+ }
251
+
252
+ .tw-rich-prose em {
253
+ font-style: italic;
254
+ }
255
+
256
+ /* ═══════════════════════════════════════════════════════════
257
+ RICH MODE — image rendering
258
+ ═══════════════════════════════════════════════════════════ */
259
+
260
+ /* Figure wrapper */
261
+ .tw-rich-img-wrap {
262
+ display: block;
263
+ margin: 0.875rem 0;
264
+ }
265
+
266
+ /* Actual image */
267
+ .tw-rich-img {
268
+ display: block;
269
+ max-width: 100%;
270
+ border-radius: 0.5rem;
271
+ box-shadow: 0 2px 8px rgb(0 0 0 / 0.1);
272
+ animation: tw-img-fade-in 0.4s ease-out both;
273
+ }
274
+
275
+ .dark .tw-rich-img {
276
+ box-shadow: 0 2px 8px rgb(0 0 0 / 0.3);
277
+ }
278
+
279
+ /* Error state overlay (hidden by default) */
280
+ .tw-rich-img-error {
281
+ display: none;
282
+ flex-direction: column;
283
+ align-items: center;
284
+ justify-content: center;
285
+ gap: 0.5rem;
286
+ padding: 1.5rem;
287
+ border-radius: 0.5rem;
288
+ background-color: var(--color-primary-100);
289
+ color: var(--color-primary-400);
290
+ font-size: 0.75rem;
291
+ font-style: normal;
292
+ text-align: center;
293
+ min-height: 80px;
294
+ max-width: 100%;
295
+ }
296
+
297
+ .dark .tw-rich-img-error {
298
+ background-color: var(--color-primary-800);
299
+ color: var(--color-primary-500);
300
+ }
301
+
302
+ /* Toggle error state via JS class added by the image error handler */
303
+ .tw-rich-img-wrap--error .tw-rich-img {
304
+ display: none;
305
+ }
306
+
307
+ .tw-rich-img-wrap--error .tw-rich-img-error {
308
+ display: flex;
309
+ }
@@ -1 +1,26 @@
1
- @import "../Dropdown/Dropdown.css";
1
+ :root {
2
+ --animate-dropdown-item-in: dropdown-item-in 200ms ease-out both;
3
+ --animate-dropdown-item-out: dropdown-item-out 150ms ease-in both;
4
+ --animate-dropdown-container-in: dropdown-container-in 150ms ease-out both;
5
+ --animate-dropdown-container-out: dropdown-container-out 120ms ease-in both;
6
+ }
7
+
8
+ @keyframes dropdown-item-in {
9
+ from { opacity: 0; transform: perspective(400px) rotateX(-50deg); transform-origin: top center; }
10
+ to { opacity: 1; transform: perspective(400px) rotateX(0deg); transform-origin: top center; }
11
+ }
12
+
13
+ @keyframes dropdown-item-out {
14
+ from { opacity: 1; transform: perspective(400px) rotateX(0deg); transform-origin: top center; }
15
+ to { opacity: 0; transform: perspective(400px) rotateX(-50deg); transform-origin: top center; }
16
+ }
17
+
18
+ @keyframes dropdown-container-in {
19
+ from { opacity: 0; transform: scaleY(0.96); transform-origin: top center; }
20
+ to { opacity: 1; transform: scaleY(1); transform-origin: top center; }
21
+ }
22
+
23
+ @keyframes dropdown-container-out {
24
+ from { opacity: 1; transform: scaleY(1); transform-origin: top center; }
25
+ to { opacity: 0; transform: scaleY(0.96); transform-origin: top center; }
26
+ }
@@ -877,6 +877,9 @@
877
877
  .min-h-52 {
878
878
  min-height: calc(var(--spacing) * 52);
879
879
  }
880
+ .min-h-64 {
881
+ min-height: calc(var(--spacing) * 64);
882
+ }
880
883
  .min-h-\[2\.5rem\] {
881
884
  min-height: 2.5rem;
882
885
  }
@@ -5814,6 +5817,43 @@
5814
5817
  font-size: 16px !important;
5815
5818
  }
5816
5819
  }
5820
+ * {
5821
+ scrollbar-width: thin;
5822
+ scrollbar-color: transparent transparent;
5823
+ }
5824
+ :hover {
5825
+ scrollbar-color: rgba(156, 163, 175, 0.4) transparent;
5826
+ }
5827
+ .dark :hover {
5828
+ scrollbar-color: rgba(75, 85, 99, 0.5) transparent;
5829
+ }
5830
+ ::-webkit-scrollbar {
5831
+ width: 6px;
5832
+ height: 6px;
5833
+ }
5834
+ ::-webkit-scrollbar-track {
5835
+ background: transparent;
5836
+ }
5837
+ ::-webkit-scrollbar-thumb {
5838
+ background: transparent;
5839
+ border-radius: 9999px;
5840
+ transition: background 0.2s;
5841
+ }
5842
+ :hover::-webkit-scrollbar-thumb {
5843
+ background: rgba(156, 163, 175, 0.4);
5844
+ }
5845
+ :hover::-webkit-scrollbar-thumb:hover {
5846
+ background: rgba(156, 163, 175, 0.6);
5847
+ }
5848
+ .dark ::-webkit-scrollbar-thumb {
5849
+ background: transparent;
5850
+ }
5851
+ .dark :hover::-webkit-scrollbar-thumb {
5852
+ background: rgba(75, 85, 99, 0.5);
5853
+ }
5854
+ .dark :hover::-webkit-scrollbar-thumb:hover {
5855
+ background: rgba(75, 85, 99, 0.7);
5856
+ }
5817
5857
  }
5818
5858
  @property --tw-translate-x {
5819
5859
  syntax: "*";
package/dist/styles.css CHANGED
@@ -886,6 +886,9 @@
886
886
  .min-h-52 {
887
887
  min-height: calc(var(--spacing) * 52);
888
888
  }
889
+ .min-h-64 {
890
+ min-height: calc(var(--spacing) * 64);
891
+ }
889
892
  .min-h-\[2\.5rem\] {
890
893
  min-height: 2.5rem;
891
894
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jacshuo/onyx",
3
- "version": "2.3.0",
3
+ "version": "2.5.0",
4
4
  "description": "Cross-platform React UI component library — works in web & Electron",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -137,6 +137,7 @@
137
137
  "null-loader": "^4.0.1",
138
138
  "postcss": "^8.5.8",
139
139
  "postcss-cli": "^11.0.1",
140
+ "postcss-import": "^16.1.1",
140
141
  "postcss-loader": "^8.2.1",
141
142
  "prettier": "^3.8.1",
142
143
  "react": "^19.2.4",