@umbra.ui/core 0.1.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 (272) hide show
  1. package/dist/components/controls/Dropdown/types.d.ts +5 -0
  2. package/dist/components/controls/Dropdown/types.d.ts.map +1 -0
  3. package/dist/components/controls/Dropdown/types.js +1 -0
  4. package/dist/components/controls/SegmentedControl/types.d.ts +6 -0
  5. package/dist/components/controls/SegmentedControl/types.d.ts.map +1 -0
  6. package/dist/components/controls/SegmentedControl/types.js +1 -0
  7. package/dist/components/dialogs/Alert/types.d.ts +7 -0
  8. package/dist/components/dialogs/Alert/types.d.ts.map +1 -0
  9. package/dist/components/dialogs/Alert/types.js +1 -0
  10. package/dist/components/dialogs/Toast/types.d.ts +34 -0
  11. package/dist/components/dialogs/Toast/types.d.ts.map +1 -0
  12. package/dist/components/dialogs/Toast/types.js +10 -0
  13. package/dist/components/dialogs/Toast/useToast.d.ts +36 -0
  14. package/dist/components/dialogs/Toast/useToast.d.ts.map +1 -0
  15. package/dist/components/dialogs/Toast/useToast.js +90 -0
  16. package/dist/components/indicators/Tooltip/tooltip.d.ts +3 -0
  17. package/dist/components/indicators/Tooltip/tooltip.d.ts.map +1 -0
  18. package/dist/components/indicators/Tooltip/tooltip.js +33 -0
  19. package/dist/components/indicators/Tooltip/types.d.ts +14 -0
  20. package/dist/components/indicators/Tooltip/types.d.ts.map +1 -0
  21. package/dist/components/indicators/Tooltip/types.js +1 -0
  22. package/dist/components/indicators/Tooltip/useTooltip.d.ts +18 -0
  23. package/dist/components/indicators/Tooltip/useTooltip.d.ts.map +1 -0
  24. package/dist/components/indicators/Tooltip/useTooltip.js +57 -0
  25. package/dist/components/inputs/Tags/tag-bar-styles.d.ts +14 -0
  26. package/dist/components/inputs/Tags/tag-bar-styles.d.ts.map +1 -0
  27. package/dist/components/inputs/Tags/tag-bar-styles.js +313 -0
  28. package/dist/components/inputs/Tags/types.d.ts +93 -0
  29. package/dist/components/inputs/Tags/types.d.ts.map +1 -0
  30. package/dist/components/inputs/Tags/types.js +216 -0
  31. package/dist/components/inputs/search/types.d.ts +9 -0
  32. package/dist/components/inputs/search/types.d.ts.map +1 -0
  33. package/dist/components/inputs/search/types.js +1 -0
  34. package/dist/components/navigation/adaptive/types.d.ts +16 -0
  35. package/dist/components/navigation/adaptive/types.d.ts.map +1 -0
  36. package/dist/components/navigation/adaptive/types.js +1 -0
  37. package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts +27 -0
  38. package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts.map +1 -0
  39. package/dist/components/navigation/adaptive/useAdaptiveLayout.js +40 -0
  40. package/dist/components/navigation/adaptive/useBreakpoints.d.ts +6 -0
  41. package/dist/components/navigation/adaptive/useBreakpoints.d.ts.map +1 -0
  42. package/dist/components/navigation/adaptive/useBreakpoints.js +37 -0
  43. package/dist/components/navigation/adaptive/useContainerMonitor.d.ts +93 -0
  44. package/dist/components/navigation/adaptive/useContainerMonitor.d.ts.map +1 -0
  45. package/dist/components/navigation/adaptive/useContainerMonitor.js +145 -0
  46. package/dist/components/navigation/adaptive/useViewAnimation.d.ts +31 -0
  47. package/dist/components/navigation/adaptive/useViewAnimation.d.ts.map +1 -0
  48. package/dist/components/navigation/adaptive/useViewAnimation.js +591 -0
  49. package/dist/components/navigation/adaptive/useViewResize.d.ts +52 -0
  50. package/dist/components/navigation/adaptive/useViewResize.d.ts.map +1 -0
  51. package/dist/components/navigation/adaptive/useViewResize.js +146 -0
  52. package/dist/components/navigation/navstack/useNavigationStack.d.ts +25 -0
  53. package/dist/components/navigation/navstack/useNavigationStack.d.ts.map +1 -0
  54. package/dist/components/navigation/navstack/useNavigationStack.js +133 -0
  55. package/dist/components/navigation/slideover/useSlideoverController.d.ts +20 -0
  56. package/dist/components/navigation/slideover/useSlideoverController.d.ts.map +1 -0
  57. package/dist/components/navigation/slideover/useSlideoverController.js +267 -0
  58. package/dist/components/navigation/splitview/useSplitViewController.d.ts +20 -0
  59. package/dist/components/navigation/splitview/useSplitViewController.d.ts.map +1 -0
  60. package/dist/components/navigation/splitview/useSplitViewController.js +325 -0
  61. package/dist/components/navigation/tabcontroller/types.d.ts +21 -0
  62. package/dist/components/navigation/tabcontroller/types.d.ts.map +1 -0
  63. package/dist/components/navigation/tabcontroller/types.js +1 -0
  64. package/dist/components/navigation/tabcontroller/useTabController.d.ts +5 -0
  65. package/dist/components/navigation/tabcontroller/useTabController.d.ts.map +1 -0
  66. package/dist/components/navigation/tabcontroller/useTabController.js +10 -0
  67. package/dist/components/navigation/types.d.ts +8 -0
  68. package/dist/components/navigation/types.d.ts.map +1 -0
  69. package/dist/components/navigation/types.js +1 -0
  70. package/dist/components/pickers/CollectionPicker/types.d.ts +11 -0
  71. package/dist/components/pickers/CollectionPicker/types.d.ts.map +1 -0
  72. package/dist/components/pickers/CollectionPicker/types.js +1 -0
  73. package/dist/components/pickers/ColorPicker/colors.d.ts +13 -0
  74. package/dist/components/pickers/ColorPicker/colors.d.ts.map +1 -0
  75. package/dist/components/pickers/ColorPicker/colors.js +266 -0
  76. package/dist/components/pickers/FilePicker/types.d.ts +10 -0
  77. package/dist/components/pickers/FilePicker/types.d.ts.map +1 -0
  78. package/dist/components/pickers/FilePicker/types.js +1 -0
  79. package/dist/index.d.ts +91 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +196 -0
  82. package/dist/theme.d.ts +73 -0
  83. package/dist/theme.d.ts.map +1 -0
  84. package/dist/theme.js +279 -0
  85. package/dist/themes/blank.d.ts +7 -0
  86. package/dist/themes/blank.d.ts.map +1 -0
  87. package/dist/themes/blank.js +543 -0
  88. package/dist/themes/crimson-dark.d.ts +4 -0
  89. package/dist/themes/crimson-dark.d.ts.map +1 -0
  90. package/dist/themes/crimson-dark.js +552 -0
  91. package/dist/themes/cyan-light.d.ts +4 -0
  92. package/dist/themes/cyan-light.d.ts.map +1 -0
  93. package/dist/themes/cyan-light.js +552 -0
  94. package/dist/themes/dark.d.ts +4 -0
  95. package/dist/themes/dark.d.ts.map +1 -0
  96. package/dist/themes/dark.js +551 -0
  97. package/dist/themes/gold-dark.d.ts +4 -0
  98. package/dist/themes/gold-dark.d.ts.map +1 -0
  99. package/dist/themes/gold-dark.js +552 -0
  100. package/dist/themes/grass-dark.d.ts +4 -0
  101. package/dist/themes/grass-dark.d.ts.map +1 -0
  102. package/dist/themes/grass-dark.js +552 -0
  103. package/dist/themes/indigo.d.ts +4 -0
  104. package/dist/themes/indigo.d.ts.map +1 -0
  105. package/dist/themes/indigo.js +552 -0
  106. package/dist/themes/light.d.ts +4 -0
  107. package/dist/themes/light.d.ts.map +1 -0
  108. package/dist/themes/light.js +551 -0
  109. package/dist/themes/orange-dark.d.ts +4 -0
  110. package/dist/themes/orange-dark.d.ts.map +1 -0
  111. package/dist/themes/orange-dark.js +551 -0
  112. package/dist/themes/orange-light.d.ts +4 -0
  113. package/dist/themes/orange-light.d.ts.map +1 -0
  114. package/dist/themes/orange-light.js +551 -0
  115. package/package.json +62 -0
  116. package/src/components/controls/Button/Button.vue +417 -0
  117. package/src/components/controls/Button/README.md +348 -0
  118. package/src/components/controls/Button/theme.css +200 -0
  119. package/src/components/controls/Checkbox/Checkbox.vue +164 -0
  120. package/src/components/controls/Checkbox/README.md +441 -0
  121. package/src/components/controls/Checkbox/theme.css +36 -0
  122. package/src/components/controls/Dropdown/Dropdown.vue +476 -0
  123. package/src/components/controls/Dropdown/README.md +370 -0
  124. package/src/components/controls/Dropdown/theme.css +50 -0
  125. package/src/components/controls/Dropdown/types.ts +6 -0
  126. package/src/components/controls/IconButton/IconButton.vue +267 -0
  127. package/src/components/controls/IconButton/README.md +502 -0
  128. package/src/components/controls/IconButton/theme.css +89 -0
  129. package/src/components/controls/Radio/README.md +591 -0
  130. package/src/components/controls/Radio/Radio.vue +89 -0
  131. package/src/components/controls/Radio/theme.css +14 -0
  132. package/src/components/controls/RangeSlider/README.md +608 -0
  133. package/src/components/controls/RangeSlider/RangeSlider.vue +535 -0
  134. package/src/components/controls/RangeSlider/theme.css +80 -0
  135. package/src/components/controls/SegmentedControl/README.md +587 -0
  136. package/src/components/controls/SegmentedControl/SegmentedControl.vue +284 -0
  137. package/src/components/controls/SegmentedControl/theme.css +60 -0
  138. package/src/components/controls/SegmentedControl/types.ts +5 -0
  139. package/src/components/controls/Slider/README.md +627 -0
  140. package/src/components/controls/Slider/Slider.vue +260 -0
  141. package/src/components/controls/Slider/theme.css +74 -0
  142. package/src/components/controls/Stepper/README.md +601 -0
  143. package/src/components/controls/Stepper/Stepper.vue +103 -0
  144. package/src/components/controls/Stepper/theme.css +53 -0
  145. package/src/components/controls/Switch/README.md +667 -0
  146. package/src/components/controls/Switch/Switch.vue +127 -0
  147. package/src/components/controls/Switch/theme.css +42 -0
  148. package/src/components/dialogs/Alert/Alert.vue +218 -0
  149. package/src/components/dialogs/Alert/README.md +450 -0
  150. package/src/components/dialogs/Alert/theme.css +44 -0
  151. package/src/components/dialogs/Alert/types.ts +11 -0
  152. package/src/components/dialogs/Toast/README.md +522 -0
  153. package/src/components/dialogs/Toast/Toast.vue +296 -0
  154. package/src/components/dialogs/Toast/ToastContainer.vue +330 -0
  155. package/src/components/dialogs/Toast/theme.css +44 -0
  156. package/src/components/dialogs/Toast/types.ts +46 -0
  157. package/src/components/dialogs/Toast/useToast.ts +127 -0
  158. package/src/components/indicators/ProgressBar/ProgressBar.vue +98 -0
  159. package/src/components/indicators/ProgressBar/README.md +744 -0
  160. package/src/components/indicators/ProgressBar/theme.css +36 -0
  161. package/src/components/indicators/Tooltip/README.md +723 -0
  162. package/src/components/indicators/Tooltip/TooltipProvider.vue +142 -0
  163. package/src/components/indicators/Tooltip/theme.css +18 -0
  164. package/src/components/indicators/Tooltip/tooltip.ts +48 -0
  165. package/src/components/indicators/Tooltip/types.ts +15 -0
  166. package/src/components/indicators/Tooltip/useTooltip.ts +71 -0
  167. package/src/components/inputs/AutogrowTextView/AutogrowTextView.vue +110 -0
  168. package/src/components/inputs/AutogrowTextView/README.md +643 -0
  169. package/src/components/inputs/AutogrowTextView/theme.css +28 -0
  170. package/src/components/inputs/InputCard/InputCard.vue +600 -0
  171. package/src/components/inputs/InputCard/README.md +636 -0
  172. package/src/components/inputs/InputEmail/InputEmail.vue +698 -0
  173. package/src/components/inputs/InputEmail/README.md +764 -0
  174. package/src/components/inputs/InputNumber/InputNumber.vue +300 -0
  175. package/src/components/inputs/InputNumber/README.md +749 -0
  176. package/src/components/inputs/InputPhone/InputPhone.vue +645 -0
  177. package/src/components/inputs/InputPhone/README.md +636 -0
  178. package/src/components/inputs/InputSecure/InputSecure.vue +646 -0
  179. package/src/components/inputs/InputSecure/README.md +771 -0
  180. package/src/components/inputs/InputText/InputText.vue +225 -0
  181. package/src/components/inputs/InputText/README.md +844 -0
  182. package/src/components/inputs/OTP/OTP.vue +349 -0
  183. package/src/components/inputs/OTP/README.md +736 -0
  184. package/src/components/inputs/OTP/theme.css +50 -0
  185. package/src/components/inputs/StringCapture/README.md +718 -0
  186. package/src/components/inputs/StringCapture/StringCapture.vue +315 -0
  187. package/src/components/inputs/StringCapture/theme.css +86 -0
  188. package/src/components/inputs/Tags/README.md +897 -0
  189. package/src/components/inputs/Tags/TagBar.vue +793 -0
  190. package/src/components/inputs/Tags/TagCreation.vue +219 -0
  191. package/src/components/inputs/Tags/TagPicker.vue +380 -0
  192. package/src/components/inputs/Tags/tag-bar-styles.ts +354 -0
  193. package/src/components/inputs/Tags/theme.css +121 -0
  194. package/src/components/inputs/Tags/types.ts +346 -0
  195. package/src/components/inputs/search/README.md +759 -0
  196. package/src/components/inputs/search/SearchBar.vue +394 -0
  197. package/src/components/inputs/search/SearchResults.vue +310 -0
  198. package/src/components/inputs/search/theme.css +187 -0
  199. package/src/components/inputs/search/types.ts +8 -0
  200. package/src/components/inputs/theme.css +102 -0
  201. package/src/components/menus/ActionMenu/ActionMenu.vue +383 -0
  202. package/src/components/menus/ActionMenu/README.md +825 -0
  203. package/src/components/menus/ActionMenu/theme.css +93 -0
  204. package/src/components/models/Popover/Popover.vue +551 -0
  205. package/src/components/models/Popover/README.md +885 -0
  206. package/src/components/models/Popover/theme.css +52 -0
  207. package/src/components/models/Sheet/README.md +1159 -0
  208. package/src/components/models/Sheet/Sheet.vue +465 -0
  209. package/src/components/models/Sheet/theme.css +72 -0
  210. package/src/components/models/Sidebar/README.md +1228 -0
  211. package/src/components/models/Sidebar/Sidebar.vue +480 -0
  212. package/src/components/models/Sidebar/theme.css +90 -0
  213. package/src/components/navigation/adaptive/AdaptiveLayout.vue +779 -0
  214. package/src/components/navigation/adaptive/AdaptiveLayoutBreadcrumbs.vue +192 -0
  215. package/src/components/navigation/adaptive/AdaptiveLayoutMenuButton.vue +149 -0
  216. package/src/components/navigation/adaptive/README.md +768 -0
  217. package/src/components/navigation/adaptive/types.ts +19 -0
  218. package/src/components/navigation/adaptive/useAdaptiveLayout.ts +89 -0
  219. package/src/components/navigation/adaptive/useBreakpoints.ts +41 -0
  220. package/src/components/navigation/adaptive/useContainerMonitor.ts +214 -0
  221. package/src/components/navigation/adaptive/useViewAnimation.ts +721 -0
  222. package/src/components/navigation/adaptive/useViewResize.ts +211 -0
  223. package/src/components/navigation/navstack/NavigationStack.vue +180 -0
  224. package/src/components/navigation/navstack/README.md +994 -0
  225. package/src/components/navigation/navstack/useNavigationStack.ts +164 -0
  226. package/src/components/navigation/slideover/README.md +1275 -0
  227. package/src/components/navigation/slideover/SlideoverController.vue +287 -0
  228. package/src/components/navigation/slideover/useSlideoverController.ts +320 -0
  229. package/src/components/navigation/splitview/README.md +1115 -0
  230. package/src/components/navigation/splitview/SplitViewController.vue +176 -0
  231. package/src/components/navigation/splitview/useSplitViewController.ts +388 -0
  232. package/src/components/navigation/tabcontroller/README.md +919 -0
  233. package/src/components/navigation/tabcontroller/TabController.vue +307 -0
  234. package/src/components/navigation/tabcontroller/TabItem.vue +57 -0
  235. package/src/components/navigation/tabcontroller/types.ts +24 -0
  236. package/src/components/navigation/tabcontroller/useTabController.ts +18 -0
  237. package/src/components/navigation/theme.css +91 -0
  238. package/src/components/navigation/types.ts +7 -0
  239. package/src/components/pickers/CollectionPicker/CollectionPicker.vue +398 -0
  240. package/src/components/pickers/CollectionPicker/README.md +1115 -0
  241. package/src/components/pickers/CollectionPicker/theme.css +14 -0
  242. package/src/components/pickers/CollectionPicker/types.ts +11 -0
  243. package/src/components/pickers/ColorPicker/ColorPicker.vue +376 -0
  244. package/src/components/pickers/ColorPicker/README.md +1439 -0
  245. package/src/components/pickers/ColorPicker/colors.ts +299 -0
  246. package/src/components/pickers/ColorPicker/theme.css +32 -0
  247. package/src/components/pickers/DatePicker/DatePicker.vue +660 -0
  248. package/src/components/pickers/DatePicker/README.md +1195 -0
  249. package/src/components/pickers/DatePicker/theme.css +22 -0
  250. package/src/components/pickers/FilePicker/FilePicker.vue +534 -0
  251. package/src/components/pickers/FilePicker/README.md +1542 -0
  252. package/src/components/pickers/FilePicker/theme.css +48 -0
  253. package/src/components/pickers/FilePicker/types.ts +10 -0
  254. package/src/components/pickers/IconPicker/IconPicker.vue +327 -0
  255. package/src/components/pickers/IconPicker/README.md +1161 -0
  256. package/src/components/pickers/IconPicker/theme.css +28 -0
  257. package/src/components/pickers/theme.css +82 -0
  258. package/src/components/views/MarkdownViewer/MarkdownViewer.vue +442 -0
  259. package/src/components/views/MarkdownViewer/README.md +833 -0
  260. package/src/components/views/MarkdownViewer/theme.css +130 -0
  261. package/src/index.ts +263 -0
  262. package/src/theme.ts +378 -0
  263. package/src/themes/crimson-dark.ts +556 -0
  264. package/src/themes/cyan-light.ts +556 -0
  265. package/src/themes/dark.ts +557 -0
  266. package/src/themes/gold-dark.ts +556 -0
  267. package/src/themes/grass-dark.ts +556 -0
  268. package/src/themes/indigo.ts +556 -0
  269. package/src/themes/light.ts +557 -0
  270. package/src/themes/orange-dark.ts +557 -0
  271. package/src/themes/orange-light.ts +557 -0
  272. package/src/vue.d.ts +45 -0
