@robosophy/ui-vue 0.0.1 → 0.0.3
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 +32 -0
- package/README.md +118 -3
- package/ai-context.md +20 -1
- package/components.md +318 -0
- package/dist/components/RsAccountSelector/RsAccountSelector.types.d.ts +38 -0
- package/dist/components/RsAccountSelector/RsAccountSelector.types.d.ts.map +1 -0
- package/dist/components/RsAccountSelector/RsAccountSelector.vue.d.ts +52 -0
- package/dist/components/RsAccountSelector/RsAccountSelector.vue.d.ts.map +1 -0
- package/dist/components/RsAccountSelector/index.d.ts +4 -0
- package/dist/components/RsAccountSelector/index.d.ts.map +1 -0
- package/dist/components/RsIcon/RsIcon.types.d.ts +20 -0
- package/dist/components/RsIcon/RsIcon.types.d.ts.map +1 -0
- package/dist/components/RsIcon/RsIcon.vue.d.ts +13 -0
- package/dist/components/RsIcon/RsIcon.vue.d.ts.map +1 -0
- package/dist/components/RsIcon/index.d.ts +6 -0
- package/dist/components/RsIcon/index.d.ts.map +1 -0
- package/dist/components/RsSidebar/RsSidebar.types.d.ts +32 -0
- package/dist/components/RsSidebar/RsSidebar.types.d.ts.map +1 -0
- package/dist/components/RsSidebar/RsSidebar.vue.d.ts +77 -0
- package/dist/components/RsSidebar/RsSidebar.vue.d.ts.map +1 -0
- package/dist/components/RsSidebar/index.d.ts +4 -0
- package/dist/components/RsSidebar/index.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4401 -83
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +184 -25
- package/dist/plugin.d.ts.map +1 -1
- package/dist/vite.d.ts +23 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +260 -0
- package/dist/vite.js.map +1 -0
- package/package.json +26 -7
- package/dist/components/RsCard/RsCard.types.d.ts +0 -14
- package/dist/components/RsCard/RsCard.types.d.ts.map +0 -1
- package/dist/components/RsCard/RsCard.vue.d.ts +0 -32
- package/dist/components/RsCard/RsCard.vue.d.ts.map +0 -1
- package/dist/components/RsCard/index.d.ts +0 -4
- package/dist/components/RsCard/index.d.ts.map +0 -1
package/AGENTS.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Robosophy UI Vue Agent Notes
|
|
2
|
+
|
|
3
|
+
Use `@robosophy/ui-vue` before creating project-local UI components from scratch.
|
|
4
|
+
|
|
5
|
+
## Consumer Rules
|
|
6
|
+
|
|
7
|
+
- Import shared components from `@robosophy/ui-vue`.
|
|
8
|
+
- Read `components.md` for available components, API shape, and composition examples.
|
|
9
|
+
- Read `dist/index.d.ts` when exact prop, emit, or type names are needed.
|
|
10
|
+
- Keep app-specific behavior in the consuming project: router pushes, stores, API calls, permissions, logout, redirects, and module switching.
|
|
11
|
+
- Prefer props and event handlers over hardcoded actions inside components.
|
|
12
|
+
- Use slots for project-specific content when the component exposes one.
|
|
13
|
+
- Use PrimeVue `Button` for actions in PrimeVue apps.
|
|
14
|
+
- Use `RsSidebar` for module navigation and `RsAccountSelector` for user/account switching.
|
|
15
|
+
- Use `@robosophy/tokens` CSS variables (`--rs-*`) for new styles.
|
|
16
|
+
- Do not duplicate `@robosophy/tokens/tokens.css` when the app already imports `@robosophy/prime-theme/prime.css`.
|
|
17
|
+
|
|
18
|
+
## CSS Imports
|
|
19
|
+
|
|
20
|
+
PrimeVue apps:
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import "@robosophy/prime-theme/prime.css";
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Non-PrimeVue apps:
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import "@robosophy/tokens/tokens.css";
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Component styles are carried by the component entrypoints. This package does not expose a global `styles.css`.
|
package/README.md
CHANGED
|
@@ -2,13 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
Vue 3 component library for shared Robosophy UI.
|
|
4
4
|
|
|
5
|
+
## Documentation
|
|
6
|
+
|
|
7
|
+
Interactive component documentation, examples, props, and usage notes are published with Storybook:
|
|
8
|
+
|
|
9
|
+
https://robosophy.gitlab.io/robosophy-basf/robosophy-library/
|
|
10
|
+
|
|
11
|
+
The npmjs page shows this README as the package overview. Use the Storybook docs for the full component library reference.
|
|
12
|
+
|
|
5
13
|
## Install
|
|
6
14
|
|
|
15
|
+
Con PrimeVue:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm install @robosophy/ui-vue @robosophy/prime-theme vue primevue
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Sin PrimeVue:
|
|
22
|
+
|
|
7
23
|
```sh
|
|
8
24
|
npm install @robosophy/ui-vue @robosophy/tokens vue
|
|
9
25
|
```
|
|
10
26
|
|
|
11
|
-
|
|
27
|
+
## CSS imports
|
|
28
|
+
|
|
29
|
+
Si la app usa PrimeVue, importa solo el theme de Prime:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import "@robosophy/prime-theme/prime.css";
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`prime.css` ya importa `@robosophy/tokens/tokens.css`, asi que no dupliques ese import.
|
|
36
|
+
|
|
37
|
+
Si la app no usa PrimeVue, importa tokens una vez:
|
|
12
38
|
|
|
13
39
|
```ts
|
|
14
40
|
import "@robosophy/tokens/tokens.css";
|
|
@@ -16,17 +42,77 @@ import "@robosophy/tokens/tokens.css";
|
|
|
16
42
|
|
|
17
43
|
Components carry their own local styles through their component entrypoint. This package does not expose a global `styles.css`.
|
|
18
44
|
|
|
45
|
+
## AI agent context
|
|
46
|
+
|
|
47
|
+
For agents working inside a consuming project, read these package files first:
|
|
48
|
+
|
|
49
|
+
- `node_modules/@robosophy/ui-vue/AGENTS.md`: short rules for prioritizing Robosophy components.
|
|
50
|
+
- `node_modules/@robosophy/ui-vue/components.md`: component inventory, APIs, and examples.
|
|
51
|
+
- `node_modules/@robosophy/ui-vue/dist/index.d.ts`: exact exported types and component contracts.
|
|
52
|
+
|
|
53
|
+
Use `@robosophy/ui-vue` components before creating local equivalents. Keep router, stores, fetches, permissions, and logout in the consuming app.
|
|
54
|
+
|
|
19
55
|
## Usage
|
|
20
56
|
|
|
21
57
|
```vue
|
|
22
58
|
<script setup lang="ts">
|
|
23
|
-
import { RsCard } from "@robosophy/ui-vue";
|
|
59
|
+
import { RsAccountSelector, RsCard, RsIcon, RsSidebar, rsPrimeIcon } from "@robosophy/ui-vue";
|
|
60
|
+
|
|
61
|
+
const user = {
|
|
62
|
+
email: "usuario@robosophy.com",
|
|
63
|
+
initials: "UR",
|
|
64
|
+
name: "Usuario Robosophy",
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const accounts = [
|
|
68
|
+
{ id: "1000", label: "Cuenta Activa SA", initials: "CA", active: true },
|
|
69
|
+
{ id: "2000", label: "Cuenta Inactiva SRL", initials: "CI" },
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
const actions = [
|
|
73
|
+
{ id: "profile", label: "Ver mi perfil", icon: "manage_accounts" },
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
const footerActions = [
|
|
77
|
+
{ id: "logout", label: "Cerrar sesion", icon: "logout", variant: "danger" },
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
const sidebarItems = [
|
|
81
|
+
{ id: "dashboard", label: "Dashboard", icon: "dashboard", active: true },
|
|
82
|
+
{ id: "settings", label: "Configuracion", icon: "settings" },
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const sidebarModules = [
|
|
86
|
+
{ text: "Mi Alta", link: "/alta" },
|
|
87
|
+
{ text: "Mi Cuenta y Orden", link: "/cyo", active: true },
|
|
88
|
+
{ text: "Mi Cuenta Corriente", link: "/cc" },
|
|
89
|
+
];
|
|
24
90
|
</script>
|
|
25
91
|
|
|
26
92
|
<template>
|
|
93
|
+
<RsSidebar
|
|
94
|
+
:items="sidebarItems"
|
|
95
|
+
:modules="sidebarModules"
|
|
96
|
+
:navigate-on-module-select="false"
|
|
97
|
+
@item-click="navigateToSection"
|
|
98
|
+
@module-select="trackModuleSelection"
|
|
99
|
+
/>
|
|
100
|
+
|
|
101
|
+
<RsAccountSelector
|
|
102
|
+
:user="user"
|
|
103
|
+
:accounts="accounts"
|
|
104
|
+
:actions="actions"
|
|
105
|
+
:footer-actions="footerActions"
|
|
106
|
+
@select-account="switchAccount"
|
|
107
|
+
@action="handleAction"
|
|
108
|
+
@footer-action="handleFooterAction"
|
|
109
|
+
/>
|
|
110
|
+
|
|
27
111
|
<RsCard title="Reusable card" subtitle="Shared layout">
|
|
28
112
|
Content from the consuming project.
|
|
29
113
|
</RsCard>
|
|
114
|
+
|
|
115
|
+
<RsIcon name="home" />
|
|
30
116
|
</template>
|
|
31
117
|
```
|
|
32
118
|
|
|
@@ -35,11 +121,38 @@ Optional plugin registration:
|
|
|
35
121
|
```ts
|
|
36
122
|
import { createApp } from "vue";
|
|
37
123
|
import RobosophyUiVue from "@robosophy/ui-vue";
|
|
38
|
-
import "@robosophy/
|
|
124
|
+
import "@robosophy/prime-theme/prime.css";
|
|
39
125
|
|
|
40
126
|
createApp(App).use(RobosophyUiVue).mount("#app");
|
|
41
127
|
```
|
|
42
128
|
|
|
129
|
+
## Material Symbols
|
|
130
|
+
|
|
131
|
+
`RsIcon` usa Material Symbols y debe combinarse con el plugin de Vite para generar fuentes locales optimizadas:
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
// vite.config.ts
|
|
135
|
+
import { defineConfig } from "vite";
|
|
136
|
+
import vue from "@vitejs/plugin-vue";
|
|
137
|
+
import { robosophyMaterialSymbols } from "@robosophy/ui-vue/vite";
|
|
138
|
+
|
|
139
|
+
export default defineConfig({
|
|
140
|
+
plugins: [
|
|
141
|
+
vue(),
|
|
142
|
+
robosophyMaterialSymbols({
|
|
143
|
+
include: ["home"], // agrega iconos dinamicos que el scanner no pueda detectar
|
|
144
|
+
}),
|
|
145
|
+
],
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Para APIs de PrimeVue que reciben `icon` como string, usa el helper:
|
|
150
|
+
|
|
151
|
+
```vue
|
|
152
|
+
<Button label="Inicio" :icon="rsPrimeIcon('home')" />
|
|
153
|
+
<Button label="Configurar" :icon="rsPrimeIcon('settings', { family: 'rounded' })" />
|
|
154
|
+
```
|
|
155
|
+
|
|
43
156
|
## Component Structure
|
|
44
157
|
|
|
45
158
|
Every public component must be self-contained:
|
|
@@ -61,6 +174,8 @@ Rules:
|
|
|
61
174
|
- add tests and Storybook stories with every exported component;
|
|
62
175
|
- use props for stable API and slots for flexible project content;
|
|
63
176
|
- use PrimeVue only when it provides behavior that belongs inside the component.
|
|
177
|
+
- use PrimeVue `Button` for actions in PrimeVue apps.
|
|
178
|
+
- use `RsSidebar` for reusable module navigation instead of project-local navbars.
|
|
64
179
|
|
|
65
180
|
## Scripts
|
|
66
181
|
|
package/ai-context.md
CHANGED
|
@@ -2,13 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
Use this package for shared Vue 3 UI components.
|
|
4
4
|
|
|
5
|
+
## For Consuming Projects
|
|
6
|
+
|
|
7
|
+
- Prefer existing `@robosophy/ui-vue` components before creating local UI components.
|
|
8
|
+
- Read `AGENTS.md` for short agent rules.
|
|
9
|
+
- Read `components.md` for component inventory, APIs, and examples.
|
|
10
|
+
- Read `dist/index.d.ts` for exact exported types.
|
|
11
|
+
- Keep app-specific behavior in the consuming project: router, stores, fetches, permissions, and logout.
|
|
12
|
+
- Use `RsSidebar` for module navigation.
|
|
13
|
+
- Use `RsAccountSelector` for user/account selection.
|
|
14
|
+
- Use `RsIcon` for Material Symbols icons.
|
|
15
|
+
- Use PrimeVue `Button` for actions in PrimeVue apps.
|
|
16
|
+
- Use `RsAvatar` for user/account identity.
|
|
17
|
+
- Use `RsCard` for content sections and state containers.
|
|
18
|
+
- In PrimeVue apps, import only `@robosophy/prime-theme/prime.css`; it already includes tokens.
|
|
19
|
+
- In non-PrimeVue apps, import `@robosophy/tokens/tokens.css`.
|
|
20
|
+
|
|
5
21
|
## Component Rules
|
|
6
22
|
|
|
7
23
|
- Every exported component lives in `src/components/<ComponentName>/`.
|
|
8
24
|
- Every component folder must include the Vue component, local CSS, public types, tests, Storybook stories, and an `index.ts`.
|
|
9
25
|
- Import component CSS from the component `index.ts`; do not add a global package stylesheet export.
|
|
10
26
|
- Use `@robosophy/tokens` CSS variables for colors, typography, strokes, and component surfaces.
|
|
11
|
-
- Use PrimeVue only when it provides real behavior for that component.
|
|
27
|
+
- Use PrimeVue only when it provides real behavior for that component; actions should use PrimeVue `Button` in PrimeVue apps.
|
|
28
|
+
- `RsSidebar` and `RsAccountSelector` use native PrimeVue controls for interactive UI; PrimeVue apps should load `@robosophy/prime-theme/prime.css` so their Button/Menu states receive Robosophy styling.
|
|
29
|
+
- `RsIcon` needs `robosophyMaterialSymbols()` from `@robosophy/ui-vue/vite` in consuming Vite apps so builds ship local subset fonts. Use `rsPrimeIcon()` for PrimeVue APIs that accept icon class strings.
|
|
30
|
+
- Use `RsSidebar` for reusable module navigation. `item-click` stays in the consuming app; the optional `modules` dropdown can redirect with the provided `link` when `navigateOnModuleSelect` is `true`.
|
|
12
31
|
- Keep props focused on stable component API. Use slots for flexible content.
|
|
13
32
|
- Export every public component and public type from `src/index.ts`.
|
|
14
33
|
|
package/components.md
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# @robosophy/ui-vue Components
|
|
2
|
+
|
|
3
|
+
Reference for agents and developers using Robosophy Vue components in consuming projects.
|
|
4
|
+
|
|
5
|
+
## Priority
|
|
6
|
+
|
|
7
|
+
When building a module or complex UI, prefer these components before creating local equivalents:
|
|
8
|
+
|
|
9
|
+
- `RsSidebar`: module navigation, side menu, mobile sidebar.
|
|
10
|
+
- `RsAccountSelector`: user/account selector.
|
|
11
|
+
- `RsIcon`: Material Symbols icon component and PrimeVue icon helper.
|
|
12
|
+
- `RsAvatar`: user/account image or initials.
|
|
13
|
+
- `RsCard`: reusable content container.
|
|
14
|
+
|
|
15
|
+
Keep app behavior in the consuming project. Components emit events; the app handles routing, stores, fetches, permissions, logout, and redirects.
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import {
|
|
21
|
+
RsAccountSelector,
|
|
22
|
+
RsAvatar,
|
|
23
|
+
RsCard,
|
|
24
|
+
RsIcon,
|
|
25
|
+
RsSidebar,
|
|
26
|
+
rsPrimeIcon,
|
|
27
|
+
} from "@robosophy/ui-vue";
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
PrimeVue apps should import only:
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import "@robosophy/prime-theme/prime.css";
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`RsSidebar` and `RsAccountSelector` render their interactive controls with PrimeVue components, so PrimeVue apps should use the theme import above to apply Robosophy Button/Menu styling.
|
|
37
|
+
|
|
38
|
+
Apps without PrimeVue should import:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import "@robosophy/tokens/tokens.css";
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Enable Material Symbols subsetting in Vite apps:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { robosophyMaterialSymbols } from "@robosophy/ui-vue/vite";
|
|
48
|
+
|
|
49
|
+
export default defineConfig({
|
|
50
|
+
plugins: [vue(), robosophyMaterialSymbols({ include: ["home"] })],
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## RsIcon
|
|
55
|
+
|
|
56
|
+
Use for Material Symbols. The Vite plugin generates local subset fonts for only the detected icons.
|
|
57
|
+
|
|
58
|
+
```vue
|
|
59
|
+
<template>
|
|
60
|
+
<RsIcon name="home" />
|
|
61
|
+
<RsIcon name="settings" family="rounded" color="primary" />
|
|
62
|
+
<Button label="Inicio" :icon="rsPrimeIcon('home')" />
|
|
63
|
+
</template>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
For dynamic icon names that the scanner cannot see, add them to `robosophyMaterialSymbols({ include: [...] })`.
|
|
67
|
+
|
|
68
|
+
## RsSidebar
|
|
69
|
+
|
|
70
|
+
Use for module navigation. It is controlled and presentational.
|
|
71
|
+
|
|
72
|
+
Main props:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
type RsSidebarItem = {
|
|
76
|
+
id: string;
|
|
77
|
+
label: string;
|
|
78
|
+
icon?: string;
|
|
79
|
+
active?: boolean;
|
|
80
|
+
disabled?: boolean;
|
|
81
|
+
visible?: boolean;
|
|
82
|
+
children?: RsSidebarItem[];
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
type RsSidebarProps = {
|
|
86
|
+
items: RsSidebarItem[];
|
|
87
|
+
footerItems?: RsSidebarItem[];
|
|
88
|
+
modules?: Array<{
|
|
89
|
+
text: string;
|
|
90
|
+
link: string;
|
|
91
|
+
active?: boolean;
|
|
92
|
+
disabled?: boolean;
|
|
93
|
+
}>;
|
|
94
|
+
navigateOnModuleSelect?: boolean;
|
|
95
|
+
title?: string;
|
|
96
|
+
icon?: string;
|
|
97
|
+
variant?: "pc" | "alta" | "cc" | "pog" | "cyo";
|
|
98
|
+
expanded?: boolean;
|
|
99
|
+
expandOnHover?: boolean;
|
|
100
|
+
mobileOpen?: boolean;
|
|
101
|
+
widthCollapsed?: string;
|
|
102
|
+
widthExpanded?: string;
|
|
103
|
+
ariaLabel?: string;
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Emits: `item-click`, `close-mobile`, `expanded-change`, `module-select`.
|
|
108
|
+
|
|
109
|
+
Slots: `header`, `header-action`, `item`, `footer`.
|
|
110
|
+
|
|
111
|
+
Example:
|
|
112
|
+
|
|
113
|
+
```vue
|
|
114
|
+
<script setup lang="ts">
|
|
115
|
+
import { ref } from "vue";
|
|
116
|
+
import { RsSidebar, type RsSidebarItem } from "@robosophy/ui-vue";
|
|
117
|
+
|
|
118
|
+
const items: RsSidebarItem[] = [
|
|
119
|
+
{ id: "liquidaciones", label: "Liquidacion", icon: "contract", active: true },
|
|
120
|
+
{ id: "adquisiciones", label: "Adquisiciones", icon: "sell" },
|
|
121
|
+
{
|
|
122
|
+
id: "config",
|
|
123
|
+
label: "Config",
|
|
124
|
+
icon: "subtitles_gear",
|
|
125
|
+
children: [
|
|
126
|
+
{ id: "excel", label: "Cargas Excel", icon: "upload" },
|
|
127
|
+
{ id: "ayuda", label: "Ayuda", icon: "info" },
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
|
|
132
|
+
const footerItems: RsSidebarItem[] = [{ id: "home", label: "Volver al home", icon: "home" }];
|
|
133
|
+
const modules = [
|
|
134
|
+
{ text: "Mi Alta", link: "/alta" },
|
|
135
|
+
{ text: "Mi Cuenta y Orden", link: "/cyo", active: true },
|
|
136
|
+
{ text: "Mi Cuenta Corriente", link: "/cc" },
|
|
137
|
+
];
|
|
138
|
+
const isMenuOpen = ref(false);
|
|
139
|
+
|
|
140
|
+
function handleSidebarItem(item: RsSidebarItem) {
|
|
141
|
+
// Route, redirect, or store updates belong in the consuming app.
|
|
142
|
+
}
|
|
143
|
+
</script>
|
|
144
|
+
|
|
145
|
+
<template>
|
|
146
|
+
<RsSidebar
|
|
147
|
+
title="CYO"
|
|
148
|
+
variant="cyo"
|
|
149
|
+
:items="items"
|
|
150
|
+
:modules="modules"
|
|
151
|
+
:footer-items="footerItems"
|
|
152
|
+
:mobile-open="isMenuOpen"
|
|
153
|
+
@item-click="handleSidebarItem"
|
|
154
|
+
@close-mobile="isMenuOpen = false"
|
|
155
|
+
/>
|
|
156
|
+
</template>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`modules` renders the default header dropdown. Each option has `text` and `link`. Selecting one emits `module-select`.
|
|
160
|
+
|
|
161
|
+
If `navigateOnModuleSelect` is `true` the component also redirects with `window.location.href = module.link`. Set it to `false` in Storybook, tests, or apps that want to intercept navigation and route manually.
|
|
162
|
+
|
|
163
|
+
Use the `header` slot only when the app needs to replace that default dropdown entirely.
|
|
164
|
+
|
|
165
|
+
Project variants set sidebar icon and active colors:
|
|
166
|
+
|
|
167
|
+
- `pc`: Plan Comercial, `#014A9F`.
|
|
168
|
+
- `alta`: Alta, `#65AC1E`.
|
|
169
|
+
- `cc`: Cuenta Corriente, `#49A0D4`.
|
|
170
|
+
- `pog`: POG, `#007C2F`.
|
|
171
|
+
- `cyo`: Cuenta y Orden, `#49A0D4`.
|
|
172
|
+
|
|
173
|
+
## RsAccountSelector
|
|
174
|
+
|
|
175
|
+
Use for user/account switching. It does not fetch, redirect, log out, or mutate stores.
|
|
176
|
+
|
|
177
|
+
Main props:
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
type RsAccountSelectorUser = {
|
|
181
|
+
email: string;
|
|
182
|
+
name?: string;
|
|
183
|
+
avatarSrc?: string;
|
|
184
|
+
secondaryAvatarSrc?: string;
|
|
185
|
+
initials?: string;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
type RsAccountSelectorAccount = {
|
|
189
|
+
id: string | number;
|
|
190
|
+
label: string;
|
|
191
|
+
avatarSrc?: string;
|
|
192
|
+
initials?: string;
|
|
193
|
+
active?: boolean;
|
|
194
|
+
disabled?: boolean;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
type RsAccountSelectorAction = {
|
|
198
|
+
id: string;
|
|
199
|
+
label: string;
|
|
200
|
+
icon?: string;
|
|
201
|
+
visible?: boolean;
|
|
202
|
+
disabled?: boolean;
|
|
203
|
+
variant?: "ghost" | "danger";
|
|
204
|
+
};
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Emits: `select-account`, `action`, `footer-action`.
|
|
208
|
+
|
|
209
|
+
Slots: `user-avatar`, `account-avatar`, `account-trailing`, `actions`, `footer`, `empty`.
|
|
210
|
+
|
|
211
|
+
Example:
|
|
212
|
+
|
|
213
|
+
```vue
|
|
214
|
+
<script setup lang="ts">
|
|
215
|
+
import { RsAccountSelector } from "@robosophy/ui-vue";
|
|
216
|
+
|
|
217
|
+
const user = {
|
|
218
|
+
email: "usuario@robosophy.com",
|
|
219
|
+
initials: "UR",
|
|
220
|
+
name: "Usuario Robosophy",
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const accounts = [
|
|
224
|
+
{ id: "1", label: "Cuenta Activa SA", initials: "CA", active: true },
|
|
225
|
+
{ id: "2", label: "Cuenta Inactiva SRL", initials: "CI" },
|
|
226
|
+
];
|
|
227
|
+
|
|
228
|
+
const actions = [{ id: "profile", label: "Ver mi perfil", icon: "manage_accounts" }];
|
|
229
|
+
const footerActions = [{ id: "logout", label: "Cerrar sesion", icon: "logout", variant: "danger" }];
|
|
230
|
+
</script>
|
|
231
|
+
|
|
232
|
+
<template>
|
|
233
|
+
<RsAccountSelector
|
|
234
|
+
:user="user"
|
|
235
|
+
:accounts="accounts"
|
|
236
|
+
:actions="actions"
|
|
237
|
+
:footer-actions="footerActions"
|
|
238
|
+
@select-account="selectAccount"
|
|
239
|
+
@action="handleAccountAction"
|
|
240
|
+
@footer-action="handleFooterAction"
|
|
241
|
+
/>
|
|
242
|
+
</template>
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## RsAvatar
|
|
246
|
+
|
|
247
|
+
Use for user or account identity.
|
|
248
|
+
|
|
249
|
+
Useful props: `src`, `alt`, `initials`, `size`, `interactive`.
|
|
250
|
+
|
|
251
|
+
Example:
|
|
252
|
+
|
|
253
|
+
```vue
|
|
254
|
+
<template>
|
|
255
|
+
<RsAvatar src="/avatar.png" alt="Usuario Robosophy" size="lg" />
|
|
256
|
+
<RsAvatar initials="CA" size="sm" interactive />
|
|
257
|
+
</template>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## RsCard
|
|
261
|
+
|
|
262
|
+
Use as a reusable content container.
|
|
263
|
+
|
|
264
|
+
Variants: `default`, `brand`, `success`, `warning`, `danger`.
|
|
265
|
+
|
|
266
|
+
Padding: `none`, `sm`, `md`, `lg`.
|
|
267
|
+
|
|
268
|
+
Useful props: `title`, `subtitle`, `variant`, `padding`, `interactive`, `as`, `ariaLabel`.
|
|
269
|
+
|
|
270
|
+
Example:
|
|
271
|
+
|
|
272
|
+
```vue
|
|
273
|
+
<template>
|
|
274
|
+
<RsCard title="Resumen" subtitle="Estado del modulo">
|
|
275
|
+
Contenido del proyecto consumidor.
|
|
276
|
+
</RsCard>
|
|
277
|
+
|
|
278
|
+
<RsCard variant="success" title="Operacion completada">
|
|
279
|
+
Mensaje de estado.
|
|
280
|
+
</RsCard>
|
|
281
|
+
</template>
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Module Composition Pattern
|
|
285
|
+
|
|
286
|
+
For a new module, start with `RsSidebar` for navigation, `RsCard` for sections, PrimeVue `Button` for actions, and `RsAccountSelector` only when user/account switching is needed.
|
|
287
|
+
|
|
288
|
+
```vue
|
|
289
|
+
<script setup lang="ts">
|
|
290
|
+
import Button from "primevue/button";
|
|
291
|
+
import { RsCard, RsSidebar, type RsSidebarItem } from "@robosophy/ui-vue";
|
|
292
|
+
|
|
293
|
+
const sidebarItems: RsSidebarItem[] = [
|
|
294
|
+
{ id: "dashboard", label: "Dashboard", icon: "dashboard", active: true },
|
|
295
|
+
{ id: "settings", label: "Configuracion", icon: "settings" },
|
|
296
|
+
];
|
|
297
|
+
|
|
298
|
+
function navigateToSection(item: RsSidebarItem) {
|
|
299
|
+
// Push a route or update local module state in the consuming app.
|
|
300
|
+
}
|
|
301
|
+
</script>
|
|
302
|
+
|
|
303
|
+
<template>
|
|
304
|
+
<div class="module-layout">
|
|
305
|
+
<RsSidebar title="Modulo" :items="sidebarItems" @item-click="navigateToSection" />
|
|
306
|
+
|
|
307
|
+
<main>
|
|
308
|
+
<RsCard title="Dashboard" subtitle="Indicadores principales">
|
|
309
|
+
<Button>
|
|
310
|
+
<span class="action-content">
|
|
311
|
+
<span>Crear</span>
|
|
312
|
+
</span>
|
|
313
|
+
</Button>
|
|
314
|
+
</RsCard>
|
|
315
|
+
</main>
|
|
316
|
+
</div>
|
|
317
|
+
</template>
|
|
318
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type RsAccountSelectorId = string | number;
|
|
2
|
+
export type RsAccountSelectorUser = {
|
|
3
|
+
email: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
avatarSrc?: string;
|
|
6
|
+
secondaryAvatarSrc?: string;
|
|
7
|
+
initials?: string;
|
|
8
|
+
};
|
|
9
|
+
export type RsAccountSelectorAccount = {
|
|
10
|
+
id: RsAccountSelectorId;
|
|
11
|
+
label: string;
|
|
12
|
+
avatarSrc?: string;
|
|
13
|
+
initials?: string;
|
|
14
|
+
active?: boolean;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
};
|
|
17
|
+
export type RsAccountSelectorActionVariant = "ghost" | "danger";
|
|
18
|
+
export type RsAccountSelectorAction = {
|
|
19
|
+
id: string;
|
|
20
|
+
label: string;
|
|
21
|
+
icon?: string;
|
|
22
|
+
visible?: boolean;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
variant?: RsAccountSelectorActionVariant;
|
|
25
|
+
};
|
|
26
|
+
export type RsAccountSelectorProps = {
|
|
27
|
+
user: RsAccountSelectorUser;
|
|
28
|
+
accounts?: RsAccountSelectorAccount[];
|
|
29
|
+
actions?: RsAccountSelectorAction[];
|
|
30
|
+
footerActions?: RsAccountSelectorAction[];
|
|
31
|
+
title?: string;
|
|
32
|
+
loading?: boolean;
|
|
33
|
+
emptyText?: string;
|
|
34
|
+
activeText?: string;
|
|
35
|
+
selectText?: string;
|
|
36
|
+
width?: string;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=RsAccountSelector.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RsAccountSelector.types.d.ts","sourceRoot":"","sources":["../../../src/components/RsAccountSelector/RsAccountSelector.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,mBAAmB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,8BAA8B,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACpC,aAAa,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { RsAccountSelectorAccount, RsAccountSelectorAction, RsAccountSelectorProps } from "./RsAccountSelector.types";
|
|
2
|
+
declare var __VLS_1: {
|
|
3
|
+
user: import("./RsAccountSelector.types").RsAccountSelectorUser;
|
|
4
|
+
}, __VLS_3: {
|
|
5
|
+
actions: RsAccountSelectorAction[];
|
|
6
|
+
}, __VLS_13: {}, __VLS_23: {
|
|
7
|
+
account: RsAccountSelectorAccount;
|
|
8
|
+
}, __VLS_25: {
|
|
9
|
+
account: RsAccountSelectorAccount;
|
|
10
|
+
}, __VLS_32: {
|
|
11
|
+
actions: RsAccountSelectorAction[];
|
|
12
|
+
};
|
|
13
|
+
type __VLS_Slots = {} & {
|
|
14
|
+
'user-avatar'?: (props: typeof __VLS_1) => any;
|
|
15
|
+
} & {
|
|
16
|
+
actions?: (props: typeof __VLS_3) => any;
|
|
17
|
+
} & {
|
|
18
|
+
empty?: (props: typeof __VLS_13) => any;
|
|
19
|
+
} & {
|
|
20
|
+
'account-avatar'?: (props: typeof __VLS_23) => any;
|
|
21
|
+
} & {
|
|
22
|
+
'account-trailing'?: (props: typeof __VLS_25) => any;
|
|
23
|
+
} & {
|
|
24
|
+
footer?: (props: typeof __VLS_32) => any;
|
|
25
|
+
};
|
|
26
|
+
declare const __VLS_base: import("vue").DefineComponent<RsAccountSelectorProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
27
|
+
"select-account": (account: RsAccountSelectorAccount) => any;
|
|
28
|
+
action: (action: RsAccountSelectorAction) => any;
|
|
29
|
+
"footer-action": (action: RsAccountSelectorAction) => any;
|
|
30
|
+
}, string, import("vue").PublicProps, Readonly<RsAccountSelectorProps> & Readonly<{
|
|
31
|
+
"onSelect-account"?: ((account: RsAccountSelectorAccount) => any) | undefined;
|
|
32
|
+
onAction?: ((action: RsAccountSelectorAction) => any) | undefined;
|
|
33
|
+
"onFooter-action"?: ((action: RsAccountSelectorAction) => any) | undefined;
|
|
34
|
+
}>, {
|
|
35
|
+
accounts: RsAccountSelectorAccount[];
|
|
36
|
+
actions: RsAccountSelectorAction[];
|
|
37
|
+
footerActions: RsAccountSelectorAction[];
|
|
38
|
+
loading: boolean;
|
|
39
|
+
emptyText: string;
|
|
40
|
+
activeText: string;
|
|
41
|
+
selectText: string;
|
|
42
|
+
width: string;
|
|
43
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
44
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
45
|
+
declare const _default: typeof __VLS_export;
|
|
46
|
+
export default _default;
|
|
47
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
48
|
+
new (): {
|
|
49
|
+
$slots: S;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=RsAccountSelector.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RsAccountSelector.vue.d.ts","sourceRoot":"","sources":["../../../src/components/RsAccountSelector/RsAccountSelector.vue"],"names":[],"mappings":"AA2PA,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAybnC,QAAA,IAAI,OAAO;;CAAU,EAAE,OAAO;;CAAU,EAAE,QAAQ,IAAW,EAAE,QAAQ;;CAAW,EAAE,QAAQ;;CAAW,EAAE,QAAQ;;CAAY,CAAE;AAC/H,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,GAClD;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,GAC5C;IAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,GAC3C;IAAE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,GACtD;IAAE,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,GACxD;IAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAK/C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;6EAId,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import "./RsAccountSelector.css";
|
|
2
|
+
export { default } from "./RsAccountSelector.vue";
|
|
3
|
+
export type { RsAccountSelectorAccount, RsAccountSelectorAction, RsAccountSelectorActionVariant, RsAccountSelectorId, RsAccountSelectorProps, RsAccountSelectorUser, } from "./RsAccountSelector.types";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RsAccountSelector/index.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,YAAY,EACV,wBAAwB,EACxB,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type RsIconFamily = "outlined" | "rounded" | "sharp";
|
|
2
|
+
export type RsIconSize = "sm" | "md" | "lg" | number;
|
|
3
|
+
export type RsIconColor = "primary" | "secondary" | "danger" | "inherit";
|
|
4
|
+
export type RsIconWeight = 100 | 200 | 300 | 400 | 500 | 600 | 700;
|
|
5
|
+
export type RsIconProps = {
|
|
6
|
+
name: string;
|
|
7
|
+
family?: RsIconFamily;
|
|
8
|
+
size?: RsIconSize;
|
|
9
|
+
color?: RsIconColor;
|
|
10
|
+
fill?: boolean;
|
|
11
|
+
weight?: RsIconWeight;
|
|
12
|
+
grade?: number;
|
|
13
|
+
opticalSize?: number;
|
|
14
|
+
interactive?: boolean;
|
|
15
|
+
ariaLabel?: string;
|
|
16
|
+
};
|
|
17
|
+
export type RsPrimeIconOptions = {
|
|
18
|
+
family?: RsIconFamily;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=RsIcon.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RsIcon.types.d.ts","sourceRoot":"","sources":["../../../src/components/RsIcon/RsIcon.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAErD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC"}
|