@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,330 @@
1
+ import PopoverList from './popover-list.vue'
2
+
3
+ const meta = {
4
+ title: 'Components/PopoverList',
5
+ component: PopoverList,
6
+ parameters: {
7
+ layout: 'centered',
8
+ docs: {
9
+ description: {
10
+ component: 'A popover list component that displays a list of items in a floating panel. Supports custom item rendering, nested data structures, empty states, and flexible positioning. Useful for displaying lists of data in a popover overlay with title and subtitle support.',
11
+ },
12
+ },
13
+ },
14
+ argTypes: {
15
+ items: {
16
+ control: 'object',
17
+ description: 'Array of items to display in the list. Can be simple strings or complex objects with nested structures.',
18
+ },
19
+ title: {
20
+ control: 'text',
21
+ description: 'Title displayed at the top of the popover list.',
22
+ },
23
+ subtitle: {
24
+ control: 'text',
25
+ description: 'Subtitle displayed below the title.',
26
+ },
27
+ position: {
28
+ control: { type: 'select' },
29
+ options: ['left', 'center', 'right'],
30
+ description: 'Horizontal position alignment of the popover relative to the trigger.',
31
+ },
32
+ placement: {
33
+ control: { type: 'select' },
34
+ options: ['top', 'bottom'],
35
+ description: 'Vertical placement of the popover relative to the trigger (above or below).',
36
+ },
37
+ nested: {
38
+ control: 'boolean',
39
+ description: 'Enable nested data structure rendering for complex hierarchical data.',
40
+ },
41
+ nestedVariant: {
42
+ control: 'select',
43
+ options: ['attributes', 'detailed'],
44
+ description: 'Variant style for nested data rendering. "attributes" for key-value pairs, "detailed" for more detailed view.',
45
+ },
46
+ },
47
+ }
48
+
49
+ export default meta
50
+
51
+ export const Basic = {
52
+ args: {
53
+ items: ['Item 1', 'Item 2', 'Item 3'],
54
+ title: 'List Title',
55
+ subtitle: 'List subtitle',
56
+ },
57
+ render: (args: any) => ({
58
+ components: { PopoverList },
59
+ setup() {
60
+ return { args }
61
+ },
62
+ template: `
63
+ <PopoverList v-bind="args">
64
+ <template #trigger>
65
+ <button class="px-4 py-2 bg-blue-500 text-white rounded">
66
+ Click me
67
+ </button>
68
+ </template>
69
+ </PopoverList>
70
+ `,
71
+ }),
72
+ }
73
+
74
+ export const WithCustomItems = {
75
+ args: {
76
+ items: [
77
+ { name: 'John Doe', role: 'Developer' },
78
+ { name: 'Jane Smith', role: 'Designer' },
79
+ { name: 'Bob Wilson', role: 'Manager' },
80
+ ],
81
+ title: 'Team Members',
82
+ },
83
+ render: (args: any) => ({
84
+ components: { PopoverList },
85
+ setup() {
86
+ return { args }
87
+ },
88
+ template: `
89
+ <PopoverList v-bind="args">
90
+ <template #trigger>
91
+ <button class="px-4 py-2 bg-green-500 text-white rounded">
92
+ Show Team
93
+ </button>
94
+ </template>
95
+ <template #item="{ item }">
96
+ <div class="flex flex-col">
97
+ <span class="text-white font-semibold text-[12px]">{{ item.name }}</span>
98
+ <span class="text-gray-400 text-[10px]">{{ item.role }}</span>
99
+ </div>
100
+ </template>
101
+ </PopoverList>
102
+ `,
103
+ }),
104
+ }
105
+
106
+ export const LeftPosition = {
107
+ args: {
108
+ items: ['Left Item 1', 'Left Item 2', 'Left Item 3'],
109
+ position: 'left',
110
+ title: 'Left Positioned',
111
+ },
112
+ render: (args: any) => ({
113
+ components: { PopoverList },
114
+ setup() {
115
+ return { args }
116
+ },
117
+ template: `
118
+ <div class="ml-64">
119
+ <PopoverList v-bind="args">
120
+ <template #trigger>
121
+ <button class="px-4 py-2 bg-red-500 text-white rounded">
122
+ Left Popover
123
+ </button>
124
+ </template>
125
+ </PopoverList>
126
+ </div>
127
+ `,
128
+ }),
129
+ }
130
+
131
+ export const CenterPosition = {
132
+ args: {
133
+ items: ['Center Item 1', 'Center Item 2', 'Center Item 3'],
134
+ position: 'center',
135
+ title: 'Center Positioned',
136
+ },
137
+ render: (args: any) => ({
138
+ components: { PopoverList },
139
+ setup() {
140
+ return { args }
141
+ },
142
+ template: `
143
+ <PopoverList v-bind="args">
144
+ <template #trigger>
145
+ <button class="px-4 py-2 bg-purple-500 text-white rounded">
146
+ Center Popover
147
+ </button>
148
+ </template>
149
+ </PopoverList>
150
+ `,
151
+ }),
152
+ }
153
+
154
+ export const EmptyState = {
155
+ args: {
156
+ items: [],
157
+ title: 'Empty List',
158
+ },
159
+ render: (args: any) => ({
160
+ components: { PopoverList },
161
+ setup() {
162
+ return { args }
163
+ },
164
+ template: `
165
+ <PopoverList v-bind="args">
166
+ <template #trigger>
167
+ <button class="px-4 py-2 bg-gray-500 text-white rounded">
168
+ Empty List
169
+ </button>
170
+ </template>
171
+ <template #empty>
172
+ <div class="flex flex-col items-start gap-4px">
173
+ <p class="text-white text-left font-inter text-[12px] font-semibold w-full leading-[128%] tracking-[-0.06px]">
174
+ Nothing to show here
175
+ </p>
176
+ <p class="text-[#BDC4CC] text-left font-inter text-[11px] font-medium w-full leading-[124%] tracking-[-0.022px]">
177
+ Add some items to see them in the list
178
+ </p>
179
+ </div>
180
+ </template>
181
+ </PopoverList>
182
+ `,
183
+ }),
184
+ }
185
+
186
+ export const NestedAttributes = {
187
+ args: {
188
+ nested: true,
189
+ nestedVariant: 'attributes',
190
+ items: [
191
+ {
192
+ name: 'User',
193
+ value: {
194
+ name: { name: 'Name', value: 'John Doe' },
195
+ email: { name: 'Email', value: 'john@example.com' },
196
+ profile: {
197
+ name: 'Profile',
198
+ value: {
199
+ age: { name: 'Age', value: 30 },
200
+ city: { name: 'City', value: 'New York' },
201
+ },
202
+ },
203
+ },
204
+ },
205
+ {
206
+ name: 'Settings',
207
+ value: {
208
+ theme: { name: 'Theme', value: 'dark' },
209
+ notifications: { name: 'Notifications', value: true },
210
+ },
211
+ },
212
+ ],
213
+ title: 'Nested Attributes',
214
+ subtitle: 'Tree structure with attributes view',
215
+ },
216
+ render: (args: any) => ({
217
+ components: { PopoverList },
218
+ setup() {
219
+ return { args }
220
+ },
221
+ template: `
222
+ <PopoverList v-bind="args">
223
+ <template #trigger>
224
+ <button class="px-4 py-2 bg-indigo-500 text-white rounded">
225
+ Nested Attributes
226
+ </button>
227
+ </template>
228
+ </PopoverList>
229
+ `,
230
+ }),
231
+ }
232
+
233
+ export const NestedDetailed = {
234
+ args: {
235
+ nested: true,
236
+ nestedVariant: 'detailed',
237
+ items: [
238
+ {
239
+ name: 'Database',
240
+ value: {
241
+ host: { name: 'Host', value: 'localhost' },
242
+ port: { name: 'Port', value: 5432 },
243
+ credentials: {
244
+ name: 'Credentials',
245
+ value: {
246
+ username: { name: 'Username', value: 'admin' },
247
+ password: { name: 'Password', value: '***' },
248
+ },
249
+ },
250
+ },
251
+ },
252
+ {
253
+ name: 'API',
254
+ value: {
255
+ endpoint: { name: 'Endpoint', value: '/api/v1' },
256
+ timeout: { name: 'Timeout', value: 30000 },
257
+ },
258
+ },
259
+ ],
260
+ title: 'Nested Detailed',
261
+ subtitle: 'Tree structure with detailed view',
262
+ },
263
+ render: (args: any) => ({
264
+ components: { PopoverList },
265
+ setup() {
266
+ return { args }
267
+ },
268
+ template: `
269
+ <PopoverList v-bind="args">
270
+ <template #trigger>
271
+ <button class="px-4 py-2 bg-teal-500 text-white rounded">
272
+ Nested Detailed
273
+ </button>
274
+ </template>
275
+ </PopoverList>
276
+ `,
277
+ }),
278
+ }
279
+
280
+ export const TopPlacement = {
281
+ args: {
282
+ items: ['Top Item 1', 'Top Item 2', 'Top Item 3'],
283
+ placement: 'top',
284
+ position: 'center',
285
+ title: 'Top Positioned',
286
+ subtitle: 'Appears above the trigger',
287
+ },
288
+ render: (args: any) => ({
289
+ components: { PopoverList },
290
+ setup() {
291
+ return { args }
292
+ },
293
+ template: `
294
+ <div class="mt-64">
295
+ <PopoverList v-bind="args">
296
+ <template #trigger>
297
+ <button class="px-4 py-2 bg-amber-500 text-white rounded">
298
+ Top Popover
299
+ </button>
300
+ </template>
301
+ </PopoverList>
302
+ </div>
303
+ `,
304
+ }),
305
+ }
306
+
307
+ export const BottomPlacement = {
308
+ args: {
309
+ items: ['Bottom Item 1', 'Bottom Item 2', 'Bottom Item 3'],
310
+ placement: 'bottom',
311
+ position: 'center',
312
+ title: 'Bottom Positioned',
313
+ subtitle: 'Appears below the trigger',
314
+ },
315
+ render: (args: any) => ({
316
+ components: { PopoverList },
317
+ setup() {
318
+ return { args }
319
+ },
320
+ template: `
321
+ <PopoverList v-bind="args">
322
+ <template #trigger>
323
+ <button class="px-4 py-2 bg-lime-500 text-white rounded">
324
+ Bottom Popover
325
+ </button>
326
+ </template>
327
+ </PopoverList>
328
+ `,
329
+ }),
330
+ }
@@ -0,0 +1,191 @@
1
+ <script setup lang="ts" generic="T">
2
+ import { PopoverContent, PopoverRoot, PopoverTrigger, PopoverPortal } from 'radix-vue'
3
+ import PopoverListNested from './popover-list-nested.vue'
4
+
5
+ interface PopoverListProps<T> {
6
+ items: T[]
7
+ title?: string
8
+ subtitle?: string
9
+ position?: 'left' | 'center' | 'right'
10
+ placement?: 'top' | 'bottom'
11
+ nested?: boolean
12
+ nestedVariant?: 'attributes' | 'detailed'
13
+ hasChildrenFn?: (item: T) => boolean
14
+ getChildrenFn?: (item: T) => T[]
15
+ }
16
+
17
+ const props = withDefaults(defineProps<PopoverListProps<T>>(), {
18
+ position: 'right',
19
+ placement: 'bottom',
20
+ nested: false,
21
+ nestedVariant: 'attributes',
22
+ })
23
+
24
+ const popoverOpen = defineModel('open', {
25
+ type: Boolean,
26
+ default: false,
27
+ })
28
+
29
+ const hoverTimeout = ref<NodeJS.Timeout>()
30
+
31
+ function handleMouseEnter() {
32
+ clearTimeout(hoverTimeout.value)
33
+ popoverOpen.value = true
34
+ }
35
+
36
+ function handleMouseLeave() {
37
+ hoverTimeout.value = setTimeout(() => {
38
+ popoverOpen.value = false
39
+ }, 150)
40
+ }
41
+
42
+ const popoverSide = computed(() => {
43
+ if (props.placement === 'top') {
44
+ return 'top'
45
+ }
46
+ if (props.placement === 'bottom') {
47
+ return 'bottom'
48
+ }
49
+ // Fallback para position horizontal quando placement não é especificado
50
+ if (props.position === 'left') {
51
+ return 'left'
52
+ }
53
+ if (props.position === 'right') {
54
+ return 'right'
55
+ }
56
+ return 'bottom' // default
57
+ })
58
+
59
+ const popoverAlign = computed(() => {
60
+ if (props.placement === 'top' || props.placement === 'bottom') {
61
+ // Para top/bottom, usar position para alinhamento horizontal
62
+ if (props.position === 'left') {
63
+ return 'start'
64
+ }
65
+ if (props.position === 'right') {
66
+ return 'end'
67
+ }
68
+ if (props.position === 'center') {
69
+ return 'center'
70
+ }
71
+ return 'center' // default para top/bottom
72
+ }
73
+ // Para left/right, usar alinhamento padrão
74
+ return 'start'
75
+ })
76
+
77
+ function hasChildren(item: T): boolean {
78
+ if (props.hasChildrenFn) {
79
+ return props.hasChildrenFn(item)
80
+ }
81
+
82
+ // Default logic for nested objects
83
+ if (typeof item === 'object' && item !== null) {
84
+ const obj = item as any
85
+ return obj.value && typeof obj.value === 'object' && Object.keys(obj.value).length > 0
86
+ }
87
+
88
+ return false
89
+ }
90
+
91
+ function getChildren(item: T): T[] {
92
+ if (props.getChildrenFn) {
93
+ return props.getChildrenFn(item)
94
+ }
95
+
96
+ // Default logic for nested objects
97
+ if (typeof item === 'object' && item !== null) {
98
+ const obj = item as any
99
+ if (obj.value && typeof obj.value === 'object') {
100
+ return Object.values(obj.value)
101
+ }
102
+ }
103
+
104
+ return []
105
+ }
106
+ </script>
107
+
108
+ <template>
109
+ <PopoverRoot v-model:open="popoverOpen">
110
+ <PopoverTrigger
111
+ as-child
112
+ @mouseenter="handleMouseEnter"
113
+ @mouseleave="handleMouseLeave"
114
+ >
115
+ <slot name="trigger" />
116
+ </PopoverTrigger>
117
+ <PopoverPortal>
118
+ <PopoverContent
119
+ class="inline-flex flex-col items-start gap-1 rounded-[12px] bg-[#030C16] p-3"
120
+ :style="{
121
+ 'box-shadow': '0px 16px 80px 0px #0D2D4814, 0px 4px 16px 0px #0D2D480D',
122
+ 'z-index': '11000',
123
+ 'width': '200px',
124
+ }"
125
+ :side="popoverSide"
126
+ :align="popoverAlign"
127
+ @mouseenter="handleMouseEnter"
128
+ @mouseleave="handleMouseLeave"
129
+ >
130
+ <!-- Header with title and subtitle -->
131
+ <div v-if="title || subtitle || $slots.title || $slots.subtitle" class="w-full">
132
+ <div v-if="title || $slots.title" class="text-white text-left font-inter text-[12px] font-semibold leading-[16px]" style="font-weight: 580;">
133
+ <slot name="title">
134
+ {{ title }}
135
+ </slot>
136
+ </div>
137
+ <div v-if="subtitle || $slots.subtitle" class="text-[#BDC4CC] text-left font-inter text-[11px] font-medium leading-[124%] tracking-[-0.022px] mt-1">
138
+ <slot name="subtitle">
139
+ {{ subtitle }}
140
+ </slot>
141
+ </div>
142
+ </div>
143
+
144
+ <!-- List content -->
145
+ <template v-if="items && items.length > 0">
146
+ <div v-if="!nested" class="flex flex-col gap-2px w-full">
147
+ <div
148
+ v-for="(item, index) in items"
149
+ :key="index"
150
+ class="rounded-md"
151
+ >
152
+ <slot name="item" :item="item" :index="index">
153
+ <div class="text-[#D4D9DE] text-left font-inter text-[12px] font-normal leading-[16px] max-w-full truncate">
154
+ {{ item }}
155
+ </div>
156
+ </slot>
157
+ </div>
158
+ </div>
159
+
160
+ <!-- Nested display -->
161
+ <div v-else class="w-full">
162
+ <PopoverListNested
163
+ :items="items"
164
+ :variant="nestedVariant"
165
+ :depth="0"
166
+ :has-children-fn="hasChildren"
167
+ :get-children-fn="getChildren"
168
+ >
169
+ <template #item="{ item, index, depth }">
170
+ <slot name="nested-item" :item="item" :index="index" :depth="depth">
171
+ <slot name="item" :item="item" :index="index" />
172
+ </slot>
173
+ </template>
174
+ </PopoverListNested>
175
+ </div>
176
+ </template>
177
+
178
+ <!-- Empty state -->
179
+ <template v-else>
180
+ <slot name="empty">
181
+ <div class="flex flex-col items-start gap-2 w-full">
182
+ <p class="text-[#D4D9DE] text-left font-inter text-[12px] font-normal leading-[16px] w-full">
183
+ {{ $t('common.noItemsAvailable') }}
184
+ </p>
185
+ </div>
186
+ </slot>
187
+ </template>
188
+ </PopoverContent>
189
+ </PopoverPortal>
190
+ </PopoverRoot>
191
+ </template>
@@ -0,0 +1,66 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps<{
3
+ autoFocus?: boolean
4
+ disabled?: boolean
5
+ modelValue?: boolean
6
+ }>()
7
+
8
+ const checked = defineModel<boolean>()
9
+
10
+ const radioEl = ref<HTMLInputElement | null>(null)
11
+ onMounted(() => {
12
+ if (props.autoFocus) {
13
+ radioEl.value?.focus()
14
+ }
15
+ })
16
+
17
+ function toggle() {
18
+ checked.value = !checked.value
19
+ }
20
+ </script>
21
+
22
+ <template>
23
+ <input
24
+ ref="radioEl"
25
+ type="radio"
26
+ :checked="checked"
27
+ :disabled="disabled"
28
+ b="1px gray-900"
29
+ cursor-pointer
30
+ :class="[checked ? 'bg-gray-900' : 'bg-white hover:bg-gray-200']"
31
+ class="form-radio focus:ring-1 focus:ring-gray-200 text-gray-900"
32
+ @change="toggle"
33
+ >
34
+ </template>
35
+
36
+ <style>
37
+ .form-radio:checked {
38
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")
39
+ }
40
+
41
+ .form-radio:checked {
42
+ background-color: currentColor;
43
+ background-position: 50%;
44
+ background-repeat: no-repeat;
45
+ background-size: 100% 100%;
46
+ border-color: transparent;
47
+ }
48
+
49
+ .form-radio {
50
+ border-radius: 100%;
51
+ -webkit-appearance: none;
52
+ -moz-appearance: none;
53
+ appearance: none;
54
+ display: inline-block;
55
+ flex-shrink: 0;
56
+ height: 1rem;
57
+ padding: 0;
58
+ -webkit-print-color-adjust: exact;
59
+ print-color-adjust: exact;
60
+ -webkit-user-select: none;
61
+ -moz-user-select: none;
62
+ user-select: none;
63
+ vertical-align: middle;
64
+ width: 1rem;
65
+ }
66
+ </style>
@@ -0,0 +1,40 @@
1
+ <script setup lang="ts">
2
+ import type { RadioGroupItemProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import {
5
+ RadioGroupIndicator,
6
+ RadioGroupItem,
7
+ useForwardProps,
8
+ } from 'reka-ui'
9
+ import { computed } from 'vue'
10
+
11
+ const props = defineProps<RadioGroupItemProps & { class?: HTMLAttributes['class'] }>()
12
+
13
+ const delegatedProps = computed(() => {
14
+ const { class: _, ...delegated } = props
15
+
16
+ return delegated
17
+ })
18
+
19
+ const forwardedProps = useForwardProps(delegatedProps)
20
+ </script>
21
+
22
+ <template>
23
+ <RadioGroupItem
24
+ v-bind="forwardedProps"
25
+ :class="
26
+ cn(
27
+ 'peer aspect-square w-16px h-16px rounded-full border-[1px] border-gray-300 bg-white-1000 hover:bg-gray-50 hover:border-gray-400 disabled:border-gray-200 disabled:bg-gray-100',
28
+ 'data-[state=checked]:bg-gray-700 data-[state=checked]:hover:bg-gray-950 disabled:data-[state=checked]:bg-gray-400 data-[state=checked]:!border-transparent',
29
+ 'focus:outline-none focus-visible:ring-1 focus-visible:ring-cyan-600 focus-visible:ring-offset-2 disabled:cursor-not-allowed',
30
+ props.class,
31
+ )
32
+ "
33
+ >
34
+ <RadioGroupIndicator
35
+ class="flex items-center justify-center"
36
+ >
37
+ <TelaIcon name="i-ph-circle-fill" color="white-1000" size="6px" />
38
+ </RadioGroupIndicator>
39
+ </RadioGroupItem>
40
+ </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import { RadioGroupRoot, useForwardPropsEmits } from 'reka-ui'
3
+ import type { RadioGroupRootEmits, RadioGroupRootProps } from 'reka-ui'
4
+ import { computed } from 'vue'
5
+ import type { HTMLAttributes } from 'vue'
6
+
7
+ const props = defineProps<RadioGroupRootProps & { class?: HTMLAttributes['class'] }>()
8
+ const emits = defineEmits<RadioGroupRootEmits>()
9
+
10
+ const delegatedProps = computed(() => {
11
+ const { class: _, ...delegated } = props
12
+
13
+ return delegated
14
+ })
15
+
16
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
17
+ </script>
18
+
19
+ <template>
20
+ <RadioGroupRoot
21
+ :class="cn('grid gap-2', props.class)"
22
+ v-bind="forwarded"
23
+ >
24
+ <slot />
25
+ </RadioGroupRoot>
26
+ </template>