@meistrari/tela-build 1.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 (295) hide show
  1. package/README.md +75 -0
  2. package/app.config.ts +73 -0
  3. package/components/tela/animated/animated-calculating-number.vue +16 -0
  4. package/components/tela/animated/animated-number.mdx +248 -0
  5. package/components/tela/animated/animated-number.stories.ts +52 -0
  6. package/components/tela/animated/animated-number.vue +23 -0
  7. package/components/tela/animated/animated-text.vue +124 -0
  8. package/components/tela/animated/animated-value.vue +68 -0
  9. package/components/tela/avatar/avatar.mdx +117 -0
  10. package/components/tela/avatar/avatar.stories.ts +62 -0
  11. package/components/tela/avatar/avatar.vue +71 -0
  12. package/components/tela/avatar/group/avatar-group.stories.ts +78 -0
  13. package/components/tela/avatar/group/avatar-group.vue +46 -0
  14. package/components/tela/badge/badge.mdx +154 -0
  15. package/components/tela/badge/badge.stories.ts +82 -0
  16. package/components/tela/badge/badge.vue +41 -0
  17. package/components/tela/button/button.mdx +155 -0
  18. package/components/tela/button/button.stories.ts +202 -0
  19. package/components/tela/button/button.vue +107 -0
  20. package/components/tela/card.vue +30 -0
  21. package/components/tela/chart/chart-bar.vue +58 -0
  22. package/components/tela/chat/chat.mdx +268 -0
  23. package/components/tela/chat/chat.stories.ts +253 -0
  24. package/components/tela/chat/command/index.vue +41 -0
  25. package/components/tela/chat/command/mention/index.vue +138 -0
  26. package/components/tela/chat/index.vue +112 -0
  27. package/components/tela/chat/pure-text-input/chat-text-input.vue +190 -0
  28. package/components/tela/chat/text-input/chat-text-input.stories.ts +128 -0
  29. package/components/tela/chat/text-input/index.vue +217 -0
  30. package/components/tela/chat/text-message/chat-text-message.stories.ts +138 -0
  31. package/components/tela/chat/text-message/index.vue +355 -0
  32. package/components/tela/chat/types.ts +19 -0
  33. package/components/tela/checkbox/checkbox-card.vue +30 -0
  34. package/components/tela/checkbox/checkbox.mdx +164 -0
  35. package/components/tela/checkbox/checkbox.stories.ts +104 -0
  36. package/components/tela/checkbox/checkbox.vue +43 -0
  37. package/components/tela/collapsible/Collapsible.vue +15 -0
  38. package/components/tela/collapsible/CollapsibleContent.vue +59 -0
  39. package/components/tela/collapsible/CollapsibleTrigger.vue +12 -0
  40. package/components/tela/collapsible/collapsible.mdx +157 -0
  41. package/components/tela/collapsible-section/collapsible-section.mdx +180 -0
  42. package/components/tela/collapsible-section/collapsible-section.stories.ts +53 -0
  43. package/components/tela/collapsible-section/collapsible-section.vue +51 -0
  44. package/components/tela/collapsible-section-with-actions.vue +98 -0
  45. package/components/tela/combobox/combobox-anchor.vue +24 -0
  46. package/components/tela/combobox/combobox-empty.vue +19 -0
  47. package/components/tela/combobox/combobox-group.vue +24 -0
  48. package/components/tela/combobox/combobox-indicator.vue +22 -0
  49. package/components/tela/combobox/combobox-input.vue +31 -0
  50. package/components/tela/combobox/combobox-item.vue +28 -0
  51. package/components/tela/combobox/combobox-label.vue +24 -0
  52. package/components/tela/combobox/combobox-list.vue +90 -0
  53. package/components/tela/combobox/combobox-module-selector.vue +366 -0
  54. package/components/tela/combobox/combobox-root.vue +15 -0
  55. package/components/tela/combobox/combobox-trigger.vue +12 -0
  56. package/components/tela/combobox/combobox.mdx +285 -0
  57. package/components/tela/combobox/combobox.stories.ts +232 -0
  58. package/components/tela/combobox/combobox.vue +497 -0
  59. package/components/tela/command/command-dialog.vue +22 -0
  60. package/components/tela/command/command-empty.vue +25 -0
  61. package/components/tela/command/command-group.vue +46 -0
  62. package/components/tela/command/command-input.vue +38 -0
  63. package/components/tela/command/command-item.vue +78 -0
  64. package/components/tela/command/command-list.vue +78 -0
  65. package/components/tela/command/command-separator.vue +23 -0
  66. package/components/tela/command/command-shortcut.vue +13 -0
  67. package/components/tela/command/command.vue +88 -0
  68. package/components/tela/command/dialog-base.vue +15 -0
  69. package/components/tela/command/dialog-content.vue +50 -0
  70. package/components/tela/command/utils.ts +15 -0
  71. package/components/tela/complex-table/complex-table-cell.stories.ts +145 -0
  72. package/components/tela/complex-table/complex-table-cell.vue +45 -0
  73. package/components/tela/complex-table/complex-table-header-cell.stories.ts +103 -0
  74. package/components/tela/complex-table/complex-table-header-cell.vue +48 -0
  75. package/components/tela/complex-table/complex-table-header.stories.ts +89 -0
  76. package/components/tela/complex-table/complex-table-header.vue +70 -0
  77. package/components/tela/complex-table/complex-table-row.vue +199 -0
  78. package/components/tela/complex-table/complex-table-virtualized.vue +326 -0
  79. package/components/tela/complex-table/complex-table.stories.ts +358 -0
  80. package/components/tela/complex-table/complex-table.vue +237 -0
  81. package/components/tela/complex-table/composables/table-common.ts +93 -0
  82. package/components/tela/complex-table/composables/table-selection.ts +87 -0
  83. package/components/tela/complex-table/composables/virtual-scroll.ts +252 -0
  84. package/components/tela/complex-table/styles/table-shared.css +170 -0
  85. package/components/tela/complex-table/types.ts +63 -0
  86. package/components/tela/complex-table/utils.ts +35 -0
  87. package/components/tela/confirm-button/confirm-button.vue +137 -0
  88. package/components/tela/confirmation-modal/confirmation-modal.vue +72 -0
  89. package/components/tela/copy-button.vue +86 -0
  90. package/components/tela/date-range-picker.vue +221 -0
  91. package/components/tela/dialog/dialog.mdx +170 -0
  92. package/components/tela/dialog/dialog.vue +182 -0
  93. package/components/tela/disabled-area.vue +16 -0
  94. package/components/tela/disclaimer/disclaimer.mdx +238 -0
  95. package/components/tela/disclaimer/disclaimer.stories.ts +196 -0
  96. package/components/tela/disclaimer/disclaimer.vue +125 -0
  97. package/components/tela/dropdown-menu/DropdownMenu.vue +121 -0
  98. package/components/tela/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
  99. package/components/tela/dropdown-menu/DropdownMenuContent.vue +75 -0
  100. package/components/tela/dropdown-menu/DropdownMenuGroup.vue +12 -0
  101. package/components/tela/dropdown-menu/DropdownMenuItem.vue +137 -0
  102. package/components/tela/dropdown-menu/DropdownMenuLabel.vue +26 -0
  103. package/components/tela/dropdown-menu/DropdownMenuRadioGroup.vue +18 -0
  104. package/components/tela/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  105. package/components/tela/dropdown-menu/DropdownMenuRoot.vue +15 -0
  106. package/components/tela/dropdown-menu/DropdownMenuSeparator.vue +21 -0
  107. package/components/tela/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  108. package/components/tela/dropdown-menu/DropdownMenuSub.vue +18 -0
  109. package/components/tela/dropdown-menu/DropdownMenuSubContent.vue +30 -0
  110. package/components/tela/dropdown-menu/DropdownMenuSubTrigger.vue +35 -0
  111. package/components/tela/dropdown-menu/DropdownMenuTrigger.vue +14 -0
  112. package/components/tela/dropdown-menu/dropdown-menu.mdx +265 -0
  113. package/components/tela/dropdown-menu/dropdown-menu.stories.ts +156 -0
  114. package/components/tela/expandable-input.vue +96 -0
  115. package/components/tela/file-drop.vue +37 -0
  116. package/components/tela/file-upload/file-upload.mdx +189 -0
  117. package/components/tela/file-upload/file-upload.stories.ts +48 -0
  118. package/components/tela/file-upload/file-upload.vue +205 -0
  119. package/components/tela/filters/checkbox-filter.stories.ts +218 -0
  120. package/components/tela/filters/checkbox-filter.vue +165 -0
  121. package/components/tela/filters/date-filter.stories.ts +258 -0
  122. package/components/tela/filters/date-filter.vue +200 -0
  123. package/components/tela/filters/user-filter.stories.ts +344 -0
  124. package/components/tela/filters/user-filter.vue +271 -0
  125. package/components/tela/hover-card/hover-card.mdx +221 -0
  126. package/components/tela/hover-card/hover-card.stories.ts +87 -0
  127. package/components/tela/hover-card/hover-card.vue +61 -0
  128. package/components/tela/icon/custom.vue +319 -0
  129. package/components/tela/icon/spinner.vue +12 -0
  130. package/components/tela/icon-button/icon-button.vue +114 -0
  131. package/components/tela/icon.vue +37 -0
  132. package/components/tela/initials.vue +28 -0
  133. package/components/tela/inline-input.vue +77 -0
  134. package/components/tela/input/input.mdx +182 -0
  135. package/components/tela/input/input.stories.ts +153 -0
  136. package/components/tela/input/tela-input.vue +240 -0
  137. package/components/tela/kbd/kbd-return.vue +6 -0
  138. package/components/tela/kbd/kbd.mdx +238 -0
  139. package/components/tela/kbd/kbd.vue +18 -0
  140. package/components/tela/label/label.mdx +121 -0
  141. package/components/tela/label/label.stories.ts +37 -0
  142. package/components/tela/label/label.vue +25 -0
  143. package/components/tela/link-decoration/link-decoration.vue +19 -0
  144. package/components/tela/live-label.vue +32 -0
  145. package/components/tela/long-press-button.vue +98 -0
  146. package/components/tela/menubar/menubar-content.vue +77 -0
  147. package/components/tela/menubar/menubar-item.vue +32 -0
  148. package/components/tela/menubar/menubar-label.vue +14 -0
  149. package/components/tela/menubar/menubar-menu.vue +12 -0
  150. package/components/tela/menubar/menubar-root.vue +30 -0
  151. package/components/tela/menubar/menubar-separator.vue +17 -0
  152. package/components/tela/menubar/menubar-shortcut.vue +14 -0
  153. package/components/tela/menubar/menubar-sub-content.vue +36 -0
  154. package/components/tela/menubar/menubar-sub-trigger.vue +28 -0
  155. package/components/tela/menubar/menubar-sub.vue +20 -0
  156. package/components/tela/menubar/menubar-trigger.vue +27 -0
  157. package/components/tela/menubar/menubar.vue +298 -0
  158. package/components/tela/modal/modal.mdx +145 -0
  159. package/components/tela/modal/modal.vue +242 -0
  160. package/components/tela/multiple-select/multiple-select.mdx +274 -0
  161. package/components/tela/multiple-select/multiple-select.stories.ts +325 -0
  162. package/components/tela/multiple-select/multiple-select.vue +666 -0
  163. package/components/tela/pane.vue +110 -0
  164. package/components/tela/popover/popover-content.vue +48 -0
  165. package/components/tela/popover/popover-trigger.vue +12 -0
  166. package/components/tela/popover/popover.mdx +239 -0
  167. package/components/tela/popover/popover.stories.ts +150 -0
  168. package/components/tela/popover/popover.vue +15 -0
  169. package/components/tela/popover-list/popover-list-nested.vue +104 -0
  170. package/components/tela/popover-list/popover-list.stories.ts +330 -0
  171. package/components/tela/popover-list/popover-list.vue +191 -0
  172. package/components/tela/radio-button.vue +66 -0
  173. package/components/tela/radio-group/radio-group-item.vue +40 -0
  174. package/components/tela/radio-group/radio-group-root.vue +26 -0
  175. package/components/tela/radio-group/radio-group.mdx +78 -0
  176. package/components/tela/radio-group/radio-group.stories.ts +106 -0
  177. package/components/tela/radio-group/radio-group.vue +23 -0
  178. package/components/tela/range-calendar.stories.ts +110 -0
  179. package/components/tela/range-calendar.vue +109 -0
  180. package/components/tela/scroll-area/scroll-area.mdx +183 -0
  181. package/components/tela/scroll-area/scroll-area.vue +30 -0
  182. package/components/tela/scroll-area/scroll-bar.vue +31 -0
  183. package/components/tela/segment-toggle.stories.ts +114 -0
  184. package/components/tela/segment-toggle.vue +66 -0
  185. package/components/tela/select-menu/select-menu-content.vue +106 -0
  186. package/components/tela/select-menu/select-menu-down-button.vue +20 -0
  187. package/components/tela/select-menu/select-menu-group.vue +16 -0
  188. package/components/tela/select-menu/select-menu-item.vue +40 -0
  189. package/components/tela/select-menu/select-menu-root.vue +15 -0
  190. package/components/tela/select-menu/select-menu-trigger.vue +34 -0
  191. package/components/tela/select-menu/select-menu-up-button.vue +20 -0
  192. package/components/tela/select-menu/select-menu-value.vue +12 -0
  193. package/components/tela/select-menu/select-menu.mdx +221 -0
  194. package/components/tela/select-menu/select-menu.stories.ts +91 -0
  195. package/components/tela/select-menu/select-menu.vue +165 -0
  196. package/components/tela/selector/selector.vue +47 -0
  197. package/components/tela/sheet/sheet-close.vue +12 -0
  198. package/components/tela/sheet/sheet-content.vue +57 -0
  199. package/components/tela/sheet/sheet-description.vue +23 -0
  200. package/components/tela/sheet/sheet-footer.vue +18 -0
  201. package/components/tela/sheet/sheet-header.vue +15 -0
  202. package/components/tela/sheet/sheet-root.vue +18 -0
  203. package/components/tela/sheet/sheet-title.vue +23 -0
  204. package/components/tela/sheet/sheet-trigger.vue +12 -0
  205. package/components/tela/sheet/sheet.client.vue +150 -0
  206. package/components/tela/sheet/sheet.mdx +176 -0
  207. package/components/tela/sheet/sheet.stories.ts +201 -0
  208. package/components/tela/sheet/variants.ts +22 -0
  209. package/components/tela/side-sheet/side-sheet.mdx +131 -0
  210. package/components/tela/side-sheet/side-sheet.stories.ts +134 -0
  211. package/components/tela/side-sheet/side-sheet.vue +106 -0
  212. package/components/tela/skeleton/skeleton.mdx +165 -0
  213. package/components/tela/skeleton/skeleton.stories.ts +35 -0
  214. package/components/tela/skeleton/skeleton.vue +45 -0
  215. package/components/tela/skeleton-icon.vue +24 -0
  216. package/components/tela/span.vue +24 -0
  217. package/components/tela/star-button.vue +70 -0
  218. package/components/tela/status/status-lean.vue +30 -0
  219. package/components/tela/status/status.mdx +187 -0
  220. package/components/tela/status/status.stories.ts +160 -0
  221. package/components/tela/status/status.vue +420 -0
  222. package/components/tela/status-bar/status-bar.mdx +178 -0
  223. package/components/tela/status-bar/status-bar.stories.ts +64 -0
  224. package/components/tela/status-bar/status-bar.vue +56 -0
  225. package/components/tela/status-bar/types.ts +5 -0
  226. package/components/tela/switch/switch.mdx +118 -0
  227. package/components/tela/switch/switch.stories.ts +80 -0
  228. package/components/tela/switch/switch.vue +56 -0
  229. package/components/tela/table/table-body.vue +13 -0
  230. package/components/tela/table/table-caption.vue +13 -0
  231. package/components/tela/table/table-cell.vue +20 -0
  232. package/components/tela/table/table-empty.vue +37 -0
  233. package/components/tela/table/table-footer.vue +13 -0
  234. package/components/tela/table/table-head.vue +13 -0
  235. package/components/tela/table/table-header.vue +13 -0
  236. package/components/tela/table/table-row.vue +13 -0
  237. package/components/tela/table/table.mdx +230 -0
  238. package/components/tela/table/table.stories.ts +384 -0
  239. package/components/tela/table/table.vue +15 -0
  240. package/components/tela/tabs/tabs-content.vue +20 -0
  241. package/components/tela/tabs/tabs-indicator.vue +22 -0
  242. package/components/tela/tabs/tabs-list.vue +23 -0
  243. package/components/tela/tabs/tabs-root.vue +15 -0
  244. package/components/tela/tabs/tabs-trigger.vue +27 -0
  245. package/components/tela/tabs/tabs.mdx +138 -0
  246. package/components/tela/tabs/tabs.stories.ts +72 -0
  247. package/components/tela/tabs/tabs.vue +61 -0
  248. package/components/tela/tags/tags-select.mdx +318 -0
  249. package/components/tela/tags/tags-select.stories.ts +47 -0
  250. package/components/tela/tags/tags-select.vue +637 -0
  251. package/components/tela/tags/tags.mdx +151 -0
  252. package/components/tela/tags/tags.stories.ts +118 -0
  253. package/components/tela/tags/tags.vue +112 -0
  254. package/components/tela/textarea/textarea.mdx +102 -0
  255. package/components/tela/textarea/textarea.stories.ts +50 -0
  256. package/components/tela/textarea/textarea.vue +34 -0
  257. package/components/tela/toggle-group.vue +91 -0
  258. package/components/tela/tooltip/tooltip-content.vue +45 -0
  259. package/components/tela/tooltip/tooltip-provider.vue +12 -0
  260. package/components/tela/tooltip/tooltip-root.vue +15 -0
  261. package/components/tela/tooltip/tooltip-trigger.vue +12 -0
  262. package/components/tela/tooltip/tooltip.mdx +196 -0
  263. package/components/tela/tooltip/tooltip.stories.ts +200 -0
  264. package/components/tela/tooltip/tooltip.vue +91 -0
  265. package/components/tela/tooltip-group/tooltip-group-trigger.vue +92 -0
  266. package/components/tela/tooltip-group/tooltip-group.mdx +236 -0
  267. package/components/tela/tooltip-group/tooltip-group.stories.ts +465 -0
  268. package/components/tela/tooltip-group/tooltip-group.vue +35 -0
  269. package/components/tela/transparent-input.vue +151 -0
  270. package/components/tela/variable-icon.vue +28 -0
  271. package/components/tela/variable-input.vue +77 -0
  272. package/components/tela/wide-button/wide-button.vue +40 -0
  273. package/components.json +18 -0
  274. package/composables/status-toast.ts +67 -0
  275. package/css/reset.css +386 -0
  276. package/css/text.css +22 -0
  277. package/lib/doc-generator.ts +903 -0
  278. package/lib/extractors/volar-extract.ts +186 -0
  279. package/lib/type-resolver.ts +402 -0
  280. package/lib/utils.ts +6 -0
  281. package/modules/tela-build-docs/index.ts +139 -0
  282. package/nuxt.config.ts +80 -0
  283. package/package.json +84 -0
  284. package/plugins/test-id.ts +7 -0
  285. package/tsconfig.json +7 -0
  286. package/types/custom-icon.ts +1 -0
  287. package/types/index.ts +2 -0
  288. package/types/status.ts +1 -0
  289. package/unocss.config.ts +89 -0
  290. package/utils/component-utils.ts +30 -0
  291. package/utils/design-tokens.ts +431 -0
  292. package/utils/fold.ts +8 -0
  293. package/utils/select-menu.ts +10 -0
  294. package/utils/status.ts +1 -0
  295. package/utils/without-keys.ts +34 -0
