@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,51 @@
1
+ # O que é UIMed-Vue?
2
+
3
+ É um framework de UI, para [Vuejs](https://vuejs.org/), com diversos componentes e funções reutilizáveis entre eles (_components_ e _composables_).
4
+
5
+ > [!Danger]
6
+ > Construído para atender um design system específico e, portanto, eliminando a necessidade de qualquer esforço para sua estilização.
7
+ >
8
+ > Portanto, evite o uso de CSS ou estilizações paralelas enquanto estiver trabalhando com este framework.
9
+
10
+ ## Casos de uso
11
+
12
+ ### Componentes
13
+
14
+ São recursos que permitem a elaboração e reutilização de interface gráfica.
15
+
16
+ Os componentes a seguir possuem exemplos práticos de utilização dentro desta documentação.
17
+
18
+ | Recurso | Descrição |
19
+ | ---------------------------------------------------------------------- | ------------------------------------------------------ |
20
+ | [Botões](./components/button.md) | Componente de botão. |
21
+ | [Botões de ícone](./components/icon-button.md) | Componente de botão que exibe apenas um ícone. |
22
+ | [Campos com máscara](./components/mask-field.md) | Componente para campo de texto com máscara. |
23
+ | [Campos com preenchimento automático](./components/autocomplete-field.md) | Componente para autocomplete/combobox. |
24
+ | [Caixas de seleção](./components/checkbox.md) | Componente para caixa de seleção. |
25
+ | [Campos de data e hora](./components/date-time-field.md) | Componente para campo de data e/ou hora. |
26
+ | [Campos de texto](./components/text-field.md) | Componente para campo de texto. |
27
+ | [Componente base](./components/main.md) | Componente raiz. |
28
+ | [Componentes de layout](./components/layout.md) | Componentes para seguir o grid system. |
29
+ | [Agrupador de Conteúdo](./components/section.md) | Componente para agrupar conteúdo. |
30
+ | [Conteúdo Expansível](./components/details.md) | Componente para expandir e recolher conteúdo. |
31
+ | [Formulários](./components/form.md) | Componente de formulário. |
32
+ | [Imagens](./components/img.md) | Componente para apresentação de imagens. |
33
+ | [Janelas modais](./components/dialog.md) | Componente para apresentar conteúdo em janelas modais. |
34
+ | [Links](./components/link.md) | Componente para links de texto. |
35
+ | [Listagens](./components/data-set.md) | Componente para listagem de dados. |
36
+ | [Tabelas](./components/table.md) | Componente para apresentação de dados em tabelas. |
37
+ | [Transição de páginas](./components/page-transition.md) | Componente para animar a troca de páginas. |
38
+
39
+ ### Composables
40
+
41
+ São funções que possibilitam a reutilização de recursos entre diversos componentes.
42
+
43
+ As composables a seguir possuem exemplos práticos de utilização dentro desta documentação.
44
+
45
+ | Recurso | Descrição |
46
+ | ---------------------------------------------------------- | ---------------------------------------------------------------------------------- |
47
+ | [Toasts](./composables/use-toast.md) | Composables para apresentar mensagens `toast`. |
48
+ | [RunOrToast](./composables/use-run-or-toast.md) | Composables para executar métodos e apresentar mensagens `toast` em caso de falha. |
49
+ | [Diálogos](./composables/use-dialog.md) | Composables para apresentar diálogos. |
50
+ | [Confirmações](./composables/use-confirm.md) | Composables para executar ações após a confirmação do usuário. |
51
+ | [Alterações não salvas](./composables/use-unsaved-changes.md) | Composables para evitar a perda de alterações não salvas ao sair da página. |
@@ -0,0 +1,191 @@
1
+ # Migrando da v1 para v2
2
+
3
+ A versão 2 do UIMed-Vue introduz uma mudança significativa: todos os componentes exportados agora possuem um prefixo `U`, padronizando a forma como você importa e utiliza os componentes. Além disso, alguns componentes receberam nomes mais descritivos internamente.
4
+
5
+ ## Mapa de Renomeação
6
+
7
+ | Nome anterior | Novo nome |
8
+ | ------------- | ----------------- |
9
+ | `Btn` | `UButton` |
10
+ | `Frm` | `UForm` |
11
+ | `Root` | `UMain` |
12
+ | `ContentSet` | `USection` |
13
+ | `Content` | `USectionContent` |
14
+ | `Container` | `UContainer` |
15
+ | `Row` | `URow` |
16
+ | `Column` | `UColumn` |
17
+ | `TextField` | `UTextField` |
18
+
19
+ ## Antes e Depois
20
+
21
+ ### Importações
22
+
23
+ **Antes (v1):**
24
+
25
+ ```js
26
+ import { Root, Btn, Row, Column, TextField } from "@nexdom/uimed-vue/components";
27
+ ```
28
+
29
+ **Depois (v2):**
30
+
31
+ ```js
32
+ import { UMain, UButton, URow, UColumn, UTextField } from "@nexdom/uimed-vue/components";
33
+ ```
34
+
35
+ ### Template
36
+
37
+ **Antes (v1):**
38
+
39
+ ```vue
40
+ <template>
41
+ <root>
42
+ <row>
43
+ <column>
44
+ <btn @click="handleClick">Clique aqui</btn>
45
+ </column>
46
+ </row>
47
+ </root>
48
+ </template>
49
+ ```
50
+
51
+ **Depois (v2):**
52
+
53
+ ```vue
54
+ <template>
55
+ <u-main>
56
+ <u-row>
57
+ <u-column>
58
+ <u-button @click="handleClick">Clique aqui</u-button>
59
+ </u-column>
60
+ </u-row>
61
+ </u-main>
62
+ </template>
63
+ ```
64
+
65
+ ### Notificações do menu superior
66
+
67
+ A propriedade `date` das notificações do menu superior (`appBar.notifications`) foi substituída por `when`, um texto livre apresentado exatamente como informado. Assim, a aplicação passa a decidir como indicar quando a notificação foi gerada (exemplo: `"10:30"`, `"Ontem"` ou `"Há 5 minutos"`).
68
+
69
+ **Antes (v1):**
70
+
71
+ ```ts
72
+ const appBar = {
73
+ title: "Minha aplicação",
74
+ notifications: [{ title: "Nova versão", date: new Date() }],
75
+ };
76
+ ```
77
+
78
+ **Depois (v2):**
79
+
80
+ ```ts
81
+ const appBar = {
82
+ title: "Minha aplicação",
83
+ notifications: [{ title: "Nova versão", when: "10:30" }],
84
+ };
85
+ ```
86
+
87
+ Para manter a formatação apresentada na v1 (horário para notificações de hoje, "Ontem" para as de ontem e a data completa para as demais), utilize as funções de [`@nexdom/shared`](https://nexdom-healthtech.github.io/shared/):
88
+
89
+ ```ts
90
+ import { formatDateTime, toPeriodInterval } from "@nexdom/shared/utils";
91
+
92
+ function formatNotificationWhen(date: Date) {
93
+ const interval = toPeriodInterval(date);
94
+ const wasThisMonth = interval.months === 0 && interval.years === 0;
95
+
96
+ if (wasThisMonth && interval.days === 0) return formatDateTime(date, "HH:mm");
97
+ if (wasThisMonth && interval.days === 1) return "Ontem";
98
+
99
+ return formatDateTime(date, "DD/MM/YYYY");
100
+ }
101
+
102
+ const appBar = {
103
+ title: "Minha aplicação",
104
+ notifications: [{ title: "Nova versão", when: formatNotificationWhen(new Date()) }],
105
+ };
106
+ ```
107
+
108
+ ### Alinhamento vertical das colunas
109
+
110
+ Na v1, as colunas de uma `Row` eram esticadas até a altura da coluna mais alta da linha. Na v2, a prop `alignY` da `URow` controla esse alinhamento e o padrão passou a ser `"start"`: cada coluna mantém a altura do próprio conteúdo e fica alinhada ao topo. Para manter o comportamento da v1, como em cartões lado a lado que devem ter a mesma altura, utilize `align-y="stretch"` (veja [Alinhamento vertical das colunas](./components/layout.md#alinhamento-vertical-das-colunas)).
111
+
112
+ **Antes (v1):**
113
+
114
+ ```vue
115
+ <template>
116
+ <row>
117
+ <column cols="6">
118
+ <content-set title="Consultas" full-height>
119
+ <!-- conteúdo curto -->
120
+ </content-set>
121
+ </column>
122
+ <column cols="6">
123
+ <content-set title="Exames" full-height>
124
+ <!-- conteúdo mais longo -->
125
+ </content-set>
126
+ </column>
127
+ </row>
128
+ </template>
129
+ ```
130
+
131
+ **Depois (v2):**
132
+
133
+ ```vue
134
+ <template>
135
+ <u-row align-y="stretch">
136
+ <u-column cols="6">
137
+ <u-section title="Consultas" full-height>
138
+ <!-- conteúdo curto -->
139
+ </u-section>
140
+ </u-column>
141
+ <u-column cols="6">
142
+ <u-section title="Exames" full-height>
143
+ <!-- conteúdo mais longo -->
144
+ </u-section>
145
+ </u-column>
146
+ </u-row>
147
+ </template>
148
+ ```
149
+
150
+ ### Menu de navegação
151
+
152
+ Na v2, o ícone (`icon`) é obrigatório nos itens e grupos do primeiro nível do menu de navegação (`navigationMenu`). Os itens dentro de um grupo continuam sem ícone. Os nomes disponíveis estão em [Ícones](./icons.md).
153
+
154
+ Em telas a partir de 1145px, o menu deixa de ser aberto pelo botão "Menu de navegação" do menu superior, que não é mais exibido: ele fica sempre visível à esquerda do conteúdo, recolhido em uma faixa de 56px com os ícones, e se expande sobre o conteúdo com o mouse, com o foco do teclado ou pelo atalho `Ctrl + K` (veja [Menu de navegação](./components/main.md#menu-de-navegacao)). O conteúdo da página fica 56px mais estreito, e testes automatizados que clicavam no botão para abrir o menu passam a encontrá-lo apenas em telas menores. Em telas menores, o menu continua sendo aberto pelo botão.
155
+
156
+ **Antes (v1):**
157
+
158
+ ```ts
159
+ const navigationMenu = {
160
+ items: [
161
+ { description: "Início", route: "/" },
162
+ { description: "Cadastros", items: [{ description: "Pacientes", route: "/pacientes" }] },
163
+ ],
164
+ };
165
+ ```
166
+
167
+ **Depois (v2):**
168
+
169
+ ```ts
170
+ const navigationMenu = {
171
+ items: [
172
+ { description: "Início", route: "/", icon: "home" },
173
+ {
174
+ description: "Cadastros",
175
+ icon: "folder",
176
+ items: [{ description: "Pacientes", route: "/pacientes" }],
177
+ },
178
+ ],
179
+ };
180
+ ```
181
+
182
+ ## Dicas de Migração
183
+
184
+ 1. Procure por todas as importações antigas e substitua pelos novos nomes com o prefixo `U`
185
+ 2. Atualize todos os templates para usar as novas tags em kebab-case (ex: `<u-button>` em vez de `<btn>`)
186
+ 3. Os tipos de props não são mais exportados pela biblioteca. Utilize `ComponentProps`, de [`vue-component-type-helpers`](https://www.npmjs.com/package/vue-component-type-helpers), para obtê-los a partir do componente (veja [Tipagem de props](./getting-started.md#tipagem-de-props))
187
+ 4. Substitua a propriedade `date` das notificações do menu superior por `when`, informando o texto já formatado (veja [Notificações do menu superior](#notificacoes-do-menu-superior))
188
+ 5. Adicione `align-y="stretch"` às `URow` cujas colunas precisam ter a mesma altura (veja [Alinhamento vertical das colunas](#alinhamento-vertical-das-colunas))
189
+ 6. Informe um `icon` em todos os itens e grupos do primeiro nível do menu de navegação, e revise as telas e os testes que contavam com o botão do menu em telas largas (veja [Menu de navegação](#menu-de-navegacao))
190
+
191
+ Para mais informações sobre cada componente, consulte a [Documentação da API](../api/index.md).
@@ -0,0 +1,85 @@
1
+ # Testes Unitários
2
+
3
+ Testes unitários com o UIMed-Vue são muito simples, pois este framework já vem com plugins que atendem as ferramentas que serão listadas a seguir.
4
+
5
+ ## Usando Vitest
6
+
7
+ Para realizar as configurações, atualize seu arquivo `vite.config.ts` da seguinte maneira:
8
+
9
+ ```ts [vite.config.ts]
10
+ import { defineConfig } from "vite";
11
+ import { vitestServerPluginUimed } from "@nexdom/uimed-vue/plugins"; // [!code ++]
12
+
13
+ export default defineConfig({
14
+ test: {
15
+ server: vitestServerPluginUimed(), // [!code ++]
16
+ },
17
+ });
18
+ ```
19
+
20
+ ## Escrevendo os testes
21
+
22
+ Uma vez que as etapas mencionadas anteriormente foram realizadas, utilize o recurso de testes unitários do uimed-vue para montar os seus componentes `wrapper` através do [`@vue/test-utils`](https://test-utils.vuejs.org/).
23
+
24
+ ```ts [hello-world.test.ts]
25
+ import { mount } from "@vue/test-utils";
26
+ import { vueTestUtilsPluginUimed } from "@nexdom/uimed-vue/unit-test"; // [!code ++]
27
+ import HelloWorld from "../hello-world.vue";
28
+
29
+ describe("HelloWorld", () => {
30
+ it("displays message", () => {
31
+ const wrapper = mount(HelloWorld, {
32
+ global: {
33
+ plugins: [vueTestUtilsPluginUimed()], // [!code ++]
34
+ },
35
+ });
36
+
37
+ // Verifica se o wrapper/componente contém o texto esperado.
38
+ expect(wrapper.text()).toContain("Olá, Mundo!");
39
+ });
40
+ });
41
+ ```
42
+
43
+ O plugin de testes usa o mesmo idioma do `createUimed()`, então os testes veem os mesmos textos em português da aplicação, como os anúncios para leitores de tela e os rótulos da paginação.
44
+
45
+ ## Testando código que usa diálogos
46
+
47
+ Os diálogos das composables [`useDialog`](./composables/use-dialog.md) e [`useConfirm`](./composables/use-confirm.md) são exibidos pelo [Componente base](./components/main.md). Em um teste que monta apenas o seu componente, sem o `UMain`, nenhum diálogo é exibido e a `Promise` de `dialog` ou `confirm` não é resolvida.
48
+
49
+ Nos testes unitários, substitua as composables por versões simuladas que respondem pelo usuário:
50
+
51
+ ```ts [delete-patient.test.ts]
52
+ import { mount } from "@vue/test-utils";
53
+ import { computed } from "vue";
54
+ import { vueTestUtilsPluginUimed } from "@nexdom/uimed-vue/unit-test";
55
+ import DeletePatient from "../delete-patient.vue";
56
+
57
+ vi.mock(import("@nexdom/uimed-vue/composables"), async (importOriginal) => ({
58
+ ...(await importOriginal()),
59
+ // Simula o usuário confirmando: executa a ação como o `confirm` faria
60
+ useConfirm: () => ({
61
+ confirm: vi.fn((_options, action, ...params) => action(...params)),
62
+ isRunning: computed(() => false),
63
+ }),
64
+ // Simula o usuário escolhendo a ação de valor "stay"
65
+ useDialog: () => ({ dialog: vi.fn().mockResolvedValue("stay") }),
66
+ }));
67
+
68
+ describe("DeletePatient", () => {
69
+ it("deletes the patient once confirmed", async () => {
70
+ const wrapper = mount(DeletePatient, {
71
+ global: {
72
+ plugins: [vueTestUtilsPluginUimed()],
73
+ },
74
+ });
75
+
76
+ await wrapper.find("button").trigger("click");
77
+
78
+ // Verifique aqui o efeito da ação confirmada.
79
+ });
80
+ });
81
+ ```
82
+
83
+ Para simular um cancelamento, faça o `confirm` simulado resolver `false` sem executar a ação, e o `dialog` simulado resolver `undefined`.
84
+
85
+ Para verificar o diálogo em si, prefira testes E2E, que exercitam a aplicação completa, com o `UMain` montado.
package/AGENTS.md DELETED
@@ -1,160 +0,0 @@
1
- # AGENTS.md
2
-
3
- ## Project
4
-
5
- `@nexdom/uimed-vue` is a Vue 3 UI component library for NEXDOM applications, built on top of [Vuetify](https://vuetifyjs.com/) and [Material Design 3](https://m3.material.io/). It's published to npm and documented via VitePress at https://nexdom-healthtech.github.io/uimed-vue/.
6
-
7
- Tooling is built around [Vite+](https://github.com/voidzero-dev/vite-plus) (`vp`/`vpr`/`vpx` CLIs), not raw `vite`/`vitest`/`eslint` invocations.
8
-
9
- ## Using this library in an app
10
-
11
- These steps are for developers _consuming_ `@nexdom/uimed-vue` in a Vue application (not for contributing to this repo — see the rest of this document for that).
12
-
13
- ### Install
14
-
15
- ```bash
16
- vp add @nexdom/uimed-vue
17
- # But, if you're not using Vite+ yet...
18
- npm i @nexdom/uimed-vue
19
- # Or
20
- pnpm add @nexdom/uimed-vue
21
- # Or
22
- yarn add @nexdom/uimed-vue
23
- ```
24
-
25
- Peer dependencies (`@fontsource/roboto`, `@mdi/font`, `@nexdom/shared`, `resize-observer-polyfill`, `vite-plugin-vuetify`, `vite-plus`, `vue`, `vue-router`, `vuetify`) must be installed alongside it — most package managers install these automatically, but confirm versions match what's declared in `package.json`'s `peerDependencies`.
26
-
27
- ### Setup
28
-
29
- Add the Vite plugin:
30
-
31
- ```ts
32
- // vite.config.ts
33
- import { vitePluginUimed } from "@nexdom/uimed-vue/plugins.ts";
34
-
35
- // ...
36
-
37
- plugins: [vue(), vitePluginUimed()];
38
-
39
- // ...
40
- ```
41
-
42
- Register the plugin in the Vue app:
43
-
44
- ```ts
45
- // main.js or main.ts
46
- import { createApp } from "vue";
47
- import { createUimed } from "@nexdom/uimed-vue";
48
-
49
- import App from "./App.vue";
50
-
51
- const uimed = createUimed();
52
-
53
- createApp(App).use(uimed).mount("#app");
54
- ```
55
-
56
- ### Usage
57
-
58
- Place the `Root` component at the top of `App.vue`, then add other components as needed:
59
-
60
- ```vue
61
- <!-- App.vue -->
62
- <template>
63
- <root>
64
- <!-- ... -->
65
- </root>
66
- </template>
67
-
68
- <script setup lang="ts">
69
- import { Root } from "@nexdom/uimed-vue/components";
70
- </script>
71
- ```
72
-
73
- Never write CSS, classes or any kind of styling. Always use component props.
74
-
75
- The library doesn't export prop types. Derive them with `ComponentProps` from `vue-component-type-helpers`:
76
-
77
- ```ts
78
- import type { ComponentProps } from "vue-component-type-helpers";
79
- import { UMain, USection } from "@nexdom/uimed-vue/components";
80
-
81
- type MainProps = ComponentProps<typeof UMain>;
82
- type AppBar = NonNullable<MainProps["appBar"]>;
83
- type NavigationMenu = NonNullable<MainProps["navigationMenu"]>;
84
- type SectionAction = NonNullable<ComponentProps<typeof USection>["actions"]>[number];
85
- ```
86
-
87
- Available entry points: `@nexdom/uimed-vue` (root), `@nexdom/uimed-vue/components`, `@nexdom/uimed-vue/composables`, `@nexdom/uimed-vue/plugins`, `@nexdom/uimed-vue/unit-test` (test helpers, e.g. `vueTestUtilsPluginUimed()` for mounting components with Vuetify in Vitest).
88
-
89
- Full component/composable reference lives in the [docs](https://nexdom-healthtech.github.io/uimed-vue/).
90
-
91
- ## Contributing to this repo
92
-
93
- The sections below are for developers working _on_ this library itself.
94
-
95
- ### Dev environment setup
96
-
97
- This project expects to be opened inside its devcontainer (VSCode). If commands below fail with missing shims/commands, run:
98
-
99
- ```bash
100
- vp env doctor # diagnose missing parts
101
- vp env setup # create shims like vpr and vpx
102
- vp install # install dependencies
103
- ```
104
-
105
- ## Commands
106
-
107
- - `vpr check` — lint, formatter, and type-check (requires `build`/`pack` to have run first for the type-check step)
108
- - `vp test --coverage` — unit tests with coverage (Vitest, jsdom, 100% coverage threshold enforced)
109
- - `vpr test:mutations` — mutation tests (Stryker; thresholds: high 100, low 95, break 95)
110
- - `vpr test:e2e` — E2E tests (Playwright, runs against the built docs preview site)
111
- - `vpr depcruise` — architecture/dependency rules (dependency-cruiser)
112
- - `vp pack` / `vpr build` — build the library
113
- - `vpr docs` / `vpr docs:dev` — run docs site (imports the lib from `dist`, not `src` — run `vpr dev` in a second terminal to keep `dist` updated while iterating)
114
-
115
- CI (`.github/workflows/ci.yml`) runs, in order: commitlint on PR commits, `vp pack`, `vpr check`, `vpr depcruise`, `vp test --coverage`, `vpr test:mutations`, `vpr test:e2e`. Match this locally before opening a PR.
116
-
117
- ## Code conventions
118
-
119
- - All `src` code is written in English. `docs` content is written in Portuguese (aimed at Brazilian users), even though file/dir names stay in English.
120
- - `docs` must not mention Vuetify
121
- - A new component/composable must be listed in its guide page (`docs/guide/…`), its API page (`docs/api/…`), both sidebars in `docs/.vitepress/config.ts`, the guide index table (`docs/guide/index.md`) and the API index list (`docs/api/index.md`).
122
- - Never write CSS, classes or any kind of styling. Always use component props.
123
- - Path aliases: `@/*` → `src/*`, `@e2e/*` → `e2e/*`.
124
- - Every public component follows this pattern to block access to internals and give it an editor-hover description:
125
-
126
- ```vue
127
- <script lang="ts">
128
- /**
129
- * A short description of the component, shown when hovering it in the
130
- * editor.
131
- */
132
- export default {
133
- inheritAttrs: false,
134
- };
135
- </script>
136
-
137
- <script setup lang="ts">
138
- // component's implementation
139
- </script>
140
- ```
141
-
142
- - Component layout: `src/components/<name>/<name>.vue`, `types.ts` for prop/option types, `__tests__/<name>.test.ts` for unit tests. Composables follow the same shape under `src/composables/<name>/`.
143
- - Public components/composables/types are re-exported from `src/components/index.ts` and `src/composables/index.ts`.
144
- - Every publicly exported component must use the `U` prefix on its export identifier (e.g., `UButton`, `UMain`), while internal file names and component names remain unprefixed.
145
- - Use [JSDoc](https://jsdoc.app/about-getting-started) on every method/prop/type intended to be part of the public API — it's the primary documentation surface and supports markdown/code examples.
146
- - Known workarounds (see CONTRIBUTING.md before touching related config): `stryker-vue-ignorer` patches a Stryker/Vue macro-hoisting issue; `vue-tsc` is used for type-check instead of Vite+'s built-in one due to an oxlint/Vue support gap. Both are meant to be removed once their upstream issues are fixed — don't build further on top of them without checking if they're still needed.
147
-
148
- ## Testing conventions
149
-
150
- - Unit tests use Vitest + `@vue/test-utils`, with `vueTestUtilsPluginUimed()` from `@/unit-test.ts` to mount a Vuetify instance.
151
- - Global unit test setup (`src/__tests__/setup.ts`) stubs `visualViewport`, uses fake timers, and silences `console.error/warn/log`.
152
- - Coverage threshold is 100%; mutation testing threshold is 100% (break at 100). Don't add code paths without covering tests.
153
- - E2E tests (Playwright, `e2e/`) run against the built docs preview (`http://localhost:4173/uimed-vue/`). Snapshots/screenshots live under `__snapshots__`/`__screenshot__` next to each spec.
154
-
155
- ## Git workflow
156
-
157
- - Trunk-based development. `main` is the only long-lived branch (`beta`/`alpha` exist only for pre-release/prototype work — see CONTRIBUTING.md for when to use them). `main`, `beta`, `alpha` are all protected against direct pushes.
158
- - Short-lived branches are named after their intention (e.g. `fix-some-method-behavior`) and are deleted after merging back via PR.
159
- - Commit messages MUST follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) — enforced by commitlint in CI. Recent examples: `feat(components): ...`, `fix(composables): ...`, `test(e2e): ...`, `docs(root): ...`, `chore: ...`.
160
- - Releases are automated via `semantic-release` (conventional-commits preset) — don't hand-edit versions/changelogs.
package/CLAUDE.md DELETED
@@ -1 +0,0 @@
1
- @AGENTS.md
@@ -1,5 +0,0 @@
1
- //#region src/composables/colors/types.d.ts
2
- type ColorVariant = "primary" | "secondary" | FeedbackColorVariant;
3
- type FeedbackColorVariant = "positive" | "informative" | "caution" | "danger";
4
- //#endregion
5
- export { FeedbackColorVariant as n, ColorVariant as t };
@@ -1,53 +0,0 @@
1
- import { computed, ref, toValue } from "vue";
2
- const colorToVuetifyColor = {
3
- primary: "primary",
4
- secondary: "secondary",
5
- positive: "success",
6
- informative: "info",
7
- caution: "warning",
8
- danger: "error"
9
- };
10
- //#endregion
11
- //#region src/composables/colors/use-vuetify-color.ts
12
- function useVuetifyColor(color) {
13
- return computed(() => {
14
- const colorValue = toValue(color);
15
- return colorValue ? colorToVuetifyColor[colorValue] : colorToVuetifyColor.primary;
16
- });
17
- }
18
- //#endregion
19
- //#region src/composables/dialogs/use-toast.ts
20
- const messages = ref([]);
21
- /**
22
- * Composable which returns a function to display toast messages.
23
- *
24
- * @example
25
- * ```ts
26
- * const { toast } = useToast();
27
- * toast({ message: "Hello, World!" });
28
- * ```
29
- */
30
- function useToast() {
31
- return { toast };
32
- }
33
- /**
34
- * Displays a toast message.
35
- * @param {ToastOptions} options - Options for the toast message.
36
- *
37
- * @example
38
- * ```ts
39
- * toast({ message: "Hello, World!" });
40
- * ```
41
- */
42
- function toast(options) {
43
- const text = options.message;
44
- const color = useVuetifyColor(options.color ?? "informative");
45
- const toastMessage = {
46
- text,
47
- color: color.value,
48
- prependIcon: `$${color.value}`
49
- };
50
- messages.value.push(toastMessage);
51
- }
52
- //#endregion
53
- export { useToast as n, useVuetifyColor as r, messages as t };