@nexdom/uimed-vue 2.0.0-beta.8 → 2.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 (222) hide show
  1. package/README.md +1 -1
  2. package/dist/_virtual/_rolldown/runtime.js +7 -0
  3. package/dist/components/app-bar/app-bar.js +5 -0
  4. package/dist/components/app-bar/app-bar.vue_vue_type_script_setup_true_lang.js +286 -0
  5. package/dist/components/app-bar/types.d.ts +96 -0
  6. package/dist/components/button/button.js +5 -0
  7. package/dist/components/button/button.vue.d.ts +31 -0
  8. package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js +97 -0
  9. package/dist/components/button/types.d.ts +65 -0
  10. package/dist/components/data-sets/data-set/data-set.js +5 -0
  11. package/dist/components/data-sets/data-set/data-set.vue.d.ts +47 -0
  12. package/dist/components/data-sets/data-set/data-set.vue_vue_type_script_setup_true_lang.js +157 -0
  13. package/dist/components/data-sets/data-set/types.d.ts +93 -0
  14. package/dist/components/data-sets/data-set-bar.js +5 -0
  15. package/dist/components/data-sets/data-set-bar.vue_vue_type_script_setup_true_lang.js +99 -0
  16. package/dist/components/data-sets/data-set-item/data-set-item.js +5 -0
  17. package/dist/components/data-sets/data-set-item/data-set-item.vue.d.ts +35 -0
  18. package/dist/components/data-sets/data-set-item/data-set-item.vue_vue_type_script_setup_true_lang.js +57 -0
  19. package/dist/components/data-sets/data-set-item/types.d.ts +42 -0
  20. package/dist/components/details/details.js +5 -0
  21. package/dist/components/details/details.vue.d.ts +28 -0
  22. package/dist/components/details/details.vue_vue_type_script_setup_true_lang.js +56 -0
  23. package/dist/components/details/types.d.ts +29 -0
  24. package/dist/components/dialogs/dialog/dialog-host-key.js +10 -0
  25. package/dist/components/dialogs/dialog/dialog.js +5 -0
  26. package/dist/components/dialogs/dialog/dialog.vue.d.ts +36 -0
  27. package/dist/components/dialogs/dialog/dialog.vue_vue_type_script_setup_true_lang.js +112 -0
  28. package/dist/components/dialogs/dialog/types.d.ts +47 -0
  29. package/dist/components/dialogs/dialog-host.js +5 -0
  30. package/dist/components/dialogs/dialog-host.vue_vue_type_script_setup_true_lang.js +81 -0
  31. package/dist/components/dialogs/toast.js +5 -0
  32. package/dist/components/dialogs/toast.vue_vue_type_script_setup_true_lang.js +35 -0
  33. package/dist/components/footer/footer.js +5 -0
  34. package/dist/components/footer/footer.vue_vue_type_script_setup_true_lang.js +31 -0
  35. package/dist/components/footer/types.d.ts +16 -0
  36. package/dist/components/form/form.js +5 -0
  37. package/dist/components/form/form.vue.d.ts +32 -0
  38. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +37 -0
  39. package/dist/components/form/types.d.ts +15 -0
  40. package/dist/components/grid/column/column.js +5 -0
  41. package/dist/components/grid/column/column.vue.d.ts +33 -0
  42. package/dist/components/grid/column/column.vue_vue_type_script_setup_true_lang.js +45 -0
  43. package/dist/components/grid/column/types.d.ts +27 -0
  44. package/dist/components/grid/container/container.js +5 -0
  45. package/dist/components/grid/container/container.vue.d.ts +27 -0
  46. package/dist/components/grid/container/container.vue_vue_type_script_setup_true_lang.js +33 -0
  47. package/dist/components/grid/container/types.d.ts +17 -0
  48. package/dist/components/grid/row/row.js +5 -0
  49. package/dist/components/grid/row/row.vue.d.ts +29 -0
  50. package/dist/components/grid/row/row.vue_vue_type_script_setup_true_lang.js +61 -0
  51. package/dist/components/grid/row/types.d.ts +63 -0
  52. package/dist/components/icon-button/icon-button.js +5 -0
  53. package/dist/components/icon-button/icon-button.vue.d.ts +23 -0
  54. package/dist/components/icon-button/icon-button.vue_vue_type_script_setup_true_lang.js +51 -0
  55. package/dist/components/icon-button/types.d.ts +32 -0
  56. package/dist/components/img/img.js +5 -0
  57. package/dist/components/img/img.vue.d.ts +23 -0
  58. package/dist/components/img/img.vue_vue_type_script_setup_true_lang.js +61 -0
  59. package/dist/components/img/types.d.ts +43 -0
  60. package/dist/components/inputs/autocomplete-field/autocomplete-field.js +5 -0
  61. package/dist/components/inputs/autocomplete-field/autocomplete-field.vue.d.ts +33 -0
  62. package/dist/components/inputs/autocomplete-field/autocomplete-field.vue_vue_type_script_setup_true_lang.js +161 -0
  63. package/dist/components/inputs/autocomplete-field/types.d.ts +84 -0
  64. package/dist/components/inputs/checkbox/checkbox.js +5 -0
  65. package/dist/components/inputs/checkbox/checkbox.vue.d.ts +33 -0
  66. package/dist/components/inputs/checkbox/checkbox.vue_vue_type_script_setup_true_lang.js +71 -0
  67. package/dist/components/inputs/checkbox/types.d.ts +35 -0
  68. package/dist/components/inputs/date-time-field/date-time-field.js +5 -0
  69. package/dist/components/inputs/date-time-field/date-time-field.vue.d.ts +32 -0
  70. package/dist/components/inputs/date-time-field/date-time-field.vue_vue_type_script_setup_true_lang.js +205 -0
  71. package/dist/components/inputs/date-time-field/types.d.ts +84 -0
  72. package/dist/components/inputs/field-loader.js +5 -0
  73. package/dist/components/inputs/field-loader.vue_vue_type_script_setup_true_lang.js +30 -0
  74. package/dist/components/inputs/mask-field/mask-field.js +5 -0
  75. package/dist/components/inputs/mask-field/mask-field.vue.d.ts +32 -0
  76. package/dist/components/inputs/mask-field/mask-field.vue_vue_type_script_setup_true_lang.js +120 -0
  77. package/dist/components/inputs/mask-field/types.d.ts +118 -0
  78. package/dist/components/inputs/text-field/text-field.js +5 -0
  79. package/dist/components/inputs/text-field/text-field.vue.d.ts +30 -0
  80. package/dist/components/inputs/text-field/text-field.vue_vue_type_script_setup_true_lang.js +119 -0
  81. package/dist/components/inputs/text-field/types.d.ts +70 -0
  82. package/dist/components/link/link.js +5 -0
  83. package/dist/components/link/link.vue.d.ts +27 -0
  84. package/dist/components/link/link.vue_vue_type_script_setup_true_lang.js +32 -0
  85. package/dist/components/link/types.d.ts +18 -0
  86. package/dist/components/main/main.js +5 -0
  87. package/dist/components/main/main.vue.d.ts +33 -0
  88. package/dist/components/main/main.vue_vue_type_script_setup_true_lang.js +104 -0
  89. package/dist/components/main/types.d.ts +75 -0
  90. package/dist/components/navigation-menu/navigation-menu.js +5 -0
  91. package/dist/components/navigation-menu/navigation-menu.vue_vue_type_script_setup_true_lang.js +207 -0
  92. package/dist/components/navigation-menu/types.d.ts +62 -0
  93. package/dist/components/page-transition/page-transition.js +5 -0
  94. package/dist/components/page-transition/page-transition.vue.d.ts +40 -0
  95. package/dist/components/page-transition/page-transition.vue_vue_type_script_setup_true_lang.js +27 -0
  96. package/dist/components/page-transition/types.d.ts +18 -0
  97. package/dist/components/sections/section/section.js +5 -0
  98. package/dist/components/sections/section/section.vue.d.ts +28 -0
  99. package/dist/components/sections/section/section.vue_vue_type_script_setup_true_lang.js +108 -0
  100. package/dist/components/sections/section/types.d.ts +80 -0
  101. package/dist/components/sections/section-content/section-content.js +5 -0
  102. package/dist/components/sections/section-content/section-content.vue.d.ts +27 -0
  103. package/dist/components/sections/section-content/section-content.vue_vue_type_script_setup_true_lang.js +16 -0
  104. package/dist/components/skeleton-loader/skeleton-loader.js +5 -0
  105. package/dist/components/skeleton-loader/skeleton-loader.vue_vue_type_script_setup_true_lang.js +65 -0
  106. package/dist/components/table/table.js +5 -0
  107. package/dist/components/table/table.vue.d.ts +19 -0
  108. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js +84 -0
  109. package/dist/components/table/types.d.ts +51 -0
  110. package/dist/components.d.ts +23 -940
  111. package/dist/components.js +23 -1254
  112. package/dist/composables/alignment/alignment.js +41 -0
  113. package/dist/composables/alignment/types.d.ts +12 -0
  114. package/dist/composables/button/button.js +54 -0
  115. package/dist/composables/colors/constants.js +27 -0
  116. package/dist/composables/colors/types.d.ts +4 -0
  117. package/dist/composables/colors/use-vuetify-background-color.js +16 -0
  118. package/dist/composables/colors/use-vuetify-color.js +11 -0
  119. package/dist/composables/colors/use-vuetify-text-color.js +12 -0
  120. package/dist/composables/data-set/data-set.js +128 -0
  121. package/dist/composables/dialogs/types.d.ts +88 -0
  122. package/dist/composables/dialogs/use-confirm.d.ts +21 -0
  123. package/dist/composables/dialogs/use-confirm.js +55 -0
  124. package/dist/composables/dialogs/use-decorative-timer.js +25 -0
  125. package/dist/composables/dialogs/use-dialog-focus.js +64 -0
  126. package/dist/composables/dialogs/use-dialog-loading.js +13 -0
  127. package/dist/composables/dialogs/use-dialog.d.ts +36 -0
  128. package/dist/composables/dialogs/use-dialog.js +73 -0
  129. package/dist/composables/dialogs/use-run-or-toast.d.ts +27 -0
  130. package/dist/composables/dialogs/use-run-or-toast.js +65 -0
  131. package/dist/composables/dialogs/use-toast.d.ts +25 -0
  132. package/dist/composables/dialogs/use-toast.js +39 -0
  133. package/dist/composables/dimensions/dimensions.js +18 -0
  134. package/dist/composables/inputs/autocomplete-field.js +39 -0
  135. package/dist/composables/inputs/date-time-field.js +109 -0
  136. package/dist/composables/inputs/fields.js +28 -0
  137. package/dist/composables/inputs/mask-field.js +133 -0
  138. package/dist/composables/inputs/rules.js +16 -0
  139. package/dist/composables/inputs/text-field.js +81 -0
  140. package/dist/composables/navigation/types.d.ts +54 -0
  141. package/dist/composables/navigation/use-navigation-rail.js +163 -0
  142. package/dist/composables/navigation/use-navigation-search-shortcut.js +96 -0
  143. package/dist/composables/navigation/use-route-props.js +21 -0
  144. package/dist/composables/navigation/use-unsaved-changes.d.ts +35 -0
  145. package/dist/composables/navigation/use-unsaved-changes.js +88 -0
  146. package/dist/composables/section/section.js +34 -0
  147. package/dist/composables.d.ts +6 -67
  148. package/dist/composables.js +6 -65
  149. package/dist/consts/icons.d.ts +67 -0
  150. package/dist/consts/icons.js +69 -0
  151. package/dist/consts/locale.js +12 -0
  152. package/dist/consts/types.d.ts +12 -0
  153. package/dist/index.d.ts +1 -13
  154. package/dist/index.js +39 -14
  155. package/dist/plugins.d.ts +15 -4
  156. package/dist/plugins.js +54 -3
  157. package/dist/styles/fonts/UnimedSlab-Regular.woff2 +0 -0
  158. package/dist/styles/fonts/fonts.css +5 -0
  159. package/dist/styles/settings.scss +155 -0
  160. package/dist/unit-test.js +11 -7
  161. package/package.json +11 -11
  162. package/skills/uimed-vue/SKILL.md +113 -0
  163. package/skills/uimed-vue/references/api/components/autocomplete-field.md +45 -0
  164. package/skills/uimed-vue/references/api/components/button.md +48 -0
  165. package/skills/uimed-vue/references/api/components/checkbox.md +36 -0
  166. package/skills/uimed-vue/references/api/components/data-sets/data-set-item.md +61 -0
  167. package/skills/uimed-vue/references/api/components/data-sets/data-set.md +67 -0
  168. package/skills/uimed-vue/references/api/components/date-time-field.md +44 -0
  169. package/skills/uimed-vue/references/api/components/details.md +33 -0
  170. package/skills/uimed-vue/references/api/components/dialog.md +70 -0
  171. package/skills/uimed-vue/references/api/components/form.md +43 -0
  172. package/skills/uimed-vue/references/api/components/grid/column.md +41 -0
  173. package/skills/uimed-vue/references/api/components/grid/container.md +32 -0
  174. package/skills/uimed-vue/references/api/components/grid/row.md +37 -0
  175. package/skills/uimed-vue/references/api/components/icon-button.md +37 -0
  176. package/skills/uimed-vue/references/api/components/img.md +34 -0
  177. package/skills/uimed-vue/references/api/components/link.md +31 -0
  178. package/skills/uimed-vue/references/api/components/main.md +174 -0
  179. package/skills/uimed-vue/references/api/components/mask-field.md +60 -0
  180. package/skills/uimed-vue/references/api/components/page-transition.md +37 -0
  181. package/skills/uimed-vue/references/api/components/sections/section-content.md +23 -0
  182. package/skills/uimed-vue/references/api/components/sections/section.md +61 -0
  183. package/skills/uimed-vue/references/api/components/table.md +35 -0
  184. package/skills/uimed-vue/references/api/components/text-field.md +42 -0
  185. package/skills/uimed-vue/references/api/composables/use-confirm.md +96 -0
  186. package/skills/uimed-vue/references/api/composables/use-dialog.md +95 -0
  187. package/skills/uimed-vue/references/api/composables/use-run-or-toast.md +58 -0
  188. package/skills/uimed-vue/references/api/composables/use-toast.md +48 -0
  189. package/skills/uimed-vue/references/api/composables/use-unsaved-changes.md +106 -0
  190. package/skills/uimed-vue/references/api/index.md +1 -0
  191. package/skills/uimed-vue/references/guide/components/autocomplete-field.md +256 -0
  192. package/skills/uimed-vue/references/guide/components/button.md +155 -0
  193. package/skills/uimed-vue/references/guide/components/checkbox.md +113 -0
  194. package/skills/uimed-vue/references/guide/components/data-set.md +370 -0
  195. package/skills/uimed-vue/references/guide/components/date-time-field.md +202 -0
  196. package/skills/uimed-vue/references/guide/components/details.md +76 -0
  197. package/skills/uimed-vue/references/guide/components/dialog.md +269 -0
  198. package/skills/uimed-vue/references/guide/components/form.md +96 -0
  199. package/skills/uimed-vue/references/guide/components/icon-button.md +76 -0
  200. package/skills/uimed-vue/references/guide/components/img.md +128 -0
  201. package/skills/uimed-vue/references/guide/components/layout.md +323 -0
  202. package/skills/uimed-vue/references/guide/components/link.md +47 -0
  203. package/skills/uimed-vue/references/guide/components/main.md +435 -0
  204. package/skills/uimed-vue/references/guide/components/mask-field.md +256 -0
  205. package/skills/uimed-vue/references/guide/components/page-transition.md +111 -0
  206. package/skills/uimed-vue/references/guide/components/section.md +232 -0
  207. package/skills/uimed-vue/references/guide/components/table.md +102 -0
  208. package/skills/uimed-vue/references/guide/components/text-field.md +172 -0
  209. package/skills/uimed-vue/references/guide/composables/use-confirm.md +123 -0
  210. package/skills/uimed-vue/references/guide/composables/use-dialog.md +102 -0
  211. package/skills/uimed-vue/references/guide/composables/use-run-or-toast.md +55 -0
  212. package/skills/uimed-vue/references/guide/composables/use-toast.md +57 -0
  213. package/skills/uimed-vue/references/guide/composables/use-unsaved-changes.md +129 -0
  214. package/skills/uimed-vue/references/guide/getting-started.md +135 -0
  215. package/skills/uimed-vue/references/guide/icons.md +71 -0
  216. package/skills/uimed-vue/references/guide/index.md +51 -0
  217. package/skills/uimed-vue/references/guide/migration-v1-to-v2.md +191 -0
  218. package/skills/uimed-vue/references/guide/unit-testing.md +85 -0
  219. package/AGENTS.md +0 -160
  220. package/CLAUDE.md +0 -1
  221. package/dist/types-BPXXtbmW.d.ts +0 -5
  222. package/dist/use-toast-CACuYhK_.js +0 -53
