@edc-motor/admin-kit 0.4.7 → 0.4.9

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": "@edc-motor/admin-kit",
3
- "version": "0.4.7",
3
+ "version": "0.4.9",
4
4
  "description": "EdC Motor — kit del panel de administración: layout, gestores CRUD, imágenes, PDF, páginas, configuración, usuarios y copias (paquete fuente: lo compila el consumidor con Vite)",
5
5
  "license": "GPL-3.0-only",
6
6
  "type": "module",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@edc-motor/ui": "^0.4.7",
36
+ "@edc-motor/ui": "^0.4.9",
37
37
  "axios": "^1.7.0",
38
38
  "vue-draggable-plus": "^0.6.1"
39
39
  },
@@ -20,17 +20,19 @@
20
20
  &--muted { opacity: 0.65; }
21
21
  &.is-active { border-color: $accent-500; }
22
22
 
23
- // Franja superior opcional (emblema/imagen).
23
+ // Franja superior opcional (emblema/imagen). Cuadrada: con el grid de los
24
+ // index a 4 columnas la tarjeta es más estrecha y la imagen queda contenida
25
+ // (más bien pequeña) y centrada, nunca deformada ni recortada.
24
26
  &__media {
25
27
  position: relative;
26
- aspect-ratio: 16 / 9;
28
+ aspect-ratio: 1 / 1;
27
29
  display: flex;
28
30
  align-items: center;
29
31
  justify-content: center;
30
32
  overflow: hidden;
31
33
  background: $surface-2;
32
34
 
33
- img { width: 100%; height: 100%; object-fit: cover; }
35
+ img { width: 100%; height: 100%; object-fit: contain; }
34
36
  }
35
37
 
36
38
  // Cabecera: título + acciones, con divisoria (CDL).
@@ -16,7 +16,7 @@
16
16
 
17
17
  &__search-icon {
18
18
  position: absolute;
19
- right: $space-3;
19
+ right: $input-padding-x;
20
20
  top: 50%;
21
21
  transform: translateY(-50%);
22
22
  color: $text-3;
@@ -25,8 +25,8 @@
25
25
 
26
26
  &__search-input {
27
27
  width: 100%;
28
- height: 40px;
29
- padding: 0 36px 0 $space-3;
28
+ height: $input-height;
29
+ padding: 0 34px 0 $input-padding-x; // hueco a la derecha para la lupa
30
30
  background: $surface-2;
31
31
  color: $text-1;
32
32
  border: 1px solid $border;
@@ -157,6 +157,26 @@
157
157
  margin: $space-1 0;
158
158
  width: 100%;
159
159
  }
160
+
161
+ // Botón-volver del panel (texto con flecha): del detalle de la card
162
+ // seleccionada al estado sin selección (los filtros del listado).
163
+ &__back {
164
+ display: inline-flex;
165
+ align-items: center;
166
+ gap: $space-1;
167
+ background: none;
168
+ border: none;
169
+ padding: 0;
170
+ color: $accent-500;
171
+ font-size: $fs-13;
172
+ cursor: pointer;
173
+ justify-self: start;
174
+
175
+ &:hover {
176
+ color: $accent-600;
177
+ text-decoration: underline;
178
+ }
179
+ }
160
180
  }
161
181
 
162
182
  .manager-detail {
@@ -0,0 +1,32 @@
1
+ import { onBeforeUnmount, onMounted } from 'vue'
2
+
3
+ // Zonas que NUNCA deseleccionan: las propias cards y cualquier control
4
+ // interactivo (enlaces, botones, campos, labels…) o las migas de pan.
5
+ const IGNORE =
6
+ 'a, button, input, textarea, select, label, [contenteditable], ' +
7
+ '.manager-card, .entity-card, .breadcrumbs'
8
+
9
+ /**
10
+ * Deselección de la card activa clickando la zona "vacía" del cuerpo de la
11
+ * vista (el contenido bajo las migas: huecos del grid, espacio bajo las
12
+ * cards, alrededor del toolbar…). Complementa el patrón de los listados con
13
+ * panel derecho: la card entera selecciona y el resto del contenedor
14
+ * deselecciona (además del botón "volver a los filtros" del panel).
15
+ *
16
+ * Escucha en document y solo actúa dentro de `.main-content` (el área de
17
+ * contenido del AdminLayout): los modales (teleport a body) y el panel
18
+ * derecho quedan fuera. Ignora los clicks que nacen en una card o en un
19
+ * control interactivo; `extraIgnore` añade selectores propios de la vista
20
+ * (p. ej. sus items cuando no son .manager-card/.entity-card).
21
+ */
22
+ export function useCardDeselect(onDeselect: () => void, extraIgnore = '') {
23
+ function onClick(e: MouseEvent) {
24
+ const target = e.target instanceof Element ? e.target : null
25
+ if (!target || !target.closest('.main-content')) return
26
+ if (target.closest(IGNORE)) return
27
+ if (extraIgnore && target.closest(extraIgnore)) return
28
+ onDeselect()
29
+ }
30
+ onMounted(() => document.addEventListener('click', onClick))
31
+ onBeforeUnmount(() => document.removeEventListener('click', onClick))
32
+ }
@@ -16,7 +16,9 @@ const props = withDefaults(
16
16
  )
17
17
 
18
18
  const presetCols: Record<string, ResponsiveCols> = {
19
- cards: { base: 1, sm: 2, lg: 3 },
19
+ // Los index de entidades escalan 1 2 3 → 4 con el ancho REAL del
20
+ // contenedor `content` (en pantallas anchas llegan a cuatro columnas).
21
+ cards: { base: 1, sm: 2, md: 3, lg: 4 },
20
22
  'cards-wide': { base: 1, sm: 2, lg: 4 },
21
23
  'cards-narrow': { base: 1, sm: 2 },
22
24
  'cards-full': { base: 1, sm: 2, md: 3, lg: 4 },
package/src/index.ts CHANGED
@@ -5,6 +5,9 @@ export { default as AdminLayout } from './layout/AdminLayout.vue'
5
5
  // lo activa con useRightSidebar() y Teleport a #right-sidebar-target.
6
6
  export { default as RightSidebar } from './layout/RightSidebar.vue'
7
7
  export { useRightSidebar, type RightSidebarToken } from './composables/useRightSidebar'
8
+ // Listados con panel derecho: click en la zona vacía del contenido para
9
+ // deseleccionar la card activa (la card entera selecciona; el resto, no).
10
+ export { useCardDeselect } from './composables/useCardDeselect'
8
11
  // Tarjeta colapsable de los gestores (previews/PDF), reutilizable.
9
12
  export { default as ManagerCard } from './components/ManagerCard.vue'
10
13
  // Index de entidades: grid de tarjetas (sin tablas) + filtros + estado vacío.