@nexdom/uimed-vue 2.0.0-beta.9 → 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 (220) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +7 -0
  2. package/dist/components/app-bar/app-bar.js +5 -0
  3. package/dist/components/app-bar/app-bar.vue_vue_type_script_setup_true_lang.js +286 -0
  4. package/dist/components/app-bar/types.d.ts +96 -0
  5. package/dist/components/button/button.js +5 -0
  6. package/dist/components/button/button.vue.d.ts +31 -0
  7. package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js +97 -0
  8. package/dist/components/button/types.d.ts +65 -0
  9. package/dist/components/data-sets/data-set/data-set.js +5 -0
  10. package/dist/components/data-sets/data-set/data-set.vue.d.ts +47 -0
  11. package/dist/components/data-sets/data-set/data-set.vue_vue_type_script_setup_true_lang.js +157 -0
  12. package/dist/components/data-sets/data-set/types.d.ts +93 -0
  13. package/dist/components/data-sets/data-set-bar.js +5 -0
  14. package/dist/components/data-sets/data-set-bar.vue_vue_type_script_setup_true_lang.js +99 -0
  15. package/dist/components/data-sets/data-set-item/data-set-item.js +5 -0
  16. package/dist/components/data-sets/data-set-item/data-set-item.vue.d.ts +35 -0
  17. package/dist/components/data-sets/data-set-item/data-set-item.vue_vue_type_script_setup_true_lang.js +57 -0
  18. package/dist/components/data-sets/data-set-item/types.d.ts +42 -0
  19. package/dist/components/details/details.js +5 -0
  20. package/dist/components/details/details.vue.d.ts +28 -0
  21. package/dist/components/details/details.vue_vue_type_script_setup_true_lang.js +56 -0
  22. package/dist/components/details/types.d.ts +29 -0
  23. package/dist/components/dialogs/dialog/dialog-host-key.js +10 -0
  24. package/dist/components/dialogs/dialog/dialog.js +5 -0
  25. package/dist/components/dialogs/dialog/dialog.vue.d.ts +36 -0
  26. package/dist/components/dialogs/dialog/dialog.vue_vue_type_script_setup_true_lang.js +112 -0
  27. package/dist/components/dialogs/dialog/types.d.ts +47 -0
  28. package/dist/components/dialogs/dialog-host.js +5 -0
  29. package/dist/components/dialogs/dialog-host.vue_vue_type_script_setup_true_lang.js +81 -0
  30. package/dist/components/dialogs/toast.js +5 -0
  31. package/dist/components/dialogs/toast.vue_vue_type_script_setup_true_lang.js +35 -0
  32. package/dist/components/footer/footer.js +5 -0
  33. package/dist/components/footer/footer.vue_vue_type_script_setup_true_lang.js +31 -0
  34. package/dist/components/footer/types.d.ts +16 -0
  35. package/dist/components/form/form.js +5 -0
  36. package/dist/components/form/form.vue.d.ts +32 -0
  37. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +37 -0
  38. package/dist/components/form/types.d.ts +15 -0
  39. package/dist/components/grid/column/column.js +5 -0
  40. package/dist/components/grid/column/column.vue.d.ts +33 -0
  41. package/dist/components/grid/column/column.vue_vue_type_script_setup_true_lang.js +45 -0
  42. package/dist/components/grid/column/types.d.ts +27 -0
  43. package/dist/components/grid/container/container.js +5 -0
  44. package/dist/components/grid/container/container.vue.d.ts +27 -0
  45. package/dist/components/grid/container/container.vue_vue_type_script_setup_true_lang.js +33 -0
  46. package/dist/components/grid/container/types.d.ts +17 -0
  47. package/dist/components/grid/row/row.js +5 -0
  48. package/dist/components/grid/row/row.vue.d.ts +29 -0
  49. package/dist/components/grid/row/row.vue_vue_type_script_setup_true_lang.js +61 -0
  50. package/dist/components/grid/row/types.d.ts +63 -0
  51. package/dist/components/icon-button/icon-button.js +5 -0
  52. package/dist/components/icon-button/icon-button.vue.d.ts +23 -0
  53. package/dist/components/icon-button/icon-button.vue_vue_type_script_setup_true_lang.js +51 -0
  54. package/dist/components/icon-button/types.d.ts +32 -0
  55. package/dist/components/img/img.js +5 -0
  56. package/dist/components/img/img.vue.d.ts +23 -0
  57. package/dist/components/img/img.vue_vue_type_script_setup_true_lang.js +61 -0
  58. package/dist/components/img/types.d.ts +43 -0
  59. package/dist/components/inputs/autocomplete-field/autocomplete-field.js +5 -0
  60. package/dist/components/inputs/autocomplete-field/autocomplete-field.vue.d.ts +33 -0
  61. package/dist/components/inputs/autocomplete-field/autocomplete-field.vue_vue_type_script_setup_true_lang.js +161 -0
  62. package/dist/components/inputs/autocomplete-field/types.d.ts +84 -0
  63. package/dist/components/inputs/checkbox/checkbox.js +5 -0
  64. package/dist/components/inputs/checkbox/checkbox.vue.d.ts +33 -0
  65. package/dist/components/inputs/checkbox/checkbox.vue_vue_type_script_setup_true_lang.js +71 -0
  66. package/dist/components/inputs/checkbox/types.d.ts +35 -0
  67. package/dist/components/inputs/date-time-field/date-time-field.js +5 -0
  68. package/dist/components/inputs/date-time-field/date-time-field.vue.d.ts +32 -0
  69. package/dist/components/inputs/date-time-field/date-time-field.vue_vue_type_script_setup_true_lang.js +205 -0
  70. package/dist/components/inputs/date-time-field/types.d.ts +84 -0
  71. package/dist/components/inputs/field-loader.js +5 -0
  72. package/dist/components/inputs/field-loader.vue_vue_type_script_setup_true_lang.js +30 -0
  73. package/dist/components/inputs/mask-field/mask-field.js +5 -0
  74. package/dist/components/inputs/mask-field/mask-field.vue.d.ts +32 -0
  75. package/dist/components/inputs/mask-field/mask-field.vue_vue_type_script_setup_true_lang.js +120 -0
  76. package/dist/components/inputs/mask-field/types.d.ts +118 -0
  77. package/dist/components/inputs/text-field/text-field.js +5 -0
  78. package/dist/components/inputs/text-field/text-field.vue.d.ts +30 -0
  79. package/dist/components/inputs/text-field/text-field.vue_vue_type_script_setup_true_lang.js +119 -0
  80. package/dist/components/inputs/text-field/types.d.ts +70 -0
  81. package/dist/components/link/link.js +5 -0
  82. package/dist/components/link/link.vue.d.ts +27 -0
  83. package/dist/components/link/link.vue_vue_type_script_setup_true_lang.js +32 -0
  84. package/dist/components/link/types.d.ts +18 -0
  85. package/dist/components/main/main.js +5 -0
  86. package/dist/components/main/main.vue.d.ts +33 -0
  87. package/dist/components/main/main.vue_vue_type_script_setup_true_lang.js +104 -0
  88. package/dist/components/main/types.d.ts +75 -0
  89. package/dist/components/navigation-menu/navigation-menu.js +5 -0
  90. package/dist/components/navigation-menu/navigation-menu.vue_vue_type_script_setup_true_lang.js +207 -0
  91. package/dist/components/navigation-menu/types.d.ts +62 -0
  92. package/dist/components/page-transition/page-transition.js +5 -0
  93. package/dist/components/page-transition/page-transition.vue.d.ts +40 -0
  94. package/dist/components/page-transition/page-transition.vue_vue_type_script_setup_true_lang.js +27 -0
  95. package/dist/components/page-transition/types.d.ts +18 -0
  96. package/dist/components/sections/section/section.js +5 -0
  97. package/dist/components/sections/section/section.vue.d.ts +28 -0
  98. package/dist/components/sections/section/section.vue_vue_type_script_setup_true_lang.js +108 -0
  99. package/dist/components/sections/section/types.d.ts +80 -0
  100. package/dist/components/sections/section-content/section-content.js +5 -0
  101. package/dist/components/sections/section-content/section-content.vue.d.ts +27 -0
  102. package/dist/components/sections/section-content/section-content.vue_vue_type_script_setup_true_lang.js +16 -0
  103. package/dist/components/skeleton-loader/skeleton-loader.js +5 -0
  104. package/dist/components/skeleton-loader/skeleton-loader.vue_vue_type_script_setup_true_lang.js +65 -0
  105. package/dist/components/table/table.js +5 -0
  106. package/dist/components/table/table.vue.d.ts +19 -0
  107. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js +84 -0
  108. package/dist/components/table/types.d.ts +51 -0
  109. package/dist/components.d.ts +23 -896
  110. package/dist/components.js +23 -1381
  111. package/dist/composables/alignment/alignment.js +41 -0
  112. package/dist/composables/alignment/types.d.ts +12 -0
  113. package/dist/composables/button/button.js +54 -0
  114. package/dist/composables/colors/constants.js +27 -0
  115. package/dist/composables/colors/types.d.ts +4 -0
  116. package/dist/composables/colors/use-vuetify-background-color.js +16 -0
  117. package/dist/composables/colors/use-vuetify-color.js +11 -0
  118. package/dist/composables/colors/use-vuetify-text-color.js +12 -0
  119. package/dist/composables/data-set/data-set.js +128 -0
  120. package/dist/composables/dialogs/types.d.ts +88 -0
  121. package/dist/composables/dialogs/use-confirm.d.ts +21 -0
  122. package/dist/composables/dialogs/use-confirm.js +55 -0
  123. package/dist/composables/dialogs/use-decorative-timer.js +25 -0
  124. package/dist/composables/dialogs/use-dialog-focus.js +64 -0
  125. package/dist/composables/dialogs/use-dialog-loading.js +13 -0
  126. package/dist/composables/dialogs/use-dialog.d.ts +36 -0
  127. package/dist/{use-dialog-Ck2_ZW7T.js → composables/dialogs/use-dialog.js} +2 -53
  128. package/dist/composables/dialogs/use-run-or-toast.d.ts +27 -0
  129. package/dist/composables/dialogs/use-run-or-toast.js +65 -0
  130. package/dist/composables/dialogs/use-toast.d.ts +25 -0
  131. package/dist/composables/dialogs/use-toast.js +39 -0
  132. package/dist/composables/dimensions/dimensions.js +18 -0
  133. package/dist/composables/inputs/autocomplete-field.js +39 -0
  134. package/dist/composables/inputs/date-time-field.js +109 -0
  135. package/dist/composables/inputs/fields.js +28 -0
  136. package/dist/composables/inputs/mask-field.js +133 -0
  137. package/dist/composables/inputs/rules.js +16 -0
  138. package/dist/composables/inputs/text-field.js +81 -0
  139. package/dist/composables/navigation/types.d.ts +54 -0
  140. package/dist/composables/navigation/use-navigation-rail.js +163 -0
  141. package/dist/composables/navigation/use-navigation-search-shortcut.js +96 -0
  142. package/dist/composables/navigation/use-route-props.js +21 -0
  143. package/dist/composables/navigation/use-unsaved-changes.d.ts +35 -0
  144. package/dist/composables/navigation/use-unsaved-changes.js +88 -0
  145. package/dist/composables/section/section.js +34 -0
  146. package/dist/composables.d.ts +6 -193
  147. package/dist/composables.js +6 -117
  148. package/dist/consts/icons.d.ts +67 -0
  149. package/dist/consts/icons.js +69 -0
  150. package/dist/consts/locale.js +12 -0
  151. package/dist/consts/types.d.ts +12 -0
  152. package/dist/index.d.ts +1 -13
  153. package/dist/index.js +39 -14
  154. package/dist/plugins.d.ts +15 -4
  155. package/dist/plugins.js +54 -3
  156. package/dist/styles/fonts/UnimedSlab-Regular.woff2 +0 -0
  157. package/dist/styles/fonts/fonts.css +5 -0
  158. package/dist/styles/settings.scss +155 -0
  159. package/dist/unit-test.js +11 -7
  160. package/package.json +11 -11
  161. package/skills/uimed-vue/SKILL.md +113 -0
  162. package/skills/uimed-vue/references/api/components/autocomplete-field.md +45 -0
  163. package/skills/uimed-vue/references/api/components/button.md +48 -0
  164. package/skills/uimed-vue/references/api/components/checkbox.md +36 -0
  165. package/skills/uimed-vue/references/api/components/data-sets/data-set-item.md +61 -0
  166. package/skills/uimed-vue/references/api/components/data-sets/data-set.md +67 -0
  167. package/skills/uimed-vue/references/api/components/date-time-field.md +44 -0
  168. package/skills/uimed-vue/references/api/components/details.md +33 -0
  169. package/skills/uimed-vue/references/api/components/dialog.md +70 -0
  170. package/skills/uimed-vue/references/api/components/form.md +43 -0
  171. package/skills/uimed-vue/references/api/components/grid/column.md +41 -0
  172. package/skills/uimed-vue/references/api/components/grid/container.md +32 -0
  173. package/skills/uimed-vue/references/api/components/grid/row.md +37 -0
  174. package/skills/uimed-vue/references/api/components/icon-button.md +37 -0
  175. package/skills/uimed-vue/references/api/components/img.md +34 -0
  176. package/skills/uimed-vue/references/api/components/link.md +31 -0
  177. package/skills/uimed-vue/references/api/components/main.md +174 -0
  178. package/skills/uimed-vue/references/api/components/mask-field.md +60 -0
  179. package/skills/uimed-vue/references/api/components/page-transition.md +37 -0
  180. package/skills/uimed-vue/references/api/components/sections/section-content.md +23 -0
  181. package/skills/uimed-vue/references/api/components/sections/section.md +61 -0
  182. package/skills/uimed-vue/references/api/components/table.md +35 -0
  183. package/skills/uimed-vue/references/api/components/text-field.md +42 -0
  184. package/skills/uimed-vue/references/api/composables/use-confirm.md +96 -0
  185. package/skills/uimed-vue/references/api/composables/use-dialog.md +95 -0
  186. package/skills/uimed-vue/references/api/composables/use-run-or-toast.md +58 -0
  187. package/skills/uimed-vue/references/api/composables/use-toast.md +48 -0
  188. package/skills/uimed-vue/references/api/composables/use-unsaved-changes.md +106 -0
  189. package/skills/uimed-vue/references/api/index.md +1 -0
  190. package/skills/uimed-vue/references/guide/components/autocomplete-field.md +256 -0
  191. package/skills/uimed-vue/references/guide/components/button.md +155 -0
  192. package/skills/uimed-vue/references/guide/components/checkbox.md +113 -0
  193. package/skills/uimed-vue/references/guide/components/data-set.md +370 -0
  194. package/skills/uimed-vue/references/guide/components/date-time-field.md +202 -0
  195. package/skills/uimed-vue/references/guide/components/details.md +76 -0
  196. package/skills/uimed-vue/references/guide/components/dialog.md +269 -0
  197. package/skills/uimed-vue/references/guide/components/form.md +96 -0
  198. package/skills/uimed-vue/references/guide/components/icon-button.md +76 -0
  199. package/skills/uimed-vue/references/guide/components/img.md +128 -0
  200. package/skills/uimed-vue/references/guide/components/layout.md +323 -0
  201. package/skills/uimed-vue/references/guide/components/link.md +47 -0
  202. package/skills/uimed-vue/references/guide/components/main.md +435 -0
  203. package/skills/uimed-vue/references/guide/components/mask-field.md +256 -0
  204. package/skills/uimed-vue/references/guide/components/page-transition.md +111 -0
  205. package/skills/uimed-vue/references/guide/components/section.md +232 -0
  206. package/skills/uimed-vue/references/guide/components/table.md +102 -0
  207. package/skills/uimed-vue/references/guide/components/text-field.md +172 -0
  208. package/skills/uimed-vue/references/guide/composables/use-confirm.md +123 -0
  209. package/skills/uimed-vue/references/guide/composables/use-dialog.md +102 -0
  210. package/skills/uimed-vue/references/guide/composables/use-run-or-toast.md +55 -0
  211. package/skills/uimed-vue/references/guide/composables/use-toast.md +57 -0
  212. package/skills/uimed-vue/references/guide/composables/use-unsaved-changes.md +129 -0
  213. package/skills/uimed-vue/references/guide/getting-started.md +135 -0
  214. package/skills/uimed-vue/references/guide/icons.md +71 -0
  215. package/skills/uimed-vue/references/guide/index.md +51 -0
  216. package/skills/uimed-vue/references/guide/migration-v1-to-v2.md +191 -0
  217. package/skills/uimed-vue/references/guide/unit-testing.md +85 -0
  218. package/AGENTS.md +0 -233
  219. package/CLAUDE.md +0 -1
  220. package/dist/types-HPMP8IrV.d.ts +0 -49
