@groupteknology/vuno 0.6.1 → 1.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.
Files changed (174) hide show
  1. package/README.md +118 -40
  2. package/dist/module.d.cts +2 -0
  3. package/dist/module.d.mts +2 -10
  4. package/dist/module.json +1 -1
  5. package/dist/module.mjs +14 -30
  6. package/dist/types.d.mts +11 -3
  7. package/package.json +47 -45
  8. package/dist/runtime/app/assets/css/main.css +0 -1
  9. package/dist/runtime/app/components/App/App.d.vue.ts +0 -33
  10. package/dist/runtime/app/components/App/App.vue +0 -127
  11. package/dist/runtime/app/components/App/App.vue.d.ts +0 -33
  12. package/dist/runtime/app/components/App/AppContext.d.vue.ts +0 -3
  13. package/dist/runtime/app/components/App/AppContext.vue +0 -7
  14. package/dist/runtime/app/components/App/AppContext.vue.d.ts +0 -3
  15. package/dist/runtime/app/components/App/AppModal.d.vue.ts +0 -38
  16. package/dist/runtime/app/components/App/AppModal.vue +0 -103
  17. package/dist/runtime/app/components/App/AppModal.vue.d.ts +0 -38
  18. package/dist/runtime/app/components/App/AppOverlay.d.vue.ts +0 -7
  19. package/dist/runtime/app/components/App/AppOverlay.vue +0 -33
  20. package/dist/runtime/app/components/App/AppOverlay.vue.d.ts +0 -7
  21. package/dist/runtime/app/components/App/AppToast.d.vue.ts +0 -11
  22. package/dist/runtime/app/components/App/AppToast.vue +0 -53
  23. package/dist/runtime/app/components/App/AppToast.vue.d.ts +0 -11
  24. package/dist/runtime/app/components/App/AppToaster.d.vue.ts +0 -11
  25. package/dist/runtime/app/components/App/AppToaster.vue +0 -49
  26. package/dist/runtime/app/components/App/AppToaster.vue.d.ts +0 -11
  27. package/dist/runtime/app/components/Cell/CellBadge.d.vue.ts +0 -5
  28. package/dist/runtime/app/components/Cell/CellBadge.vue +0 -24
  29. package/dist/runtime/app/components/Cell/CellBadge.vue.d.ts +0 -5
  30. package/dist/runtime/app/components/Cell/CellBoolean.d.vue.ts +0 -5
  31. package/dist/runtime/app/components/Cell/CellBoolean.vue +0 -21
  32. package/dist/runtime/app/components/Cell/CellBoolean.vue.d.ts +0 -5
  33. package/dist/runtime/app/components/Cell/CellCurrency.d.vue.ts +0 -5
  34. package/dist/runtime/app/components/Cell/CellCurrency.vue +0 -14
  35. package/dist/runtime/app/components/Cell/CellCurrency.vue.d.ts +0 -5
  36. package/dist/runtime/app/components/Cell/CellDate.d.vue.ts +0 -5
  37. package/dist/runtime/app/components/Cell/CellDate.vue +0 -19
  38. package/dist/runtime/app/components/Cell/CellDate.vue.d.ts +0 -5
  39. package/dist/runtime/app/components/Cell/CellImage.d.vue.ts +0 -5
  40. package/dist/runtime/app/components/Cell/CellImage.vue +0 -22
  41. package/dist/runtime/app/components/Cell/CellImage.vue.d.ts +0 -5
  42. package/dist/runtime/app/components/Cell/CellNumber.d.vue.ts +0 -5
  43. package/dist/runtime/app/components/Cell/CellNumber.vue +0 -15
  44. package/dist/runtime/app/components/Cell/CellNumber.vue.d.ts +0 -5
  45. package/dist/runtime/app/components/Cell/CellText.d.vue.ts +0 -5
  46. package/dist/runtime/app/components/Cell/CellText.vue +0 -13
  47. package/dist/runtime/app/components/Cell/CellText.vue.d.ts +0 -5
  48. package/dist/runtime/app/components/Confirm/Confirm.d.vue.ts +0 -35
  49. package/dist/runtime/app/components/Confirm/Confirm.vue +0 -75
  50. package/dist/runtime/app/components/Confirm/Confirm.vue.d.ts +0 -35
  51. package/dist/runtime/app/components/Field/FieldArray.d.vue.ts +0 -5
  52. package/dist/runtime/app/components/Field/FieldArray.vue +0 -128
  53. package/dist/runtime/app/components/Field/FieldArray.vue.d.ts +0 -5
  54. package/dist/runtime/app/components/Field/FieldCheckbox.d.vue.ts +0 -5
  55. package/dist/runtime/app/components/Field/FieldCheckbox.vue +0 -30
  56. package/dist/runtime/app/components/Field/FieldCheckbox.vue.d.ts +0 -5
  57. package/dist/runtime/app/components/Field/FieldColor.d.vue.ts +0 -5
  58. package/dist/runtime/app/components/Field/FieldColor.vue +0 -57
  59. package/dist/runtime/app/components/Field/FieldColor.vue.d.ts +0 -5
  60. package/dist/runtime/app/components/Field/FieldEmail.d.vue.ts +0 -5
  61. package/dist/runtime/app/components/Field/FieldEmail.vue +0 -37
  62. package/dist/runtime/app/components/Field/FieldEmail.vue.d.ts +0 -5
  63. package/dist/runtime/app/components/Field/FieldFile.d.vue.ts +0 -5
  64. package/dist/runtime/app/components/Field/FieldFile.vue +0 -93
  65. package/dist/runtime/app/components/Field/FieldFile.vue.d.ts +0 -5
  66. package/dist/runtime/app/components/Field/FieldNumber.d.vue.ts +0 -5
  67. package/dist/runtime/app/components/Field/FieldNumber.vue +0 -38
  68. package/dist/runtime/app/components/Field/FieldNumber.vue.d.ts +0 -5
  69. package/dist/runtime/app/components/Field/FieldPassword.d.vue.ts +0 -5
  70. package/dist/runtime/app/components/Field/FieldPassword.vue +0 -35
  71. package/dist/runtime/app/components/Field/FieldPassword.vue.d.ts +0 -5
  72. package/dist/runtime/app/components/Field/FieldRadio.d.vue.ts +0 -5
  73. package/dist/runtime/app/components/Field/FieldRadio.vue +0 -33
  74. package/dist/runtime/app/components/Field/FieldRadio.vue.d.ts +0 -5
  75. package/dist/runtime/app/components/Field/FieldSelect.d.vue.ts +0 -5
  76. package/dist/runtime/app/components/Field/FieldSelect.vue +0 -38
  77. package/dist/runtime/app/components/Field/FieldSelect.vue.d.ts +0 -5
  78. package/dist/runtime/app/components/Field/FieldSlug.d.vue.ts +0 -5
  79. package/dist/runtime/app/components/Field/FieldSlug.vue +0 -92
  80. package/dist/runtime/app/components/Field/FieldSlug.vue.d.ts +0 -5
  81. package/dist/runtime/app/components/Field/FieldSwitch.d.vue.ts +0 -5
  82. package/dist/runtime/app/components/Field/FieldSwitch.vue +0 -27
  83. package/dist/runtime/app/components/Field/FieldSwitch.vue.d.ts +0 -5
  84. package/dist/runtime/app/components/Field/FieldText.d.vue.ts +0 -5
  85. package/dist/runtime/app/components/Field/FieldText.vue +0 -38
  86. package/dist/runtime/app/components/Field/FieldText.vue.d.ts +0 -5
  87. package/dist/runtime/app/components/Field/FieldTextarea.d.vue.ts +0 -5
  88. package/dist/runtime/app/components/Field/FieldTextarea.vue +0 -36
  89. package/dist/runtime/app/components/Field/FieldTextarea.vue.d.ts +0 -5
  90. package/dist/runtime/app/components/Form/Form.d.vue.ts +0 -48
  91. package/dist/runtime/app/components/Form/Form.vue +0 -150
  92. package/dist/runtime/app/components/Form/Form.vue.d.ts +0 -48
  93. package/dist/runtime/app/components/Form/FormField.d.vue.ts +0 -7
  94. package/dist/runtime/app/components/Form/FormField.vue +0 -63
  95. package/dist/runtime/app/components/Form/FormField.vue.d.ts +0 -7
  96. package/dist/runtime/app/components/Form/FormModal.d.vue.ts +0 -60
  97. package/dist/runtime/app/components/Form/FormModal.vue +0 -91
  98. package/dist/runtime/app/components/Form/FormModal.vue.d.ts +0 -60
  99. package/dist/runtime/app/components/Form/FormSection.d.vue.ts +0 -12
  100. package/dist/runtime/app/components/Form/FormSection.vue +0 -43
  101. package/dist/runtime/app/components/Form/FormSection.vue.d.ts +0 -12
  102. package/dist/runtime/app/components/Page/Page.d.vue.ts +0 -24
  103. package/dist/runtime/app/components/Page/Page.vue +0 -63
  104. package/dist/runtime/app/components/Page/Page.vue.d.ts +0 -24
  105. package/dist/runtime/app/components/State/EmptyState.d.vue.ts +0 -20
  106. package/dist/runtime/app/components/State/EmptyState.vue +0 -36
  107. package/dist/runtime/app/components/State/EmptyState.vue.d.ts +0 -20
  108. package/dist/runtime/app/components/State/FailureState.d.vue.ts +0 -10
  109. package/dist/runtime/app/components/State/FailureState.vue +0 -34
  110. package/dist/runtime/app/components/State/FailureState.vue.d.ts +0 -10
  111. package/dist/runtime/app/components/Table/Table.d.vue.ts +0 -70
  112. package/dist/runtime/app/components/Table/Table.vue +0 -345
  113. package/dist/runtime/app/components/Table/Table.vue.d.ts +0 -70
  114. package/dist/runtime/app/components/Table/TableCell.d.vue.ts +0 -8
  115. package/dist/runtime/app/components/Table/TableCell.vue +0 -35
  116. package/dist/runtime/app/components/Table/TableCell.vue.d.ts +0 -8
  117. package/dist/runtime/app/composables/useVunoConfirm.d.ts +0 -15
  118. package/dist/runtime/app/composables/useVunoConfirm.js +0 -5
  119. package/dist/runtime/app/composables/useVunoContext.d.ts +0 -13
  120. package/dist/runtime/app/composables/useVunoContext.js +0 -9
  121. package/dist/runtime/app/composables/useVunoCrud.d.ts +0 -23
  122. package/dist/runtime/app/composables/useVunoCrud.js +0 -139
  123. package/dist/runtime/app/composables/useVunoField.d.ts +0 -10
  124. package/dist/runtime/app/composables/useVunoField.js +0 -34
  125. package/dist/runtime/app/composables/useVunoForm.d.ts +0 -2
  126. package/dist/runtime/app/composables/useVunoForm.js +0 -9
  127. package/dist/runtime/app/composables/useVunoModal.d.ts +0 -21
  128. package/dist/runtime/app/composables/useVunoModal.js +0 -26
  129. package/dist/runtime/app/composables/useVunoOverlay.d.ts +0 -22
  130. package/dist/runtime/app/composables/useVunoOverlay.js +0 -10
  131. package/dist/runtime/app/composables/useVunoTableQuery.d.ts +0 -51
  132. package/dist/runtime/app/composables/useVunoTableQuery.js +0 -110
  133. package/dist/runtime/app/composables/useVunoTheme.d.ts +0 -12
  134. package/dist/runtime/app/composables/useVunoTheme.js +0 -36
  135. package/dist/runtime/app/composables/useVunoToast.d.ts +0 -28
  136. package/dist/runtime/app/composables/useVunoToast.js +0 -13
  137. package/dist/runtime/app/internal/useVunoTable.d.ts +0 -65
  138. package/dist/runtime/app/internal/useVunoTable.js +0 -161
  139. package/dist/runtime/app/theme/index.d.ts +0 -14
  140. package/dist/runtime/app/theme/index.js +0 -281
  141. package/dist/runtime/app/types/app-config.d.ts +0 -8
  142. package/dist/runtime/app/types/app-config.js +0 -1
  143. package/dist/runtime/app/types/app.d.ts +0 -83
  144. package/dist/runtime/app/types/app.js +0 -0
  145. package/dist/runtime/app/types/confirm.d.ts +0 -19
  146. package/dist/runtime/app/types/confirm.js +0 -0
  147. package/dist/runtime/app/types/crud.d.ts +0 -108
  148. package/dist/runtime/app/types/crud.js +0 -0
  149. package/dist/runtime/app/types/field.d.ts +0 -128
  150. package/dist/runtime/app/types/field.js +0 -0
  151. package/dist/runtime/app/types/form.d.ts +0 -39
  152. package/dist/runtime/app/types/form.js +0 -1
  153. package/dist/runtime/app/types/index.d.ts +0 -10
  154. package/dist/runtime/app/types/index.js +0 -1
  155. package/dist/runtime/app/types/page.d.ts +0 -6
  156. package/dist/runtime/app/types/page.js +0 -0
  157. package/dist/runtime/app/types/responsive.d.ts +0 -8
  158. package/dist/runtime/app/types/responsive.js +0 -0
  159. package/dist/runtime/app/types/table.d.ts +0 -197
  160. package/dist/runtime/app/types/table.js +0 -0
  161. package/dist/runtime/app/types/theme.d.ts +0 -89
  162. package/dist/runtime/app/types/theme.js +0 -0
  163. package/dist/runtime/app/utils/column.d.ts +0 -9
  164. package/dist/runtime/app/utils/column.js +0 -5
  165. package/dist/runtime/app/utils/format.d.ts +0 -9
  166. package/dist/runtime/app/utils/format.js +0 -30
  167. package/dist/runtime/app/utils/grid.d.ts +0 -9
  168. package/dist/runtime/app/utils/grid.js +0 -91
  169. package/dist/runtime/app/utils/pagination.d.ts +0 -12
  170. package/dist/runtime/app/utils/pagination.js +0 -6
  171. package/dist/runtime/app/utils/path.d.ts +0 -16
  172. package/dist/runtime/app/utils/path.js +0 -74
  173. package/dist/runtime/app/utils/query-key.d.ts +0 -20
  174. package/dist/runtime/app/utils/query-key.js +0 -7
