@unsetsoft/ryunixjs 1.2.5-canary.11 → 1.2.5-canary.13

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unsetsoft/ryunixjs",
3
- "version": "1.2.5-canary.11",
3
+ "version": "1.2.5-canary.13",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,13 +28,19 @@
28
28
  "import": "./jsx/jsx-dev-runtime.js",
29
29
  "require": "./jsx/jsx-dev-runtime.js",
30
30
  "default": "./jsx/jsx-dev-runtime.js"
31
- }
31
+ },
32
+ "./style.css": "./styles/ryunix-style.css",
33
+ "./theme-toggle.css": "./styles/theme-toggle.css",
34
+ "./layout.css": "./styles/layout.css",
35
+ "./layout-header.css": "./styles/layout-header.css",
36
+ "./layout-footer.css": "./styles/layout-footer.css"
32
37
  },
33
38
  "types": "./types/index.d.ts",
34
39
  "files": [
35
40
  "dist",
36
41
  "jsx",
37
- "types"
42
+ "types",
43
+ "styles"
38
44
  ],
39
45
  "type": "module",
40
46
  "dependencies": {},
@@ -53,7 +59,7 @@
53
59
  "jest-environment-jsdom": "30.2.0"
54
60
  },
55
61
  "engines": {
56
- "node": "20 || ^22 || ^24"
62
+ "node": "20 || ^22 || ^24 || ^26"
57
63
  },
58
64
  "keywords": [
59
65
  "ryunixjs"
@@ -66,14 +72,15 @@
66
72
  },
67
73
  "homepage": "https://github.com/UnSetSoft/Ryunixjs#readme",