@@ -0,0 +1,42 @@
1
+ # UTextField
2
+
3
+ Componente para utilização de campos de text.
4
+
5
+ ## Props
6
+
7
+ | Prop | Tipo | Padrão | Descrição |
8
+ | ------------- | ------------------------------------------------------------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | `modelValue` | `string` | `""` | Valor digitado no campo. |
10
+ | `variant` | `"primary" \| "secondary"` | `"primary"` | Aplica uma variação de estilo distinta ao campo. |
11
+ | `type` | `"text" \| "phone" \| "email" \| "url" \| "password" \| "search" ` | `"text"` | Ajusta o tipo de campo de texto. Com `password`, exibe o ícone "Mostrar senha", que alterna entre mostrar e ocultar o valor. |
12
+ | `label` | `string` | | Título dado ao campo. |
13
+ | `placeholder` | `string` | | Exemplo de valor para preenchimento do campo. |
14
+ | `hint` | `string` | | Dica, instrução ou mensagem relacionada ao campo. |
15
+ | `required` | `boolean` | `false` | Torna o campo obrigatório para a submissão do formulário. |
16
+ | `disabled` | `boolean` | `false` | Remove a possibilidade de interação com o campo. |
17
+ | `readonly` | `boolean` | `false` | Remove a possibilidade de edição do campo. |
18
+ | `loading` | `boolean` | `false` | Exibe um indicador de carregamento. O campo mantém o rótulo como nome acessível e fica marcado como ocupado, e leitores de tela ignoram o indicador. |
19
+ | `clearable` | `boolean` | `false` | Exibe recurso para limpar o campo. O valor padrão muda para `true` quando o `type` é `search`. |
20
+ | `dataTestid` | `string` | | Aplica atributo `data-testid` para testes sobre o componente. |
21
+
22
+ ## Eventos
23
+
24
+ | Event | Retorno | Descrição |
25
+ | ------------------- | -------- | ------------------------------------------------------------------ |
26
+ | `update:modelValue` | `string` | Retorna o novo valor do campo sempre que o usuário altera o mesmo. |
27
+
28
+ ## Exemplo
29
+
30
+ ```vue
31
+ <template>
32
+ <u-text-field v-model="name" label="Nome" />
33
+ Olá, {{ name }}!
34
+ </template>
35
+
36
+ <script lang="ts" setup>
37
+ import { ref } from "vue";
38
+ import { UTextField } from "@nexdom/uimed-vue/components";
39
+
40
+ const name = ref("");
41
+ </script>
42
+ ```
@@ -0,0 +1,96 @@
1
+ # useConfirm
2
+
3
+ Composable para execução de ações somente após a confirmação do usuário em um diálogo.
4
+
5
+ ## Tipo
6
+
7
+ ```ts
8
+ type ColorVariant = "primary" | "secondary" | "positive" | "informative" | "caution" | "danger";
9
+
10
+ interface ConfirmOptions {
11
+ title?: string;
12
+ message: string;
13
+ confirmText?: string;
14
+ cancelText?: string;
15
+ color?: ColorVariant;
16
+ }
17
+
18
+ function useConfirm(): {
19
+ confirm: <F extends (...args: Parameters<F>) => PromiseLike<Awaited<ReturnType<F>>>>(
20
+ options: ConfirmOptions,
21
+ action: F,
22
+ ...params: Parameters<F>
23
+ ) => Promise<Awaited<ReturnType<F>> | false>;
24
+ isRunning: import("vue").ComputedRef<boolean>;
25
+ };
26
+ ```
27
+
28
+ ## Detalhes
29
+
30
+ Retorna uma função (`confirm`) e uma [`computed`](https://vuejs.org/guide/essentials/computed.html) (`isRunning`) para monitorar a execução da ação. Cada chamada de `useConfirm` tem o seu próprio `isRunning`.
31
+
32
+ A função (`confirm`) apresenta um diálogo com os botões "Cancelar" e "Confirmar". A ação (`action`) é obrigatória e só é executada, com os parâmetros seguintes (`params`), depois que o usuário clica em "Confirmar". Enquanto ela executa:
33
+
34
+ - o botão de confirmação apresenta um indicador de carregamento;
35
+ - o botão de cancelamento fica desabilitado;
36
+ - o diálogo não pode ser fechado;
37
+ - `isRunning` é `true`.
38
+
39
+ Ao terminar a execução, o diálogo fecha. Se houver qualquer erro durante a execução, a mensagem do erro é apresentada em um [`toast`](./use-toast.md), assim como no [`useRunOrToast`](./use-run-or-toast.md).
40
+
41
+ Os diálogos de `confirm` compartilham a fila de diálogos do [`useDialog`](./use-dialog.md).
42
+
43
+ ### `ConfirmOptions`
44
+
45
+ | Opção | Tipo | Padrão | Descrição |
46
+ | ------------- | -------------------------------------------------------------------------------------------- | ------------- | ---------------------------------------------------------------- |
47
+ | `title` | `string` | | Título do diálogo, em texto simples (HTML não é interpretado). |
48
+ | `message` | `string` | | Mensagem do diálogo, em texto simples (HTML não é interpretado). |
49
+ | `confirmText` | `string` | `"Confirmar"` | Texto do botão de confirmação. |
50
+ | `cancelText` | `string` | `"Cancelar"` | Texto do botão de cancelamento. |
51
+ | `color` | `"primary"` \| `"secondary"` \| `"positive"` \| `"informative"` \| `"caution"` \| `"danger"` | `"primary"` | Cor do botão de confirmação. |
52
+
53
+ ### Retorno
54
+
55
+ `confirm` resolve o retorno da ação, ou `false` quando:
56
+
57
+ - a ação falha;
58
+ - o usuário clica no botão de cancelamento;
59
+ - o usuário pressiona a tecla `Esc` ou clica fora do diálogo;
60
+ - o usuário usa o botão "voltar" do navegador, em aplicações que usam o [Vue Router](https://router.vuejs.org/), exceto quando ele leva a uma página aberta com `router.replace` (como a página pela qual o usuário entrou na aplicação).
61
+
62
+ ### Acessibilidade
63
+
64
+ O diálogo usa o papel `alertdialog`. O foco inicia no botão de cancelamento, fica restrito ao diálogo enquanto ele estiver aberto e volta ao elemento de origem quando ele fecha.
65
+
66
+ ## Exemplo
67
+
68
+ ```vue
69
+ <template>
70
+ <u-main>
71
+ <!-- ... -->
72
+ </u-main>
73
+ </template>
74
+ <script lang="ts" setup>
75
+ import { UMain } from "@nexdom/uimed-vue/components";
76
+ import { useConfirm } from "@nexdom/uimed-vue/composables";
77
+
78
+ const { confirm, isRunning } = useConfirm();
79
+
80
+ const removed = await confirm(
81
+ {
82
+ title: "Excluir paciente",
83
+ message: "Esta ação não pode ser desfeita.",
84
+ confirmText: "Excluir",
85
+ color: "danger",
86
+ },
87
+ () => api.deletePatient(id),
88
+ );
89
+
90
+ if (removed === false) {
91
+ // Executa algo quando o usuário cancela ou a ação falha.
92
+ } else {
93
+ // Executa algo quando a ação executa com sucesso.
94
+ }
95
+ </script>
96
+ ```
@@ -0,0 +1,95 @@
1
+ # useDialog
2
+
3
+ Composable para apresentação de diálogos.
4
+
5
+ ## Tipo
6
+
7
+ ```ts
8
+ type ButtonVariant = "primary" | "secondary" | "ghost";
9
+
10
+ type ColorVariant = "primary" | "secondary" | "positive" | "informative" | "caution" | "danger";
11
+
12
+ interface DialogAction<T extends string = string> {
13
+ text: string;
14
+ value: T;
15
+ variant?: ButtonVariant;
16
+ color?: ColorVariant;
17
+ }
18
+
19
+ interface DialogOptions<T extends string = string> {
20
+ title?: string;
21
+ message: string;
22
+ actions?: DialogAction<T>[];
23
+ }
24
+
25
+ function dialog<T extends string = never>(options: DialogOptions<T>): Promise<T | undefined>;
26
+
27
+ function useDialog(): {
28
+ dialog: typeof dialog;
29
+ };
30
+ ```
31
+
32
+ ## Detalhes
33
+
34
+ Retorna uma função (`dialog`) para exibir diálogos. Ela devolve uma `Promise` que resolve quando o diálogo é fechado.
35
+
36
+ Os diálogos são apresentados um de cada vez, na ordem em que foram solicitados, incluindo os de [`useConfirm`](./use-confirm.md). Diálogos solicitados enquanto nenhum [`UMain`](../components/main.md) estiver montado aguardam até que um seja montado. Havendo mais de um `UMain` na página, apenas o primeiro montado apresenta os diálogos.
37
+
38
+ ### `DialogOptions`
39
+
40
+ | Opção | Tipo | Padrão | Descrição |
41
+ | --------- | --------------------------------- | ---------------------- | --------------------------------------------------------------------------- |
42
+ | `title` | `string` | | Título do diálogo, em texto simples (HTML não é interpretado). |
43
+ | `message` | `string` | | Mensagem do diálogo, em texto simples (HTML não é interpretado). |
44
+ | `actions` | [`DialogAction[]`](#dialogaction) | `[{ text: "Fechar" }]` | Botões apresentados no rodapé do diálogo, alinhados à direita, nesta ordem. |
45
+
46
+ ### `DialogAction`
47
+
48
+ | Opção | Tipo | Padrão | Descrição |
49
+ | --------- | -------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------ |
50
+ | `text` | `string` | | Texto do botão. |
51
+ | `value` | `string` | | Valor devolvido por `dialog` quando o botão é clicado. |
52
+ | `variant` | `"primary"` \| `"secondary"` \| `"ghost"` | `"ghost"`, ou `"primary"` para a última ação | Variante do botão. |
53
+ | `color` | `"primary"` \| `"secondary"` \| `"positive"` \| `"informative"` \| `"caution"` \| `"danger"` | `"primary"` | Cor do botão. |
54
+
55
+ ### Retorno
56
+
57
+ `dialog` resolve o `value` da ação clicada, ou `undefined` quando o diálogo é fechado:
58
+
59
+ - pelo botão padrão "Fechar";
60
+ - pela tecla `Esc`;
61
+ - por um clique fora do diálogo;
62
+ - pelo botão "voltar" do navegador, em aplicações que usam o [Vue Router](https://router.vuejs.org/), exceto quando ele leva a uma página aberta com `router.replace` (como a página pela qual o usuário entrou na aplicação).
63
+
64
+ ### Acessibilidade
65
+
66
+ O foco inicia na primeira ação, fica restrito ao diálogo enquanto ele estiver aberto e volta ao elemento de origem quando ele fecha. O diálogo é identificado pelo título (ou pela mensagem, quando não houver título) e descrito pela mensagem.
67
+
68
+ ## Exemplo
69
+
70
+ ```vue
71
+ <template>
72
+ <u-main>
73
+ <!-- ... -->
74
+ </u-main>
75
+ </template>
76
+ <script lang="ts" setup>
77
+ import { UMain } from "@nexdom/uimed-vue/components";
78
+ import { useDialog } from "@nexdom/uimed-vue/composables";
79
+
80
+ const { dialog } = useDialog();
81
+
82
+ const answer = await dialog({
83
+ title: "Sessão expirando",
84
+ message: "Deseja continuar conectado?",
85
+ actions: [
86
+ { text: "Sair", value: "sair" },
87
+ { text: "Continuar conectado", value: "continuar" },
88
+ ],
89
+ });
90
+
91
+ if (answer === "sair") {
92
+ // Executa algo quando o usuário escolhe sair.
93
+ }
94
+ </script>
95
+ ```
@@ -0,0 +1,58 @@
1
+ # useRunOrToast
2
+
3
+ Composable para execução de métodos assíncronos e apresentação de mensagens, tipo _toast_, em caso de falha.
4
+
5
+ ## Tipo
6
+
7
+ ```ts
8
+ function useRunOrToast(): {
9
+ run: <T extends (...args: Parameters<T>) => PromiseLike<Awaited<ReturnType<T>>>>(
10
+ toRun: T,
11
+ ...params: Parameters<T>
12
+ ) => Promise<Awaited<ReturnType<T>> | false>;
13
+ isRunning: import("vue").ComputedRef<boolean>;
14
+ };
15
+ ```
16
+
17
+ ## Detalhes
18
+
19
+ Retorna uma função (`run`) e uma [`computed`](https://vuejs.org/guide/essentials/computed.html) (`isRunning`) para monitorar a execução da função.
20
+
21
+ A função (`run`) espera receber um parâmetro com a função que deverá ser executada (`callback`), então devolverá o retorno dessa função.
22
+
23
+ Se houver qualquer erro durante a execução da função (`run`), a mesma irá chamar o [`toast`](./use-toast.md) e apresentar o erro, retornando `false` em seguida.
24
+
25
+ ## Exemplo
26
+
27
+ ```vue
28
+ <template>
29
+ <u-main>
30
+ <!-- ... -->
31
+ </u-main>
32
+ </template>
33
+ <script lang="ts" setup>
34
+ import { UMain } from "@nexdom/uimed-vue/components";
35
+ import { useRunOrToast } from "@nexdom/uimed-vue/composables";
36
+
37
+ const { run, isRunning } = useRunOrToast();
38
+
39
+ // Apresenta: false
40
+ console.log(isRunning.value);
41
+
42
+ const promise = run(() => someFunction(param1, param2));
43
+
44
+ // Apresenta: true
45
+ console.log(isRunning.value);
46
+
47
+ const response = await promise;
48
+
49
+ // Apresenta: false
50
+ console.log(isRunning.value);
51
+
52
+ if (response === false) {
53
+ // Executa algo em caso de falha no método.
54
+ } else {
55
+ // Executa algo quando o método executa com sucesso.
56
+ }
57
+ </script>
58
+ ```
@@ -0,0 +1,48 @@
1
+ # useToast
2
+
3
+ Composable para apresentação de mensagens tipo _toast_.
4
+
5
+ ## Tipo
6
+
7
+ ```ts
8
+ type FeedbackColorVariant = "positive" | "informative" | "caution" | "danger";
9
+
10
+ interface ToastOptions {
11
+ message: string;
12
+ color?: FeedbackColorVariant;
13
+ }
14
+
15
+ function toast(options: ToastOptions): void;
16
+
17
+ function useToast(): {
18
+ toast: typeof toast;
19
+ };
20
+ ```
21
+
22
+ ## Detalhes
23
+
24
+ Retorna uma função (`toast`) para exibir novas mensagens _toast_. As mensagens são apresentadas pelo [`UMain`](../components/main.md), que precisa estar montado na página.
25
+
26
+ ### `ToastOptions`
27
+
28
+ | Opção | Tipo | Padrão | Descrição |
29
+ | --------- | ------------------------------------------------------------ | --------------- | --------------------------- |
30
+ | `message` | `string` | | Texto apresentado no toast. |
31
+ | `color` | `"positive"` \| `"informative"` \| `"caution"` \| `"danger"` | `"informative"` | Cor do toast. |
32
+
33
+ ## Exemplo
34
+
35
+ ```vue
36
+ <template>
37
+ <u-main>
38
+ <!-- ... -->
39
+ </u-main>
40
+ </template>
41
+ <script lang="ts" setup>
42
+ import { UMain } from "@nexdom/uimed-vue/components";
43
+ import { useToast } from "@nexdom/uimed-vue/composables";
44
+
45
+ const { toast } = useToast();
46
+ toast({ message: "Olá, Toast!" });
47
+ </script>
48
+ ```
@@ -0,0 +1,106 @@
1
+ # useUnsavedChanges
2
+
3
+ Composable para evitar a perda de alterações não salvas de um formulário ao sair da página.
4
+
5
+ ## Tipo
6
+
7
+ ```ts
8
+ type ColorVariant = "primary" | "secondary" | "positive" | "informative" | "caution" | "danger";
9
+
10
+ interface UnsavedChangesValues<T> {
11
+ previous: import("vue").MaybeRefOrGetter<T>;
12
+ current: import("vue").MaybeRefOrGetter<T>;
13
+ }
14
+
15
+ interface UnsavedChangesOptions {
16
+ title?: string;
17
+ message?: string;
18
+ confirmText?: string;
19
+ cancelText?: string;
20
+ color?: ColorVariant;
21
+ beforeUnload?: boolean;
22
+ }
23
+
24
+ function useUnsavedChanges<T>(
25
+ values: UnsavedChangesValues<T>,
26
+ options?: UnsavedChangesOptions,
27
+ ): {
28
+ hasChanges: import("vue").ComputedRef<boolean>;
29
+ };
30
+ ```
31
+
32
+ ## Detalhes
33
+
34
+ Deve ser chamada no `setup` de um componente. Retorna uma [`computed`](https://vuejs.org/guide/essentials/computed.html) somente leitura (`hasChanges`), que é `true` enquanto o valor original (`previous`) e o valor atual (`current`) forem diferentes.
35
+
36
+ `previous` e `current` aceitam uma `ref`, um getter ou um objeto `reactive`, e são comparados em profundidade:
37
+
38
+ - a ordem das propriedades não importa;
39
+ - uma propriedade com `undefined` é igual a uma propriedade ausente;
40
+ - datas (`Date`) são comparadas pelo horário;
41
+ - listas são comparadas item a item, na mesma ordem;
42
+ - objetos simples (literais ou sem protótipo) são comparados propriedade a propriedade;
43
+ - os demais objetos, como `File`, `Blob`, `Map`, `Set` e instâncias de classes, são comparados por referência;
44
+ - os demais valores são comparados com [`Object.is`](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/is), então `null`, `""` e `undefined` são diferentes entre si e `NaN` é igual a `NaN`.
45
+
46
+ Para marcar o formulário como salvo, atribua a `previous` uma cópia do valor atual. Se `previous` e `current` apontarem para o mesmo objeto, `hasChanges` fica sempre `false`.
47
+
48
+ ### Navegação
49
+
50
+ Quando o componente é renderizado por um `<RouterView>` do [Vue Router](https://router.vuejs.org/) (diretamente ou dentro de uma página), sair da página com alterações apresenta um diálogo de [confirmação](./use-confirm.md):
51
+
52
+ - "Sair sem salvar" continua a navegação;
53
+ - "Continuar editando", a tecla `Esc` ou um clique fora do diálogo cancelam a navegação.
54
+
55
+ `hasChanges` é lido no momento da navegação, então uma navegação feita logo depois de atualizar `previous` acontece sem diálogo. Enquanto o diálogo estiver aberto, novas navegações reaproveitam a mesma resposta, que vale para a navegação mais recente. Em aplicações com Vue Router e histórico do navegador (`createWebHistory` ou `createWebHashHistory`), o botão "voltar" do navegador passa pela mesma verificação e, com o diálogo aberto, não o fecha (ao contrário do [`useConfirm`](./use-confirm.md)): a resposta passa a valer para o "voltar". Cada chamada de `useUnsavedChanges` com alterações apresenta o seu diálogo.
56
+
57
+ A verificação é removida quando o componente é desmontado. Ela não acontece:
58
+
59
+ - fora de um `<RouterView>` ou em aplicações sem Vue Router;
60
+ - em mudanças apenas nos parâmetros (`params`) ou na consulta (`query`) da mesma rota.
61
+
62
+ O diálogo depende do [`UMain`](../components/main.md): sem ele, o diálogo não aparece e a navegação fica pendente.
63
+
64
+ ### Aviso do navegador
65
+
66
+ Com `beforeUnload` ligado (padrão), recarregar a página, fechar a aba ou sair da aplicação por um link externo com alterações apresenta o aviso do próprio navegador. O texto é definido pelo navegador, e o aviso só aparece se o usuário já interagiu com a página. O aviso só é registrado enquanto houver alterações e é removido quando o componente é desmontado ou, dentro de um `<KeepAlive>`, desativado. Alterações feitas enquanto o componente está desativado (por exemplo, por uma requisição que termina depois que o usuário saiu da página) só registram o aviso quando ele é ativado de novo.
67
+
68
+ ### `UnsavedChangesOptions`
69
+
70
+ | Opção | Tipo | Padrão | Descrição |
71
+ | -------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
72
+ | `title` | `string` | `"Alterações não salvas"` | Título do diálogo, em texto simples (HTML não é interpretado). |
73
+ | `message` | `string` | `"Existem alterações que ainda não foram salvas. Deseja sair sem salvar?"` | Mensagem do diálogo, em texto simples (HTML não é interpretado). |
74
+ | `confirmText` | `string` | `"Sair sem salvar"` | Texto do botão que continua a navegação. |
75
+ | `cancelText` | `string` | `"Continuar editando"` | Texto do botão que cancela a navegação. |
76
+ | `color` | `"primary"` \| `"secondary"` \| `"positive"` \| `"informative"` \| `"caution"` \| `"danger"` | `"danger"` | Cor do botão que continua a navegação. |
77
+ | `beforeUnload` | `boolean` | `true` | Apresenta o aviso do navegador ao recarregar, fechar a aba ou sair por um link externo. |
78
+
79
+ ### Acessibilidade
80
+
81
+ O diálogo usa o papel `alertdialog`. O foco inicia no botão "Continuar editando", fica restrito ao diálogo enquanto ele estiver aberto e volta ao elemento de origem quando ele fecha.
82
+
83
+ ## Exemplo
84
+
85
+ ```vue
86
+ <template>
87
+ <u-text-field v-model="form.name" label="Nome" />
88
+ <u-button :disabled="!hasChanges" @click="save">Salvar</u-button>
89
+ </template>
90
+ <script lang="ts" setup>
91
+ import { ref, toRaw } from "vue";
92
+ import { UButton, UTextField } from "@nexdom/uimed-vue/components";
93
+ import { useUnsavedChanges } from "@nexdom/uimed-vue/composables";
94
+
95
+ const saved = ref({ name: "Maria" });
96
+ const form = ref(structuredClone(toRaw(saved.value)));
97
+
98
+ const { hasChanges } = useUnsavedChanges({ previous: saved, current: form });
99
+
100
+ async function save() {
101
+ await api.save(form.value);
102
+ // Marca o formulário como salvo
103
+ saved.value = structuredClone(toRaw(form.value));
104
+ }
105
+ </script>
106
+ ```
@@ -0,0 +1 @@
1
+ # APIs Disponíveis