@umbra.ui/core 0.1.17 → 0.1.19

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 (146) hide show
  1. package/dist/components/controls/Button/Button.vue +417 -0
  2. package/dist/components/controls/Button/README.md +348 -0
  3. package/dist/components/controls/Button/theme.css +200 -0
  4. package/dist/components/controls/Checkbox/Checkbox.vue +164 -0
  5. package/dist/components/controls/Checkbox/README.md +441 -0
  6. package/dist/components/controls/Checkbox/theme.css +36 -0
  7. package/dist/components/controls/Dropdown/Dropdown.vue +476 -0
  8. package/dist/components/controls/Dropdown/README.md +370 -0
  9. package/dist/components/controls/Dropdown/theme.css +50 -0
  10. package/dist/components/controls/Dropdown/types.ts +6 -0
  11. package/dist/components/controls/IconButton/IconButton.vue +267 -0
  12. package/dist/components/controls/IconButton/README.md +502 -0
  13. package/dist/components/controls/IconButton/theme.css +89 -0
  14. package/dist/components/controls/Radio/README.md +591 -0
  15. package/dist/components/controls/Radio/Radio.vue +89 -0
  16. package/dist/components/controls/Radio/theme.css +14 -0
  17. package/dist/components/controls/RangeSlider/README.md +608 -0
  18. package/dist/components/controls/RangeSlider/RangeSlider.vue +535 -0
  19. package/dist/components/controls/RangeSlider/theme.css +80 -0
  20. package/dist/components/controls/SegmentedControl/README.md +587 -0
  21. package/dist/components/controls/SegmentedControl/SegmentedControl.vue +284 -0
  22. package/dist/components/controls/SegmentedControl/theme.css +60 -0
  23. package/dist/components/controls/SegmentedControl/types.ts +5 -0
  24. package/dist/components/controls/Slider/README.md +627 -0
  25. package/dist/components/controls/Slider/Slider.vue +260 -0
  26. package/dist/components/controls/Slider/theme.css +74 -0
  27. package/dist/components/controls/Stepper/README.md +601 -0
  28. package/dist/components/controls/Stepper/Stepper.vue +103 -0
  29. package/dist/components/controls/Stepper/theme.css +53 -0
  30. package/dist/components/controls/Switch/README.md +667 -0
  31. package/dist/components/controls/Switch/Switch.vue +127 -0
  32. package/dist/components/controls/Switch/theme.css +42 -0
  33. package/dist/components/dialogs/Alert/Alert.vue +218 -0
  34. package/dist/components/dialogs/Alert/README.md +450 -0
  35. package/dist/components/dialogs/Alert/theme.css +44 -0
  36. package/dist/components/dialogs/Alert/types.ts +11 -0
  37. package/dist/components/dialogs/Toast/README.md +522 -0
  38. package/dist/components/dialogs/Toast/Toast.vue +296 -0
  39. package/dist/components/dialogs/Toast/ToastContainer.vue +330 -0
  40. package/dist/components/dialogs/Toast/theme.css +44 -0
  41. package/dist/components/dialogs/Toast/types.ts +46 -0
  42. package/dist/components/dialogs/Toast/useToast.ts +127 -0
  43. package/dist/components/indicators/ProgressBar/ProgressBar.vue +98 -0
  44. package/dist/components/indicators/ProgressBar/README.md +744 -0
  45. package/dist/components/indicators/ProgressBar/theme.css +36 -0
  46. package/dist/components/indicators/Tooltip/README.md +723 -0
  47. package/dist/components/indicators/Tooltip/TooltipProvider.vue +142 -0
  48. package/dist/components/indicators/Tooltip/theme.css +18 -0
  49. package/dist/components/indicators/Tooltip/tooltip.ts +48 -0
  50. package/dist/components/indicators/Tooltip/types.ts +15 -0
  51. package/dist/components/indicators/Tooltip/useTooltip.ts +71 -0
  52. package/dist/components/inputs/AutogrowTextView/AutogrowTextView.vue +110 -0
  53. package/dist/components/inputs/AutogrowTextView/README.md +643 -0
  54. package/dist/components/inputs/AutogrowTextView/theme.css +28 -0
  55. package/dist/components/inputs/InputCard/InputCard.vue +600 -0
  56. package/dist/components/inputs/InputCard/README.md +636 -0
  57. package/dist/components/inputs/InputEmail/InputEmail.vue +698 -0
  58. package/dist/components/inputs/InputEmail/README.md +764 -0
  59. package/dist/components/inputs/InputNumber/InputNumber.vue +300 -0
  60. package/dist/components/inputs/InputNumber/README.md +749 -0
  61. package/dist/components/inputs/InputPhone/InputPhone.vue +645 -0
  62. package/dist/components/inputs/InputPhone/README.md +636 -0
  63. package/dist/components/inputs/InputSecure/InputSecure.vue +646 -0
  64. package/dist/components/inputs/InputSecure/README.md +771 -0
  65. package/dist/components/inputs/InputText/InputText.vue +225 -0
  66. package/dist/components/inputs/InputText/README.md +844 -0
  67. package/dist/components/inputs/OTP/OTP.vue +349 -0
  68. package/dist/components/inputs/OTP/README.md +736 -0
  69. package/dist/components/inputs/OTP/theme.css +50 -0
  70. package/dist/components/inputs/StringCapture/README.md +718 -0
  71. package/dist/components/inputs/StringCapture/StringCapture.vue +315 -0
  72. package/dist/components/inputs/StringCapture/theme.css +86 -0
  73. package/dist/components/inputs/Tags/README.md +897 -0
  74. package/dist/components/inputs/Tags/TagBar.vue +793 -0
  75. package/dist/components/inputs/Tags/TagCreation.vue +219 -0
  76. package/dist/components/inputs/Tags/TagPicker.vue +380 -0
  77. package/dist/components/inputs/Tags/tag-bar-styles.ts +354 -0
  78. package/dist/components/inputs/Tags/theme.css +121 -0
  79. package/dist/components/inputs/Tags/types.ts +346 -0
  80. package/dist/components/inputs/search/README.md +759 -0
  81. package/dist/components/inputs/search/SearchBar.vue +394 -0
  82. package/dist/components/inputs/search/SearchResults.vue +310 -0
  83. package/dist/components/inputs/search/theme.css +187 -0
  84. package/dist/components/inputs/search/types.ts +8 -0
  85. package/dist/components/inputs/theme.css +102 -0
  86. package/dist/components/menus/ActionMenu/ActionMenu.vue +383 -0
  87. package/dist/components/menus/ActionMenu/README.md +825 -0
  88. package/dist/components/menus/ActionMenu/theme.css +93 -0
  89. package/dist/components/models/Popover/Popover.vue +551 -0
  90. package/dist/components/models/Popover/README.md +885 -0
  91. package/dist/components/models/Popover/theme.css +52 -0
  92. package/dist/components/models/Sheet/README.md +1159 -0
  93. package/dist/components/models/Sheet/Sheet.vue +465 -0
  94. package/dist/components/models/Sheet/theme.css +72 -0
  95. package/dist/components/models/Sidebar/README.md +1228 -0
  96. package/dist/components/models/Sidebar/Sidebar.vue +480 -0
  97. package/dist/components/models/Sidebar/theme.css +90 -0
  98. package/dist/components/navigation/adaptive/AdaptiveLayout.vue +779 -0
  99. package/dist/components/navigation/adaptive/AdaptiveLayoutBreadcrumbs.vue +192 -0
  100. package/dist/components/navigation/adaptive/AdaptiveLayoutMenuButton.vue +149 -0
  101. package/dist/components/navigation/adaptive/README.md +768 -0
  102. package/dist/components/navigation/adaptive/types.ts +19 -0
  103. package/dist/components/navigation/adaptive/useAdaptiveLayout.ts +89 -0
  104. package/dist/components/navigation/adaptive/useBreakpoints.ts +41 -0
  105. package/dist/components/navigation/adaptive/useContainerMonitor.ts +214 -0
  106. package/dist/components/navigation/adaptive/useViewAnimation.ts +721 -0
  107. package/dist/components/navigation/adaptive/useViewResize.ts +211 -0
  108. package/dist/components/navigation/navstack/NavigationStack.vue +180 -0
  109. package/dist/components/navigation/navstack/README.md +994 -0
  110. package/dist/components/navigation/navstack/useNavigationStack.ts +164 -0
  111. package/dist/components/navigation/slideover/README.md +1275 -0
  112. package/dist/components/navigation/slideover/SlideoverController.vue +287 -0
  113. package/dist/components/navigation/slideover/useSlideoverController.ts +320 -0
  114. package/dist/components/navigation/splitview/README.md +1115 -0
  115. package/dist/components/navigation/splitview/SplitViewController.vue +176 -0
  116. package/dist/components/navigation/splitview/useSplitViewController.ts +388 -0
  117. package/dist/components/navigation/tabcontroller/README.md +919 -0
  118. package/dist/components/navigation/tabcontroller/TabController.vue +307 -0
  119. package/dist/components/navigation/tabcontroller/TabItem.vue +57 -0
  120. package/dist/components/navigation/tabcontroller/types.ts +24 -0
  121. package/dist/components/navigation/tabcontroller/useTabController.ts +18 -0
  122. package/dist/components/navigation/theme.css +91 -0
  123. package/dist/components/navigation/types.ts +7 -0
  124. package/dist/components/pickers/CollectionPicker/CollectionPicker.vue +398 -0
  125. package/dist/components/pickers/CollectionPicker/README.md +1115 -0
  126. package/dist/components/pickers/CollectionPicker/theme.css +14 -0
  127. package/dist/components/pickers/CollectionPicker/types.ts +11 -0
  128. package/dist/components/pickers/ColorPicker/ColorPicker.vue +376 -0
  129. package/dist/components/pickers/ColorPicker/README.md +1439 -0
  130. package/dist/components/pickers/ColorPicker/colors.ts +299 -0
  131. package/dist/components/pickers/ColorPicker/theme.css +32 -0
  132. package/dist/components/pickers/DatePicker/DatePicker.vue +660 -0
  133. package/dist/components/pickers/DatePicker/README.md +1195 -0
  134. package/dist/components/pickers/DatePicker/theme.css +22 -0
  135. package/dist/components/pickers/FilePicker/FilePicker.vue +534 -0
  136. package/dist/components/pickers/FilePicker/README.md +1542 -0
  137. package/dist/components/pickers/FilePicker/theme.css +48 -0
  138. package/dist/components/pickers/FilePicker/types.ts +10 -0
  139. package/dist/components/pickers/IconPicker/IconPicker.vue +327 -0
  140. package/dist/components/pickers/IconPicker/README.md +1161 -0
  141. package/dist/components/pickers/IconPicker/theme.css +28 -0
  142. package/dist/components/pickers/theme.css +82 -0
  143. package/dist/components/views/MarkdownViewer/MarkdownViewer.vue +442 -0
  144. package/dist/components/views/MarkdownViewer/README.md +833 -0
  145. package/dist/components/views/MarkdownViewer/theme.css +130 -0
  146. package/package.json +4 -3
