@robosophy/ui-react 1.0.1 → 4.0.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.
- package/AGENTS.md +15 -3
- package/README.md +11 -5
- package/dist/{chunk-AEWPQXHG.js → chunk-H3GFVSAQ.js} +15 -7
- package/dist/components/RsSidebar/index.css +10 -10
- package/dist/components/RsSidebar/index.d.ts +4 -0
- package/dist/components/RsSidebar/index.js +1 -1
- package/dist/index.css +10 -10
- package/dist/index.js +1 -1
- package/package.json +6 -2
package/AGENTS.md
CHANGED
|
@@ -29,21 +29,33 @@ The main barrel (`@robosophy/ui-react`) loads all components including PrimeReac
|
|
|
29
29
|
|
|
30
30
|
PrimeReact apps:
|
|
31
31
|
|
|
32
|
+
Crea un archivo `layers.css` en tu aplicación:
|
|
33
|
+
|
|
34
|
+
```css
|
|
35
|
+
/* layers.css */
|
|
36
|
+
@layer prime-base, prime-design;
|
|
37
|
+
@import "primereact/resources/themes/fluent-light/theme.css" layer(prime-base);
|
|
38
|
+
@import "@robosophy/prime-theme/prime.css" layer(prime-design);
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Luego importa este archivo en tu aplicación:
|
|
42
|
+
|
|
32
43
|
```tsx
|
|
33
44
|
import { PrimeReactProvider } from "primereact/api";
|
|
34
|
-
import
|
|
35
|
-
import "@robosophy/prime-theme/prime.css";
|
|
45
|
+
import "./layers.css";
|
|
36
46
|
import "@robosophy/ui-react/styles.css";
|
|
37
47
|
|
|
38
48
|
function MyApp({ Component, pageProps }) {
|
|
39
49
|
return (
|
|
40
|
-
<PrimeReactProvider
|
|
50
|
+
<PrimeReactProvider>
|
|
41
51
|
<Component {...pageProps} />
|
|
42
52
|
</PrimeReactProvider>
|
|
43
53
|
);
|
|
44
54
|
}
|
|
45
55
|
```
|
|
46
56
|
|
|
57
|
+
El archivo `layers.css` configura los CSS Cascade Layers, permitiendo que los estilos de la aplicación sobrescriban los del design system si es necesario.
|
|
58
|
+
|
|
47
59
|
Non-PrimeReact apps:
|
|
48
60
|
|
|
49
61
|
```tsx
|
package/README.md
CHANGED
|
@@ -28,25 +28,31 @@ npm install @robosophy/ui-react @robosophy/tokens react react-dom
|
|
|
28
28
|
|
|
29
29
|
## PrimeReact theme
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
PrimeReact 10 usa un sistema de temas CSS. Necesitas importar el tema `fluent-light` seguido de los overrides de Robosophy:
|
|
32
32
|
|
|
33
33
|
```tsx
|
|
34
|
-
// app/layout.tsx
|
|
34
|
+
// app/layout.tsx o pages/_app.tsx
|
|
35
35
|
import { PrimeReactProvider } from "primereact/api";
|
|
36
|
-
import
|
|
36
|
+
import "primereact/resources/themes/fluent-light/theme.css";
|
|
37
37
|
import "@robosophy/prime-theme/prime.css";
|
|
38
38
|
import "@robosophy/ui-react/styles.css";
|
|
39
39
|
|
|
40
40
|
function MyApp({ Component, pageProps }) {
|
|
41
41
|
return (
|
|
42
|
-
<PrimeReactProvider
|
|
42
|
+
<PrimeReactProvider>
|
|
43
43
|
<Component {...pageProps} />
|
|
44
44
|
</PrimeReactProvider>
|
|
45
45
|
);
|
|
46
46
|
}
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
**Orden de importación (crítico):**
|
|
50
|
+
1. Tema base de PrimeReact (ej: `fluent-light/theme.css`) — estilos estructurales
|
|
51
|
+
2. `@robosophy/prime-theme/prime.css` — aplica tokens `--rs-*` a componentes de PrimeReact
|
|
52
|
+
|
|
53
|
+
`prime.css` ya importa `@robosophy/tokens/tokens.css`, así que no dupliques ese import.
|
|
54
|
+
|
|
55
|
+
Solo `fluent-light` es compatible con los overrides de Robosophy.
|
|
50
56
|
|
|
51
57
|
If your app doesn't use PrimeReact, import tokens once:
|
|
52
58
|
|
|
@@ -44,7 +44,9 @@ var RsSidebar = forwardRef(
|
|
|
44
44
|
const [isHovered, setIsHovered] = useState(false);
|
|
45
45
|
const [activeParent, setActiveParent] = useState(null);
|
|
46
46
|
const [isModuleMenuOpen, setIsModuleMenuOpen] = useState(false);
|
|
47
|
+
const [menuTop, setMenuTop] = useState(88);
|
|
47
48
|
const rootRef = useRef(null);
|
|
49
|
+
const headerRef = useRef(null);
|
|
48
50
|
const isFirstRenderRef = useRef(true);
|
|
49
51
|
const onExpandedChangeRef = useRef(onExpandedChange);
|
|
50
52
|
onExpandedChangeRef.current = onExpandedChange;
|
|
@@ -77,6 +79,9 @@ var RsSidebar = forwardRef(
|
|
|
77
79
|
setIsModuleMenuOpen(false);
|
|
78
80
|
onModuleSelect?.(module);
|
|
79
81
|
if (navigateOnModuleSelect && typeof window !== "undefined" && module.link) {
|
|
82
|
+
console.warn(
|
|
83
|
+
"[RsSidebar] navigateOnModuleSelect is deprecated. Use onModuleSelect and handle navigation in your app to avoid full page reloads in SPAs."
|
|
84
|
+
);
|
|
80
85
|
window.location.href = module.link;
|
|
81
86
|
}
|
|
82
87
|
},
|
|
@@ -122,6 +127,11 @@ var RsSidebar = forwardRef(
|
|
|
122
127
|
}
|
|
123
128
|
return classes.join(" ");
|
|
124
129
|
}, [variant, isExpanded, mobileOpen, activeParent]);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
if (headerRef.current) {
|
|
132
|
+
setMenuTop(headerRef.current.offsetHeight);
|
|
133
|
+
}
|
|
134
|
+
}, [isExpanded, mobileOpen]);
|
|
125
135
|
useEffect(() => {
|
|
126
136
|
if (!mobileOpen) {
|
|
127
137
|
setActiveParent(null);
|
|
@@ -212,7 +222,7 @@ var RsSidebar = forwardRef(
|
|
|
212
222
|
if (header) {
|
|
213
223
|
return header;
|
|
214
224
|
}
|
|
215
|
-
return /* @__PURE__ */ jsxs("header", { className: "rs-sidebar__header", children: [
|
|
225
|
+
return /* @__PURE__ */ jsxs("header", { ref: headerRef, className: "rs-sidebar__header", children: [
|
|
216
226
|
/* @__PURE__ */ jsx(
|
|
217
227
|
"div",
|
|
218
228
|
{
|
|
@@ -248,7 +258,8 @@ var RsSidebar = forwardRef(
|
|
|
248
258
|
] })
|
|
249
259
|
}
|
|
250
260
|
),
|
|
251
|
-
renderHeaderAction()
|
|
261
|
+
renderHeaderAction(),
|
|
262
|
+
renderModuleMenu()
|
|
252
263
|
] });
|
|
253
264
|
};
|
|
254
265
|
const renderHeaderAction = () => {
|
|
@@ -285,10 +296,8 @@ var RsSidebar = forwardRef(
|
|
|
285
296
|
Menu,
|
|
286
297
|
{
|
|
287
298
|
className: "rs-sidebar__module-menu",
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
root: { role: "menu" }
|
|
291
|
-
}
|
|
299
|
+
style: { "--rs-sidebar-menu-top": `${menuTop}px` },
|
|
300
|
+
model: moduleMenuItems
|
|
292
301
|
}
|
|
293
302
|
);
|
|
294
303
|
};
|
|
@@ -335,7 +344,6 @@ var RsSidebar = forwardRef(
|
|
|
335
344
|
onMouseLeave: () => setHovered(false),
|
|
336
345
|
children: [
|
|
337
346
|
renderHeaderContent(),
|
|
338
|
-
renderModuleMenu(),
|
|
339
347
|
/* @__PURE__ */ jsxs("div", { className: "rs-sidebar__content", children: [
|
|
340
348
|
/* @__PURE__ */ jsx("nav", { className: "rs-sidebar__nav", "aria-label": "Secciones", children: /* @__PURE__ */ jsxs("ul", { className: "rs-sidebar__list", children: [
|
|
341
349
|
activeParent && /* @__PURE__ */ jsx("li", { className: "rs-sidebar__list-item", children: /* @__PURE__ */ jsxs(
|
|
@@ -142,41 +142,41 @@
|
|
|
142
142
|
overflow: hidden;
|
|
143
143
|
padding: 0;
|
|
144
144
|
position: absolute;
|
|
145
|
-
top: 88px;
|
|
145
|
+
top: var(--rs-sidebar-menu-top, 88px);
|
|
146
146
|
z-index: 20;
|
|
147
147
|
}
|
|
148
148
|
.rs-sidebar__module-menu .p-menu-list {
|
|
149
149
|
gap: 0;
|
|
150
150
|
padding: 0;
|
|
151
151
|
}
|
|
152
|
-
.rs-sidebar__module-option .p-
|
|
152
|
+
.rs-sidebar__module-option .p-menuitem-content {
|
|
153
153
|
color: var(--rs-sidebar-color);
|
|
154
154
|
border-radius: 0;
|
|
155
155
|
}
|
|
156
|
-
.rs-sidebar__module-option .p-
|
|
156
|
+
.rs-sidebar__module-option .p-menuitem-link {
|
|
157
157
|
font-family: inherit;
|
|
158
158
|
font-size: inherit;
|
|
159
159
|
line-height: 1;
|
|
160
160
|
min-height: 38px;
|
|
161
161
|
padding: 10px 14px;
|
|
162
162
|
}
|
|
163
|
-
.rs-sidebar__module-option:not(.p-disabled) .p-
|
|
164
|
-
.rs-sidebar__module-option--active .p-
|
|
163
|
+
.rs-sidebar__module-option:not(.p-disabled) .p-menuitem-content:hover,
|
|
164
|
+
.rs-sidebar__module-option--active .p-menuitem-content {
|
|
165
165
|
background: var(--rs-sidebar-hover);
|
|
166
166
|
color: var(--rs-sidebar-color);
|
|
167
167
|
}
|
|
168
|
-
.rs-sidebar__module-option--disabled .p-
|
|
168
|
+
.rs-sidebar__module-option--disabled .p-menuitem-content {
|
|
169
169
|
color: var(--rs-sidebar-muted);
|
|
170
170
|
cursor: not-allowed;
|
|
171
171
|
}
|
|
172
|
-
.rs-sidebar__module-option--disabled .p-
|
|
172
|
+
.rs-sidebar__module-option--disabled .p-menuitem-content:hover {
|
|
173
173
|
background: transparent;
|
|
174
174
|
}
|
|
175
|
-
.rs-sidebar__module-option.p-focus .p-
|
|
175
|
+
.rs-sidebar__module-option.p-focus .p-menuitem-content {
|
|
176
176
|
background: var(--rs-sidebar-hover);
|
|
177
177
|
color: var(--rs-sidebar-color);
|
|
178
178
|
}
|
|
179
|
-
.rs-sidebar__module-option.p-focus .p-
|
|
179
|
+
.rs-sidebar__module-option.p-focus .p-menuitem-link {
|
|
180
180
|
outline: 2px solid var(--rs-color-stroke-focused, #48a0d4);
|
|
181
181
|
outline-offset: -2px;
|
|
182
182
|
}
|
|
@@ -298,7 +298,7 @@
|
|
|
298
298
|
.rs-sidebar--mobile-open .rs-sidebar__module-menu {
|
|
299
299
|
left: 16px;
|
|
300
300
|
min-width: min(320px, calc(100% - 32px));
|
|
301
|
-
top: 88px;
|
|
301
|
+
top: var(--rs-sidebar-menu-top, 88px);
|
|
302
302
|
}
|
|
303
303
|
.rs-sidebar--mobile-open .rs-sidebar__item {
|
|
304
304
|
font-size: 18px;
|
|
@@ -22,6 +22,10 @@ type RsSidebarProps = {
|
|
|
22
22
|
items: RsSidebarItem[];
|
|
23
23
|
footerItems?: RsSidebarItem[];
|
|
24
24
|
modules?: RsSidebarModule[];
|
|
25
|
+
/**
|
|
26
|
+
* @deprecated Use `onModuleSelect` instead and handle navigation in your app.
|
|
27
|
+
* This prop causes a full page reload in SPAs.
|
|
28
|
+
*/
|
|
25
29
|
navigateOnModuleSelect?: boolean;
|
|
26
30
|
title?: string;
|
|
27
31
|
icon?: string;
|
package/dist/index.css
CHANGED
|
@@ -192,41 +192,41 @@
|
|
|
192
192
|
overflow: hidden;
|
|
193
193
|
padding: 0;
|
|
194
194
|
position: absolute;
|
|
195
|
-
top: 88px;
|
|
195
|
+
top: var(--rs-sidebar-menu-top, 88px);
|
|
196
196
|
z-index: 20;
|
|
197
197
|
}
|
|
198
198
|
.rs-sidebar__module-menu .p-menu-list {
|
|
199
199
|
gap: 0;
|
|
200
200
|
padding: 0;
|
|
201
201
|
}
|
|
202
|
-
.rs-sidebar__module-option .p-
|
|
202
|
+
.rs-sidebar__module-option .p-menuitem-content {
|
|
203
203
|
color: var(--rs-sidebar-color);
|
|
204
204
|
border-radius: 0;
|
|
205
205
|
}
|
|
206
|
-
.rs-sidebar__module-option .p-
|
|
206
|
+
.rs-sidebar__module-option .p-menuitem-link {
|
|
207
207
|
font-family: inherit;
|
|
208
208
|
font-size: inherit;
|
|
209
209
|
line-height: 1;
|
|
210
210
|
min-height: 38px;
|
|
211
211
|
padding: 10px 14px;
|
|
212
212
|
}
|
|
213
|
-
.rs-sidebar__module-option:not(.p-disabled) .p-
|
|
214
|
-
.rs-sidebar__module-option--active .p-
|
|
213
|
+
.rs-sidebar__module-option:not(.p-disabled) .p-menuitem-content:hover,
|
|
214
|
+
.rs-sidebar__module-option--active .p-menuitem-content {
|
|
215
215
|
background: var(--rs-sidebar-hover);
|
|
216
216
|
color: var(--rs-sidebar-color);
|
|
217
217
|
}
|
|
218
|
-
.rs-sidebar__module-option--disabled .p-
|
|
218
|
+
.rs-sidebar__module-option--disabled .p-menuitem-content {
|
|
219
219
|
color: var(--rs-sidebar-muted);
|
|
220
220
|
cursor: not-allowed;
|
|
221
221
|
}
|
|
222
|
-
.rs-sidebar__module-option--disabled .p-
|
|
222
|
+
.rs-sidebar__module-option--disabled .p-menuitem-content:hover {
|
|
223
223
|
background: transparent;
|
|
224
224
|
}
|
|
225
|
-
.rs-sidebar__module-option.p-focus .p-
|
|
225
|
+
.rs-sidebar__module-option.p-focus .p-menuitem-content {
|
|
226
226
|
background: var(--rs-sidebar-hover);
|
|
227
227
|
color: var(--rs-sidebar-color);
|
|
228
228
|
}
|
|
229
|
-
.rs-sidebar__module-option.p-focus .p-
|
|
229
|
+
.rs-sidebar__module-option.p-focus .p-menuitem-link {
|
|
230
230
|
outline: 2px solid var(--rs-color-stroke-focused, #48a0d4);
|
|
231
231
|
outline-offset: -2px;
|
|
232
232
|
}
|
|
@@ -348,7 +348,7 @@
|
|
|
348
348
|
.rs-sidebar--mobile-open .rs-sidebar__module-menu {
|
|
349
349
|
left: 16px;
|
|
350
350
|
min-width: min(320px, calc(100% - 32px));
|
|
351
|
-
top: 88px;
|
|
351
|
+
top: var(--rs-sidebar-menu-top, 88px);
|
|
352
352
|
}
|
|
353
353
|
.rs-sidebar--mobile-open .rs-sidebar__item {
|
|
354
354
|
font-size: 18px;
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robosophy/ui-react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"test": "vitest run"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
|
+
"@robosophy/prime-theme": ">=2.0.0",
|
|
46
47
|
"primereact": ">=10",
|
|
47
48
|
"react": ">=18",
|
|
48
49
|
"react-dom": ">=18"
|
|
@@ -56,10 +57,13 @@
|
|
|
56
57
|
},
|
|
57
58
|
"primereact": {
|
|
58
59
|
"optional": true
|
|
60
|
+
},
|
|
61
|
+
"@robosophy/prime-theme": {
|
|
62
|
+
"optional": true
|
|
59
63
|
}
|
|
60
64
|
},
|
|
61
65
|
"dependencies": {
|
|
62
|
-
"@robosophy/tokens": "^1.0
|
|
66
|
+
"@robosophy/tokens": "^1.1.0"
|
|
63
67
|
},
|
|
64
68
|
"devDependencies": {
|
|
65
69
|
"@storybook/addon-docs": "^9.1.0",
|