package/README.md CHANGED
@@ -1,8 +1,16 @@
1
1
  # @groupteknology/vuno
2
2
 
3
- Formularios, tablas y diálogos declarativos para Nuxt 4, construidos sobre [Nuxt UI](https://ui.nuxt.com).
3
+ Formularios, tablas y diálogos declarativos para Nuxt 4, con componentes propios y sin librería de interfaz por debajo.
4
4
 
5
- El módulo **no aporta estética**. Todo lo que pinta sale del tema del proyecto que lo instala: usa las utilidades semánticas de Nuxt UI (`bg-default`, `text-muted`, `border-default`), su escala de radios y sus colores. Si cambias `primary` o `--ui-radius`, los componentes de vuno cambian contigo.
5
+ El módulo **trae su propia estética, y se sobreescribe entera desde el proyecto**. Todo lo que pinta se deriva de un puñado de variables CSS —los tokens `--vuno-*`—, así que redefinir una cambia vuno entero sin tocar un solo componente. Lo que necesita comportamiento difícil —combobox, menú, pestañas, tooltip, campo numérico— lleva su patrón ARIA y su teclado escritos aquí, con [Floating UI](https://floating-ui.com) para colocar lo que flota y nada más; el resto son elementos nativos.
6
+
7
+ Un color o un radio escrito a mano dentro de un componente es un error: si algo no se puede cambiar desde los tokens, falta un token.
8
+
9
+ ## Documentación
10
+
11
+ El catálogo vive en **<https://groupteknology.github.io/vuno/>**: una ficha por componente, con la vista viva, los controles que la mueven, el código que produce cada combinación y las tablas de props, slots y emits al pie.
12
+
13
+ Lo que hay aquí abajo es la referencia corta, para leerla sin salir del editor.
6
14
 
7
15
  ## Instalación
8
16
 
@@ -13,7 +21,24 @@ pnpm add @groupteknology/vuno
13
21
  ```ts
14
22
  // nuxt.config.ts
15
23
  export default defineNuxtConfig({
16
- modules: ['@nuxt/ui', '@groupteknology/vuno'],
24
+ modules: ['@groupteknology/vuno'],
25
+ })
26
+ ```
27
+
28
+ Eso es todo: el módulo registra sus componentes, su hoja de estilos, el compilador de Tailwind y `@nuxt/icon`, que es quien pinta los iconos.
29
+
30
+ ¿Vienes de la `0.6.1`? El [changelog](https://github.com/groupteknology/vuno/blob/main/packages/core/CHANGELOG.md) dice qué se rompe y qué mirar después.
31
+
32
+ ### Tailwind
33
+
34
+ **El módulo registra el compilador de Tailwind** (`@tailwindcss/vite`). No es una comodidad: la hoja que empuja vuno empieza por `@import 'tailwindcss'`, y sin nadie que lo compile ese import no hace nada —las variables del tema llegan, porque son CSS normal, y ni una sola utilidad—. La aplicación se sirve, no falla nada y sale sin estilos, que es el peor modo de fallar.
35
+
36
+ Si tu proyecto ya monta Tailwind, se detecta y no se duplica. Y si prefieres llevarlo tú:
37
+
38
+ ```ts
39
+ export default defineNuxtConfig({
40
+ modules: ['@groupteknology/vuno'],
41
+ vuno: { tailwind: false },
17
42
  })
18
43
  ```
19
44
 
@@ -53,8 +78,8 @@ const definition = {
53
78
  <template>
54
79
  <VForm v-model:state="state" :definition="definition" :schema="schema" @submit="guardar">
55
80
  <template #footer="{ dirty, reset }">
56
- <UButton :disabled="!dirty" label="Descartar" variant="ghost" @click="reset" />
57
- <UButton label="Guardar" type="submit" />
81
+ <VButton :disabled="!dirty" label="Descartar" variant="ghost" @click="reset" />
82
+ <VButton label="Guardar" type="submit" />
58
83
  </template>
59
84
  </VForm>
60
85
  </template>
@@ -74,7 +99,7 @@ Cada uno declara sus propios props mediante una unión discriminada por `type`,
74
99
 
75
100
  El `<form>` lleva `novalidate`, así que el navegador no valida por su cuenta. Sin eso convivirían dos validaciones y ganaría la del navegador: cortaría el envío antes de que el esquema llegase a ejecutarse, y el usuario vería un globo del navegador, en su idioma y fuera del tema, en lugar del mensaje que tú escribiste.
76
101
 
77
- Conviene saberlo si vienes de Nuxt UI a secas: `UFormField` con `required` solo pinta el asterisco y no toca el input. Los campos de vuno sí lo propagan, a propósito y por accesibilidad, y por eso el `novalidate` es necesario y no una preferencia.
102
+ Conviene saberlo si vienes de otras librerías, donde `required` suele pintar el asterisco y no llegar al control. Aquí llega, a propósito y por accesibilidad, y por eso el `novalidate` es necesario y no una preferencia.
78
103
 
79
104
  ### Campos repetibles
80
105
 
@@ -102,8 +127,8 @@ El slot `footer` recibe `formId`, necesario para enviar desde un botón propio:
102
127
  ```vue
103
128
  <VFormModal v-model:open="open" v-model:state="state" :definition="definition" :title="title">
104
129
  <template #footer="{ close, formId, loading }">
105
- <UButton label="Cancelar" variant="ghost" @click="close" />
106
- <UButton :form="formId" :label="editando ? 'Guardar cambios' : 'Crear'" :loading="loading" type="submit" />
130
+ <VButton label="Cancelar" variant="ghost" @click="close" />
131
+ <VButton :form="formId" :label="editando ? 'Guardar cambios' : 'Crear'" :loading="loading" type="submit" />
107
132
  </template>
108
133
  </VFormModal>
109
134
  ```
@@ -185,7 +210,7 @@ Y la página queda sin saber nada de los campos:
185
210
  | La fila en edición | Un prop —`product`, `brand`, lo que sea— que vale `null` en el alta. De él salen el título y la etiqueta del botón. |
186
211
  | `@submit` | Significa «el usuario confirmó», nada más. Sin datos: ya están en `state`. |
187
212
 
188
- No es casualidad que encaje: son exactamente `state`, `formOpen`, `isSaving`, `editing` y `submit` de `useVunoCrud`.
213
+ No es casualidad que encaje: son exactamente `state`, `formOpen`, `isSaving`, `editing` y `submit` de `useCrud`.
189
214
 
190
215
  #### Qué se queda fuera
191
216
 
@@ -197,7 +222,7 @@ El estado tampoco se queda dentro. Si el formulario declara su propio `ref` en v
197
222
 
198
223
  ## Una pantalla de mantenimiento entera
199
224
 
200
- `useVunoCrud` resuelve el ciclo completo: listar, dar de alta o editar en un modal, borrar con confirmación, invalidar la caché y avisar. Está construido sobre [TanStack Query](https://tanstack.com/query).
225
+ `useCrud` resuelve el ciclo completo: listar, dar de alta o editar en un modal, borrar con confirmación, invalidar la caché y avisar. Está construido sobre [TanStack Query](https://tanstack.com/query).
201
226
 
202
227
  ```vue
203
228
  <script setup lang="ts">
@@ -205,11 +230,11 @@ El estado tampoco se queda dentro. Si el formulario declara su propio `ref` en v
205
230
  // responde 401 durante el render. `useRequestFetch()` sí la lleva.
206
231
  const request = useRequestFetch()
207
232
 
208
- const query = useVunoTableQuery({ sort: 'sku', url: true })
233
+ const query = useTableQuery({ sort: 'sku', url: true })
209
234
 
210
235
  const { items, total, failure, isPending, isSaving, isDeleting,
211
236
  formOpen, editing, state, submit, openCreate, openEdit,
212
- confirmOpen, deleting, askDelete, confirmDelete } = useVunoCrud<Product, ProductForm>({
237
+ confirmOpen, deleting, askDelete, confirmDelete } = useCrud<Product, ProductForm>({
213
238
  key: 'products',
214
239
  query,
215
240
  emptyForm: () => ({ name: '', sku: '' }),
@@ -230,7 +255,7 @@ La consulta forma parte de la clave de caché, así que cada página, filtro y o
230
255
  `key` acepta un getter o un `computed`, no solo un valor fijo. Hace falta en cuanto la pantalla tiene un selector —empresa, tienda, almacén—: con una clave fija, cambiar de empresa seguiría enseñando los datos de la anterior sin dar ninguna señal de error.
231
256
 
232
257
  ```ts
233
- const crud = useVunoCrud({
258
+ const crud = useCrud({
234
259
  key: () => ['products', selectedCompanyId.value],
235
260
  // ...
236
261
  })
@@ -255,7 +280,7 @@ Mientras la clave está incompleta, `isPending` sigue en `true`: la pantalla est
255
280
  Para lo que no se deduce de la clave —un permiso, una pestaña que no está a la vista— está la opción `enabled`, que se suma a la condición anterior.
256
281
 
257
282
  ```ts
258
- useVunoCrud({ key: () => ['products', companyId.value], enabled: () => canRead.value, /* ... */ })
283
+ useCrud({ key: () => ['products', companyId.value], enabled: () => canRead.value, /* ... */ })
259
284
  ```
260
285
 
261
286
  ### La clave de invalidación
@@ -269,7 +294,7 @@ key: () => productKeys.list(filtros) // solo refresca esa combinación de filtro
269
294
 
270
295
  ### Render en servidor
271
296
 
272
- `useVunoCrud` resuelve el listado durante el render en servidor, así que el HTML sale con las filas puestas y no aparecen al hidratar. Nuxt renderiza en servidor por defecto, de modo que esto no hay que activarlo.
297
+ `useCrud` resuelve el listado durante el render en servidor, así que el HTML sale con las filas puestas y no aparecen al hidratar. Nuxt renderiza en servidor por defecto, de modo que esto no hay que activarlo.
273
298
 
274
299
  Para que además viaje en el payload y el cliente no vuelva a pedirlo, el plugin de vue-query del proyecto tiene que deshidratar. Es responsabilidad del consumidor, no del módulo:
275
300
 
@@ -294,7 +319,13 @@ Con la clave incompleta no se espera nada: la consulta está suspendida y espera
294
319
 
295
320
  Si compruebas esto con un test, **mira el HTML renderizado, no el payload**. El payload lleva la consulta resuelta aunque el prefetch esté apagado, porque la consulta se asienta después del render y el plugin deshidrata lo que encuentra: un assert sobre el payload pasa en las dos direcciones y no mide nada.
296
321
 
297
- `@tanstack/vue-query` es una dependencia opcional: solo hace falta si usas este composable.
322
+ **`@tanstack/vue-query` lo instala el proyecto**, y solo hace falta si usas este composable:
323
+
324
+ ```bash
325
+ pnpm add @tanstack/vue-query
326
+ ```
327
+
328
+ No se declara como dependencia opcional del módulo a propósito. npm instala igualmente los `peerDependencies` marcados como opcionales, y como los de vue-query admiten Vue 2, acababa colocando `vue@2.6.14` en la raíz y chocando con el `vue@^3.5.0` que pide vuno: `npm install @groupteknology/vuno` fallaba con `ERESOLVE` en un proyecto Nuxt que no declarara `vue` por su cuenta. Con pnpm no ocurría, que es por lo que tardó en verse.
298
329
 
299
330
  ## Páginas
300
331
 
@@ -303,7 +334,7 @@ Si compruebas esto con un test, **mira el HTML renderizado, no el payload**. El
303
334
  ```vue
304
335
  <VPage title="Productos" description="Catálogo completo." :breadcrumb="[{ label: 'Inicio', to: '/' }, { label: 'Productos' }]">
305
336
  <template #actions>
306
- <UButton icon="lucide:plus" label="Nuevo producto" @click="openCreate" />
337
+ <VButton icon="lucide:plus" label="Nuevo producto" @click="openCreate" />
307
338
  </template>
308
339
 
309
340
  <VTable ... />
@@ -314,9 +345,11 @@ Si compruebas esto con un test, **mira el HTML renderizado, no el payload**. El
314
345
 
315
346
  `VTable` funciona en modo servidor: emite el estado de consulta y tú devuelves la página.
316
347
 
348
+ **`query` es obligatorio.** No es un `v-model` opcional: sin él la tabla no compila, y el error de tipos que sale encabeza con el objeto `definition`, así que manda a mirar el sitio equivocado.
349
+
317
350
  ```vue
318
351
  <script setup lang="ts">
319
- const query = useVunoTableQuery({ sort: 'sku', url: true, history: 'push', filterKeys: ['status'] })
352
+ const query = useTableQuery({ sort: 'sku', url: true, history: 'push', filterKeys: ['status'] })
320
353
 
321
354
  const { data, status } = await useFetch('/api/products', {
322
355
  query: computed(() => ({ page: query.value.page, sort: query.value.sort?.column, ...query.value.filters })),
@@ -392,10 +425,10 @@ Y un aviso al ordenar: `sortable` ordena **en servidor por `key`**, y el servido
392
425
  `map` es solo de `badge`. Para traducir en otro tipo de columna, o para componer algo que no es una etiqueta, está `type: 'custom'` con su slot:
393
426
 
394
427
  ```vue
395
- <VTable :definition="definition" :data="rows">
428
+ <VTable v-model:query="query" :definition="definition" :data="rows">
396
429
  <template #cell-stock="{ row, value }">
397
430
  <span class="tabular-nums">{{ value }} uds.</span>
398
- <UBadge v-if="row.stock === 0" color="error" label="Agotado" />
431
+ <VBadge v-if="row.stock === 0" color="error" label="Agotado" />
399
432
  </template>
400
433
  </VTable>
401
434
  ```
@@ -412,20 +445,20 @@ const failure = computed(() => isError.value
412
445
  : undefined)
413
446
  ```
414
447
 
415
- Con `useVunoCrud` no hace falta escribirlo: el objeto lo construye él, y el título y la pista se declaran en `messages` con `listFailed` y `listFailedHint`.
448
+ Con `useCrud` no hace falta escribirlo: el objeto lo construye él, y el título y la pista se declaran en `messages` con `listFailed` y `listFailedHint`.
416
449
 
417
450
  Si vienes de componerlo a mano, cuenta con un efecto lateral: si tu proyecto tiene un test que sujeta esta invariante buscando el objeto en la pantalla, se pondrá **rojo** al mudar los textos, porque ahí ya no hay ningún `retry:` que encontrar. No es una regresión —la garantía sigue, solo que ahora la sostiene el tipo `VunoTableFailure`, cuyo `retry` es obligatorio y comprueba el typecheck— pero el test tiene que mirar otra cosa.
418
451
 
419
452
  El reintento va **dentro** del objeto para que no se pueda pintar un error sin ofrecer salida. Mientras hay fallo, la tabla no muestra filas ni paginación. El estado vacío se declara en la definición (`empty: { title, hint, icon }`) y tiene un slot `empty-actions` donde encaja el «crear el primero».
420
453
 
421
- Los dos estados existen además como componentes sueltos, para las pantallas que no son una tabla:
454
+ Los dos estados existen además sueltos, para las pantallas que no son una tabla, y son **un solo componente con dos tonos**: `VState`. El tono no es un adjetivo sino el discriminante de una unión, así que `tone="failure"` exige el objeto del fallo y no hay forma de escribir un error sin su salida dentro:
422
455
 
423
456
  ```vue
424
- <VEmptyState title="Todavía no hay pedidos" hint="Aparecerán aquí en cuanto entre el primero." icon="lucide:inbox">
425
- <template #actions><UButton label="Crear pedido" /></template>
426
- </VEmptyState>
457
+ <VState title="Todavía no hay pedidos" hint="Aparecerán aquí en cuanto entre el primero." icon="lucide:inbox">
458
+ <template #actions><VButton label="Crear pedido" /></template>
459
+ </VState>
427
460
 
428
- <VFailureState :failure="failure" />
461
+ <VState tone="failure" :failure="failure" />
429
462
  ```
430
463
 
431
464
  Tipos de columna: `text` · `number` · `currency` · `date` · `boolean` · `badge` · `image` · `custom` · `actions`. Trae búsqueda con antirrebote, paginación, selección múltiple, panel lateral de filtros y menú de acciones por fila.
@@ -437,7 +470,7 @@ Tipos de columna: `text` · `number` · `currency` · `date` · `boolean` · `ba
437
470
  ```vue
438
471
  <VConfirm v-model:open="open" :title="`¿Eliminar ${marca.nombre}?`" @confirm="borrar">
439
472
  <p>Se eliminará <strong>{{ marca.nombre }}</strong>.</p>
440
- <p class="text-warning">{{ marca.productos }} productos se quedarán sin marca.</p>
473
+ <p class="text-vuno-warning">{{ marca.productos }} productos se quedarán sin marca.</p>
441
474
  </VConfirm>
442
475
  ```
443
476
 
@@ -453,7 +486,7 @@ app/components/modal/ModalInvoice.vue -> open('invoice')
453
486
  ```
454
487
 
455
488
  ```ts
456
- const modal = useVunoModal()
489
+ const modal = useModal()
457
490
 
458
491
  const guardado = await modal.open<boolean>('product', { sku: row.sku })
459
492
  ```
@@ -480,27 +513,66 @@ Se pinta en `<VApp>` y no en la pantalla que lo abrió, así que navegar no lo d
480
513
 
481
514
  | Composable | Para qué |
482
515
  |---|---|
483
- | `useVunoCrud` | El ciclo de mantenimiento entero sobre TanStack Query. |
484
- | `useVunoTableQuery` | Estado de consulta de una tabla, opcionalmente sincronizado con la query string. |
485
- | `useVunoForm` | Contexto del `VForm` que envuelve al componente: estado, `dirty`, `reset`. |
486
- | `useVunoField` | Lee y escribe un campo por su ruta; para construir campos propios. |
487
- | `useVunoTheme` | Resuelve los slots de un componente cruzando tema, `app.config` y prop `ui`. |
488
- | `useVunoIcons` | Los iconos configurados en `vuno.icons`. |
489
- | `useVunoMessages` | Los textos configurados en `vuno.messages`. |
516
+ | `useCrud` | El ciclo de mantenimiento entero sobre TanStack Query. |
517
+ | `useTableQuery` | Estado de consulta de una tabla, opcionalmente sincronizado con la query string. |
518
+ | `useForm` | Contexto del `VForm` que envuelve al componente: estado, `dirty`, `reset`. |
519
+ | `useField` | Lee y escribe un campo por su ruta; para construir campos propios. |
520
+ | `useTheme` | Resuelve los slots de un componente cruzando tema, `app.config` y prop `ui`. |
521
+ | `useIcons` | Los iconos configurados en `vuno.icons`. |
522
+ | `useMessages` | Los textos configurados en `vuno.messages`. |
490
523
 
491
524
  Los tres últimos existen para que un componente tuyo pueda usar los mismos iconos, textos y reglas de tema que los de vuno sin duplicar la configuración.
492
525
 
493
526
  ## Personalización
494
527
 
495
- Tres niveles, de más global a más concreto:
528
+ ### Los tokens
529
+
530
+ **Es el primer sitio al que hay que ir, y casi siempre el único.** Todo el color, el radio y la jerarquía de texto de vuno salen de variables CSS que se redefinen desde el proyecto. El caso mínimo, en cualquier hoja que cargue tu aplicación:
531
+
532
+ ```css
533
+ :root {
534
+ --vuno-primary: var(--color-indigo-600);
535
+ }
536
+ ```
537
+
538
+ Con esa línea cambian los botones sólidos, el anillo de foco de todos los campos, el enlace activo, la casilla marcada y el acento de las insignias: no hay un solo componente que escriba ese azul por su cuenta.
539
+
540
+ Los que hay:
541
+
542
+ | Token | Para qué |
543
+ | --- | --- |
544
+ | `--vuno-primary` · `--vuno-secondary` · `--vuno-neutral` | Los tres acentos de marca. |
545
+ | `--vuno-success` · `--vuno-info` · `--vuno-warning` · `--vuno-error` | Los cuatro de estado. |
546
+ | `--vuno-*-contrast` | El texto que va **encima** de cada acento en su variante sólida. |
547
+ | `--vuno-font-sans` · `--vuno-font-mono` | La tipografía. El módulo **nombra** la familia y no la carga: un `@import` a un servidor de fuentes convertiría cada visita de tu proyecto en una petición a un tercero. Cárgala tú —con `@nuxt/fonts` o con tu propio `@font-face`—; si no está, la pila de respaldo se encarga. |
548
+ | `--vuno-surface` · `--vuno-surface-1` · `--vuno-surface-2` · `--vuno-surface-inverse` | La escala de elevación: **cada cosa sube un escalón sobre lo que la sostiene**. La página es la base —blanco en claro, negro en oscuro—, lo que se levanta de ella es el 1 y lo que se levanta dentro de algo ya levantado es el 2. |
549
+ | `--vuno-text-strong` · `-body` · `-muted` · `-subtle` · `-inverse` | El texto por jerarquía, no por color. |
550
+ | `--vuno-border` · `--vuno-border-strong` | El borde que decora y el que delimita un control. |
551
+ | `--vuno-radius` | La curvatura de todo. |
552
+ | `--vuno-backdrop` | El velo que oscurece detrás de un diálogo. |
553
+
554
+ Dos cosas que ahorran un rato:
555
+
556
+ - **El tema oscuro se redefine aparte**, bajo `.dark`. Si solo cambias `:root`, el modo oscuro se queda con el valor de serie.
557
+ - **Cada acento sólido necesita su contraste.** Un `--vuno-warning` claro con texto blanco no se lee; por eso el ámbar de serie trae texto oscuro.
558
+
559
+ ```css
560
+ .dark {
561
+ --vuno-primary: var(--color-indigo-400);
562
+ }
563
+ ```
564
+
565
+ ### Los tres niveles del resto
566
+
567
+ Para lo que no es color: la forma de un componente concreto, sus iconos y sus textos.
496
568
 
497
569
  ```ts
498
570
  // app.config.ts — para toda la aplicación
499
571
  export default defineAppConfig({
500
- ui: { colors: { primary: 'indigo' } },
501
572
  vuno: {
502
573
  formSection: { slots: { root: 'border-dashed' } },
503
574
  icons: { slugEdit: 'lucide:wand-sparkles' },
575
+ locale: 'es-ES',
504
576
  messages: { selectPlaceholder: 'Elige una opción' },
505
577
  },
506
578
  })
@@ -511,7 +583,9 @@ export default defineAppConfig({
511
583
  <VForm :ui="{ sections: 'gap-8' }" ... />
512
584
  ```
513
585
 
514
- Los textos e iconos están todos en `vuno.messages` y `vuno.icons`: el paquete no impone idioma ni colección de iconos.
586
+ Se funden en orden de especificidad creciente —tema por defecto, `app.config`, prop `ui`— y los conflictos los deshace `tailwind-merge`, así que la última clase gana de verdad y no depende del orden de la hoja.
587
+
588
+ Los textos e iconos están todos en `vuno.messages` y `vuno.icons`: el paquete no impone idioma ni colección de iconos. El formato de fechas, números y monedas sale de `vuno.locale`, que se declara en vez de leerse del navegador —con render en servidor, adivinarlo da un número en el HTML y otro al hidratar—.
515
589
 
516
590
  ## Estado
517
591
 
@@ -519,9 +593,13 @@ En desarrollo.
519
593
 
520
594
  ### Nota sobre pruebas automatizadas
521
595
 
522
- Al comprobar los diálogos con un navegador controlado por automatización, el nodo del modal puede seguir en el DOM después de cerrarlo. No es un fallo: Chrome congela las animaciones CSS en pestañas ocultas y Reka UI espera el evento `animationend` para desmontar el diálogo. El componente ya está cerrado —lo indica su `data-state="closed"`—, solo falta la limpieza.
596
+ Tres trampas, las tres medidas aquí, que hacen que una comprobación afirme lo contrario de lo que pasa.
597
+
598
+ **Una pestaña oculta no pinta.** Con la ventana de fondo, `document.visibilityState` es `hidden`, `requestAnimationFrame` **no dispara nunca** y con él se paran las transiciones: un diálogo puede no llegar a abrirse y una captura caducar. El DOM y las medidas de disposición sí funcionan, así que se puede comprobar casi todo; lo que no se puede es dar por cerrado un componente porque su nodo siga ahí. Mira el estado (`opacity`, `data-state`) y no la existencia del nodo, o haz la prueba con la pestaña delante.
599
+
600
+ **`getComputedStyle` se queda con el valor viejo tras cambiar un token.** Si redefines `--vuno-primary` y vuelves a leer un elemento que ya existía, puede devolverte el color anterior aunque la variable ya valga otra cosa. Se nota porque el valor sale en `oklab` en vez de en `oklch`. Lee sobre un elemento **creado después** del cambio —o sobre un clon del que te interesa— y el valor es el nuevo.
523
601
 
524
- Comprueba la visibilidad real (`opacity`, `data-state`) en lugar de la existencia del nodo, o haz la prueba con la pestaña en primer plano.
602
+ **Un control de Reka no responde a un clic sintético.** Sus botones actúan en `pointerdown`, no en `click`, y las flechas necesitan foco de verdad: un `.click()` o un `.focus()` desde el script no disparan nada y parece que el componente está roto. Los controles nativos —casilla, interruptor, radio— sí responden a `click()`, así que ahí el clic sintético vale.
525
603
 
526
604
  ## Licencia
527
605
 
@@ -0,0 +1,2 @@
1
+ export * from "/woodpecker/src/github.com/groupteknology/vuno/packages/core/src/module.js";
2
+ export { default } from "/woodpecker/src/github.com/groupteknology/vuno/packages/core/src/module.js";
package/dist/module.d.mts CHANGED
@@ -1,10 +1,2 @@
1
- import { NuxtModule } from '@nuxt/schema';
2
- export * from '../dist/runtime/app/types/index.js';
3
-
4
- interface ModuleOptions {
5
- prefix?: string;
6
- }
7
- declare const module$1: NuxtModule<ModuleOptions>;
8
-
9
- export { module$1 as default };
10
- export type { ModuleOptions };
1
+ export * from "/woodpecker/src/github.com/groupteknology/vuno/packages/core/src/module.js";
2
+ export { default } from "/woodpecker/src/github.com/groupteknology/vuno/packages/core/src/module.js";
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vuno",
3
3
  "configKey": "vuno",
4
- "version": "0.6.1",
4
+ "version": "1.0.0",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.3",
7
7
  "unbuild": "unknown"
package/dist/module.mjs CHANGED
@@ -1,34 +1,18 @@
1
- import { defineNuxtModule, createResolver, addComponentsDir, addImportsDir } from '@nuxt/kit';
1
+ import { createJiti } from "file:///woodpecker/src/github.com/groupteknology/vuno/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti.mjs";
2
2
 
3
- const module$1 = defineNuxtModule({
4
- defaults: {
5
- prefix: "V"
3
+ const jiti = createJiti(import.meta.url, {
4
+ "interopDefault": true,
5
+ "alias": {
6
+ "@groupteknology/vuno": "/woodpecker/src/github.com/groupteknology/vuno/packages/core"
6
7
  },
7
- meta: {
8
- name: "vuno",
9
- configKey: "vuno"
10
- },
11
- moduleDependencies: {
12
- "@nuxt/ui": {}
13
- },
14
- setup(options, nuxt) {
15
- const resolver = createResolver(import.meta.url);
16
- nuxt.options.alias["#vuno"] = resolver.resolve("./runtime/app");
17
- addComponentsDir({
18
- global: true,
19
- path: resolver.resolve("./runtime/app/components"),
20
- pathPrefix: false,
21
- prefix: options.prefix
22
- });
23
- nuxt.hook("components:extend", (components) => {
24
- for (const component of components) {
25
- const path = component.filePath.split("\\").join("/");
26
- if (path.includes("/components/modal/")) component.global = true;
27
- }
28
- });
29
- addImportsDir(resolver.resolve("./runtime/app/composables"));
30
- nuxt.options.css.push(resolver.resolve("./runtime/app/assets/css/main.css"));
8
+ "transformOptions": {
9
+ "babel": {
10
+ "plugins": []
11
+ }
31
12
  }
32
- });
13
+ })
14
+
15
+ /** @type {import("/woodpecker/src/github.com/groupteknology/vuno/packages/core/src/module.js")} */
16
+ const _module = await jiti.import("/woodpecker/src/github.com/groupteknology/vuno/packages/core/src/module.ts");
33
17
 
34
- export { module$1 as default };
18
+ export default _module?.default ?? _module;
package/dist/types.d.mts CHANGED
@@ -1,5 +1,13 @@
1
- export { default } from './module.mjs'
1
+ import type { ModuleHooks, ModuleRuntimeHooks, ModuleRuntimeConfig, ModulePublicRuntimeConfig } from './module.mjs'
2
2
 
3
- export { type ModuleOptions } from './module.mjs'
3
+ declare module '#app' {
4
+ interface RuntimeNuxtHooks extends ModuleRuntimeHooks {}
5
+ }
4
6
 
5
- export * from '../dist/runtime/app/types/index.js'
7
+ declare module '@nuxt/schema' {
8
+ interface NuxtHooks extends ModuleHooks {}
9
+ interface RuntimeConfig extends ModuleRuntimeConfig {}
10
+ interface PublicRuntimeConfig extends ModulePublicRuntimeConfig {}
11
+ }
12
+
13
+ export * from "./module.mjs"
package/package.json CHANGED
@@ -1,6 +1,28 @@
1
1
  {
2
2
  "name": "@groupteknology/vuno",
3
- "version": "0.6.1",
3
+ "version": "1.0.0",
4
+ "description": "Formularios, tablas y diálogos declarativos para Nuxt 4, con componentes propios y tokens sobreescribibles.",
5
+ "keywords": [
6
+ "nuxt",
7
+ "nuxt-module",
8
+ "vue",
9
+ "form",
10
+ "table",
11
+ "crud",
12
+ "datatable",
13
+ "typescript"
14
+ ],
15
+ "homepage": "https://github.com/groupteknology/vuno#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/groupteknology/vuno/issues"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/groupteknology/vuno.git",
22
+ "directory": "packages/core"
23
+ },
24
+ "license": "MIT",
25
+ "author": "Diego Otayza <diegootayza@live.com>",
4
26
  "type": "module",
5
27
  "exports": {
6
28
  ".": {
@@ -21,66 +43,46 @@
21
43
  "dist"
22
44
  ],
23
45
  "dependencies": {
24
- "@iconify-json/lucide": "^1.2.123",
46
+ "@floating-ui/dom": "^1.8.0",
47
+ "@vueuse/core": "^15.0.0",
48
+ "@iconify-json/lucide": "^1.2.134",
49
+ "@nuxt/icon": "^2.5.1",
25
50
  "@nuxt/kit": "^4.5.2",
26
- "tailwind-merge": "^3.6.0"
51
+ "@tailwindcss/vite": "^4.3.3",
52
+ "gsap": "^3.15.0",
53
+ "tailwind-merge": "^3.7.0",
54
+ "tailwindcss": "^4.3.3"
27
55
  },
28
56
  "devDependencies": {
29
57
  "@nuxt/module-builder": "^1.0.3",
58
+ "@nuxt/schema": "^4.5.2",
30
59
  "@tanstack/vue-query": "^5.0.0",
31
- "@types/node": "^22.20.2",
60
+ "@types/node": "^26.6.2",
61
+ "@vitejs/plugin-vue": "^6.0.9",
62
+ "@vitest/coverage-v8": "^5.0.1",
63
+ "@vue/test-utils": "^2.5.0",
64
+ "happy-dom": "^20.14.5",
32
65
  "nuxt": "^4.5.2",
33
66
  "typescript": "^6.0.3",
34
- "vitest": "^3.2.4",
35
- "vue": "^3.5.42",
36
- "vue-tsc": "^3.3.11",
37
- "zod": "^4.6.2",
38
- "tailwindcss": "^4.3.3"
39
- },
40
- "description": "Formularios, tablas y diálogos declarativos para Nuxt 4, construidos sobre Nuxt UI y sin estilos propios.",
41
- "keywords": [
42
- "nuxt",
43
- "nuxt-module",
44
- "nuxt-ui",
45
- "vue",
46
- "form",
47
- "table",
48
- "crud",
49
- "datatable",
50
- "typescript"
51
- ],
52
- "license": "MIT",
53
- "author": "Diego Otayza <diegootayza@live.com>",
54
- "repository": {
55
- "type": "git",
56
- "url": "git+https://github.com/groupteknology/vuno.git",
57
- "directory": "packages/core"
67
+ "vitest": "^5.0.1",
68
+ "vue": "^3.5.43",
69
+ "vue-tsc": "^3.3.11"
58
70
  },
59
- "bugs": {
60
- "url": "https://github.com/groupteknology/vuno/issues"
71
+ "peerDependencies": {
72
+ "nuxt": "^4.5.2",
73
+ "vue": "^3.5.43"
61
74
  },
62
- "homepage": "https://github.com/groupteknology/vuno#readme",
63
75
  "publishConfig": {
64
76
  "access": "public"
65
77
  },
66
- "peerDependencies": {
67
- "@nuxt/ui": "^4.0.0",
68
- "@tanstack/vue-query": "^5.0.0",
69
- "nuxt": "^4.0.0",
70
- "vue": "^3.5.0"
71
- },
72
- "peerDependenciesMeta": {
73
- "@tanstack/vue-query": {
74
- "optional": true
75
- }
76
- },
77
78
  "scripts": {
78
79
  "build": "nuxt-module-build build",
79
- "clean": "rm -rf dist",
80
+ "clean": "node -e \"require('node:fs').rmSync('dist', { force: true, recursive: true })\"",
80
81
  "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare",
81
82
  "dev:watch": "node scripts/watch-build.mjs",
82
- "typecheck": "nuxt-module-build build",
83
83
  "test": "vitest run",
84
- "test:watch": "vitest"
84
+ "test:coverage": "vitest run --coverage",
85
+ "test:watch": "vitest",
86
+ "typecheck": "pnpm dev:prepare && vue-tsc --noEmit -p tsconfig.json"
85
87
  }
86
88
  }
@@ -1 +0,0 @@
1
- @import "tailwindcss";@import "@nuxt/ui";@source "../../**/*";:root{--vuno-modal-duration:180ms;--vuno-modal-ease:cubic-bezier(0.32,0.72,0,1);--vuno-backdrop:rgba(0,0,0,.5)}dialog{opacity:0;transform:scale(.97) translateY(.5rem);transition:opacity var(--vuno-modal-duration) var(--vuno-modal-ease),transform var(--vuno-modal-duration) var(--vuno-modal-ease),display var(--vuno-modal-duration) allow-discrete,overlay var(--vuno-modal-duration) allow-discrete}dialog[open]{opacity:1;transform:scale(1) translateY(0)}@starting-style{dialog[open]{opacity:0;transform:scale(.97) translateY(.5rem)}}dialog::backdrop{background-color:transparent;transition:background-color var(--vuno-modal-duration) var(--vuno-modal-ease),display var(--vuno-modal-duration) allow-discrete,overlay var(--vuno-modal-duration) allow-discrete}dialog[open]::backdrop{background-color:var(--vuno-backdrop)}@starting-style{dialog[open]::backdrop{background-color:transparent}}dialog.vuno-overlay-behind::backdrop,dialog.vuno-overlay-behind[open]::backdrop{background-color:transparent}@media (prefers-reduced-motion:reduce){dialog,dialog::backdrop{transition-duration:1ms}dialog{transform:none}}
@@ -1,33 +0,0 @@
1
- import { type Component } from 'vue';
2
- import type { VunoAlertRequest, VunoConfirmRequest, VunoNotifyRequest } from '#vuno/types/app';
3
- /**
4
- * Monta un componente y espera a que emita `close`.
5
- *
6
- * Cerrar con Escape o pulsando fuera cuenta como cerrar sin resultado: un
7
- * `update:open` en falso resuelve igual, porque si no la promesa se quedaría
8
- * esperando para siempre a un diálogo que ya no está en pantalla.
9
- */
10
- declare function open<TResult = unknown>(component: Component, props?: Record<string, unknown>): Promise<TResult | undefined>;
11
- declare function closeAll(): void;
12
- declare function dismiss(id: number): void;
13
- declare function notify(request: VunoNotifyRequest): number;
14
- declare var __VLS_1: {};
15
- type __VLS_Slots = {} & {
16
- default?: (props: typeof __VLS_1) => any;
17
- };
18
- declare const __VLS_base: import("vue").DefineComponent<{}, {
19
- alert: (request: VunoAlertRequest) => Promise<void>;
20
- closeAll: typeof closeAll;
21
- confirm: (request: VunoConfirmRequest) => Promise<boolean>;
22
- dismiss: typeof dismiss;
23
- notify: typeof notify;
24
- open: typeof open;
25
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
26
- declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
27
- declare const _default: typeof __VLS_export;
28
- export default _default;
29
- type __VLS_WithSlots<T, S> = T & {
30
- new (): {
31
- $slots: S;
32
- };
33
- };