@@ -0,0 +1,142 @@
1
+ // components/TooltipProvider.vue
2
+ <script setup lang="ts">
3
+ import { ref, onMounted, nextTick, onUnmounted, watch } from "vue";
4
+ import { useTooltipProvider } from "./useTooltip";
5
+ import {
6
+ offset,
7
+ flip,
8
+ shift,
9
+ computePosition,
10
+ autoUpdate,
11
+ } from "@floating-ui/vue";
12
+ import "./theme.css";
13
+
14
+ // Element references
15
+ const tooltip = ref<HTMLElement | null>(null);
16
+
17
+ // Position tracking
18
+ let cleanupAutoUpdate: (() => void) | null = null;
19
+
20
+ // Get tooltip state from provider
21
+ const { tooltipState } = useTooltipProvider();
22
+
23
+ // Lifecycle
24
+ onUnmounted(() => {
25
+ if (cleanupAutoUpdate) {
26
+ cleanupAutoUpdate();
27
+ }
28
+ });
29
+
30
+ // Update position when tooltip becomes visible
31
+ const updateTooltipPosition = async () => {
32
+ if (!tooltipState.targetElement || !tooltip.value || !tooltipState.isVisible)
33
+ return;
34
+
35
+ await nextTick();
36
+
37
+ if (cleanupAutoUpdate) {
38
+ cleanupAutoUpdate();
39
+ }
40
+
41
+ cleanupAutoUpdate = autoUpdate(
42
+ tooltipState.targetElement,
43
+ tooltip.value,
44
+ () => {
45
+ computePosition(tooltipState.targetElement!, tooltip.value!, {
46
+ placement: tooltipState.placement,
47
+ middleware: [offset(tooltipState.offset), flip(), shift()],
48
+ }).then(({ x, y }) => {
49
+ if (tooltip.value) {
50
+ Object.assign(tooltip.value.style, {
51
+ left: `${x}px`,
52
+ top: `${y}px`,
53
+ });
54
+ }
55
+ });
56
+ }
57
+ );
58
+ };
59
+
60
+ // Watch for visibility changes
61
+ const watchVisibility = () => {
62
+ if (tooltipState.isVisible) {
63
+ nextTick(() => {
64
+ updateTooltipPosition();
65
+ });
66
+ } else {
67
+ if (cleanupAutoUpdate) {
68
+ cleanupAutoUpdate();
69
+ cleanupAutoUpdate = null;
70
+ }
71
+ }
72
+ };
73
+
74
+ // Watch for target element changes
75
+ const watchTargetElement = () => {
76
+ if (tooltipState.targetElement && tooltipState.isVisible) {
77
+ nextTick(() => {
78
+ updateTooltipPosition();
79
+ });
80
+ }
81
+ };
82
+
83
+ // Set up watchers
84
+ onMounted(() => {
85
+ watchVisibility();
86
+ watchTargetElement();
87
+ });
88
+
89
+ // Watch for state changes
90
+ watch(
91
+ () => tooltipState.isVisible,
92
+ () => {
93
+ watchVisibility();
94
+ }
95
+ );
96
+
97
+ watch(
98
+ () => tooltipState.targetElement,
99
+ () => {
100
+ watchTargetElement();
101
+ }
102
+ );
103
+ </script>
104
+
105
+ <template>
106
+ <Teleport to="body">
107
+ <Transition name="tooltip">
108
+ <div
109
+ v-if="tooltipState.isVisible"
110
+ :class="$style.tooltip"
111
+ ref="tooltip"
112
+ style="position: absolute; z-index: 9999"
113
+ >
114
+ <p class="caption">{{ tooltipState.content }}</p>
115
+ </div>
116
+ </Transition>
117
+ </Teleport>
118
+ </template>
119
+
120
+ <style module>
121
+ .tooltip {
122
+ background: var(--tooltip-bg);
123
+ padding: 0.118rem 0.471rem;
124
+ border-radius: 0.176rem;
125
+ white-space: nowrap;
126
+ pointer-events: none;
127
+ }
128
+ .tooltip p {
129
+ margin: 0;
130
+ color: var(--tooltip-text);
131
+ }
132
+
133
+ .tooltip-enter-active,
134
+ .tooltip-leave-active {
135
+ transition: opacity 0.2s ease;
136
+ }
137
+
138
+ .tooltip-enter-from,
139
+ .tooltip-leave-to {
140
+ opacity: 0;
141
+ }
142
+ </style>
@@ -0,0 +1,18 @@
1
+ /* Light theme using Colors */
2
+ :root {
3
+ /* Tooltip background colors */
4
+ --tooltip-bg: #f0f2f4; /* gray3 - light background for light mode */
5
+
6
+ /* Tooltip text colors */
7
+ --tooltip-text: #1a1d23; /* gray12 - dark text for light mode */
8
+ }
9
+
10
+ /* Dark theme */
11
+ .dark,
12
+ .dark-theme {
13
+ /* Tooltip background colors */
14
+ --tooltip-bg: #b4b4b4; /* Original dark mode value */
15
+
16
+ /* Tooltip text colors */
17
+ --tooltip-text: #000000; /* black - text for dark mode */
18
+ }
@@ -0,0 +1,48 @@
1
+ // directives/tooltip.ts
2
+ import { Directive, DirectiveBinding } from "vue";
3
+ import { useTooltip } from "./useTooltip";
4
+ import type { TooltipConfig } from "./types";
5
+
6
+ interface TooltipElement extends HTMLElement {
7
+ _tooltipCleanup?: () => void;
8
+ }
9
+
10
+ export const vTooltip: Directive = {
11
+ mounted(el: TooltipElement, binding: DirectiveBinding) {
12
+ const config: TooltipConfig =
13
+ typeof binding.value === "string"
14
+ ? { content: binding.value }
15
+ : binding.value;
16
+
17
+ if (config && config.content) {
18
+ const { bindTooltip } = useTooltip(config);
19
+ el._tooltipCleanup = bindTooltip(el);
20
+ }
21
+ },
22
+
23
+ updated(el: TooltipElement, binding: DirectiveBinding) {
24
+ // Clean up old tooltip
25
+ if (el._tooltipCleanup) {
26
+ el._tooltipCleanup();
27
+ delete el._tooltipCleanup;
28
+ }
29
+
30
+ // Set up new tooltip if value exists
31
+ const config: TooltipConfig =
32
+ typeof binding.value === "string"
33
+ ? { content: binding.value }
34
+ : binding.value;
35
+
36
+ if (config && config.content) {
37
+ const { bindTooltip } = useTooltip(config);
38
+ el._tooltipCleanup = bindTooltip(el);
39
+ }
40
+ },
41
+
42
+ unmounted(el: TooltipElement) {
43
+ if (el._tooltipCleanup) {
44
+ el._tooltipCleanup();
45
+ delete el._tooltipCleanup;
46
+ }
47
+ },
48
+ };
@@ -0,0 +1,15 @@
1
+ // types.ts
2
+ export interface TooltipConfig {
3
+ content: string;
4
+ placement?: "top" | "bottom" | "left" | "right";
5
+ delay?: number;
6
+ offset?: number;
7
+ }
8
+
9
+ export interface TooltipState {
10
+ isVisible: boolean;
11
+ content: string;
12
+ targetElement: HTMLElement | null;
13
+ placement: TooltipConfig["placement"];
14
+ offset: number;
15
+ }
@@ -0,0 +1,71 @@
1
+ import { reactive } from "vue";
2
+ import { TooltipConfig, TooltipState } from "./types";
3
+
4
+ const tooltipState = reactive<TooltipState>({
5
+ isVisible: false,
6
+ content: "",
7
+ targetElement: null,
8
+ placement: "top",
9
+ offset: 2,
10
+ });
11
+
12
+ export const useTooltipProvider = () => {
13
+ const showTooltip = async (element: HTMLElement, config: TooltipConfig) => {
14
+ tooltipState.content = config.content;
15
+ tooltipState.placement = config.placement || "top";
16
+ tooltipState.offset = config.offset || 2;
17
+ tooltipState.targetElement = element;
18
+
19
+ setTimeout(() => {
20
+ tooltipState.isVisible = true;
21
+ }, config.delay || 1000);
22
+ };
23
+
24
+ const hideTooltip = () => {
25
+ tooltipState.isVisible = false;
26
+ };
27
+
28
+ return {
29
+ tooltipState,
30
+ showTooltip,
31
+ hideTooltip,
32
+ };
33
+ };
34
+
35
+ export const useTooltip = (config: TooltipConfig) => {
36
+ const { showTooltip, hideTooltip } = useTooltipProvider();
37
+
38
+ const bindTooltip = (element: HTMLElement | any) => {
39
+ // Handle Vue component instances
40
+ let actualElement = element;
41
+
42
+ // If it's a Vue component instance, try to get the root element
43
+ if (element && element.$el) {
44
+ actualElement = element.$el;
45
+ }
46
+
47
+ // Safety check to ensure element is an HTMLElement
48
+ if (!actualElement || !(actualElement instanceof HTMLElement)) {
49
+ console.error("bindTooltip: Invalid element provided", element);
50
+ return () => {}; // Return empty cleanup function
51
+ }
52
+
53
+ const handleMouseEnter = () => showTooltip(actualElement, config);
54
+ const handleMouseLeave = () => hideTooltip();
55
+
56
+ actualElement.addEventListener("mouseenter", handleMouseEnter);
57
+ actualElement.addEventListener("mouseleave", handleMouseLeave);
58
+
59
+ // Return cleanup function
60
+ return () => {
61
+ actualElement.removeEventListener("mouseenter", handleMouseEnter);
62
+ actualElement.removeEventListener("mouseleave", handleMouseLeave);
63
+ };
64
+ };
65
+
66
+ return {
67
+ bindTooltip,
68
+ showTooltip: (element: HTMLElement) => showTooltip(element, config),
69
+ hideTooltip,
70
+ };
71
+ };
@@ -0,0 +1,110 @@
1
+ <script setup lang="ts">
2
+ import { ref, onMounted, onBeforeUnmount, watch } from "vue";
3
+ import autosize from "autosize";
4
+ import "./theme.css";
5
+
6
+ export interface Props {
7
+ text?: string;
8
+ placeholder?: string;
9
+ fontStyle?: string;
10
+ }
11
+
12
+ const emit = defineEmits(["update:text", "onBlur"]);
13
+
14
+ const props = withDefaults(defineProps<Props>(), {
15
+ text: "",
16
+ placeholder: "Type Here...",
17
+ fontStyle: "body",
18
+ });
19
+
20
+ // Reference for the textarea
21
+ const autosizeTextarea = ref<HTMLTextAreaElement | null>(null);
22
+ const internalText = ref("");
23
+
24
+ watch(
25
+ () => props.text,
26
+ (newValue) => {
27
+ internalText.value = newValue;
28
+ setTimeout(() => {
29
+ if (autosizeTextarea.value) {
30
+ autosize.update(autosizeTextarea.value);
31
+ }
32
+ }, 10);
33
+ }
34
+ );
35
+
36
+ // Watch for local text changes and emit updates
37
+ watch(internalText, (newValue) => {
38
+ emit("update:text", newValue);
39
+ });
40
+
41
+ // Setup autosize on mounted and cleanup on unmount
42
+ onMounted(() => {
43
+ internalText.value = props.text;
44
+ if (autosizeTextarea.value) {
45
+ autosize(autosizeTextarea.value);
46
+ }
47
+ });
48
+
49
+ onBeforeUnmount(() => {
50
+ if (autosizeTextarea.value) {
51
+ autosize.destroy(autosizeTextarea.value);
52
+ }
53
+ });
54
+
55
+ const onBlur = () => {
56
+ emit("onBlur", internalText.value);
57
+ };
58
+
59
+ const focusTextArea = () => {
60
+ if (autosizeTextarea.value) {
61
+ autosizeTextarea.value.focus();
62
+ }
63
+ };
64
+ </script>
65
+
66
+ <template>
67
+ <div :class="$style.container" @click="focusTextArea">
68
+ <textarea
69
+ :class="[$style.textview, props.fontStyle]"
70
+ v-model="internalText"
71
+ ref="autosizeTextarea"
72
+ :placeholder="placeholder"
73
+ @blur="onBlur"
74
+ ></textarea>
75
+ </div>
76
+ </template>
77
+
78
+ <style module>
79
+ .container {
80
+ padding: var(--autogrow-padding, 1.176rem);
81
+ border-radius: var(--autogrow-border-radius, 0.706rem);
82
+ background-color: var(--autogrow-bg);
83
+ border: 1px solid var(--autogrow-border);
84
+ transition: border-color 0.2s ease-in-out;
85
+ cursor: text;
86
+ }
87
+
88
+ .container:has(.textview:focus) {
89
+ border-color: var(--autogrow-focus-border);
90
+ }
91
+
92
+ .textview {
93
+ width: 100%;
94
+ border: none;
95
+ outline: none;
96
+ background-color: transparent;
97
+ color: var(--autogrow-text-color);
98
+ resize: none;
99
+ font-family: inherit;
100
+ }
101
+
102
+ .textview::placeholder {
103
+ color: var(--autogrow-placeholder-color);
104
+ }
105
+
106
+ .textview:focus {
107
+ outline: none;
108
+ border: none;
109
+ }
110
+ </style>