@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,370 @@
1
+ # Listagem
2
+
3
+ O componente padrão para listar registros se chama `DataSet`.
4
+
5
+ Ele apresenta os registros da página atual em uma grade responsiva de cartões, montada com os componentes de [layout](./layout.md) `Row` e `Column`. Cada registro ocupa a sua própria coluna e é apresentado por meio do slot padrão, que recebe o registro original (`item`) e a sua posição na página atual (`index`). Dentro do slot, monte o cartão de cada registro com o componente [`DataSetItem`](#componente-datasetitem), baseado no [agrupador de conteúdo](./section.md).
6
+
7
+ ## Propriedades
8
+
9
+ ### Itens
10
+
11
+ A prop `items` define os registros a serem listados.
12
+
13
+ ```vue
14
+ <template>
15
+ <u-data-set :items="pacientes">
16
+ <template #default="{ item }">
17
+ <u-data-set-item :title="item.nome" :subtitle="`Plano ${item.plano}`" />
18
+ </template>
19
+ </u-data-set>
20
+ </template>
21
+
22
+ <script lang="ts" setup>
23
+ import { UDataSet, UDataSetItem } from "@nexdom/uimed-vue/components";
24
+
25
+ const pacientes = [
26
+ { id: 1, nome: "Ana Souza", plano: "Ouro" },
27
+ { id: 2, nome: "Bruno Lima", plano: "Prata" },
28
+ { id: 3, nome: "Carla Dias", plano: "Bronze" },
29
+ ];
30
+ </script>
31
+ ```
32
+
33
+ ### Colunas
34
+
35
+ A prop `columns` define a quantidade máxima de registros apresentados lado a lado em cada linha da grade: `1`, `2`, `3`, `4` ou `6`. O padrão é `3`.
36
+
37
+ A grade é responsiva e se adapta ao espaço que a listagem realmente ocupa, e não apenas ao tamanho da tela: para que cada cartão tenha pelo menos 240px de largura, a quantidade de registros por linha é reduzida para o maior dos valores acima que caiba na largura disponível. Assim, uma listagem dentro de um espaço estreito, como um diálogo ou um painel lateral, apresenta menos registros por linha, podendo chegar a um único registro. Em telas muito pequenas, como as de celulares, cada registro ocupa a largura inteira.
38
+
39
+ Experimente alterar a quantidade de colunas no [Playground](#playground), cuja área de visualização é estreita, e a largura da janela: a quantidade de registros por linha se ajusta ao espaço disponível.
40
+
41
+ ```vue
42
+ <template>
43
+ <u-data-set :items="pacientes" :columns="2">
44
+ <template #default="{ item }">
45
+ <u-data-set-item :title="item.nome" :subtitle="`Plano ${item.plano}`" />
46
+ </template>
47
+ </u-data-set>
48
+ </template>
49
+
50
+ <script lang="ts" setup>
51
+ import { UDataSet, UDataSetItem } from "@nexdom/uimed-vue/components";
52
+
53
+ const pacientes = [
54
+ { id: 1, nome: "Ana Souza", plano: "Ouro" },
55
+ { id: 2, nome: "Bruno Lima", plano: "Prata" },
56
+ { id: 3, nome: "Carla Dias", plano: "Bronze" },
57
+ { id: 4, nome: "Daniel Rocha", plano: "Ouro" },
58
+ ];
59
+ </script>
60
+ ```
61
+
62
+ ### Paginação
63
+
64
+ Os registros são divididos em páginas de acordo com a prop `itemsPerPage`, que por padrão apresenta até `10` registros por página. Os controles de paginação só são exibidos quando há mais de uma página.
65
+
66
+ A página atual pode ser acompanhada, ou alterada, por meio do `v-model:page`, que inicia na primeira página.
67
+
68
+ ```vue
69
+ <template>
70
+ <u-data-set v-model:page="paginaAtual" :items="consultas" :items-per-page="6">
71
+ <template #default="{ item }">
72
+ <u-data-set-item :title="item.paciente" :subtitle="item.especialidade">
73
+ Consulta em {{ item.data }}
74
+ </u-data-set-item>
75
+ </template>
76
+ </u-data-set>
77
+ Página atual: {{ paginaAtual }}
78
+ </template>
79
+
80
+ <script lang="ts" setup>
81
+ import { ref } from "vue";
82
+ import { UDataSet, UDataSetItem } from "@nexdom/uimed-vue/components";
83
+
84
+ const paginaAtual = ref(1);
85
+ const consultas = [
86
+ { id: 1, paciente: "Ana Souza", especialidade: "Cardiologia", data: "01/10/2026" },
87
+ { id: 2, paciente: "Bruno Lima", especialidade: "Dermatologia", data: "02/10/2026" },
88
+ // ...
89
+ ];
90
+ </script>
91
+ ```
92
+
93
+ ### Pesquisa
94
+
95
+ A prop `searchable` exibe um campo de pesquisa na barra acima dos registros, alinhado à direita e com 240px de largura, a mesma largura mínima de um cartão. Em telas muito pequenas, como as de celulares, ele ocupa a largura inteira. Apenas os registros que contêm o texto pesquisado, sem diferenciar maiúsculas e minúsculas, são listados, e a listagem volta para a primeira página a cada nova pesquisa.
96
+
97
+ Por padrão, todas as propriedades dos registros são consideradas. Utilize a prop `searchKeys` para restringir a pesquisa a algumas delas.
98
+
99
+ O texto pesquisado pode ser acompanhado, ou alterado, por meio do `v-model:search`. Ele filtra os registros mesmo quando o campo de pesquisa não é exibido.
100
+
101
+ ```vue
102
+ <template>
103
+ <u-data-set
104
+ v-model:search="pesquisa"
105
+ :items="pacientes"
106
+ :search-keys="['nome']"
107
+ :items-per-page="4"
108
+ :columns="2"
109
+ searchable
110
+ >
111
+ <template #default="{ item }">
112
+ <u-data-set-item :title="item.nome" :subtitle="`Plano ${item.plano}`" />
113
+ </template>
114
+ </u-data-set>
115
+ Pesquisa: {{ pesquisa }}
116
+ </template>
117
+
118
+ <script lang="ts" setup>
119
+ import { ref } from "vue";
120
+ import { UDataSet, UDataSetItem } from "@nexdom/uimed-vue/components";
121
+
122
+ const pesquisa = ref("");
123
+ const pacientes = [
124
+ { id: 1, nome: "Ana Souza", plano: "Ouro" },
125
+ { id: 2, nome: "Bruno Lima", plano: "Prata" },
126
+ // ...
127
+ ];
128
+ </script>
129
+ ```
130
+
131
+ ### Ações da listagem
132
+
133
+ A prop `actions` define as ações sobre a listagem como um todo, como "Novo paciente". Elas são exibidas como botões à esquerda da barra acima dos registros, na mesma linha do campo de pesquisa, e aceitam as mesmas opções das [ações do agrupador de conteúdo](./section.md#acoes). A barra só é exibida quando há ações ou pesquisa.
134
+
135
+ Sem `variant`, as ações da listagem são `secondary`, e não `primary` como nas ações do agrupador de conteúdo e dos registros, para não concorrerem com elas. Uma ação que informa `variant` mantém a sua.
136
+
137
+ Com o campo de pesquisa, as ações ocupam a metade esquerda da barra, e o campo, a metade direita. As ações que não cabem na metade delas passam para a linha seguinte, ainda à esquerda. Quando a listagem não tem largura para dois cartões lado a lado, como em diálogos e painéis laterais, as ações e o campo de pesquisa ficam em linhas separadas, com o campo ainda à direita. Em telas muito pequenas, como as de celulares, cada ação e o campo de pesquisa ocupam uma linha inteira.
138
+
139
+ ```vue
140
+ <template>
141
+ <u-data-set
142
+ :items="pacientes"
143
+ :columns="2"
144
+ :actions="[
145
+ { label: 'Novo paciente', onClick: novoPaciente },
146
+ { label: 'Exportar', onClick: exportar },
147
+ ]"
148
+ searchable
149
+ >
150
+ <template #default="{ item }">
151
+ <u-data-set-item :title="item.nome" :subtitle="`Plano ${item.plano}`" />
152
+ </template>
153
+ </u-data-set>
154
+ Última ação: {{ ultimaAcao }}
155
+ </template>
156
+
157
+ <script lang="ts" setup>
158
+ import { ref } from "vue";
159
+ import { UDataSet, UDataSetItem } from "@nexdom/uimed-vue/components";
160
+
161
+ const ultimaAcao = ref("nenhuma");
162
+ const pacientes = [
163
+ { id: 1, nome: "Ana Souza", plano: "Ouro" },
164
+ { id: 2, nome: "Bruno Lima", plano: "Prata" },
165
+ // ...
166
+ ];
167
+
168
+ function novoPaciente() {
169
+ ultimaAcao.value = "Novo paciente";
170
+ }
171
+
172
+ function exportar() {
173
+ ultimaAcao.value = "Exportar";
174
+ }
175
+ </script>
176
+ ```
177
+
178
+ ### Sem registros
179
+
180
+ Quando não há registros para listar, seja porque `items` está vazio ou porque nenhum registro corresponde à pesquisa, a mensagem "Nenhum registro encontrado." é exibida. Utilize a prop `noDataText` para personalizá-la.
181
+
182
+ ```vue
183
+ <template>
184
+ <u-data-set :items="[]" no-data-text="Nenhum paciente agendado para hoje." />
185
+ </template>
186
+
187
+ <script lang="ts" setup>
188
+ import { UDataSet } from "@nexdom/uimed-vue/components";
189
+ </script>
190
+ ```
191
+
192
+ ### Carregamento
193
+
194
+ A prop `loading` exibe um skeleton loader no lugar da listagem enquanto uma operação está em andamento.
195
+
196
+ ```vue
197
+ <template>
198
+ <u-data-set :items="pacientes" loading />
199
+ </template>
200
+
201
+ <script lang="ts" setup>
202
+ import { UDataSet } from "@nexdom/uimed-vue/components";
203
+
204
+ const pacientes = [
205
+ { id: 1, nome: "Ana Souza", plano: "Ouro" },
206
+ { id: 2, nome: "Bruno Lima", plano: "Prata" },
207
+ ];
208
+ </script>
209
+ ```
210
+
211
+ ## Componente DataSetItem
212
+
213
+ O componente `DataSetItem` apresenta um registro como um cartão, baseado no [agrupador de conteúdo](./section.md). Ele ocupa toda a altura da sua coluna, de forma que os cartões de uma mesma linha fiquem alinhados.
214
+
215
+ ### Título e subtítulo
216
+
217
+ As props `title` e `subtitle` definem o título e uma breve descrição, exibidos no topo do cartão.
218
+
219
+ ```vue
220
+ <template>
221
+ <u-data-set :items="pacientes" :columns="2">
222
+ <template #default="{ item, index }">
223
+ <u-data-set-item :title="`${index + 1}. ${item.nome}`" :subtitle="item.cidade" />
224
+ </template>
225
+ </u-data-set>
226
+ </template>
227
+
228
+ <script lang="ts" setup>
229
+ import { UDataSet, UDataSetItem } from "@nexdom/uimed-vue/components";
230
+
231
+ const pacientes = [
232
+ { id: 1, nome: "Ana Souza", cidade: "São Paulo - SP" },
233
+ { id: 2, nome: "Bruno Lima", cidade: "Belo Horizonte - MG" },
234
+ ];
235
+ </script>
236
+ ```
237
+
238
+ ### Campos do registro
239
+
240
+ O slot padrão do `DataSetItem` apresenta os detalhes do registro abaixo do título. Para apresentar alguns dos seus campos, utilize a [tabela](./table.md) com o layout `vertical`, que exibe o nome de cada campo ao lado do seu valor.
241
+
242
+ ```vue
243
+ <template>
244
+ <u-data-set :items="pacientes" :columns="2">
245
+ <template #default="{ item }">
246
+ <u-data-set-item :title="item.nome" :subtitle="item.cidade">
247
+ <u-table
248
+ :headers="['Plano', 'Idade', 'Carteirinha']"
249
+ :items="[[item.plano, item.idade, item.carteirinha]]"
250
+ vertical
251
+ />
252
+ </u-data-set-item>
253
+ </template>
254
+ </u-data-set>
255
+ </template>
256
+
257
+ <script lang="ts" setup>
258
+ import { UDataSet, UDataSetItem, UTable } from "@nexdom/uimed-vue/components";
259
+
260
+ const pacientes = [
261
+ {
262
+ id: 1,
263
+ nome: "Ana Souza",
264
+ cidade: "São Paulo - SP",
265
+ plano: "Ouro",
266
+ idade: "34 anos",
267
+ carteirinha: "0001 2345 6789",
268
+ },
269
+ {
270
+ id: 2,
271
+ nome: "Bruno Lima",
272
+ cidade: "Belo Horizonte - MG",
273
+ plano: "Prata",
274
+ idade: "52 anos",
275
+ carteirinha: "0001 9876 5432",
276
+ },
277
+ // ...
278
+ ];
279
+ </script>
280
+ ```
281
+
282
+ ### Ações
283
+
284
+ A prop `actions` define as ações do registro, como "Editar" e "Excluir". Elas são exibidas como botões no rodapé do cartão, alinhadas entre os cartões de uma mesma linha mesmo quando os detalhes têm alturas diferentes, e aceitam as mesmas opções das [ações do agrupador de conteúdo](./section.md#acoes). Como as ações são definidas dentro do slot, cada uma pode usar o registro (`item`) diretamente.
285
+
286
+ ```vue
287
+ <template>
288
+ <u-data-set :items="contatos" :columns="2">
289
+ <template #default="{ item }">
290
+ <u-data-set-item
291
+ :title="item.nome"
292
+ :subtitle="item.email"
293
+ :actions="[
294
+ { label: 'Editar', variant: 'secondary', onClick: () => editar(item) },
295
+ { label: 'Excluir', color: 'danger', variant: 'secondary', onClick: () => excluir(item) },
296
+ ]"
297
+ >
298
+ <u-table
299
+ :headers="Object.keys(item.telefones)"
300
+ :items="[Object.values(item.telefones)]"
301
+ vertical
302
+ />
303
+ </u-data-set-item>
304
+ </template>
305
+ </u-data-set>
306
+ Última ação: {{ ultimaAcao }}
307
+ </template>
308
+
309
+ <script lang="ts" setup>
310
+ import { ref } from "vue";
311
+ import { UDataSet, UDataSetItem, UTable } from "@nexdom/uimed-vue/components";
312
+
313
+ type Contato = (typeof contatos)[number];
314
+
315
+ const ultimaAcao = ref("nenhuma");
316
+ const contatos = [
317
+ {
318
+ id: 1,
319
+ nome: "Ana Souza",
320
+ email: "ana.souza@example.com",
321
+ telefones: { Celular: "(00) 90000-0001", Residencial: "(00) 3000-0001" },
322
+ },
323
+ {
324
+ id: 2,
325
+ nome: "Bruno Lima",
326
+ email: "bruno.lima@example.com",
327
+ telefones: { Celular: "(00) 90000-0002" },
328
+ },
329
+ ];
330
+
331
+ function editar(contato: Contato) {
332
+ ultimaAcao.value = `Editar ${contato.nome}`;
333
+ }
334
+
335
+ function excluir(contato: Contato) {
336
+ ultimaAcao.value = `Excluir ${contato.nome}`;
337
+ }
338
+ </script>
339
+ ```
340
+
341
+ ### Variantes
342
+
343
+ A prop `variant` define a variação de estilo do cartão, assim como no agrupador de conteúdo: `primary` ou `secondary`. O padrão é `primary`.
344
+
345
+ ```vue
346
+ <template>
347
+ <u-data-set :items="pacientes" :columns="2">
348
+ <template #default="{ item }">
349
+ <u-data-set-item :title="item.nome" :subtitle="`Plano ${item.plano}`" variant="secondary" />
350
+ </template>
351
+ </u-data-set>
352
+ </template>
353
+
354
+ <script lang="ts" setup>
355
+ import { UDataSet, UDataSetItem } from "@nexdom/uimed-vue/components";
356
+
357
+ const pacientes = [
358
+ { id: 1, nome: "Ana Souza", plano: "Ouro" },
359
+ { id: 2, nome: "Bruno Lima", plano: "Prata" },
360
+ ];
361
+ </script>
362
+ ```
363
+
364
+ ## Playground
365
+
366
+ Experimente as combinações de props do componente.
367
+
368
+ ## Ver também
369
+
370
+ Consulte a referência de [API do UDataSet](../../api/components/data-sets/data-set.md) e da [API do UDataSetItem](../../api/components/data-sets/data-set-item.md) para a lista completa de props, slots e eventos.
@@ -0,0 +1,202 @@
1
+ # Campos de data e hora
2
+
3
+ O componente para campos de data e hora se chama `DateTimeField`.
4
+
5
+ Ao clicar no campo, um seletor é aberto para escolher a data, o horário ou ambos. O valor é exibido no formato brasileiro (`24/09/2026`, `14:30` ou `24/09/2026 14:30`), mas o `v-model` utiliza os formatos padrão dos campos nativos:
6
+
7
+ | Tipo | Formato do `v-model` | Exemplo |
8
+ | ---------- | -------------------- | ------------------ |
9
+ | `date` | `YYYY-MM-DD` | `2026-09-24` |
10
+ | `time` | `HH:mm` (24 horas) | `14:30` |
11
+ | `datetime` | `YYYY-MM-DDTHH:mm` | `2026-09-24T14:30` |
12
+
13
+ Quando não há valor, o `v-model` é uma `string` vazia (`""`).
14
+
15
+ > [!Warning]
16
+ > Deve ser utilizado no lugar do `<input>` nativo dos tipos `date`, `time` e `datetime-local`.
17
+
18
+ ## Propriedades
19
+
20
+ ### Tipos
21
+
22
+ A prop `type` define quais seletores são apresentados e o formato do valor. O padrão é `datetime`.
23
+
24
+ ```vue
25
+ <template>
26
+ <u-date-time-field v-model="dateValue" label="Data" type="date" />
27
+ <u-date-time-field v-model="timeValue" label="Horário" type="time" />
28
+ <u-date-time-field v-model="dateTimeValue" label="Data e hora" type="datetime" />
29
+ </template>
30
+
31
+ <script lang="ts" setup>
32
+ import { ref } from "vue";
33
+ import { UDateTimeField } from "@nexdom/uimed-vue/components";
34
+
35
+ const dateValue = ref("2026-09-10");
36
+ const timeValue = ref("08:00");
37
+ const dateTimeValue = ref("2026-09-10T08:00");
38
+ </script>
39
+ ```
40
+
41
+ O seletor é fechado assim que o valor estiver completo:
42
+
43
+ - `date`: ao escolher o dia;
44
+ - `time`: ao escolher os minutos;
45
+ - `datetime`: ao escolher o dia ou os minutos, desde que data e horário já estejam definidos.
46
+
47
+ > [!Tip]
48
+ > No tipo `datetime`, o `v-model` só é atualizado quando data e horário estão definidos. Ao escolher uma nova data, o horário atual é mantido. Se o seletor for fechado com apenas uma das partes escolhida, a seleção incompleta é descartada.
49
+
50
+ ### Variantes
51
+
52
+ A prop `variant` define a variação de estilo aplicada ao campo. O padrão é `primary`.
53
+
54
+ ```vue
55
+ <template>
56
+ <u-date-time-field label="Primary" variant="primary" />
57
+ <u-date-time-field label="Secondary" variant="secondary" />
58
+ </template>
59
+
60
+ <script lang="ts" setup>
61
+ import { UDateTimeField } from "@nexdom/uimed-vue/components";
62
+ </script>
63
+ ```
64
+
65
+ ### Labels, placeholders e mensagens
66
+
67
+ As props `label`, `placeholder` e `hint` funcionam da mesma forma que nos [campos de texto](./text-field.md).
68
+
69
+ ```vue
70
+ <template>
71
+ <u-date-time-field
72
+ label="Data de nascimento"
73
+ type="date"
74
+ placeholder="dd/mm/aaaa"
75
+ hint="Informe a data do documento"
76
+ />
77
+ </template>
78
+
79
+ <script lang="ts" setup>
80
+ import { UDateTimeField } from "@nexdom/uimed-vue/components";
81
+ </script>
82
+ ```
83
+
84
+ ### Limites
85
+
86
+ As props `min` e `max` recebem valores no mesmo formato do `v-model` para o `type` atual. Opções fora do intervalo não podem ser escolhidas no seletor e, se o valor estiver fora do intervalo (por exemplo, quando definido pelo código), uma mensagem de erro é exibida.
87
+
88
+ ```vue
89
+ <template>
90
+ <u-date-time-field
91
+ v-model="limitedValue"
92
+ label="Data do retorno"
93
+ type="date"
94
+ min="2026-09-10"
95
+ max="2026-09-20"
96
+ hint="Entre 10/09/2026 e 20/09/2026"
97
+ />
98
+ <u-button variant="secondary" @click="limitedValue = '2026-09-25'">Definir 25/09/2026</u-button>
99
+ </template>
100
+
101
+ <script lang="ts" setup>
102
+ import { ref } from "vue";
103
+ import { UButton, UDateTimeField } from "@nexdom/uimed-vue/components";
104
+
105
+ const limitedValue = ref("2026-09-15");
106
+ </script>
107
+ ```
108
+
109
+ > [!Tip]
110
+ > No tipo `datetime`, a data do limite restringe o calendário, e o horário do limite só restringe o relógio quando a data escolhida é a própria data do limite. Por exemplo, com `min="2026-09-10T08:00"`, os horários antes das 08:00 só ficam indisponíveis no dia 10/09/2026.
111
+
112
+ ### Obrigatório
113
+
114
+ A prop `required` impede o envio do [formulário](./form.md) enquanto o campo estiver vazio.
115
+
116
+ ```vue
117
+ <template>
118
+ <u-form>
119
+ <u-date-time-field label="Data da consulta" type="date" required />
120
+ <u-button type="submit">Enviar</u-button>
121
+ </u-form>
122
+ </template>
123
+
124
+ <script lang="ts" setup>
125
+ import { UButton, UDateTimeField, UForm } from "@nexdom/uimed-vue/components";
126
+ </script>
127
+ ```
128
+
129
+ ### Estados
130
+
131
+ #### Desabilitado
132
+
133
+ Utilize a prop `disabled` para indicar ao usuário que não há possibilidade de interação com o campo.
134
+
135
+ ```vue
136
+ <template>
137
+ <u-date-time-field label="Desabilitado" disabled />
138
+ </template>
139
+
140
+ <script lang="ts" setup>
141
+ import { UDateTimeField } from "@nexdom/uimed-vue/components";
142
+ </script>
143
+ ```
144
+
145
+ #### Somente leitura
146
+
147
+ Utilize a prop `readonly` para evitar que o valor presente em um campo seja alterado. O seletor não é aberto.
148
+
149
+ ```vue
150
+ <template>
151
+ <u-date-time-field model-value="2026-09-24T14:30" label="Somente leitura" readonly />
152
+ </template>
153
+
154
+ <script lang="ts" setup>
155
+ import { UDateTimeField } from "@nexdom/uimed-vue/components";
156
+ </script>
157
+ ```
158
+
159
+ #### Carregamento
160
+
161
+ 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.
162
+
163
+ ```vue
164
+ <template>
165
+ <u-date-time-field label="Carregando" loading />
166
+ </template>
167
+
168
+ <script lang="ts" setup>
169
+ import { UDateTimeField } from "@nexdom/uimed-vue/components";
170
+ </script>
171
+ ```
172
+
173
+ #### Limpável
174
+
175
+ A prop `clearable` exibe um recurso para limpar o campo, que altera o `v-model` para uma `string` vazia. O recurso não é exibido enquanto o campo estiver somente leitura.
176
+
177
+ ```vue
178
+ <template>
179
+ <u-date-time-field v-model="clearableValue" label="Limpável" type="date" clearable />
180
+ </template>
181
+
182
+ <script lang="ts" setup>
183
+ import { ref } from "vue";
184
+ import { UDateTimeField } from "@nexdom/uimed-vue/components";
185
+
186
+ const clearableValue = ref("2026-09-24");
187
+ </script>
188
+ ```
189
+
190
+ ## Eventos
191
+
192
+ ### Atualização
193
+
194
+ O evento `update:modelValue` será emitido toda vez que o usuário escolher um valor completo ou limpar o campo, repassando o novo valor como uma `string`.
195
+
196
+ ## Playground
197
+
198
+ Experimente as combinações de props do componente.
199
+
200
+ ## Ver também
201
+
202
+ Consulte a referência de [API do UDateTimeField](../../api/components/date-time-field.md) para a lista completa de props, slots e eventos.
@@ -0,0 +1,76 @@
1
+ # Conteúdo Expansível
2
+
3
+ O componente padrão para exibir conteúdo que pode ser expandido e recolhido se chama `Details`.
4
+
5
+ > [!Warning]
6
+ > Deve ser utilizado no lugar do `<details>` nativo.
7
+
8
+ O conteúdo inicia recolhido e é exibido ao clicar no título.
9
+
10
+ ## Propriedades
11
+
12
+ ### Variantes
13
+
14
+ A prop `variant` define a variação de estilo aplicada ao conteúdo expansível. O padrão é `primary`.
15
+
16
+ ```vue
17
+ <template>
18
+ <u-details variant="primary" title="Primary">Conteúdo expansível primary</u-details>
19
+ <u-details variant="secondary" title="Secondary">Conteúdo expansível secondary</u-details>
20
+ </template>
21
+
22
+ <script lang="ts" setup>
23
+ import { UDetails } from "@nexdom/uimed-vue/components";
24
+ </script>
25
+ ```
26
+
27
+ ### Título
28
+
29
+ A prop `title` define o texto exibido no cabeçalho. Ao clicar nele, o conteúdo é expandido ou recolhido.
30
+
31
+ ```vue
32
+ <template>
33
+ <u-details title="Mais informações">Conteúdo exibido ao expandir</u-details>
34
+ </template>
35
+
36
+ <script lang="ts" setup>
37
+ import { UDetails } from "@nexdom/uimed-vue/components";
38
+ </script>
39
+ ```
40
+
41
+ ### Carregamento
42
+
43
+ A prop `loading` exibe um skeleton loader no lugar do conteúdo expansível enquanto uma operação está em andamento.
44
+
45
+ ```vue
46
+ <template>
47
+ <u-details title="Carregando..." loading>Conteúdo expansível</u-details>
48
+ </template>
49
+
50
+ <script lang="ts" setup>
51
+ import { UDetails } from "@nexdom/uimed-vue/components";
52
+ </script>
53
+ ```
54
+
55
+ ### Vários conteúdos expansíveis
56
+
57
+ Cada `Details` é independente: vários podem ficar abertos ao mesmo tempo.
58
+
59
+ ```vue
60
+ <template>
61
+ <u-details title="Primeiro">Conteúdo do primeiro</u-details>
62
+ <u-details title="Segundo">Conteúdo do segundo</u-details>
63
+ </template>
64
+
65
+ <script lang="ts" setup>
66
+ import { UDetails } from "@nexdom/uimed-vue/components";
67
+ </script>
68
+ ```
69
+
70
+ ## Playground
71
+
72
+ Experimente as combinações de props do componente.
73
+
74
+ ## Ver também
75
+
76
+ Consulte a referência de [API do UDetails](../../api/components/details.md) para a lista completa de props e slots.