@@ -0,0 +1,61 @@
1
+ # USection
2
+
3
+ Componente para agrupar conteúdo, como campos de formulário, relatórios, dashboard e afins.
4
+ Inclui suporte para ações sobre esses conteúdos, como botões para salvar, etc.
5
+
6
+ ## Props
7
+
8
+ | Prop | Tipo | Padrão | Descrição |
9
+ | ------------ | ------------------------------ | ----------- | ------------------------------------------------------------------------------------------------------------ |
10
+ | `variant` | `"primary" \| "secondary"` | `"primary"` | Aplica uma variação de estilo distinta ao agrupador de conteúdo. |
11
+ | `title` | `string` | | Título do agrupador. |
12
+ | `subtitle` | `string` | | Subtítulo do agrupador. |
13
+ | `textAlign` | `"start" \| "center" \| "end"` | `"start"` | Alinhamento horizontal do título, do subtítulo, do conteúdo e das ações. Com `start`, as ações ficam no fim. |
14
+ | `actions` | [`action[]`](#action) | | Lista de ações disponíveis para o agrupador. |
15
+ | `fullWidth` | `boolean` | `false` | Faz o agrupador ocupar 100% da largura do seu container. |
16
+ | `fullHeight` | `boolean` | `false` | Faz o agrupador ocupar 100% da altura do seu container. |
17
+ | `loading` | `boolean` | `false` | Coloca o agrupador em estado de carregamento. |
18
+ | `dataTestid` | `string` | | Id do componente para uso em testes automatizados. |
19
+
20
+ ### `Action`
21
+
22
+ Estende [`UButtonProps`](../button.md#props) (por exemplo, `variant`, `color`, `disabled` ou `route`) com as seguintes propriedades adicionais:
23
+
24
+ | Prop | Tipo | Descrição |
25
+ | --------- | ----------------- | ----------------------------------------------------------------------------------------------------- |
26
+ | `label` | `string` | Texto exibido no botão de ação. |
27
+ | `onClick` | `(event) => void` | Chamado quando o botão de ação é clicado. Não é chamado enquanto a ação está `disabled` ou `loading`. |
28
+
29
+ ## Slots
30
+
31
+ | Slot | Descrição |
32
+ | --------- | ------------------------------------- |
33
+ | `default` | Conteúdo exibido dentro do agrupador. |
34
+
35
+ ## Exemplo
36
+
37
+ ```vue
38
+ <template>
39
+ <u-section title="Confirmação" subtitle="Deseja continuar?" :actions="actions">
40
+ <u-section-content>Esta ação não pode ser desfeita.</u-section-content>
41
+ </u-section>
42
+ </template>
43
+
44
+ <script lang="ts" setup>
45
+ import { ref } from "vue";
46
+ import { USection, USectionContent } from "@nexdom/uimed-vue/components";
47
+
48
+ const actions = ref([
49
+ {
50
+ label: "Cancelar",
51
+ variant: "ghost",
52
+ onClick: () => console.log("Cancelado"),
53
+ },
54
+ {
55
+ label: "Confirmar",
56
+ color: "positive",
57
+ onClick: () => console.log("Confirmado"),
58
+ },
59
+ ]);
60
+ </script>
61
+ ```
@@ -0,0 +1,35 @@
1
+ # UTable
2
+
3
+ Componente para apresentação de dados em formato tabelado, orientado por dados por meio de props (**sem slots**).
4
+
5
+ ## Props
6
+
7
+ | Prop | Tipo | Padrão | Descrição |
8
+ | ------------ | ------------ | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | `headers` | `string[]` | | Cabeçalhos das colunas. Não obrigatório. Quando não fornecido ou vazio, nenhum `<thead>` é renderizado em modo horizontal. Em modo vertical, é utilizado a cada linha como cabeçalho do valor seguinte da linha. |
10
+ | `items` | `string[][]` | | Lista da dados que serão apresentados na tabela. Os valores dentro de cada item devem estar na mesma ordem dos cabeçalhos (`headers`). Nenhum preenchimento ou truncamento é aplicado, ou seja, as células são renderizadas exatamente como fornecidas, mesmo que as linhas tenham comprimentos/quantidade de strings diferentes. |
11
+ | `vertical` | `boolean` | `false` | Altera o layout para modo vertical quando `true`, renderizando uma tabela separada para cada item. Com cabeçalhos definidos, cada linha exibe um rótulo. Do contrário, serão exibidos apenas os valores dos itens, dividindo um por linha. |
12
+ | `loading` | `boolean` | `false` | Coloca a tabela em estado de carregamento. |
13
+ | `dataTestid` | `string` | | Aplica atributo `data-testid` para testes automatizados. Em modo vertical, com múltiplos itens, cada tabela recebe um contador como sufixo (`${dataTestid}-${index}`). |
14
+
15
+ ## Exemplo
16
+
17
+ ```vue
18
+ <template>
19
+ <u-table
20
+ :headers="['Nome', 'Idade', 'Cidade']"
21
+ :items="[
22
+ ['Ana', '30', 'São Paulo'],
23
+ ['Bruno', '25', 'Rio de Janeiro'],
24
+ ]"
25
+ :loading="loading"
26
+ />
27
+ </template>
28
+
29
+ <script lang="ts" setup>
30
+ import { ref } from "vue";
31
+ import { UTable } from "@nexdom/uimed-vue/components";
32
+
33
+ const loading = ref(false);
34
+ </script>
35
+ ```
@@ -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