@@ -0,0 +1,187 @@
1
+ /* Light theme using Colors */
2
+ :root {
3
+ /* SearchBar colors */
4
+ --search-bar-bg: #ffffff;
5
+ --search-bar-text: #1f2937; /* gray8 - dark text for light mode */
6
+ --search-bar-placeholder: #6b7280; /* gray5 - placeholder text for light mode */
7
+ --search-bar-border: 1px solid #d9d9d9; /* blackA6 - search bar border for light mode */
8
+ --search-bar-focus-border: #0090ff; /* blue9 - focus border color */
9
+ --search-bar-shadow: rgba(
10
+ 0,
11
+ 0,
12
+ 0,
13
+ 0.1
14
+ ); /* blackA6 - lighter shadow for light mode */
15
+ --search-bar-inset-shadow: none;
16
+
17
+ /* SearchResults colors */
18
+ --search-results-bg: #ffffff; /* white - light background for light mode */
19
+ --search-results-border: 1px solid rgba(0, 0, 0, 0.1); /* blackA6 - search results border for light mode */
20
+ --search-results-shadow: transparent;
21
+ --search-results-inset-shadow: rgba(
22
+ 255,
23
+ 255,
24
+ 255,
25
+ 0.8
26
+ ); /* whiteA8 - inset highlight for light mode */
27
+
28
+ /* SearchResults subheader colors */
29
+ --search-subheader-bg: #f9fafb; /* gray0 - very light background for light mode */
30
+ --search-subheader-border: rgba(
31
+ 0,
32
+ 0,
33
+ 0,
34
+ 0.1
35
+ ); /* blackA6 - lighter border for light mode */
36
+ --search-subheader-text: #374151; /* gray7 - dark text for light mode */
37
+
38
+ /* SearchResults result colors */
39
+ --search-result-bg: #ffffff; /* white - light background for light mode */
40
+ --search-result-hover-bg: rgba(
41
+ 0,
42
+ 0,
43
+ 0,
44
+ 0.05
45
+ ); /* blackA6 - hover background for light mode */
46
+ --search-result-border: rgba(
47
+ 0,
48
+ 0,
49
+ 0,
50
+ 0.1
51
+ ); /* blackA6 - border for light mode */
52
+ --search-result-text: #1f2937; /* gray8 - dark text for light mode */
53
+ --search-result-secondary-text: #6b7280; /* gray5 - secondary text for light mode */
54
+
55
+ /* SearchResults icon colors */
56
+ --search-icon-bg: #f3f4f6; /* gray1 - light background for light mode */
57
+ --search-icon-border: #d1d5db; /* gray3 - border for light mode */
58
+
59
+ /* SearchResults footnote colors */
60
+ --search-footnote-bg: rgba(
61
+ 0,
62
+ 0,
63
+ 0,
64
+ 0.1
65
+ ); /* blackA6 - background for light mode */
66
+
67
+ /* SearchResults nothing found colors */
68
+ --search-nothing-text: #6b7280; /* gray5 - text for light mode */
69
+
70
+ /* SearchResults load more colors */
71
+ --search-load-more-bg: rgba(
72
+ 0,
73
+ 0,
74
+ 0,
75
+ 0.05
76
+ ); /* blackA6 - background for light mode */
77
+ --search-load-more-hover-bg: rgba(
78
+ 0,
79
+ 0,
80
+ 0,
81
+ 0.1
82
+ ); /* blackA8 - hover background for light mode */
83
+ --search-load-more-text: #374151; /* gray7 - text for light mode */
84
+
85
+ /* SearchResults highlight colors */
86
+ --search-highlight-bg: rgba(
87
+ 255,
88
+ 214,
89
+ 10,
90
+ 0.3
91
+ ); /* yellow with reduced opacity for light mode */
92
+
93
+ /* SearchResults overlay colors */
94
+ --search-overlay-bg: rgba(
95
+ 0,
96
+ 0,
97
+ 0,
98
+ 0.1
99
+ ); /* blackA8 - lighter overlay for light mode */
100
+ }
101
+
102
+ /* Dark theme */
103
+ .dark,
104
+ .dark-theme {
105
+ /* SearchBar colors */
106
+ --search-bar-bg: #484848; /* Original dark mode value */
107
+ --search-bar-text: #ffffff; /* Original dark mode value */
108
+ --search-bar-placeholder: #b4b4b4; /* Original dark mode value */
109
+ --search-bar-border: 1px solid transparent; /* transparent border for dark mode */
110
+ --search-bar-focus-border: #0090ff; /* blue9 - focus border color */
111
+ --search-bar-shadow: rgba(0, 0, 0, 0.21); /* Original dark mode value */
112
+ --search-bar-inset-shadow: rgba(
113
+ 255,
114
+ 255,
115
+ 255,
116
+ 0.1
117
+ ); /* Original dark mode value */
118
+
119
+ /* SearchResults colors */
120
+ --search-results-bg: #484848; /* Original dark mode value */
121
+ --search-results-border: none; /* no border for dark mode */
122
+ --search-results-shadow: rgba(0, 0, 0, 0.21); /* Original dark mode value */
123
+ --search-results-inset-shadow: rgba(
124
+ 255,
125
+ 255,
126
+ 255,
127
+ 0.1
128
+ ); /* Original dark mode value */
129
+
130
+ /* SearchResults subheader colors */
131
+ --search-subheader-bg: #5a5a5a; /* Original dark mode value */
132
+ --search-subheader-border: rgba(0, 0, 0, 0.25); /* Original dark mode value */
133
+ --search-subheader-text: #eeeeee; /* Original dark mode value */
134
+
135
+ /* SearchResults result colors */
136
+ --search-result-bg: #484848; /* Original dark mode value */
137
+ --search-result-hover-bg: rgba(
138
+ 255,
139
+ 255,
140
+ 255,
141
+ 0.05
142
+ ); /* Original dark mode value */
143
+ --search-result-border: rgba(
144
+ 255,
145
+ 255,
146
+ 255,
147
+ 0.12
148
+ ); /* Original dark mode value */
149
+ --search-result-text: #eeeeee; /* Original dark mode value */
150
+ --search-result-secondary-text: #b4b4b4; /* Original dark mode value */
151
+
152
+ /* SearchResults icon colors */
153
+ --search-icon-bg: #48484a; /* Original dark mode value */
154
+ --search-icon-border: #ffffff; /* Original dark mode value */
155
+
156
+ /* SearchResults footnote colors */
157
+ --search-footnote-bg: rgba(
158
+ 255,
159
+ 255,
160
+ 255,
161
+ 0.25
162
+ ); /* Original dark mode value */
163
+
164
+ /* SearchResults nothing found colors */
165
+ --search-nothing-text: #eeeeee; /* Original dark mode value */
166
+
167
+ /* SearchResults load more colors */
168
+ --search-load-more-bg: rgba(
169
+ 255,
170
+ 255,
171
+ 255,
172
+ 0.1
173
+ ); /* Original dark mode value */
174
+ --search-load-more-hover-bg: rgba(
175
+ 255,
176
+ 255,
177
+ 255,
178
+ 0.1
179
+ ); /* Original dark mode value */
180
+ --search-load-more-text: #eeeeee; /* Original dark mode value */
181
+
182
+ /* SearchResults highlight colors */
183
+ --search-highlight-bg: rgba(255, 214, 10, 0.5); /* Original dark mode value */
184
+
185
+ /* SearchResults overlay colors */
186
+ --search-overlay-bg: rgba(0, 0, 0, 0.7); /* Original dark mode value */
187
+ }
@@ -0,0 +1,8 @@
1
+ export interface SearchResult {
2
+ id: string;
3
+ icon?: string;
4
+ title: string;
5
+ description: string;
6
+ caption: string;
7
+ footnote: string;
8
+ }
@@ -0,0 +1,102 @@
1
+ /* Light theme */
2
+ :root {
3
+ /* Error */
4
+ --input-error-bg: #fef2f2;
5
+ --input-error-text: #dc2626;
6
+ --input-error-border: #fecaca;
7
+
8
+ /* Text */
9
+ --input-text-empty: #6b7280;
10
+ --input-text-filled: #1f2937;
11
+ --input-text-error: #dc2626;
12
+
13
+ /* Placeholder */
14
+ --input-placeholder: rgba(107, 114, 128, 0.5);
15
+ --input-placeholder-filled: rgba(107, 114, 128, 0.7);
16
+
17
+ /* Focus */
18
+ --input-focus-border: #0090ff;
19
+
20
+ /* Success */
21
+ --input-success-color: #30a46c;
22
+
23
+ /* Readonly */
24
+ --input-readonly-bg: #f4faff;
25
+ --input-readonly-text: #6b7280;
26
+ --input-readonly-border: #acd8fc;
27
+ --input-readonly-placeholder: rgba(107, 114, 128, 0.4);
28
+
29
+ /* Disabled */
30
+ --input-disabled-bg: #f9f9f9;
31
+ --input-disabled-text: #d9d9d9;
32
+ --input-disabled-border: #e1e5e9;
33
+ --input-disabled-placeholder: rgba(156, 163, 175, 0.5);
34
+
35
+ /* Default */
36
+ --input-background-normal: #ffffff;
37
+ --input-background-filled: #f0f0f0;
38
+ --input-border: 1px solid #d9d9d9;
39
+ --input-border-filled: rgba(0, 0, 0, 0.15);
40
+ --input-border-radius: 0.471rem;
41
+
42
+ --default-tag-border: #d1d5db;
43
+ --default-tag-border-radius: 0.375rem;
44
+ --default-tag-padding: 0.235rem 0.588rem;
45
+ --default-tag-font-size: 0.875rem;
46
+ --default-tag-font-weight: 400;
47
+ --default-tag-color: #1f2937;
48
+ --default-tag-background-color: #f3f4f6;
49
+ --default-tag-hover-background-color: #e5e7eb;
50
+ }
51
+
52
+ /* Dark theme */
53
+ .dark,
54
+ .dark-theme {
55
+ /* Error */
56
+ --input-error-bg: #3b1219;
57
+ --input-error-text: #ff9592;
58
+ --input-error-border: #500f1c;
59
+
60
+ /* Text */
61
+ --input-text-empty: #eeeeee;
62
+ --input-text-filled: black;
63
+ --input-text-error: #eeeeee;
64
+
65
+ /* Placeholder */
66
+ --input-placeholder: color-mix(in srgb, #eeeeee 50%, transparent);
67
+ --input-placeholder-filled: #484848;
68
+
69
+ /* Focus */
70
+ --input-focus-border: #0090ff;
71
+
72
+ /* Success */
73
+ --input-success-color: #30a46c;
74
+
75
+ /* Readonly */
76
+ --input-readonly-bg: #111927;
77
+ --input-readonly-text: #70b8ff;
78
+ --input-readonly-border: #0d2847;
79
+ --input-readonly-placeholder: rgba(156, 163, 175, 0.4);
80
+
81
+ /* Disabled */
82
+ --input-disabled-bg: #313131;
83
+ --input-disabled-text: #6e6e6e;
84
+ --input-disabled-border: #606060;
85
+ --input-disabled-placeholder: rgba(107, 114, 128, 0.5);
86
+
87
+ /* Default */
88
+ --input-background-normal: #484848;
89
+ --input-background-filled: #b4b4b4;
90
+ --input-border: 1px solid #606060;
91
+ --input-border-filled: #eeeeee;
92
+ --input-border-radius: 0.471rem;
93
+
94
+ --default-tag-border: #7b7b7b;
95
+ --default-tag-border-radius: 0.375rem;
96
+ --default-tag-padding: 0.235rem 0.588rem;
97
+ --default-tag-font-size: 0.875rem;
98
+ --default-tag-font-weight: 400;
99
+ --default-tag-color: #eeeeee;
100
+ --default-tag-background-color: #606060;
101
+ --default-tag-hover-background-color: #e5e7eb;
102
+ }
@@ -0,0 +1,383 @@
1
+ <script setup lang="ts">
2
+ import { ref, onMounted, nextTick, onUnmounted, watch, computed } from "vue";
3
+ import {
4
+ offset,
5
+ flip,
6
+ shift,
7
+ size,
8
+ computePosition,
9
+ autoUpdate,
10
+ } from "@floating-ui/vue";
11
+ import { icons, type IconKey } from "@umbra-ui/icons";
12
+ import "./theme.css";
13
+
14
+ export interface ActionMenuItem {
15
+ icon?: IconKey;
16
+ title: string;
17
+ action: () => void;
18
+ isDestructive?: boolean;
19
+ }
20
+
21
+ // Props
22
+ export interface Props {
23
+ items: ActionMenuItem[];
24
+ modelValue?: boolean;
25
+ contextMenu?: boolean;
26
+ }
27
+
28
+ const props = withDefaults(defineProps<Props>(), {
29
+ modelValue: false,
30
+ contextMenu: false,
31
+ });
32
+
33
+ // Emits
34
+ const emits = defineEmits<{
35
+ "update:modelValue": [value: boolean];
36
+ "item-click": [item: ActionMenuItem];
37
+ }>();
38
+
39
+ // State
40
+ const showPopover = ref<boolean>(props.modelValue || false);
41
+
42
+ // Watch for changes to modelValue prop
43
+ watch(
44
+ () => props.modelValue,
45
+ (newValue) => {
46
+ showPopover.value = newValue || false;
47
+ }
48
+ );
49
+
50
+ // Element references
51
+ const trigger = ref<HTMLElement | null>(null);
52
+ const popup = ref<HTMLElement | null>(null);
53
+ const overlay = ref<HTMLElement | null>(null);
54
+ const contextTrigger = ref<HTMLElement | null>(null);
55
+
56
+ // Position tracking
57
+ let cleanupAutoUpdate: (() => void) | null = null;
58
+
59
+ // Lifecycle
60
+ onUnmounted(() => {
61
+ if (cleanupAutoUpdate) {
62
+ cleanupAutoUpdate();
63
+ }
64
+ });
65
+
66
+ // Event handlers
67
+ const onItemClick = (item: ActionMenuItem) => {
68
+ item.action();
69
+ emits("item-click", item);
70
+ togglePopover();
71
+ };
72
+
73
+ const handleOverlayClick = () => {
74
+ togglePopover();
75
+ };
76
+
77
+ const handleContextMenu = (event: MouseEvent) => {
78
+ if (!props.contextMenu) return;
79
+
80
+ event.preventDefault();
81
+ event.stopPropagation();
82
+
83
+ // Store the clicked element's position for menu alignment
84
+ const clickedElement = event.currentTarget as HTMLElement;
85
+ const rect = clickedElement.getBoundingClientRect();
86
+
87
+ // Determine best placement based on available space
88
+ const viewportWidth = window.innerWidth;
89
+ const menuWidth = 200; // Approximate menu width
90
+ const rightSpace = viewportWidth - rect.right;
91
+ const leftSpace = rect.left;
92
+
93
+ // Prefer right placement if there's enough space, otherwise use left
94
+ const preferredPlacement = rightSpace >= menuWidth ? "right" : "left";
95
+
96
+ // Set the trigger position to align with the clicked element
97
+ if (contextTrigger.value) {
98
+ contextTrigger.value.style.position = "fixed";
99
+
100
+ if (preferredPlacement === "right") {
101
+ contextTrigger.value.style.left = `${rect.right}px`;
102
+ contextTrigger.value.style.top = `${rect.top}px`;
103
+ } else {
104
+ contextTrigger.value.style.left = `${rect.left}px`;
105
+ contextTrigger.value.style.top = `${rect.top}px`;
106
+ }
107
+
108
+ contextTrigger.value.style.width = "1px";
109
+ contextTrigger.value.style.height = `${rect.height}px`;
110
+ contextTrigger.value.style.pointerEvents = "none";
111
+ }
112
+
113
+ showPopover.value = true;
114
+ emits("update:modelValue", true);
115
+
116
+ nextTick(() => {
117
+ updatePopoverPosition(preferredPlacement);
118
+ });
119
+ };
120
+
121
+ // Helper function to get icon component
122
+ const getIconComponent = (iconKey: IconKey) => {
123
+ return icons[iconKey];
124
+ };
125
+
126
+ // Popover management
127
+ const togglePopover = () => {
128
+ showPopover.value = !showPopover.value;
129
+ emits("update:modelValue", showPopover.value);
130
+
131
+ if (showPopover.value) {
132
+ nextTick(() => {
133
+ updatePopoverPosition();
134
+ });
135
+ } else {
136
+ if (cleanupAutoUpdate) {
137
+ cleanupAutoUpdate();
138
+ cleanupAutoUpdate = null;
139
+ }
140
+ }
141
+ };
142
+
143
+ const updatePopoverPosition = async (contextPlacement?: string) => {
144
+ const positioningTrigger = props.contextMenu
145
+ ? contextTrigger.value
146
+ : trigger.value;
147
+ if (!positioningTrigger || !popup.value) return;
148
+
149
+ await nextTick();
150
+
151
+ if (cleanupAutoUpdate) {
152
+ cleanupAutoUpdate();
153
+ }
154
+
155
+ // Determine placement based on context
156
+ let placement: "bottom-start" | "bottom" | "right" | "left" = "bottom-start";
157
+ if (props.contextMenu && contextPlacement) {
158
+ placement = contextPlacement === "right" ? "right" : "left";
159
+ } else if (props.contextMenu) {
160
+ placement = "bottom";
161
+ }
162
+
163
+ cleanupAutoUpdate = autoUpdate(positioningTrigger, popup.value, () => {
164
+ computePosition(positioningTrigger!, popup.value!, {
165
+ placement,
166
+ middleware: [
167
+ offset(props.contextMenu ? 4 : 4),
168
+ flip(),
169
+ shift(),
170
+ size({
171
+ padding: 20,
172
+ apply({
173
+ availableWidth,
174
+ availableHeight,
175
+ elements,
176
+ }: {
177
+ availableWidth: number;
178
+ availableHeight: number;
179
+ elements: {
180
+ floating: {
181
+ style: {
182
+ maxWidth: string;
183
+ maxHeight: string;
184
+ };
185
+ };
186
+ };
187
+ }) {
188
+ Object.assign(elements.floating.style, {
189
+ maxWidth: `${availableWidth}px`,
190
+ maxHeight: `${availableHeight}px`,
191
+ });
192
+ },
193
+ }),
194
+ ],
195
+ }).then(({ x, y }) => {
196
+ if (popup.value) {
197
+ Object.assign(popup.value.style, {
198
+ left: `${x}px`,
199
+ top: `${y}px`,
200
+ });
201
+ }
202
+ });
203
+ });
204
+ };
205
+
206
+ // Expose togglePopover for external use
207
+ defineExpose({
208
+ togglePopover,
209
+ });
210
+ </script>
211
+
212
+ <template>
213
+ <div :class="$style.container">
214
+ <!-- Slot for the trigger button -->
215
+ <div
216
+ ref="trigger"
217
+ @click="!contextMenu && togglePopover()"
218
+ @contextmenu="handleContextMenu"
219
+ :class="[$style.trigger, { [$style.trigger_raised]: showPopover }]"
220
+ >
221
+ <slot />
222
+ </div>
223
+
224
+ <!-- Invisible trigger for context menu positioning -->
225
+ <div
226
+ v-if="contextMenu"
227
+ ref="contextTrigger"
228
+ :class="$style.context_trigger"
229
+ ></div>
230
+
231
+ <!-- Teleport the overlay and popup to body -->
232
+ <Teleport to="body">
233
+ <div
234
+ v-if="showPopover"
235
+ :class="[$style.overlay, { [$style.overlay_blur]: contextMenu }]"
236
+ ref="overlay"
237
+ @click="handleOverlayClick"
238
+ ></div>
239
+ <div v-if="showPopover" :class="$style.popup" ref="popup">
240
+ <div
241
+ v-for="item in items"
242
+ :key="`action-item-${item.title}`"
243
+ :class="[$style.item, { [$style.destructive]: item.isDestructive }]"
244
+ @click="onItemClick(item)"
245
+ >
246
+ <component
247
+ v-if="item.icon"
248
+ :is="getIconComponent(item.icon)"
249
+ :class="[
250
+ $style.item_icon,
251
+ { [$style.destructive_icon]: item.isDestructive },
252
+ ]"
253
+ />
254
+ <p
255
+ :class="[
256
+ 'subheadline',
257
+ item.isDestructive ? $style.destructive_text : '',
258
+ ]"
259
+ >
260
+ {{ item.title }}
261
+ </p>
262
+ </div>
263
+ </div>
264
+ </Teleport>
265
+ </div>
266
+ </template>
267
+
268
+ <style module>
269
+ .container {
270
+ display: inline-block;
271
+ }
272
+
273
+ .trigger {
274
+ position: relative;
275
+ transition: z-index 0s;
276
+ }
277
+
278
+ .trigger_raised {
279
+ z-index: 1001;
280
+ }
281
+
282
+ .context_trigger {
283
+ position: absolute;
284
+ width: 1px;
285
+ height: 1px;
286
+ opacity: 0;
287
+ pointer-events: none;
288
+ z-index: 1001;
289
+ }
290
+
291
+ .popup {
292
+ position: absolute;
293
+ top: 0;
294
+ left: 0;
295
+ background-color: var(--actionmenu-popup-bg);
296
+ border-radius: 0.353rem;
297
+ min-width: 9.412rem;
298
+ overflow: hidden;
299
+ z-index: 1002;
300
+ box-shadow: 0px 1px 0px 0px var(--actionmenu-popup-shadow),
301
+ inset 0px 1px 0px 0px var(--actionmenu-popup-inset-shadow);
302
+ animation: popupFadeIn 0.2s ease-out;
303
+ border: var(--actionmenu-popup-border);
304
+ }
305
+
306
+ @keyframes popupFadeIn {
307
+ from {
308
+ opacity: 0;
309
+ transform: translateY(-8px) scale(0.95);
310
+ }
311
+ to {
312
+ opacity: 1;
313
+ transform: translateY(0) scale(1);
314
+ }
315
+ }
316
+
317
+ .item {
318
+ min-height: 2rem;
319
+ border-bottom: 1px solid var(--actionmenu-item-border);
320
+ display: flex;
321
+ align-items: center;
322
+ gap: 0.882rem;
323
+ padding: 0.588rem;
324
+ cursor: pointer;
325
+ transition: background-color 0.2s ease;
326
+ color: var(--actionmenu-item-text);
327
+ }
328
+
329
+ .item:hover {
330
+ background-color: var(--actionmenu-item-hover-bg);
331
+ }
332
+
333
+ .item:hover .item_icon {
334
+ scale: 1.1;
335
+ }
336
+
337
+ .item:last-child {
338
+ border-bottom: 0;
339
+ }
340
+
341
+ .item_icon {
342
+ width: 1.25rem;
343
+ height: 1.25rem;
344
+ transition: 0.2s ease-in-out scale;
345
+ color: var(--actionmenu-item-icon);
346
+ }
347
+
348
+ .destructive_icon {
349
+ color: var(--actionmenu-destructive-icon);
350
+ }
351
+
352
+ .destructive_text {
353
+ color: var(--actionmenu-destructive-text) !important;
354
+ }
355
+
356
+ .overlay {
357
+ position: fixed;
358
+ top: 0;
359
+ left: 0;
360
+ width: 100%;
361
+ height: 100%;
362
+ background-color: var(--actionmenu-overlay-bg);
363
+ opacity: 0.7;
364
+ z-index: 999;
365
+ animation: overlayFadeIn 0.2s ease-out;
366
+ }
367
+
368
+ .overlay_blur {
369
+ background-color: var(--actionmenu-overlay-blur-bg);
370
+ backdrop-filter: blur(20px) saturate(180%);
371
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
372
+ opacity: 1;
373
+ }
374
+
375
+ @keyframes overlayFadeIn {
376
+ from {
377
+ opacity: 0;
378
+ }
379
+ to {
380
+ opacity: 0.7;
381
+ }
382
+ }
383
+ </style>