@@ -0,0 +1,221 @@
1
+ <script setup lang="ts">
2
+ import { Icon } from '@iconify/vue'
3
+ import { getLocalTimeZone } from '@internationalized/date'
4
+ import { endOfDay, format, startOfDay } from 'date-fns'
5
+ import {
6
+ DateRangePickerArrow,
7
+ DateRangePickerCalendar,
8
+ DateRangePickerCell,
9
+ DateRangePickerCellTrigger,
10
+ DateRangePickerContent,
11
+ DateRangePickerField,
12
+ DateRangePickerGrid,
13
+ DateRangePickerGridBody,
14
+ DateRangePickerGridHead,
15
+ DateRangePickerGridRow,
16
+ DateRangePickerHeadCell,
17
+ DateRangePickerHeader,
18
+ DateRangePickerHeading,
19
+ DateRangePickerNext,
20
+ DateRangePickerPrev,
21
+ DateRangePickerRoot,
22
+ DateRangePickerTrigger,
23
+
24
+ } from 'radix-vue'
25
+ import type { DateRange } from 'radix-vue'
26
+ import { computed } from 'vue'
27
+
28
+ const props = defineProps<{
29
+ label?: string
30
+ disableClear?: boolean
31
+ open?: boolean
32
+ hasClear?: boolean
33
+ }>()
34
+
35
+ const emit = defineEmits<{
36
+ (e: 'update:model-value', value: DateRange): void
37
+ (e: 'clear'): void
38
+ (e: 'update:open', value: boolean): void
39
+ }>()
40
+
41
+ const model = defineModel<DateRange>({ required: true })
42
+ const startDate = computed(() => {
43
+ if (model.value && model.value.start) {
44
+ return startOfDay(new Date(model.value.start.toDate(getLocalTimeZone()).toISOString()))
45
+ }
46
+ return undefined
47
+ })
48
+
49
+ const endDate = computed(() => {
50
+ if (model.value && model.value.end) {
51
+ return endOfDay(new Date(model.value.end.toDate(getLocalTimeZone()).toISOString()))
52
+ }
53
+ return undefined
54
+ })
55
+
56
+ const defaultLabel = computed(() => {
57
+ return `${startDate.value ? format(startDate.value, 'dd/MM/yyyy') : '--/--/----'} - ${endDate.value ? format(endDate.value, 'dd/MM/yyyy') : '--/--/----'}`
58
+ })
59
+ </script>
60
+
61
+ <template>
62
+ <div class="flex flex-col gap-2">
63
+ <DateRangePickerRoot
64
+ id="date-field"
65
+ :default-value="model"
66
+ :open="props.open"
67
+ @update:open="emit('update:open', $event)"
68
+ @update:model-value="emit('update:model-value', $event)"
69
+ >
70
+ <DateRangePickerTrigger>
71
+ <DateRangePickerField
72
+ bg-white
73
+ rounded-8px
74
+ select-none
75
+ border="0.5px solid gray-300"
76
+ flex="~ gap-6px"
77
+ h-32px
78
+ py-7px
79
+ px-14px
80
+ items-center
81
+ text-gray-200
82
+ hover:bg-gray-50
83
+ class="data-[invalid]:border-red-500"
84
+ >
85
+ <TelaIcon name="i-ph-calendar-blank-bold" size="sm" />
86
+ <span
87
+ body-12-semibold
88
+ text-gray-900
89
+ text-nowrap
90
+ >
91
+ {{ props.label || defaultLabel }}
92
+ </span>
93
+ <div
94
+ v-if="hasClear"
95
+ cursor-pointer
96
+ hover:bg-gray-200
97
+ rounded-full
98
+ p-2px
99
+ @click="!props.disableClear && emit('clear')"
100
+ >
101
+ <TelaIcon
102
+ :disabled="props.disableClear"
103
+ name="i-ph-x"
104
+ size="sm"
105
+ />
106
+ </div>
107
+ </DateRangePickerField>
108
+ </DateRangePickerTrigger>
109
+
110
+ <DateRangePickerContent
111
+ :side-offset="4"
112
+ z-60
113
+ rounded-xl
114
+ bg-white
115
+ shadow-lg
116
+ class="will-change-[transform,opacity] data-[state=open]:data-[side=top]:animate-slideDownAndFade data-[state=open]:data-[side=right]:animate-slideLeftAndFade data-[state=open]:data-[side=bottom]:animate-slideUpAndFade data-[state=open]:data-[side=left]:animate-slideRightAndFade"
117
+ >
118
+ <DateRangePickerArrow fill-white />
119
+ <DateRangePickerCalendar
120
+ v-slot="{ weekDays, grid }"
121
+ class="p-4"
122
+ >
123
+ <DateRangePickerHeader flex="~ items-center justify-between">
124
+ <DateRangePickerPrev
125
+ flex="~ items-center justify-center"
126
+ cursor-pointer
127
+ text-black
128
+ rounded-9px
129
+ bg-transparent
130
+ w-8 h-8
131
+ hover:bg-gray-200
132
+ class="active:scale-98 active:transition-all focus:shadow-[0_0_0_2px] focus:shadow-black"
133
+ >
134
+ <Icon
135
+ icon="radix-icons:chevron-left"
136
+ w-6 h-6
137
+ />
138
+ </DateRangePickerPrev>
139
+
140
+ <DateRangePickerHeading body-14-semibold text-black />
141
+ <DateRangePickerNext
142
+ flex="~ items-center justify-center"
143
+ cursor-pointer
144
+ text-black
145
+ rounded-9px
146
+ bg-transparent
147
+ w-8 h-8
148
+ hover:bg-gray-200
149
+ class="active:scale-98 active:transition-all focus:shadow-[0_0_0_2px] focus:shadow-black"
150
+ >
151
+ <Icon
152
+ icon="radix-icons:chevron-right"
153
+ w-6 h-6
154
+ />
155
+ </DateRangePickerNext>
156
+ </DateRangePickerHeader>
157
+ <div
158
+ flex="~ col"
159
+ space-y-4
160
+ pt-4
161
+ sm:flex-row
162
+ sm:space-x-4
163
+ sm:space-y-0
164
+ >
165
+ <DateRangePickerGrid
166
+ v-for="month in grid"
167
+ :key="month.value.toString()"
168
+ w-full
169
+ border-collapse
170
+ select-none
171
+ space-y-1
172
+ >
173
+ <DateRangePickerGridHead>
174
+ <DateRangePickerGridRow w-full flex="~ justify-between" mb-1>
175
+ <DateRangePickerHeadCell
176
+ v-for="day in weekDays"
177
+ :key="day"
178
+ w-8
179
+ rounded-md
180
+ body-12-semibold
181
+ text-black
182
+ >
183
+ {{ day }}
184
+ </DateRangePickerHeadCell>
185
+ </DateRangePickerGridRow>
186
+ </DateRangePickerGridHead>
187
+ <DateRangePickerGridBody>
188
+ <DateRangePickerGridRow
189
+ v-for="(weekDates, index) in month.rows"
190
+ :key="`weekDate-${index}`"
191
+ flex="~"
192
+ w-full
193
+ >
194
+ <DateRangePickerCell
195
+ v-for="weekDate in weekDates"
196
+ :key="weekDate.toString()"
197
+ :date="weekDate"
198
+ >
199
+ <DateRangePickerCellTrigger
200
+ :day="weekDate"
201
+ :month="month.value"
202
+ relative
203
+ flex="~ items-center justify-center"
204
+ rounded-full
205
+ whitespace-nowrap
206
+ body-12-semibold
207
+ text-black
208
+ w-8 h-8
209
+ outline-none
210
+ class=" hover:bg-white hover:shadow-[#2563eb] hover:shadow-[0_0_0_2px] data-[outside-view]:text-black/30 data-[selected]:!bg-blue-200 data-[selected]:text-[#1e3a8a]! hover:bg-blue-200 data-[highlighted]:bg-blue-200 data-[highlighted]:text-[#1e3a8a]! data-[unavailable]:pointer-events-none data-[unavailable]:text-black/30 data-[unavailable]:line-through data-[today]:text-[#1e3a8a]! data-[today]:underline data-[today]:underline-offset-4"
211
+ />
212
+ </DateRangePickerCell>
213
+ </DateRangePickerGridRow>
214
+ </DateRangePickerGridBody>
215
+ </DateRangePickerGrid>
216
+ </div>
217
+ </DateRangePickerCalendar>
218
+ </DateRangePickerContent>
219
+ </DateRangePickerRoot>
220
+ </div>
221
+ </template>
@@ -0,0 +1,170 @@
1
+ import { Meta, ArgTypes } from '@storybook/blocks';
2
+
3
+ <Meta title="Layout/Dialog" />
4
+
5
+ # TelaDialog
6
+
7
+ A dialog component for displaying important messages, confirmations, or forms that require user interaction. Built on reka-ui primitives for accessibility.
8
+
9
+ ## Props
10
+
11
+ <ArgTypes />
12
+
13
+ ```typescript
14
+ type DialogProps = {
15
+ open?: boolean
16
+ defaultOpen?: boolean
17
+ }
18
+ ```
19
+
20
+ ## Examples
21
+
22
+ ### Basic Usage
23
+
24
+ ```vue
25
+ <script setup>
26
+ import { ref } from 'vue'
27
+
28
+ const isOpen = ref(false)
29
+ </script>
30
+
31
+ <template>
32
+ <TelaDialogRoot v-model:open="isOpen">
33
+ <TelaDialogTrigger as-child>
34
+ <TelaButton>Open Dialog</TelaButton>
35
+ </TelaDialogTrigger>
36
+
37
+ <TelaDialogContent>
38
+ <TelaDialogHeader>
39
+ <TelaDialogTitle>Dialog Title</TelaDialogTitle>
40
+ <TelaDialogDescription>
41
+ Dialog description text goes here
42
+ </TelaDialogDescription>
43
+ </TelaDialogHeader>
44
+
45
+ <div class="py-4">
46
+ <p>Dialog content</p>
47
+ </div>
48
+
49
+ <TelaDialogFooter>
50
+ <TelaButton variant="secondary" @click="isOpen = false">
51
+ Cancel
52
+ </TelaButton>
53
+ <TelaButton variant="primary" @click="confirm">
54
+ Confirm
55
+ </TelaButton>
56
+ </TelaDialogFooter>
57
+ </TelaDialogContent>
58
+ </TelaDialogRoot>
59
+ </template>
60
+ ```
61
+
62
+ ### Confirmation Dialog
63
+
64
+ ```vue
65
+ <TelaDialogRoot v-model:open="isOpen">
66
+ <TelaDialogTrigger as-child>
67
+ <TelaButton variant="danger">Delete</TelaButton>
68
+ </TelaDialogTrigger>
69
+
70
+ <TelaDialogContent>
71
+ <TelaDialogHeader>
72
+ <TelaDialogTitle>Are you sure?</TelaDialogTitle>
73
+ <TelaDialogDescription>
74
+ This action cannot be undone.
75
+ </TelaDialogDescription>
76
+ </TelaDialogHeader>
77
+
78
+ <TelaDialogFooter>
79
+ <TelaButton variant="secondary" @click="isOpen = false">
80
+ Cancel
81
+ </TelaButton>
82
+ <TelaButton variant="danger" @click="deleteItem">
83
+ Delete
84
+ </TelaButton>
85
+ </TelaDialogFooter>
86
+ </TelaDialogContent>
87
+ </TelaDialogRoot>
88
+ ```
89
+
90
+ ### Form Dialog
91
+
92
+ ```vue
93
+ <TelaDialogRoot v-model:open="isOpen">
94
+ <TelaDialogTrigger as-child>
95
+ <TelaButton>Add User</TelaButton>
96
+ </TelaDialogTrigger>
97
+
98
+ <TelaDialogContent>
99
+ <TelaDialogHeader>
100
+ <TelaDialogTitle>Add New User</TelaDialogTitle>
101
+ <TelaDialogDescription>
102
+ Enter user information below
103
+ </TelaDialogDescription>
104
+ </TelaDialogHeader>
105
+
106
+ <form @submit.prevent="onSubmit">
107
+ <TelaInput label="Name" v-model="name" />
108
+ <TelaInput label="Email" v-model="email" type="email" />
109
+
110
+ <TelaDialogFooter>
111
+ <TelaButton type="button" variant="secondary" @click="isOpen = false">
112
+ Cancel
113
+ </TelaButton>
114
+ <TelaButton type="submit" variant="primary">
115
+ Add User
116
+ </TelaButton>
117
+ </TelaDialogFooter>
118
+ </form>
119
+ </TelaDialogContent>
120
+ </TelaDialogRoot>
121
+ ```
122
+
123
+ ### With Close Button
124
+
125
+ ```vue
126
+ <TelaDialogContent>
127
+ <TelaDialogClose class="absolute right-4 top-4">
128
+ <TelaIcon name="i-ph-x" />
129
+ </TelaDialogClose>
130
+
131
+ <TelaDialogHeader>
132
+ <TelaDialogTitle>Dialog with Close</TelaDialogTitle>
133
+ </TelaDialogHeader>
134
+
135
+ <div>Content...</div>
136
+ </TelaDialogContent>
137
+ ```
138
+
139
+ ## Components
140
+
141
+ The Dialog system consists of these sub-components:
142
+
143
+ - `TelaDialogRoot` - Root dialog container
144
+ - `TelaDialogTrigger` - Button that opens the dialog
145
+ - `TelaDialogContent` - Main content container
146
+ - `TelaDialogHeader` - Header section
147
+ - `TelaDialogTitle` - Dialog title
148
+ - `TelaDialogDescription` - Dialog description/subtitle
149
+ - `TelaDialogFooter` - Footer for actions
150
+ - `TelaDialogClose` - Close button
151
+ - `TelaDialogOverlay` - Background overlay
152
+
153
+ ## Features
154
+
155
+ - **Accessible**: Built on reka-ui with proper ARIA attributes
156
+ - **Keyboard Navigation**: Escape to close, Tab to navigate
157
+ - **Focus Management**: Focus trapped within dialog
158
+ - **Overlay**: Click outside to close
159
+ - **Customizable**: Full control over content and styling
160
+ - **Composable**: Mix and match components as needed
161
+
162
+ ## Accessibility
163
+
164
+ - Built on reka-ui primitives
165
+ - Proper ARIA attributes (role="dialog", aria-labelledby, aria-describedby)
166
+ - Focus trapped within dialog
167
+ - Escape key to close
168
+ - Focus returns to trigger on close
169
+ - Screen reader support
170
+
@@ -0,0 +1,182 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ DialogClose,
4
+ DialogContent,
5
+ DialogDescription,
6
+ DialogOverlay,
7
+ DialogPortal,
8
+ DialogRoot,
9
+ DialogTitle,
10
+ VisuallyHidden,
11
+ } from 'reka-ui'
12
+
13
+ defineOptions({
14
+ inheritAttrs: false,
15
+ })
16
+
17
+ const props = withDefaults(defineProps<{
18
+ title?: string
19
+ modalWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'wide'
20
+ compact?: boolean
21
+ hideDividers?: boolean
22
+ hideHeader?: boolean
23
+ overlayClass?: string
24
+ fullscreen?: boolean
25
+ }>(), {
26
+ modalWidth: 'md',
27
+ })
28
+ const emit = defineEmits<{
29
+ close: []
30
+ }>()
31
+
32
+ const open = defineModel<boolean>()
33
+
34
+ watch(open, (value) => {
35
+ if (!value) {
36
+ emit('close')
37
+ }
38
+ })
39
+
40
+ const sizeClasses = {
41
+ xs: 'max-w-300px',
42
+ sm: 'max-w-400px',
43
+ md: 'max-w-500px',
44
+ lg: 'max-w-740px',
45
+ xl: 'max-w-900px',
46
+ wide: 'max-w-1200px',
47
+ } as const
48
+
49
+ const modalMaxWidth = computed(() => {
50
+ return sizeClasses[props.modalWidth] || sizeClasses.md
51
+ })
52
+ </script>
53
+
54
+ <template>
55
+ <DialogRoot v-model:open="open">
56
+ <DialogPortal>
57
+ <DialogOverlay :class="`DialogOverlay ${overlayClass ?? ''}`" bg="bg-#020913/24" z-600 overflow-y-auto flex items-center justify-center :p-16px="!fullscreen">
58
+ <DialogContent
59
+ :class="`DialogContent shadow-xl ${modalMaxWidth ?? ''}`"
60
+ z-101
61
+ rounded-16px
62
+ w-full flex="~ col"
63
+ min-w-100px
64
+ bg-white
65
+ v-bind="$attrs"
66
+ overflow-y-hidden
67
+ >
68
+ <div
69
+ v-if="!hideHeader" w-full flex="~" items-center
70
+ justify-between
71
+ :b-b="!props.hideDividers && '0.5px gray-200'"
72
+ :p="props.compact ? 'y-14px x-24px' : 'y-24px x-32px'"
73
+ >
74
+ <DialogTitle
75
+ v-if="title"
76
+ w-full
77
+ heading-20-medium
78
+ :content="props.compact ? '16px gray-900' : '20px gray-900'"
79
+ capitalize
80
+ >
81
+ <slot name="header">
82
+ <div flex="~" items-center justify-between h-32px>
83
+ <slot name="header-leading" />
84
+ <p :class="$slots['header-leading'] && 'absolute left-1/2 -translate-x-1/2'">
85
+ {{ title }}
86
+ </p>
87
+ </div>
88
+ </slot>
89
+ </DialogTitle>
90
+
91
+ <VisuallyHidden v-else>
92
+ <DialogTitle />
93
+ </VisuallyHidden>
94
+
95
+ <div w-32px />
96
+ <VisuallyHidden as-child>
97
+ <DialogDescription />
98
+ </VisuallyHidden>
99
+
100
+ <div z-1 :right="props.compact ? '12px' : '24px'">
101
+ <slot name="actions">
102
+ <DialogClose as-child>
103
+ <TelaIconButton
104
+ icon="i-ph-x" size="sm" color="secondary" outline-none
105
+ :class="props.compact ? 'p-12px' : 'p-16px'"
106
+ />
107
+ </DialogClose>
108
+ </slot>
109
+ </div>
110
+ </div>
111
+
112
+ <VisuallyHidden v-else>
113
+ <DialogTitle />
114
+ </VisuallyHidden>
115
+
116
+ <slot name="content">
117
+ <div
118
+ flex w-full items-center justify-center relative h-full
119
+ :class="[
120
+ props.compact ? 'pb-24px' : 'px-32px py-24px',
121
+ ]"
122
+ >
123
+ <slot />
124
+ </div>
125
+ </slot>
126
+
127
+ <div
128
+ v-if="$slots.footer" mt-24px :b-t="!props.hideDividers && '0.5px gray-200'"
129
+ py-24px flex px-32px
130
+ >
131
+ <slot name="footer" />
132
+ </div>
133
+ </DialogContent>
134
+ </DialogOverlay>
135
+ </DialogPortal>
136
+ </DialogRoot>
137
+ </template>
138
+
139
+ <style lang="css" scoped>
140
+ .DialogOverlay {
141
+ background-color: rgba(2, 9, 19, 0.24);
142
+ position: fixed;
143
+ inset: 0;
144
+ animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1);
145
+ }
146
+
147
+ .DialogContent {
148
+ width: 100%;
149
+ animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1);
150
+ }
151
+
152
+ .DialogContent:focus {
153
+ outline: none;
154
+ }
155
+
156
+ .DialogDescription {
157
+ margin: 10px 0 20px;
158
+ color: var(--mauve-11);
159
+ font-size: 15px;
160
+ line-height: 1.5;
161
+ }
162
+
163
+ @keyframes overlayShow {
164
+ from {
165
+ opacity: 0;
166
+ }
167
+ to {
168
+ opacity: 1;
169
+ }
170
+ }
171
+
172
+ @keyframes contentShow {
173
+ from {
174
+ opacity: 0;
175
+ transform: scale(0.96);
176
+ }
177
+ to {
178
+ opacity: 1;
179
+ transform: scale(1);
180
+ }
181
+ }
182
+ </style>
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ defineProps<{
3
+ disabled?: boolean
4
+ }>()
5
+ </script>
6
+
7
+ <template>
8
+ <div
9
+ :class="[
10
+ disabled ? '!op-45 !pointer-events-none cursor-not-allowed select-none' : '',
11
+ ]"
12
+ transition ease-in-out
13
+ >
14
+ <slot />
15
+ </div>
16
+ </template>