@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,111 @@
1
+ # Transição de páginas
2
+
3
+ O componente para animar a troca entre as páginas da aplicação se chama `PageTransition`. A página atual desaparece aos poucos e, só depois que ela sai, a nova página aparece da mesma forma.
4
+
5
+ > [!Warning]
6
+ > Feito para envolver a página renderizada pelo `<router-view>` do [Vue Router](https://router.vuejs.org/).
7
+
8
+ ## Uso
9
+
10
+ Coloque o `<router-view>` dentro do [Componente base](./main.md) e envolva a página da rota atual com o `PageTransition`.
11
+
12
+ Só a troca de páginas é animada. A primeira página aparece sem animação quando a aplicação é montada depois que o roteador carrega a primeira rota (com `await router.isReady()` antes do `app.mount`). Se a aplicação for montada antes, a área de conteúdo começa vazia e a primeira página aparece com a animação, como na demonstração abaixo.
13
+
14
+ Navegue entre as páginas da demonstração.
15
+
16
+ A demonstração tem duas páginas com um roteador próprio. Por isso, a navegação entre elas não altera o endereço do navegador. A página "Pacientes" é uma section, e a página "Agenda" centraliza a sua section na altura da tela, com um container e uma linha com `full-height` (veja [Altura total](./layout.md#altura-total)).
17
+
18
+ ```vue
19
+ <!-- App.vue -->
20
+ <template>
21
+ <u-main>
22
+ <router-view v-slot="{ Component }">
23
+ <u-page-transition>
24
+ <component :is="Component" />
25
+ </u-page-transition>
26
+ </router-view>
27
+ </u-main>
28
+ </template>
29
+
30
+ <script lang="ts" setup>
31
+ import { UMain, UPageTransition } from "@nexdom/uimed-vue/components";
32
+ </script>
33
+ ```
34
+
35
+ ### Elemento em volta da página
36
+
37
+ O `PageTransition` coloca a página dentro de um `<div>`, e é esse elemento que aparece e desaparece. Assim, qualquer página é animada, seja qual for o seu conteúdo: uma section, mais de um elemento (por exemplo, o conteúdo e uma [janela modal](./dialog.md) ao lado dele) ou comentários fora do elemento principal.
38
+
39
+ ```vue
40
+ <!-- PatientList.vue, página renderizada pelo <router-view> -->
41
+ <template>
42
+ <u-section title="Pacientes" :actions>
43
+ <u-section-content>Lista de pacientes cadastrados.</u-section-content>
44
+ </u-section>
45
+ <u-dialog v-model="open" title="Novo paciente">...</u-dialog>
46
+ </template>
47
+ ```
48
+
49
+ O `<div>` ocupa toda a altura do elemento em que está. Por isso, containers e linhas com `full-height` continuam ocupando a altura da área de conteúdo do [Componente base](./main.md), como na página "Agenda" da demonstração.
50
+
51
+ Atributos informados no `PageTransition`, como `class` e `style`, não são repassados ao `<div>` nem à página.
52
+
53
+ ### Movimento reduzido
54
+
55
+ Quando o sistema operacional pede movimento reduzido (por exemplo, com a opção "Reduzir movimento" ou "Efeitos de animação" desligada), as páginas trocam sem animação. Nenhuma configuração é necessária, e a mudança da preferência com a aplicação aberta vale a partir da troca seguinte.
56
+
57
+ ### Quando a troca é animada
58
+
59
+ A troca é animada sempre que a prop `transitionKey` muda. Por padrão, ela é o endereço completo da rota atual (`route.fullPath`), então toda navegação é animada, inclusive quando só mudam os parâmetros (de `/pacientes/1` para `/pacientes/2`), a consulta (de `/pacientes?pagina=1` para `/pacientes?pagina=2`) ou o fragmento (um link para uma âncora da mesma página, como `#consultas`). Nesses casos, a página é criada de novo, e o estado dela (como campos preenchidos) não é mantido.
60
+
61
+ Para escolher quais navegações são animadas, informe outro valor. Com o caminho da rota (`route.path`), por exemplo, mudanças só na consulta ou no fragmento, como a troca de página de uma lista, acontecem sem animação e mantêm a página:
62
+
63
+ ```vue
64
+ <template>
65
+ <u-main>
66
+ <router-view v-slot="{ Component, route }">
67
+ <u-page-transition :transition-key="route.path">
68
+ <component :is="Component" />
69
+ </u-page-transition>
70
+ </router-view>
71
+ </u-main>
72
+ </template>
73
+ ```
74
+
75
+ #### Rotas aninhadas
76
+
77
+ Com rotas aninhadas, o endereço completo também muda quando só a rota filha muda. Com o valor padrão, navegar entre rotas filhas (de `/pacientes/1` para `/pacientes/2`) anima a página pai inteira, que sai com a filha anterior e é criada de novo com a nova, sem manter o seu estado.
78
+
79
+ Para animar só a troca da rota filha, informe no `PageTransition` de cima uma `transitionKey` que identifique apenas a rota pai, como o caminho dela (`route.matched[0]?.path`), e envolva o `<router-view>` da página pai com outro `PageTransition`:
80
+
81
+ ```vue
82
+ <!-- App.vue -->
83
+ <template>
84
+ <u-main>
85
+ <router-view v-slot="{ Component, route }">
86
+ <u-page-transition :transition-key="route.matched[0]?.path">
87
+ <component :is="Component" />
88
+ </u-page-transition>
89
+ </router-view>
90
+ </u-main>
91
+ </template>
92
+ ```
93
+
94
+ ```vue
95
+ <!-- PatientLayout.vue, página pai das rotas /pacientes/:id -->
96
+ <template>
97
+ <router-view v-slot="{ Component }">
98
+ <u-page-transition>
99
+ <component :is="Component" />
100
+ </u-page-transition>
101
+ </router-view>
102
+ </template>
103
+ ```
104
+
105
+ ### Páginas mantidas em memória
106
+
107
+ Com um `<keep-alive>` dentro do `PageTransition`, a troca é animada, mas as páginas não são mantidas: o `<div>` em volta da página é criado de novo a cada troca, e o `<keep-alive>` dentro dele também. Para manter as páginas, informe uma `transitionKey` fixa (por exemplo, `transition-key="paginas"`). Nesse caso, a troca de páginas acontece sem animação.
108
+
109
+ ## Ver também
110
+
111
+ Consulte a referência de [API do UPageTransition](../../api/components/page-transition.md) para mais informações.
@@ -0,0 +1,232 @@
1
+ # Agrupador de Conteúdo
2
+
3
+ O componente padrão para agrupar conteúdo relacionado se chama `Section`.
4
+
5
+ > [!Warning]
6
+ > Deve ser utilizado no lugar do `<section>` nativo.
7
+
8
+ Dentro do mesmo também podemos adicionar o [`SectionContent`](#componente-sectioncontent).
9
+
10
+ ## Propriedades
11
+
12
+ ### Variantes
13
+
14
+ A prop `variant` define a variação de estilo aplicada ao agrupador de conteúdo. O padrão é `primary`.
15
+
16
+ ```vue
17
+ <template>
18
+ <u-section variant="primary" title="Primary">Conteúdo do agrupador primary</u-section>
19
+ <u-section variant="secondary" title="Secondary">Conteúdo do agrupador secondary</u-section>
20
+ </template>
21
+
22
+ <script lang="ts" setup>
23
+ import { USection } from "@nexdom/uimed-vue/components";
24
+ </script>
25
+ ```
26
+
27
+ ### Título e Subtítulo
28
+
29
+ As props `title` e `subtitle` definem o título e o subtítulo exibidos no topo do agrupador.
30
+
31
+ ```vue
32
+ <template>
33
+ <u-section title="Título do Agrupador" subtitle="Subtítulo descritivo">
34
+ Conteúdo do agrupador com título e subtítulo
35
+ </u-section>
36
+ </template>
37
+
38
+ <script lang="ts" setup>
39
+ import { USection } from "@nexdom/uimed-vue/components";
40
+ </script>
41
+ ```
42
+
43
+ ### Alinhamento
44
+
45
+ A prop `textAlign` define o alinhamento horizontal do título, do subtítulo, do conteúdo e das ações do agrupador. O padrão é `start`.
46
+
47
+ - `start`: alinha o texto ao início, mantendo as ações no fim;
48
+ - `center`: centraliza o texto e as ações;
49
+ - `end`: alinha o texto e as ações ao fim.
50
+
51
+ Os valores `start` e `end` seguem a direção do texto, então se invertem em idiomas escritos da direita para a esquerda.
52
+
53
+ ```vue
54
+ <template>
55
+ <u-section text-align="start" title="Início" subtitle="Alinhamento padrão" :actions="actions">
56
+ <u-section-content>Conteúdo alinhado ao início, com as ações no fim</u-section-content>
57
+ </u-section>
58
+ <u-section
59
+ text-align="center"
60
+ title="Página não encontrada"
61
+ subtitle="Erro 404"
62
+ :actions="notFoundActions"
63
+ >
64
+ <u-section-content>
65
+ O endereço que você tentou abrir não existe ou foi removido.
66
+ </u-section-content>
67
+ </u-section>
68
+ <u-section text-align="end" title="Fim" subtitle="Alinhado ao fim" :actions="actions">
69
+ <u-section-content>Conteúdo alinhado ao fim, assim como as ações</u-section-content>
70
+ </u-section>
71
+ </template>
72
+
73
+ <script lang="ts" setup>
74
+ import { ref } from "vue";
75
+ import { USection, USectionContent } from "@nexdom/uimed-vue/components";
76
+
77
+ const actions = ref([
78
+ {
79
+ label: "Cancelar",
80
+ variant: "ghost",
81
+ onClick: () => alert("Cancelar clicado"),
82
+ },
83
+ {
84
+ label: "Salvar",
85
+ color: "positive",
86
+ onClick: () => alert("Salvar clicado"),
87
+ },
88
+ ]);
89
+
90
+ const notFoundActions = ref([
91
+ {
92
+ label: "Voltar para o Início",
93
+ variant: "ghost",
94
+ onClick: () => alert("Voltar para o Início clicado"),
95
+ },
96
+ ]);
97
+ </script>
98
+ ```
99
+
100
+ O alinhamento vale para todo o conteúdo do agrupador, inclusive para os textos e componentes dentro dele, exceto os que definem o próprio alinhamento. Por isso, os valores `center` e `end` são pensados para conteúdos curtos, como estados vazios e mensagens.
101
+
102
+ Um agrupador dentro de outro mantém o próprio alinhamento, que também é `start` por padrão:
103
+
104
+ ```vue
105
+ <template>
106
+ <u-section text-align="center" title="Agrupador centralizado" full-width>
107
+ <u-section-content>
108
+ <p>Conteúdo centralizado</p>
109
+ <u-section variant="secondary" title="Agrupador interno" full-width>
110
+ <u-section-content>Conteúdo alinhado ao início</u-section-content>
111
+ </u-section>
112
+ </u-section-content>
113
+ </u-section>
114
+ </template>
115
+
116
+ <script lang="ts" setup>
117
+ import { USection, USectionContent } from "@nexdom/uimed-vue/components";
118
+ </script>
119
+ ```
120
+
121
+ ### Dimensões
122
+
123
+ #### Largura Total
124
+
125
+ Utilize a prop `fullWidth` para fazer o agrupador ocupar 100% da largura do seu container.
126
+
127
+ ```vue
128
+ <template>
129
+ <u-section title="Agrupador com 100% de largura" full-width>
130
+ Conteúdo preenchendo toda a largura disponível
131
+ </u-section>
132
+ </template>
133
+
134
+ <script lang="ts" setup>
135
+ import { USection } from "@nexdom/uimed-vue/components";
136
+ </script>
137
+ ```
138
+
139
+ #### Altura Total
140
+
141
+ Utilize a prop `fullHeight` para fazer o agrupador ocupar 100% da altura do seu container.
142
+
143
+ Quando o agrupador estiver dentro de uma [`URow`](./layout.md#alinhamento-vertical-das-colunas), utilize `align-y="stretch"` na linha para que ele acompanhe a altura da coluna mais alta. Para que a linha ocupe toda a altura da tela, veja [Altura total](./layout.md#altura-total).
144
+
145
+ ```vue
146
+ <template>
147
+ <div style="height: 300px;">
148
+ <u-section title="Agrupador com 100% de altura" full-height>
149
+ Conteúdo preenchendo toda a altura disponível
150
+ </u-section>
151
+ </div>
152
+ </template>
153
+
154
+ <script lang="ts" setup>
155
+ import { USection } from "@nexdom/uimed-vue/components";
156
+ </script>
157
+ ```
158
+
159
+ ### Ações
160
+
161
+ A prop `actions` define uma lista de botões exibidos na área de ações (rodapé) do agrupador, alinhados ao fim (veja [Alinhamento](#alinhamento)), nesta ordem. Coloque a ação principal por último. Cada ação aceita as props do [Button](./button.md), como `variant`, `color`, `disabled` e `route`, que faz a ação navegar para uma rota (veja [Navegação](./button.md#navegacao)).
162
+
163
+ Coloque o conteúdo dentro do [`SectionContent`](#componente-sectioncontent) para que ele fique espaçado das bordas do agrupador e dos botões de ação.
164
+
165
+ ```vue
166
+ <template>
167
+ <div style="height: 300px;">
168
+ <u-section title="Agrupador com Ações" :actions="actions" full-height>
169
+ <u-section-content>Conteúdo com ações disponíveis no rodapé</u-section-content>
170
+ </u-section>
171
+ </div>
172
+ </template>
173
+
174
+ <script lang="ts" setup>
175
+ import { ref } from "vue";
176
+ import { USection, USectionContent } from "@nexdom/uimed-vue/components";
177
+
178
+ const actions = ref([
179
+ {
180
+ label: "Cancelar",
181
+ variant: "ghost",
182
+ onClick: () => alert("Cancelar clicado"),
183
+ },
184
+ {
185
+ label: "Salvar",
186
+ color: "positive",
187
+ onClick: () => alert("Salvar clicado"),
188
+ },
189
+ ]);
190
+ </script>
191
+ ```
192
+
193
+ ### Carregamento
194
+
195
+ A prop `loading` exibe um skeleton loader no lugar do conteúdo enquanto uma operação está em andamento.
196
+
197
+ ```vue
198
+ <template>
199
+ <u-section title="Carregando..." loading> Conteúdo do agrupador </u-section>
200
+ <u-section title="Carregando com actions..." :actions="[{ label: 'Salvar' }]" loading>
201
+ <u-section-content>Conteúdo do agrupador com actions</u-section-content>
202
+ </u-section>
203
+ </template>
204
+
205
+ <script lang="ts" setup>
206
+ import { USection, USectionContent } from "@nexdom/uimed-vue/components";
207
+ </script>
208
+ ```
209
+
210
+ ## Componente SectionContent
211
+
212
+ O componente `SectionContent` é utilizado para estruturar o conteúdo exibido dentro do `Section`.
213
+
214
+ ```vue
215
+ <template>
216
+ <u-section title="Título do Agrupador">
217
+ <u-section-content>Conteúdo estruturado com o componente SectionContent</u-section-content>
218
+ </u-section>
219
+ </template>
220
+
221
+ <script lang="ts" setup>
222
+ import { USectionContent, USection } from "@nexdom/uimed-vue/components";
223
+ </script>
224
+ ```
225
+
226
+ ## Playground
227
+
228
+ Experimente as combinações de props do componente.
229
+
230
+ ## Ver também
231
+
232
+ Consulte a referência de [API do USection](../../api/components/sections/section.md) e da [API do USectionContent](../../api/components/sections/section-content.md) para a lista completa de props, slots e eventos.
@@ -0,0 +1,102 @@
1
+ # Tabela
2
+
3
+ O componente `Table` é usado para apresentar dados em tabelas, de forma clara e organizada.
4
+
5
+ > [!Warning]
6
+ > Deve ser utilizado no lugar do `<table>` nativo.
7
+
8
+ ## Propriedades
9
+
10
+ ### Layout
11
+
12
+ A prop `vertical` define o layout da tabela.
13
+
14
+ #### Horizontal (Padrão)
15
+
16
+ Por padrão, a tabela será exibida em layout horizontal com cabeçalhos no topo.
17
+
18
+ ```vue
19
+ <template>
20
+ <u-table
21
+ :headers="['Nome', 'Idade', 'Cidade']"
22
+ :items="[
23
+ ['Ana', '30', 'São Paulo'],
24
+ ['Bruno', '25', 'Rio de Janeiro'],
25
+ ]"
26
+ />
27
+ </template>
28
+
29
+ <script lang="ts" setup>
30
+ import { UTable } from "@nexdom/uimed-vue/components";
31
+ </script>
32
+ ```
33
+
34
+ #### Vertical
35
+
36
+ Utilize a prop `vertical` para renderizar uma tabela separada para cada item, exibindo cada linha com um cabeçalho na coluna esquerda.
37
+
38
+ ```vue
39
+ <template>
40
+ <u-table
41
+ :headers="['Nome', 'Idade', 'Cidade']"
42
+ :items="[
43
+ ['Ana', '30', 'São Paulo'],
44
+ ['Bruno', '25', 'Rio de Janeiro'],
45
+ ]"
46
+ vertical
47
+ />
48
+ </template>
49
+
50
+ <script lang="ts" setup>
51
+ import { UTable } from "@nexdom/uimed-vue/components";
52
+ </script>
53
+ ```
54
+
55
+ Caso `headers` seja um array vazio, o layout vertical ainda pode ser utilizado, mas as linhas serão exibidas sem um cabeçalho na coluna esquerda.
56
+
57
+ ```vue
58
+ <template>
59
+ <u-table
60
+ :items="[
61
+ ['Ana', '30', 'São Paulo'],
62
+ ['Bruno', '25', 'Rio de Janeiro'],
63
+ ]"
64
+ vertical
65
+ />
66
+ </template>
67
+
68
+ <script lang="ts" setup>
69
+ import { UTable } from "@nexdom/uimed-vue/components";
70
+ </script>
71
+ ```
72
+
73
+ ### Carregamento
74
+
75
+ A prop `loading` exibe um skeleton loader no lugar da tabela.
76
+
77
+ Esse é um ótimo recurso de feedback para o usuário, enquanto uma operação está em andamento.
78
+
79
+ ```vue
80
+ <template>
81
+ <u-table
82
+ :headers="['Nome', 'Idade', 'Cidade']"
83
+ :items="[
84
+ ['Ana', '30', 'São Paulo'],
85
+ ['Bruno', '25', 'Rio de Janeiro'],
86
+ ]"
87
+ loading
88
+ />
89
+ </template>
90
+
91
+ <script lang="ts" setup>
92
+ import { UTable } from "@nexdom/uimed-vue/components";
93
+ </script>
94
+ ```
95
+
96
+ ## Playground
97
+
98
+ Experimente as combinações de props do componente.
99
+
100
+ ## Ver também
101
+
102
+ Consulte a referência de [API do UTable](../../api/components/table.md) para a lista completa de props.
@@ -0,0 +1,172 @@
1
+ # Campos de texto
2
+
3
+ O componente para campos de texto se chama `TextField`.
4
+
5
+ > [!Warning]
6
+ > Deve ser utilizado no lugar do `<input>` nativo.
7
+
8
+ ## Propriedades
9
+
10
+ ### Variantes
11
+
12
+ A prop `variant` define a variação de estilo aplicada ao campo. O padrão é `primary`.
13
+
14
+ ```vue
15
+ <template>
16
+ <u-text-field label="Primary" variant="primary" />
17
+ <u-text-field label="Secondary" variant="secondary" />
18
+ </template>
19
+
20
+ <script lang="ts" setup>
21
+ import { UTextField } from "@nexdom/uimed-vue/components";
22
+ </script>
23
+ ```
24
+
25
+ ### Labels
26
+
27
+ A prop `label` aceita um texto que identifica a informação a ser preenchida no campo.
28
+
29
+ ```vue
30
+ <template>
31
+ <u-text-field label="Primeiro nome" />
32
+ <u-text-field label="Sobrenome" />
33
+ </template>
34
+
35
+ <script lang="ts" setup>
36
+ import { UTextField } from "@nexdom/uimed-vue/components";
37
+ </script>
38
+ ```
39
+
40
+ ### Placeholders
41
+
42
+ A prop `placeholder` aceita um texto que fornece um exemplo ou instrução sobre o formato do dado que pode ser preenchido no campo.
43
+
44
+ ```vue
45
+ <template>
46
+ <u-text-field label="E-mail" type="email" placeholder="me.nexdom@gmail.com" />
47
+ </template>
48
+
49
+ <script lang="ts" setup>
50
+ import { UTextField } from "@nexdom/uimed-vue/components";
51
+ </script>
52
+ ```
53
+
54
+ ### Mensagens
55
+
56
+ A prop `hint` recebe um texto que será apresentado como uma dica para oferecer mais instruções ao usuário que virá a preencher o campo.
57
+
58
+ ```vue
59
+ <template>
60
+ <u-text-field label="URL" type="url" hint="https://google.com ou http://localhost:8080" />
61
+ </template>
62
+
63
+ <script lang="ts" setup>
64
+ import { UTextField } from "@nexdom/uimed-vue/components";
65
+ </script>
66
+ ```
67
+
68
+ ### Senha
69
+
70
+ Com `type="password"`, o campo oculta o valor digitado e exibe um ícone de olho, anunciado pelos leitores de tela como o botão "Mostrar senha", que alterna entre mostrar e ocultar a senha. O ícone também pode ser acessado pelo teclado: a partir do campo, pressione `Tab` para focá-lo e `Espaço` ou `Enter` para alternar. A senha volta a ficar oculta ao pressionar o ícone novamente ou quando o `type` muda.
71
+
72
+ ```vue
73
+ <template>
74
+ <u-text-field label="Senha" type="password" />
75
+ </template>
76
+
77
+ <script lang="ts" setup>
78
+ import { UTextField } from "@nexdom/uimed-vue/components";
79
+ </script>
80
+ ```
81
+
82
+ ### Pesquisa
83
+
84
+ Com `type="search"`, o campo exibe um ícone de lupa e, por padrão, o recurso para limpar o valor digitado (`clearable`). A lupa é apenas visual: não é anunciada pelos leitores de tela e não recebe foco ao pressionar `Tab`.
85
+
86
+ ```vue
87
+ <template>
88
+ <u-text-field label="Pesquisar" type="search" />
89
+ </template>
90
+
91
+ <script lang="ts" setup>
92
+ import { UTextField } from "@nexdom/uimed-vue/components";
93
+ </script>
94
+ ```
95
+
96
+ ### Estados
97
+
98
+ #### Desabilitado
99
+
100
+ Utilize a prop `disabled` para indicar ao usuário que não há possibilidade de interação com o campo.
101
+
102
+ ```vue
103
+ <template>
104
+ <u-text-field label="Desabilitado" disabled />
105
+ </template>
106
+
107
+ <script lang="ts" setup>
108
+ import { UTextField } from "@nexdom/uimed-vue/components";
109
+ </script>
110
+ ```
111
+
112
+ #### Somente leitura
113
+
114
+ Utilize a prop `readonly` para evitar que o valor presente em um campo seja alterado.
115
+
116
+ ```vue
117
+ <template>
118
+ <u-text-field modelValue="Valor inicial" label="Somente leitura" readonly />
119
+ </template>
120
+
121
+ <script lang="ts" setup>
122
+ import { UTextField } from "@nexdom/uimed-vue/components";
123
+ </script>
124
+ ```
125
+
126
+ #### Carregamento
127
+
128
+ A prop `loading` exibe um indicador de carregamento no campo enquanto ativa. Nesse estado, o campo mantém o rótulo como nome acessível e fica marcado como ocupado, e leitores de tela ignoram o indicador.
129
+
130
+ ```vue
131
+ <template>
132
+ <u-text-field label="Carregando" loading />
133
+ </template>
134
+
135
+ <script lang="ts" setup>
136
+ import { UTextField } from "@nexdom/uimed-vue/components";
137
+ </script>
138
+ ```
139
+
140
+ ## Eventos
141
+
142
+ ### Atualização
143
+
144
+ O evento `update:modelValue` será emitido toda vez que o valor do campo for alterado pelo usuário, repassando o novo valor como uma `string`.
145
+
146
+ ```vue
147
+ <template>
148
+ <u-text-field label="Texto" :model-value :hint @update:modelValue="onUpdateValue" />
149
+ </template>
150
+
151
+ <script lang="ts" setup>
152
+ import { ref, computed } from "vue";
153
+ import { UTextField } from "@nexdom/uimed-vue/components";
154
+
155
+ const modelValue = ref("Me altere!");
156
+ const changes = ref(0);
157
+ const hint = computed(() => `${changes.value} alteração(ões)`);
158
+
159
+ function onUpdateValue(newValue: string) {
160
+ modelValue.value = newValue;
161
+ changes.value++;
162
+ }
163
+ </script>
164
+ ```
165
+
166
+ ## Playground
167
+
168
+ Experimente as combinações de props do componente.
169
+
170
+ ## Ver também
171
+
172
+ Consulte a referência de [API do UTextField](../../api/components/text-field.md) para a lista completa de props, slots e eventos.