68
74
  "scripts": {
69
- "build": "rollup -c",
70
- "build:lib-ts": "tsc -p tsconfig.emit.json && prettier -w \"src/lib/**/*.js\" \"src/utils/**/*.js\" \"src/main.js\"",
75
+ "build": "pnpm run build:lib-ts && rollup -c",
76
+ "build:lib-ts": "tsc -p tsconfig.emit.json && prettier -w \".generated/lib/**/*.js\" \".generated/utils/**/*.js\" \".generated/main.js\"",
71
77
  "canary:release": "npm publish --tag canary",
72
78
  "release": "npm publish",
73
79
  "lint": "eslint src jsx --max-warnings=0 --config ../../eslint.config.mjs",
74
80
  "prettier-check": "prettier -c .",
75
81
  "prettier-fix": "prettier -w .",
76
82
  "test": "jest --testPathPatterns=src",
83
+ "pretest": "pnpm run build:lib-ts",
77
84
  "typecheck": "tsc --noEmit -p tsconfig.json",
78
85
  "typecheck:checkjs": "tsc --noEmit -p tsconfig.checkjs.json"
79
86
  }
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Footer chrome — import via layout.css or standalone.
3
+ * Expects Ryunix semantic tokens (`style: true`) for colors and spacing.
4
+ */
5
+
6
+ html:not(.dark) {
7
+ --ryx-footer-bg: var(--ryx-surface-elevated, #f4f4f5);
8
+ --ryx-footer-border: var(--ryx-border, #e4e4e7);
9
+ --ryx-footer-accent: color-mix(
10
+ in srgb,
11
+ var(--ryx-link, #2563eb) 30%,
12
+ transparent
13
+ );
14
+ --ryx-footer-glow: color-mix(
15
+ in srgb,
16
+ var(--ryx-link, #2563eb) 6%,
17
+ transparent
18
+ );
19
+ --ryx-footer-bottom-border: var(--ryx-border, #e4e4e7);
20
+ --ryx-footer-link: var(--ryx-text-muted, #52525b);
21
+ --ryx-footer-link-hover: var(--ryx-text, #18181b);
22
+ }
23
+
24
+ html.dark {
25
+ --ryx-footer-bg: #0a0a0b;
26
+ --ryx-footer-border: #2e2e30;
27
+ --ryx-footer-accent: rgb(59 130 246 / 0.38);
28
+ --ryx-footer-glow: rgb(37 99 235 / 0.12);
29
+ --ryx-footer-bottom-border: #1e1e1e;
30
+ --ryx-footer-link: #9ca3af;
31
+ --ryx-footer-link-hover: #ffffff;
32
+ }
33
+
34
+ .ryx-footer a,
35
+ .ryx-footer-column a,
36
+ .ryx-footer-bottom a {
37
+ text-decoration: none;
38
+ font-weight: 500;
39
+ }
40
+
41
+ .ryx-footer nav ul,
42
+ .ryx-footer-column ul {
43
+ margin-block: 0;
44
+ }
45
+
46
+ .ryx-footer-description,
47
+ .ryx-footer-bottom p,
48
+ .ryx-footer-bottom-end p {
49
+ max-inline-size: none;
50
+ }
51
+
52
+ .ryx-footer {
53
+ position: relative;
54
+ align-self: stretch;
55
+ inline-size: 100%;
56
+ max-inline-size: none;
57
+ box-sizing: border-box;
58
+ margin-block-start: auto;
59
+ border-block-start: 1px solid var(--ryx-footer-border);
60
+ background: var(--ryx-footer-bg);
61
+ color: var(--ryx-footer-link);
62
+ overflow: hidden;
63
+ }
64
+
65
+ .ryx-footer-accent {
66
+ pointer-events: none;
67
+ position: absolute;
68
+ inset-inline: 0;
69
+ inset-block-start: 0;
70
+ block-size: 1px;
71
+ background: linear-gradient(
72
+ 90deg,
73
+ transparent,
74
+ var(--ryx-footer-accent),
75
+ transparent
76
+ );
77
+ }
78
+
79
+ .ryx-footer-glow {
80
+ pointer-events: none;
81
+ position: absolute;
82
+ inset-block-start: -6rem;
83
+ inset-inline-start: 50%;
84
+ transform: translateX(-50%);
85
+ inline-size: min(100%, 36rem);
86
+ block-size: 12rem;
87
+ border-radius: 9999px;
88
+ background: var(--ryx-footer-glow);
89
+ filter: blur(80px);
90
+ }
91
+
92
+ .ryx-footer-inner {
93
+ position: relative;
94
+ width: 100%;
95
+ max-width: var(--ryx-shell-container);
96
+ margin-inline: auto;
97
+ padding: clamp(3rem, 6vw, 4rem) var(--ryx-shell-gutter);
98
+ }
99
+
100
+ .ryx-footer-grid {
101
+ display: grid;
102
+ gap: clamp(2rem, 4vw, 2.5rem);
103
+ grid-template-columns: minmax(0, 1fr);
104
+ align-items: start;
105
+ }
106
+
107
+ .ryx-footer-column h3 {
108
+ margin: 0 0 1rem;
109
+ font-size: 0.75rem;
110
+ font-weight: 600;
111
+ letter-spacing: 0.08em;
112
+ text-transform: uppercase;
113
+ color: #6b7280;
114
+ }
115
+
116
+ html:not(.dark) .ryx-footer-column h3 {
117
+ color: var(--ryx-text-subtle, #71717a);
118
+ }
119
+
120
+ .ryx-footer-column ul {
121
+ display: flex;
122
+ flex-direction: column;
123
+ gap: 0.75rem;
124
+ margin: 0;
125
+ padding: 0;
126
+ list-style: none;
127
+ }
128
+
129
+ .ryx-footer-column a {
130
+ display: inline-flex;
131
+ align-items: center;
132
+ gap: 0.375rem;
133
+ font-size: 0.875rem;
134
+ line-height: 1.4;
135
+ text-decoration: none;
136
+ color: var(--ryx-footer-link);
137
+ transition: color 180ms ease;
138
+ }
139
+
140
+ .ryx-footer-column a:hover {
141
+ color: var(--ryx-footer-link-hover);
142
+ }
143
+
144
+ .ryx-footer-brand-column {
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 1rem;
148
+ min-width: 0;
149
+ }
150
+
151
+ .ryx-footer-brand {
152
+ display: flex;
153
+ align-items: center;
154
+ min-width: 0;
155
+ }
156
+
157
+ .ryx-footer-brand-link {
158
+ display: inline-flex;
159
+ align-items: center;
160
+ gap: 0.625rem;
161
+ width: fit-content;
162
+ text-decoration: none;
163
+ color: inherit;
164
+ font-weight: 700;
165
+ min-width: 0;
166
+ transition: opacity 200ms ease;
167
+ }
168
+
169
+ .ryx-footer-brand-link:hover {
170
+ opacity: 1;
171
+ }
172
+
173
+ .ryx-footer-brand-image {
174
+ width: 2.25rem;
175
+ height: 2.25rem;
176
+ object-fit: contain;
177
+ flex-shrink: 0;
178
+ border-radius: var(--ryx-radius-md, 0.375rem);
179
+ opacity: 0.92;
180
+ }
181
+
182
+ .ryx-footer-brand-link:hover .ryx-footer-brand-image {
183
+ opacity: 1;
184
+ }
185
+
186
+ .ryx-footer-brand-title {
187
+ font-size: 1.125rem;
188
+ line-height: 1.15;
189
+ letter-spacing: -0.015em;
190
+ white-space: nowrap;
191
+ overflow: hidden;
192
+ text-overflow: ellipsis;
193
+ background: linear-gradient(90deg, #60a5fa, #a78bfa);
194
+ -webkit-background-clip: text;
195
+ background-clip: text;
196
+ color: transparent;
197
+ }
198
+
199
+ html:not(.dark) .ryx-footer-brand-title {
200
+ background: linear-gradient(
201
+ 90deg,
202
+ var(--ryx-link, #2563eb),
203
+ var(--ryx-accent, #7c3aed)
204
+ );
205
+ -webkit-background-clip: text;
206
+ background-clip: text;
207
+ }
208
+
209
+ .ryx-footer-description {
210
+ margin: 0;
211
+ max-inline-size: 28rem;
212
+ font-size: 0.875rem;
213
+ line-height: 1.625;
214
+ color: #6b7280;
215
+ text-wrap: pretty;
216
+ }
217
+
218
+ html:not(.dark) .ryx-footer-description {
219
+ color: var(--ryx-text-subtle, #71717a);
220
+ }
221
+
222
+ .ryx-footer-bottom {
223
+ display: flex;
224
+ flex-direction: column;
225
+ gap: 1rem;
226
+ margin-block-start: clamp(2rem, 4vw, 3rem);
227
+ padding-block-start: clamp(1.5rem, 3vw, 2rem);
228
+ border-block-start: 1px solid var(--ryx-footer-bottom-border);
229
+ font-size: 0.75rem;
230
+ line-height: 1.5;
231
+ color: #6b7280;
232
+ }
233
+
234
+ html:not(.dark) .ryx-footer-bottom {
235
+ color: var(--ryx-text-subtle, #71717a);
236
+ }
237
+
238
+ .ryx-footer-bottom-start,
239
+ .ryx-footer-bottom-end {
240
+ display: flex;
241
+ align-items: center;
242
+ flex-wrap: wrap;
243
+ gap: 0.75rem;
244
+ min-width: 0;
245
+ }
246
+
247
+ .ryx-footer-bottom-end {
248
+ flex-direction: column;
249
+ align-items: flex-start;
250
+ gap: 0.25rem;
251
+ }
252
+
253
+ .ryx-footer-bottom-end p {
254
+ margin: 0;
255
+ max-inline-size: none;
256
+ font-size: inherit;
257
+ color: inherit;
258
+ }
259
+
260
+ .ryx-footer-bottom-end code {
261
+ font-size: 0.85em;
262
+ }
263
+
264
+ @media (min-width: 640px) {
265
+ .ryx-footer-grid {
266
+ grid-template-columns: repeat(2, minmax(0, 1fr));
267
+ }
268
+
269
+ .ryx-footer-brand-column {
270
+ grid-column: 1 / -1;
271
+ }
272
+
273
+ .ryx-footer-bottom {
274
+ flex-direction: row;
275
+ align-items: center;
276
+ justify-content: space-between;
277
+ }
278
+
279
+ .ryx-footer-bottom-end {
280
+ align-items: flex-end;
281
+ text-align: end;
282
+ }
283
+ }
284
+
285
+ @media (min-width: 1024px) {
286
+ .ryx-footer-grid {
287
+ grid-template-columns: repeat(12, minmax(0, 1fr));
288
+ gap: 2rem;
289
+ }
290
+
291
+ .ryx-footer-brand-column {
292
+ grid-column: span 5;
293
+ }
294
+
295
+ .ryx-footer-column:nth-child(2) {
296
+ grid-column: 7 / span 3;
297
+ }
298
+
299
+ .ryx-footer-column:nth-child(3) {
300
+ grid-column: span 2;
301
+ }
302
+
303
+ .ryx-footer-column:nth-child(n + 4) {
304
+ grid-column: span 2;
305
+ }
306
+ }
307
+
308
+ @media (prefers-reduced-motion: reduce) {
309
+ .ryx-footer-brand-link,
310
+ .ryx-footer-column a {
311
+ transition: none;
312
+ }
313
+ }
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Header chrome — import via layout.css or standalone.
3
+ * Expects Ryunix semantic tokens (`style: true`) for colors and spacing.
4
+ */
5
+
6
+ html:not(.dark) {
7
+ --ryx-header-height: 4rem;
8
+ --ryx-header-bg: color-mix(
9
+ in srgb,
10
+ var(--ryx-surface, #ffffff) 92%,
11
+ transparent
12
+ );
13
+ --ryx-header-border: var(--ryx-border, #e4e4e7);
14
+ --ryx-header-shadow: 0 1px 0 rgb(15 23 42 / 0.04);
15
+ --ryx-header-nav-text: var(--ryx-text-muted, #52525b);
16
+ --ryx-header-nav-hover-bg: color-mix(
17
+ in srgb,
18
+ var(--ryx-accent, #7c3aed) 10%,
19
+ transparent
20
+ );
21
+ --ryx-header-nav-hover-border: color-mix(
22
+ in srgb,
23
+ var(--ryx-accent, #7c3aed) 24%,
24
+ transparent
25
+ );
26
+ --ryx-header-nav-hover-text: var(--ryx-text, #18181b);
27
+ --ryx-header-brand-hover-bg: color-mix(
28
+ in srgb,
29
+ var(--ryx-accent, #7c3aed) 8%,
30
+ transparent
31
+ );
32
+ --ryx-header-brand-hover-border: color-mix(
33
+ in srgb,
34
+ var(--ryx-accent, #7c3aed) 18%,
35
+ transparent
36
+ );
37
+ }
38
+
39
+ html.dark {
40
+ --ryx-header-height: 4rem;
41
+ --ryx-header-bg: rgb(17 17 18 / 0.82);
42
+ --ryx-header-border: #2e2e30;
43
+ --ryx-header-shadow: 0 1px 0 rgb(255 255 255 / 0.04);
44
+ --ryx-header-nav-text: #d4d4d8;
45
+ --ryx-header-nav-hover-bg: rgb(139 92 246 / 0.18);
46
+ --ryx-header-nav-hover-border: rgb(167 139 250 / 0.32);
47
+ --ryx-header-nav-hover-text: #ffffff;
48
+ --ryx-header-brand-hover-bg: rgb(139 92 246 / 0.14);
49
+ --ryx-header-brand-hover-border: rgb(167 139 250 / 0.22);
50
+ }
51
+
52
+ .ryx-header a,
53
+ .ryx-header-end a {
54
+ text-decoration: none;
55
+ font-weight: 500;
56
+ }
57
+
58
+ .ryx-header nav ul {
59
+ margin-block: 0;
60
+ }
61
+
62
+ .ryx-header {
63
+ position: relative;
64
+ z-index: 100;
65
+ align-self: stretch;
66
+ inline-size: 100%;
67
+ max-inline-size: none;
68
+ box-sizing: border-box;
69
+ border-block-end: 1px solid var(--ryx-header-border);
70
+ background: var(--ryx-header-bg);
71
+ color: var(--ryx-text);
72
+ box-shadow: var(--ryx-header-shadow);
73
+ }
74
+
75
+ .ryx-header--sticky {
76
+ position: sticky;
77
+ inset-block-start: 0;
78
+ backdrop-filter: blur(16px) saturate(140%);
79
+ -webkit-backdrop-filter: blur(16px) saturate(140%);
80
+ }
81
+
82
+ .ryx-header-inner {
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: space-between;
86
+ gap: var(--ryx-space-4, 1rem);
87
+ width: 100%;
88
+ max-width: var(--ryx-shell-container);
89
+ height: var(--ryx-header-height);
90
+ margin-inline: auto;
91
+ padding-inline: var(--ryx-shell-gutter);
92
+ }
93
+
94
+ .ryx-header-start {
95
+ display: flex;
96
+ align-items: center;
97
+ min-width: 0;
98
+ flex: 1 1 0;
99
+ }
100
+
101
+ .ryx-header-brand {
102
+ display: flex;
103
+ align-items: center;
104
+ min-width: 0;
105
+ }
106
+
107
+ .ryx-header-end {
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: flex-end;
111
+ flex-wrap: nowrap;
112
+ gap: var(--ryx-space-4, 1rem);
113
+ min-width: 0;
114
+ flex: 1 1 0;
115
+ }
116
+
117
+ .ryx-header-brand-link {
118
+ display: inline-flex;
119
+ align-items: center;
120
+ gap: 0.625rem;
121
+ padding: 0.5rem 0.625rem;
122
+ border: 1px solid transparent;
123
+ border-radius: 0.75rem;
124
+ text-decoration: none;
125
+ color: inherit;
126
+ font-weight: 700;
127
+ min-width: 0;
128
+ transition:
129
+ background-color 200ms ease,
130
+ border-color 200ms ease,
131
+ color 200ms ease;
132
+ }
133
+
134
+ .ryx-header-brand-link:hover {
135
+ background: var(--ryx-header-brand-hover-bg);
136
+ border-color: var(--ryx-header-brand-hover-border);
137
+ }
138
+
139
+ .ryx-header-brand-image {
140
+ width: 2.25rem;
141
+ height: 2.25rem;
142
+ object-fit: contain;
143
+ flex-shrink: 0;
144
+ border-radius: var(--ryx-radius-md, 0.375rem);
145
+ }
146
+
147
+ .ryx-header-brand-title {
148
+ font-size: 1.25rem;
149
+ line-height: 1.15;
150
+ letter-spacing: -0.02em;
151
+ white-space: nowrap;
152
+ overflow: hidden;
153
+ text-overflow: ellipsis;
154
+ background: linear-gradient(90deg, #60a5fa, #a78bfa);
155
+ -webkit-background-clip: text;
156
+ background-clip: text;
157
+ color: transparent;
158
+ }
159
+
160
+ html:not(.dark) .ryx-header-brand-title {
161
+ background: linear-gradient(
162
+ 90deg,
163
+ var(--ryx-link, #2563eb),
164
+ var(--ryx-accent, #7c3aed)
165
+ );
166
+ -webkit-background-clip: text;
167
+ background-clip: text;
168
+ }
169
+
170
+ .ryx-header-end nav ul {
171
+ display: flex;
172
+ align-items: center;
173
+ flex-wrap: nowrap;
174
+ gap: 0.375rem;
175
+ margin: 0;
176
+ padding: 0;
177
+ list-style: none;
178
+ }
179
+
180
+ .ryx-header-end nav a {
181
+ display: inline-flex;
182
+ align-items: center;
183
+ gap: 0.5rem;
184
+ padding: 0.5rem 1rem;
185
+ border: 1px solid transparent;
186
+ border-radius: 9999px;
187
+ font-size: 0.875rem;
188
+ font-weight: 500;
189
+ line-height: 1.25;
190
+ text-decoration: none;
191
+ color: var(--ryx-header-nav-text);
192
+ white-space: nowrap;
193
+ transition:
194
+ color 200ms ease,
195
+ background-color 200ms ease,
196
+ border-color 200ms ease,
197
+ box-shadow 200ms ease;
198
+ }
199
+
200
+ .ryx-header-end nav a:hover {
201
+ color: var(--ryx-header-nav-hover-text);
202
+ background: var(--ryx-header-nav-hover-bg);
203
+ border-color: var(--ryx-header-nav-hover-border);
204
+ box-shadow: 0 0 20px rgb(139 92 246 / 0.18);
205
+ }
206
+
207
+ .ryx-header-end > .ryx-theme-segment {
208
+ flex-shrink: 0;
209
+ }
210
+
211
+ @media (max-width: 767px) {
212
+ .ryx-header-inner {
213
+ height: auto;
214
+ min-height: var(--ryx-header-height);
215
+ padding-block: 0.75rem;
216
+ flex-wrap: wrap;
217
+ }
218
+
219
+ .ryx-header-start,
220
+ .ryx-header-end {
221
+ flex: 1 1 100%;
222
+ }
223
+
224
+ .ryx-header-end {
225
+ justify-content: flex-start;
226
+ flex-wrap: wrap;
227
+ }
228
+
229
+ .ryx-header-end nav ul {
230
+ flex-wrap: wrap;
231
+ }
232
+ }
233
+
234
+ @media (prefers-reduced-motion: reduce) {
235
+ .ryx-header-brand-link,
236
+ .ryx-header-end nav a {
237
+ transition: none;
238
+ }
239
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Header / Main / Footer layout shell — import alongside app styles.
3
+ * Expects Ryunix semantic tokens (`style: true`) for colors and spacing.
4
+ */
5
+
6
+ @import './layout-header.css';
7
+ @import './layout-footer.css';
8
+
9
+ html:not(.dark):has(.ryx-header),
10
+ html.dark:has(.ryx-header),
11
+ html:not(.dark):has(.ryx-footer),
12
+ html.dark:has(.ryx-footer),
13
+ html:not(.dark):has(.ryx-main),
14
+ html.dark:has(.ryx-main) {
15
+ width: 100%;
16
+ max-width: none;
17
+ }
18
+
19
+ /* --- Shell tokens (webpack1 / ryunix-doc palette) --- */
20
+
21
+ html:not(.dark) {
22
+ --ryx-shell-bg: var(--ryx-bg, #fafafa);
23
+ --ryx-shell-main-bg: var(--ryx-bg, #fafafa);
24
+ --ryx-shell-container: 80rem;
25
+ --ryx-shell-gutter: var(--ryx-page-padding, 1.5rem);
26
+ }
27
+
28
+ html.dark {
29
+ --ryx-shell-bg: #111112;
30
+ --ryx-shell-main-bg: #111112;
31
+ --ryx-shell-container: 80rem;
32
+ --ryx-shell-gutter: var(--ryx-page-padding, 1.5rem);
33
+ }
34
+
35
+ /* Shell: body sin padding; header/footer a ancho completo */
36
+ html:not(.dark) body:has(.ryx-header),
37
+ html.dark body:has(.ryx-header),
38
+ html:not(.dark) body:has(.ryx-footer),
39
+ html.dark body:has(.ryx-footer),
40
+ html:not(.dark) body:has(.ryx-main),
41
+ html.dark body:has(.ryx-main) {
42
+ padding: 0;
43
+ margin: 0;
44
+ width: 100%;
45
+ max-width: none;
46
+ background-color: var(--ryx-shell-bg);
47
+ }
48
+
49
+ html:not(.dark) #__ryunix,
50
+ html.dark #__ryunix {
51
+ display: flex;
52
+ flex-direction: column;
53
+ align-items: stretch;
54
+ width: 100%;
55
+ max-width: none;
56
+ min-height: 100vh;
57
+ background-color: var(--ryx-shell-bg);
58
+ }
59
+
60
+ /* --- Main --- */
61
+
62
+ .ryx-main {
63
+ flex: 1 1 auto;
64
+ align-self: stretch;
65
+ inline-size: 100%;
66
+ max-inline-size: none;
67
+ background: var(--ryx-shell-main-bg);
68
+ color: var(--ryx-text);
69
+ }
70
+
71
+ .ryx-main-inner {
72
+ width: 100%;
73
+ max-width: var(--ryx-shell-container);
74
+ margin-inline: auto;
75
+ padding: var(--ryx-page-padding, 1.5rem);
76
+ }