@huponx/x-core-ui 0.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 (3) hide show
  1. package/README.md +14 -0
  2. package/package.json +51 -0
  3. package/src/theme.css +331 -0
package/README.md ADDED
@@ -0,0 +1,14 @@
1
+ # x-core-ui
2
+
3
+ Reusable React design system (Gradient Mesh). Local folder: `core-ui`.
4
+
5
+ ```ts
6
+ import { ThemeProvider, I18nProvider, Button } from "x-core-ui";
7
+ import "x-core-ui/theme.css";
8
+
9
+ <ThemeProvider storageKey="my-app-theme">
10
+ <I18nProvider storageKey="my-app-locale">{/* ... */}</I18nProvider>
11
+ </ThemeProvider>
12
+ ```
13
+
14
+ Pass a per-app `storageKey` so locale/theme do not clash when several apps share an origin. Defaults are `x-core-ui-theme` and `x-core-ui-locale`.
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@huponx/x-core-ui",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "license": "UNLICENSED",
6
+ "files": [
7
+ "dist",
8
+ "src/theme.css"
9
+ ],
10
+ "sideEffects": [
11
+ "**/*.css"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./src/index.ts",
16
+ "import": "./src/index.ts"
17
+ },
18
+ "./theme.css": "./src/theme.css"
19
+ },
20
+ "scripts": {
21
+ "build": "vite build && tsc -p tsconfig.build.json",
22
+ "typecheck": "tsc --noEmit"
23
+ },
24
+ "peerDependencies": {
25
+ "react": "^19.0.0",
26
+ "react-dom": "^19.0.0"
27
+ },
28
+ "dependencies": {
29
+ "@radix-ui/react-dialog": "^1.1.15",
30
+ "@radix-ui/react-popover": "^1.1.15",
31
+ "@radix-ui/react-select": "^2.2.6",
32
+ "@radix-ui/react-tabs": "^1.1.13",
33
+ "clsx": "^2.1.1",
34
+ "date-fns": "^4.1.0",
35
+ "lucide-react": "^0.544.0",
36
+ "react-day-picker": "^9.11.0",
37
+ "recharts": "^2.15.4",
38
+ "tailwind-merge": "^3.3.1"
39
+ },
40
+ "devDependencies": {
41
+ "@tailwindcss/vite": "^4.1.13",
42
+ "@types/react": "^19.1.13",
43
+ "@types/react-dom": "^19.1.9",
44
+ "@vitejs/plugin-react": "^5.0.3",
45
+ "react": "^19.1.1",
46
+ "react-dom": "^19.1.1",
47
+ "tailwindcss": "^4.1.13",
48
+ "typescript": "^5.9.2",
49
+ "vite": "^7.1.5"
50
+ }
51
+ }
package/src/theme.css ADDED
@@ -0,0 +1,331 @@
1
+ @import "react-day-picker/style.css";
2
+
3
+ @theme inline {
4
+ --color-nm-bg: var(--nm-bg);
5
+ --color-nm-bg-elevated: var(--nm-bg-elevated);
6
+ --color-nm-fg: var(--nm-fg);
7
+ --color-nm-muted: var(--nm-muted);
8
+ --color-nm-accent: var(--nm-accent);
9
+ --color-nm-on-accent: var(--nm-on-accent);
10
+ --color-nm-accent-2: var(--nm-accent-2);
11
+ --color-nm-danger: var(--nm-danger);
12
+ --color-nm-glass: var(--nm-glass);
13
+ --color-nm-border: var(--nm-border);
14
+ --color-nm-ring: var(--nm-ring);
15
+ --font-nm: "Sora", "Segoe UI", system-ui, sans-serif;
16
+ --radius-nm: 0.75rem;
17
+ --radius-nm-panel: 1rem;
18
+ --shadow-nm: var(--nm-shadow);
19
+ }
20
+
21
+ [data-theme="dark"] {
22
+ --nm-bg: #16141f;
23
+ --nm-bg-elevated: #242033;
24
+ --nm-fg: #f0ebf7;
25
+ --nm-muted: #b4a8c6;
26
+ --nm-accent: #c4a6ff;
27
+ --nm-on-accent: #1a1624;
28
+ --nm-accent-2: #b4b8ff;
29
+ --nm-danger: #e08a96;
30
+ --nm-glass: rgb(32 28 46 / 0.68);
31
+ --nm-border: rgb(198 180 230 / 0.14);
32
+ --nm-ring: rgb(196 166 255 / 0.42);
33
+ --nm-shadow: 0 16px 40px rgb(8 6 16 / 0.45);
34
+ --nm-blob-1: #f6d365;
35
+ --nm-blob-2: #ff9a9e;
36
+ --nm-blob-3: #fecfef;
37
+ --nm-blob-4: #a1c4fd;
38
+ --nm-blob-5: #96e6a1;
39
+ --nm-blob-6: #d4fc79;
40
+ --rdp-accent-color: var(--nm-accent);
41
+ --rdp-accent-background-color: rgb(196 166 255 / 0.22);
42
+ --rdp-background-color: transparent;
43
+ --rdp-today-color: var(--nm-accent-2);
44
+ }
45
+
46
+ [data-theme="light"] {
47
+ --nm-bg: #fdfbfb;
48
+ --nm-bg-elevated: #fffdf9;
49
+ --nm-fg: #2a2d3c;
50
+ --nm-muted: #5d6474;
51
+ --nm-accent: #6b4ca0;
52
+ --nm-on-accent: #ffffff;
53
+ --nm-accent-2: #5b8def;
54
+ --nm-danger: #c44d5d;
55
+ --nm-glass: rgb(255 255 255 / 0.78);
56
+ --nm-border: rgb(90 70 110 / 0.1);
57
+ --nm-ring: rgb(107 76 160 / 0.35);
58
+ --nm-shadow: 0 12px 36px rgb(80 60 100 / 0.08);
59
+ --nm-blob-1: #f6d365;
60
+ --nm-blob-2: #ff9a9e;
61
+ --nm-blob-3: #fecfef;
62
+ --nm-blob-4: #a1c4fd;
63
+ --nm-blob-5: #96e6a1;
64
+ --nm-blob-6: #d4fc79;
65
+ --rdp-accent-color: var(--nm-accent);
66
+ --rdp-accent-background-color: rgb(107 76 160 / 0.12);
67
+ --rdp-background-color: transparent;
68
+ --rdp-today-color: var(--nm-accent-2);
69
+ }
70
+
71
+ html {
72
+ --radius-nm: 0.75rem;
73
+ --radius-nm-panel: 1rem;
74
+ --nm-mesh:
75
+ radial-gradient(at 40% 20%, #ff9a9e 0, transparent 50%),
76
+ radial-gradient(at 80% 0%, #fecfef 0, transparent 50%),
77
+ radial-gradient(at 0% 50%, #ffecd2 0, transparent 50%),
78
+ radial-gradient(at 80% 50%, #a1c4fd 0, transparent 50%),
79
+ radial-gradient(at 0% 100%, #d4fc79 0, transparent 50%),
80
+ radial-gradient(at 80% 100%, #96e6a1 0, transparent 50%),
81
+ radial-gradient(at 0% 0%, #f6d365 0, transparent 50%);
82
+ }
83
+
84
+ html,
85
+ body,
86
+ #root {
87
+ min-height: 100%;
88
+ }
89
+
90
+ body {
91
+ margin: 0;
92
+ font-family: var(--font-nm);
93
+ color: var(--nm-fg);
94
+ background: var(--nm-bg);
95
+ }
96
+
97
+ button:not(:disabled),
98
+ [role="button"]:not([data-disabled]),
99
+ [role="tab"]:not([data-disabled]),
100
+ a[href] {
101
+ cursor: pointer;
102
+ }
103
+
104
+ button:disabled {
105
+ cursor: not-allowed;
106
+ }
107
+
108
+ @media (max-width: 767px) {
109
+ input,
110
+ textarea,
111
+ select {
112
+ font-size: 16px;
113
+ }
114
+ }
115
+
116
+ .nm-app-bg {
117
+ position: relative;
118
+ isolation: isolate;
119
+ min-height: 100dvh;
120
+ overflow: clip;
121
+ background: var(--nm-bg);
122
+ }
123
+
124
+ .nm-app-bg::before {
125
+ content: "";
126
+ position: absolute;
127
+ inset: -18%;
128
+ z-index: -2;
129
+ background:
130
+ radial-gradient(52% 46% at 6% 4%, var(--nm-blob-1), transparent 68%),
131
+ radial-gradient(50% 42% at 40% 6%, var(--nm-blob-2), transparent 66%),
132
+ radial-gradient(56% 48% at 94% 8%, var(--nm-blob-3), transparent 70%),
133
+ radial-gradient(46% 52% at 98% 46%, var(--nm-blob-4), transparent 68%),
134
+ radial-gradient(54% 46% at 84% 96%, var(--nm-blob-5), transparent 68%),
135
+ radial-gradient(48% 42% at 10% 94%, var(--nm-blob-6), transparent 66%),
136
+ radial-gradient(38% 32% at 48% 38%, color-mix(in srgb, var(--nm-blob-2) 70%, var(--nm-blob-3)), transparent 64%);
137
+ filter: blur(42px) saturate(1.08);
138
+ }
139
+
140
+ [data-theme="light"] .nm-app-bg::before,
141
+ [data-theme="dark"] .nm-app-bg::before {
142
+ inset: 0;
143
+ filter: none;
144
+ background: var(--nm-mesh);
145
+ }
146
+
147
+ [data-theme="light"] .nm-blob,
148
+ [data-theme="dark"] .nm-blob {
149
+ filter: none;
150
+ background: var(--nm-mesh), var(--nm-bg);
151
+ }
152
+
153
+ .nm-app-bg::after {
154
+ content: "";
155
+ position: absolute;
156
+ inset: 0;
157
+ z-index: -1;
158
+ pointer-events: none;
159
+ opacity: 0.12;
160
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
161
+ mix-blend-mode: overlay;
162
+ }
163
+
164
+ .nm-blob {
165
+ background:
166
+ radial-gradient(120% 90% at 0% 0%, var(--nm-blob-1), transparent 58%),
167
+ radial-gradient(110% 100% at 48% 0%, var(--nm-blob-2), transparent 52%),
168
+ radial-gradient(110% 100% at 100% 8%, var(--nm-blob-3), transparent 55%),
169
+ radial-gradient(90% 80% at 100% 70%, var(--nm-blob-4), transparent 50%),
170
+ radial-gradient(90% 80% at 70% 100%, var(--nm-blob-5), transparent 50%),
171
+ radial-gradient(70% 70% at 12% 100%, var(--nm-blob-6), transparent 48%);
172
+ filter: saturate(1.08);
173
+ }
174
+
175
+ .nm-glass {
176
+ background: var(--nm-glass);
177
+ backdrop-filter: blur(22px) saturate(1.2);
178
+ border: 1px solid var(--nm-border);
179
+ box-shadow: var(--nm-shadow);
180
+ }
181
+
182
+ .nm-panel {
183
+ border-color: rgb(255 255 255 / 0.92);
184
+ }
185
+
186
+ .nm-control {
187
+ border-color: rgb(255 255 255 / 0.78);
188
+ }
189
+
190
+ [data-theme="dark"] .nm-panel {
191
+ border-color: rgb(255 255 255 / 0.22);
192
+ }
193
+
194
+ [data-theme="dark"] .nm-control {
195
+ border-color: rgb(255 255 255 / 0.18);
196
+ }
197
+
198
+ .nm-focus {
199
+ outline: none;
200
+ }
201
+
202
+ .nm-focus:focus-visible {
203
+ box-shadow: 0 0 0 2px var(--nm-bg), 0 0 0 4px var(--nm-ring);
204
+ }
205
+
206
+ .nm-rdp.rdp-root {
207
+ --rdp-accent-color: var(--nm-accent);
208
+ --rdp-day-width: 100%;
209
+ --rdp-day-height: 2.5rem;
210
+ --rdp-day_button-width: 2.25rem;
211
+ --rdp-day_button-height: 2.25rem;
212
+ --rdp-nav_button-width: 2rem;
213
+ --rdp-nav_button-height: 2rem;
214
+ --rdp-nav-height: 2.5rem;
215
+ --rdp-weekday-padding: 0.2rem 0;
216
+ --rdp-weekday-opacity: 0.7;
217
+ color: var(--nm-fg);
218
+ width: 100%;
219
+ }
220
+
221
+ .nm-rdp .rdp-month,
222
+ .nm-rdp .rdp-months,
223
+ .nm-rdp .rdp-month_grid {
224
+ width: 100%;
225
+ }
226
+
227
+ .nm-rdp .rdp-month_grid {
228
+ table-layout: fixed;
229
+ }
230
+
231
+ .nm-rdp .rdp-caption_label {
232
+ z-index: 0;
233
+ max-width: calc(100% - 4.5rem);
234
+ overflow: hidden;
235
+ text-overflow: ellipsis;
236
+ pointer-events: none;
237
+ }
238
+
239
+ .nm-rdp .rdp-nav {
240
+ z-index: 2;
241
+ pointer-events: none;
242
+ }
243
+
244
+ .nm-rdp .rdp-button_previous,
245
+ .nm-rdp .rdp-button_next {
246
+ z-index: 3;
247
+ pointer-events: auto;
248
+ }
249
+
250
+ .nm-rdp .rdp-weekday {
251
+ font-size: 0.7rem;
252
+ font-weight: 500;
253
+ }
254
+
255
+ .nm-picker-panel {
256
+ box-sizing: border-box;
257
+ width: min(20rem, calc(100vw - 1.5rem));
258
+ padding: 0.75rem;
259
+ }
260
+
261
+ @keyframes nm-indeterminate {
262
+ 0% {
263
+ transform: translateX(-120%);
264
+ }
265
+ 100% {
266
+ transform: translateX(220%);
267
+ }
268
+ }
269
+
270
+ .nm-progress-indeterminate {
271
+ animation: nm-indeterminate 1.4s ease-in-out infinite;
272
+ }
273
+
274
+ @keyframes nm-overlay-in {
275
+ from {
276
+ opacity: 0;
277
+ }
278
+ to {
279
+ opacity: 1;
280
+ }
281
+ }
282
+
283
+ @keyframes nm-overlay-out {
284
+ from {
285
+ opacity: 1;
286
+ }
287
+ to {
288
+ opacity: 0;
289
+ }
290
+ }
291
+
292
+ @keyframes nm-sheet-in {
293
+ from {
294
+ transform: translateY(100%);
295
+ }
296
+ to {
297
+ transform: translateY(0);
298
+ }
299
+ }
300
+
301
+ @keyframes nm-sheet-out {
302
+ from {
303
+ transform: translateY(0);
304
+ }
305
+ to {
306
+ transform: translateY(100%);
307
+ }
308
+ }
309
+
310
+ .nm-dialog-overlay[data-state="open"] {
311
+ animation: nm-overlay-in 220ms ease-out;
312
+ }
313
+
314
+ .nm-dialog-overlay[data-state="closed"] {
315
+ animation: nm-overlay-out 180ms ease-in;
316
+ }
317
+
318
+ .nm-dialog-sheet[data-state="open"] {
319
+ animation: nm-sheet-in 320ms cubic-bezier(0.32, 0.72, 0, 1);
320
+ }
321
+
322
+ .nm-dialog-sheet[data-state="closed"] {
323
+ animation: nm-sheet-out 220ms ease-in;
324
+ }
325
+
326
+ @media (prefers-reduced-motion: reduce) {
327
+ .nm-dialog-overlay,
328
+ .nm-dialog-sheet {
329
+ animation: none;
330
+ }
331
+ }