@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 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 RobosophyPreset from "@robosophy/prime-theme";
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 value={{ theme: { preset: RobosophyPreset } }}>
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
- If your app uses PrimeReact, configure the Robosophy preset and load its tokens/overrides once:
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 or pages/_app.tsx
34
+ // app/layout.tsx o pages/_app.tsx
35
35
  import { PrimeReactProvider } from "primereact/api";
36
- import RobosophyPreset from "@robosophy/prime-theme";
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 value={{ theme: { preset: RobosophyPreset } }}>
42
+ <PrimeReactProvider>
43
43
  <Component {...pageProps} />
44
44
  </PrimeReactProvider>
45
45
  );
46
46
  }
47
47
  ```
48
48
 
49
- `prime.css` already imports `@robosophy/tokens/tokens.css`, so don't duplicate that import.
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
- model: moduleMenuItems,
289
- pt: {
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-menu-item-content {
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-menu-item-link {
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-menu-item-content:hover,
164
- .rs-sidebar__module-option--active .p-menu-item-content {
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-menu-item-content {
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-menu-item-content:hover {
172
+ .rs-sidebar__module-option--disabled .p-menuitem-content:hover {
173
173
  background: transparent;
174
174
  }
175
- .rs-sidebar__module-option.p-focus .p-menu-item-content {
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-menu-item-link {
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;
@@ -1,7 +1,7 @@
1
1
  // AUTO-GENERATED FILE. DO NOT EDIT MANUALLY.
2
2
  import {
3
3
  RsSidebar_default
4
- } from "../../chunk-AEWPQXHG.js";
4
+ } from "../../chunk-H3GFVSAQ.js";
5
5
  import "../../chunk-PEJOAJYL.js";
6
6
  import "../../chunk-D4ZW5VUU.js";
7
7
  export {
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-menu-item-content {
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-menu-item-link {
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-menu-item-content:hover,
214
- .rs-sidebar__module-option--active .p-menu-item-content {
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-menu-item-content {
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-menu-item-content:hover {
222
+ .rs-sidebar__module-option--disabled .p-menuitem-content:hover {
223
223
  background: transparent;
224
224
  }
225
- .rs-sidebar__module-option.p-focus .p-menu-item-content {
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-menu-item-link {
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
@@ -1,7 +1,7 @@
1
1
  // AUTO-GENERATED FILE. DO NOT EDIT MANUALLY.
2
2
  import {
3
3
  RsSidebar_default
4
- } from "./chunk-AEWPQXHG.js";
4
+ } from "./chunk-H3GFVSAQ.js";
5
5
  import {
6
6
  RsIcon_default,
7
7
  rsPrimeIcon
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robosophy/ui-react",
3
- "version": "1.0.1",
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.4"
66
+ "@robosophy/tokens": "^1.1.0"
63
67
  },
64
68
  "devDependencies": {
65
69
  "@storybook/addon-docs": "^9.1.0",