@umbra.ui/core 0.2.0 → 0.4.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 (61) hide show
  1. package/dist/components/controls/InlineDropdown/InlineDropdown.vue +290 -0
  2. package/dist/components/controls/InlineDropdown/README.md +35 -0
  3. package/dist/components/controls/InlineDropdown/theme.css +40 -0
  4. package/dist/components/dialogs/Alert/Alert.vue +122 -11
  5. package/dist/components/dialogs/Alert/theme.css +20 -0
  6. package/dist/components/dialogs/Toast/useToast.d.ts +1 -1
  7. package/dist/components/inputs/AutogrowRichTextView/AutogrowRichTextView.vue +128 -0
  8. package/dist/components/inputs/AutogrowRichTextView/README.md +86 -0
  9. package/dist/components/inputs/AutogrowRichTextView/editor.css +211 -0
  10. package/dist/components/inputs/AutogrowRichTextView/theme.css +28 -0
  11. package/dist/components/inputs/InputCryptoAddress/InputCryptoAddress.vue +512 -0
  12. package/dist/components/inputs/InputCryptoAddress/README.md +45 -0
  13. package/dist/components/inputs/InputCryptoAddress/theme.css +80 -0
  14. package/dist/components/inputs/Tags/TagBar.vue +7 -4
  15. package/dist/components/inputs/Tags/theme.css +4 -0
  16. package/dist/components/inputs/search/README.md +64 -736
  17. package/dist/components/inputs/search/SearchOverlay.vue +376 -0
  18. package/dist/components/inputs/search/SearchResultCell.vue +205 -0
  19. package/dist/components/inputs/search/theme.css +66 -21
  20. package/dist/components/inputs/search/types.d.ts +27 -5
  21. package/dist/components/inputs/search/types.d.ts.map +1 -1
  22. package/dist/components/inputs/search/types.ts +33 -5
  23. package/dist/components/menus/ActionMenu/ActionMenu.vue +29 -7
  24. package/dist/components/menus/ActionMenu/theme.css +1 -1
  25. package/dist/components/menus/ActionMenu/types.d.ts +9 -0
  26. package/dist/components/menus/ActionMenu/types.d.ts.map +1 -0
  27. package/dist/components/menus/ActionMenu/types.js +1 -0
  28. package/dist/components/menus/ActionMenu/types.ts +9 -0
  29. package/dist/components/models/Popover/Popover.vue +6 -84
  30. package/dist/css/umbra-ui.css +1 -0
  31. package/dist/index.d.ts +7 -3
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +5 -2
  34. package/package.json +21 -16
  35. package/src/components/controls/InlineDropdown/InlineDropdown.vue +290 -0
  36. package/src/components/controls/InlineDropdown/README.md +35 -0
  37. package/src/components/controls/InlineDropdown/theme.css +40 -0
  38. package/src/components/dialogs/Alert/Alert.vue +122 -11
  39. package/src/components/dialogs/Alert/theme.css +20 -0
  40. package/src/components/inputs/AutogrowRichTextView/AutogrowRichTextView.vue +128 -0
  41. package/src/components/inputs/AutogrowRichTextView/README.md +86 -0
  42. package/src/components/inputs/AutogrowRichTextView/editor.css +211 -0
  43. package/src/components/inputs/AutogrowRichTextView/theme.css +28 -0
  44. package/src/components/inputs/InputCryptoAddress/InputCryptoAddress.vue +512 -0
  45. package/src/components/inputs/InputCryptoAddress/README.md +45 -0
  46. package/src/components/inputs/InputCryptoAddress/theme.css +80 -0
  47. package/src/components/inputs/Tags/TagBar.vue +7 -4
  48. package/src/components/inputs/Tags/theme.css +4 -0
  49. package/src/components/inputs/search/README.md +64 -736
  50. package/src/components/inputs/search/SearchOverlay.vue +376 -0
  51. package/src/components/inputs/search/SearchResultCell.vue +205 -0
  52. package/src/components/inputs/search/theme.css +66 -21
  53. package/src/components/inputs/search/types.ts +33 -5
  54. package/src/components/menus/ActionMenu/ActionMenu.vue +29 -7
  55. package/src/components/menus/ActionMenu/theme.css +1 -1
  56. package/src/components/menus/ActionMenu/types.ts +9 -0
  57. package/src/components/models/Popover/Popover.vue +6 -84
  58. package/src/index.ts +13 -3
  59. package/src/vue.d.ts +7 -26
  60. package/src/components/inputs/search/SearchBar.vue +0 -394
  61. package/src/components/inputs/search/SearchResults.vue +0 -310
@@ -0,0 +1,128 @@
1
+ <script setup lang="ts">
2
+ import { computed, onBeforeUnmount, ref, watch } from "vue";
3
+ import { EditorContent, useEditor } from "@tiptap/vue-3";
4
+ import StarterKit from "@tiptap/starter-kit";
5
+ import { Markdown } from "@tiptap/markdown";
6
+ import Highlight from "@tiptap/extension-highlight";
7
+ import Placeholder from "@tiptap/extension-placeholder";
8
+ import Underline from "@tiptap/extension-underline";
9
+ import "./theme.css";
10
+ import "./editor.css";
11
+
12
+ export interface Props {
13
+ text?: string;
14
+ placeholder?: string;
15
+ }
16
+
17
+ const emit = defineEmits(["update:text", "onBlur"]);
18
+
19
+ const props = withDefaults(defineProps<Props>(), {
20
+ text: "",
21
+ placeholder: "Start writing...",
22
+ });
23
+
24
+ const isUpdatingFromProps = ref(false);
25
+
26
+ type MarkdownEditor = {
27
+ getJSON: () => unknown;
28
+ storage?: {
29
+ markdown?: {
30
+ getMarkdown?: () => string;
31
+ serialize?: (doc: unknown) => string;
32
+ };
33
+ };
34
+ };
35
+
36
+ const getMarkdownFromEditor = (activeEditor: MarkdownEditor) => {
37
+ const storage = activeEditor.storage?.markdown;
38
+ if (storage?.getMarkdown) {
39
+ return storage.getMarkdown();
40
+ }
41
+ if (storage?.serialize) {
42
+ return storage.serialize(activeEditor.getJSON());
43
+ }
44
+ return "";
45
+ };
46
+
47
+ const editor = useEditor({
48
+ content: props.text,
49
+ contentType: "markdown",
50
+ extensions: [
51
+ StarterKit,
52
+ Markdown,
53
+ Highlight,
54
+ Underline,
55
+ Placeholder.configure({
56
+ placeholder: props.placeholder,
57
+ }),
58
+ ],
59
+ editorProps: {
60
+ attributes: {
61
+ class: "tiptap",
62
+ spellcheck: "true",
63
+ },
64
+ },
65
+ onUpdate: ({ editor: activeEditor }: { editor: MarkdownEditor }) => {
66
+ if (isUpdatingFromProps.value) {
67
+ return;
68
+ }
69
+ const markdown = getMarkdownFromEditor(activeEditor);
70
+ emit("update:text", markdown);
71
+ },
72
+ onBlur: ({ editor: activeEditor }: { editor: MarkdownEditor }) => {
73
+ const markdown = getMarkdownFromEditor(activeEditor);
74
+ emit("onBlur", markdown);
75
+ },
76
+ });
77
+
78
+ const editorMarkdown = computed(() =>
79
+ editor.value ? getMarkdownFromEditor(editor.value) : ""
80
+ );
81
+
82
+ watch(
83
+ () => props.text,
84
+ (newValue) => {
85
+ if (!editor.value || newValue === editorMarkdown.value) {
86
+ return;
87
+ }
88
+ isUpdatingFromProps.value = true;
89
+ editor.value.commands.setContent(newValue, false, {
90
+ contentType: "markdown",
91
+ });
92
+ isUpdatingFromProps.value = false;
93
+ }
94
+ );
95
+
96
+ onBeforeUnmount(() => {
97
+ editor.value?.destroy();
98
+ });
99
+
100
+ const focusEditor = () => {
101
+ editor.value?.commands.focus();
102
+ };
103
+ </script>
104
+
105
+ <template>
106
+ <div :class="$style.container" @click="focusEditor">
107
+ <EditorContent :editor="editor" :class="$style.editor" />
108
+ </div>
109
+ </template>
110
+
111
+ <style module>
112
+ .container {
113
+ padding: var(--autogrow-padding, 1.176rem);
114
+ border-radius: var(--autogrow-border-radius, 0.706rem);
115
+ background-color: var(--autogrow-bg);
116
+ border: 1px solid var(--autogrow-border);
117
+ transition: border-color 0.2s ease-in-out;
118
+ cursor: text;
119
+ }
120
+
121
+ .container:has(.ProseMirror-focused) {
122
+ border-color: var(--autogrow-focus-border);
123
+ }
124
+
125
+ .editor {
126
+ width: 100%;
127
+ }
128
+ </style>
@@ -0,0 +1,86 @@
1
+ # AutogrowRichTextView
2
+
3
+ A rich text input component that supports Markdown, built with Vue 3 and Tiptap. The editor grows naturally with content and serializes to Markdown for storage or processing.
4
+
5
+ ## Installation/Import
6
+
7
+ ```typescript
8
+ import { AutogrowRichTextView } from "@umbra-ui/core";
9
+ ```
10
+
11
+ **Dependencies:**
12
+
13
+ - Vue 3.x
14
+ - @tiptap/vue-3
15
+ - @tiptap/starter-kit
16
+ - @tiptap/markdown
17
+ - @tiptap/extension-highlight
18
+ - @tiptap/extension-placeholder
19
+
20
+ ## Basic Usage
21
+
22
+ ```vue
23
+ <script setup lang="ts">
24
+ import { ref } from "vue";
25
+ import { AutogrowRichTextView } from "@umbra-ui/core";
26
+
27
+ const text = ref("# Hello\n\nThis is **markdown**.");
28
+ </script>
29
+
30
+ <template>
31
+ <AutogrowRichTextView v-model:text="text" />
32
+ </template>
33
+ ```
34
+
35
+ ## Props
36
+
37
+ | Prop Name | Type | Required | Default | Description |
38
+ | ------------- | -------- | -------- | -------------------- | ------------------------------------- |
39
+ | `text` | `string` | No | `""` | Markdown content for the editor |
40
+ | `placeholder` | `string` | No | `"Start writing..."` | Placeholder text displayed when empty |
41
+
42
+ ## Events
43
+
44
+ | Event Name | Payload Type | Description |
45
+ | ------------- | ------------ | ----------------------------------------- |
46
+ | `update:text` | `string` | Emitted when the markdown content changes |
47
+ | `onBlur` | `string` | Emitted when the editor loses focus |
48
+
49
+ ## Supported Markdown
50
+
51
+ - Headings
52
+ - Bold and italic
53
+ - Highlight, underline, and strikethrough
54
+ - Inline code and code blocks
55
+ - Ordered and unordered lists
56
+ - Blockquotes and horizontal rules
57
+
58
+ ## CSS Customization
59
+
60
+ The component uses CSS custom properties for easy theming:
61
+
62
+ ```css
63
+ /* Base colors */
64
+ --autogrow-bg: #ffffff;
65
+ --autogrow-border: #d9d9d9;
66
+ --autogrow-focus-border: #0090ff;
67
+ --autogrow-text-color: #202020;
68
+ --autogrow-placeholder-color: rgba(26, 29, 35, 0.5);
69
+
70
+ /* Layout */
71
+ --autogrow-padding: 1.176rem;
72
+ --autogrow-border-radius: 0.706rem;
73
+
74
+ /* Optional rich-text accents */
75
+ --autogrow-highlight-bg: rgba(255, 214, 10, 0.35);
76
+ --autogrow-code-bg: rgba(0, 0, 0, 0.08);
77
+ --autogrow-codeblock-bg: rgba(0, 0, 0, 0.08);
78
+ --autogrow-quote-border: rgba(0, 144, 255, 0.5);
79
+ --autogrow-divider: rgba(0, 0, 0, 0.12);
80
+ ```
81
+
82
+ ## Notes
83
+
84
+ - Markdown is parsed on load and serialized on update using `@tiptap/markdown`.
85
+ - The editor grows as content increases; no fixed height is applied.
86
+ - The container is clickable to focus the editor.
@@ -0,0 +1,211 @@
1
+ :root {
2
+ --autogrow-rt-strong: #b4232a;
3
+ --autogrow-rt-underline: #6f42c1;
4
+ --autogrow-rt-link: #0077a5;
5
+ --autogrow-rt-strike: rgba(0, 0, 0, 0.5);
6
+ --autogrow-rt-mark-bg: #fff2a8;
7
+ --autogrow-rt-mark-text: #202020;
8
+ --autogrow-rt-code-bg: #f2f2f2;
9
+ --autogrow-rt-code-border: #d0d0d0;
10
+ --autogrow-rt-code-text: #202020;
11
+ --autogrow-rt-pre-bg: #f2f2f2;
12
+ --autogrow-rt-pre-border: #d0d0d0;
13
+ --autogrow-rt-pre-text: #202020;
14
+ --autogrow-rt-quote-border: #2f9e61;
15
+ --autogrow-rt-quote-text: #5a5a5a;
16
+ --autogrow-rt-hr: #d0d0d0;
17
+ --autogrow-rt-h1: #1f2d5c;
18
+ --autogrow-rt-h2: #243a78;
19
+ --autogrow-rt-h3: #2c4aa8;
20
+ --autogrow-rt-h4: #1f6fa8;
21
+ --autogrow-rt-h5: #1b76c5;
22
+ --autogrow-rt-h6: #1e88e5;
23
+ --autogrow-rt-paragraph: #202020;
24
+ }
25
+
26
+ .dark,
27
+ .dark-theme {
28
+ --autogrow-rt-strong: #e5484d;
29
+ --autogrow-rt-underline: #d19dff;
30
+ --autogrow-rt-link: #00a2c7;
31
+ --autogrow-rt-strike: rgba(255, 255, 255, 0.5);
32
+ --autogrow-rt-mark-bg: #fef6baf6;
33
+ --autogrow-rt-mark-text: #000000;
34
+ --autogrow-rt-code-bg: #606060;
35
+ --autogrow-rt-code-border: #7b7b7b;
36
+ --autogrow-rt-code-text: #ffffff;
37
+ --autogrow-rt-pre-bg: #606060;
38
+ --autogrow-rt-pre-border: #7b7b7b;
39
+ --autogrow-rt-pre-text: #ffffff;
40
+ --autogrow-rt-quote-border: #30a46c;
41
+ --autogrow-rt-quote-text: #b4b4b4;
42
+ --autogrow-rt-hr: #7b7b7b;
43
+ --autogrow-rt-h1: #d6e1ff;
44
+ --autogrow-rt-h2: #9eb1ff;
45
+ --autogrow-rt-h3: #5472e4;
46
+ --autogrow-rt-h4: #c2e6ff;
47
+ --autogrow-rt-h5: #70b8ff;
48
+ --autogrow-rt-h6: #3b9eff;
49
+ --autogrow-rt-paragraph: #ffffff;
50
+ }
51
+
52
+ .tiptap {
53
+ min-height: 5.882rem;
54
+ width: 100%;
55
+ color: var(--autogrow-text-color);
56
+ outline: none;
57
+ word-break: break-word;
58
+ }
59
+
60
+ .tiptap > * + * {
61
+ margin-top: 0.706rem;
62
+ }
63
+
64
+ .tiptap p {
65
+ line-height: 1.5;
66
+ margin: 0;
67
+ }
68
+
69
+ .tiptap p.is-editor-empty:first-child::before {
70
+ color: var(--autogrow-placeholder-color);
71
+ content: attr(data-placeholder);
72
+ float: left;
73
+ height: 0;
74
+ pointer-events: none;
75
+ }
76
+
77
+ .tiptap strong {
78
+ font-weight: 700;
79
+ color: var(--autogrow-rt-strong);
80
+ }
81
+
82
+ .tiptap em {
83
+ font-style: italic;
84
+ }
85
+
86
+ .tiptap u {
87
+ text-decoration: underline;
88
+ text-decoration-color: var(--autogrow-rt-underline);
89
+ text-underline-offset: 0.118rem;
90
+ }
91
+
92
+ .tiptap a {
93
+ color: var(--autogrow-rt-link);
94
+ opacity: 1;
95
+ }
96
+
97
+ .tiptap s {
98
+ text-decoration: line-through;
99
+ color: var(--autogrow-rt-strike);
100
+ }
101
+
102
+ .tiptap mark {
103
+ background-color: var(--autogrow-rt-mark-bg);
104
+ color: var(--autogrow-rt-mark-text);
105
+ padding: 0.118rem 0.235rem;
106
+ }
107
+
108
+ .tiptap code {
109
+ background-color: var(--autogrow-rt-code-bg);
110
+ border: 1px solid var(--autogrow-rt-code-border);
111
+ border-radius: 0.235rem;
112
+ font-family: "JetBrains Mono";
113
+ font-weight: normal;
114
+ font-size: 0.882rem;
115
+ color: var(--autogrow-rt-code-text);
116
+ padding: 0.118rem 0.235rem;
117
+ }
118
+
119
+ .tiptap pre {
120
+ background-color: var(--autogrow-rt-pre-bg);
121
+ border: 1px solid var(--autogrow-rt-pre-border);
122
+ border-radius: 0.706rem;
123
+ font-family: "JetBrains Mono";
124
+ font-weight: normal;
125
+ font-size: 1rem;
126
+ color: var(--autogrow-rt-pre-text);
127
+ padding: 0.882rem;
128
+ overflow-x: auto;
129
+ }
130
+
131
+ .tiptap pre code {
132
+ background: none;
133
+ color: inherit;
134
+ font-family: "JetBrains Mono";
135
+ font-weight: normal;
136
+ padding: 0;
137
+ font-size: inherit;
138
+ border: none;
139
+ }
140
+
141
+ .tiptap ul,
142
+ .tiptap ol {
143
+ padding-left: 1.176rem;
144
+ }
145
+
146
+ .tiptap ul {
147
+ list-style: disc;
148
+ }
149
+
150
+ .tiptap ol {
151
+ list-style: decimal;
152
+ }
153
+
154
+ .tiptap blockquote {
155
+ border-left: 0.176rem solid var(--autogrow-rt-quote-border);
156
+ margin: 0;
157
+ margin-top: 0.706rem;
158
+ padding-left: 0.706rem;
159
+ color: var(--autogrow-rt-quote-text);
160
+ opacity: 0.85;
161
+ }
162
+
163
+ .tiptap hr {
164
+ border: none;
165
+ border-top: 1px solid var(--autogrow-rt-hr);
166
+ margin: 1.176rem 0;
167
+ }
168
+
169
+ .tiptap h1,
170
+ .tiptap h2,
171
+ .tiptap h3,
172
+ .tiptap h4,
173
+ .tiptap h5,
174
+ .tiptap h6 {
175
+ font-weight: 600;
176
+ }
177
+
178
+ .tiptap h1 {
179
+ font-size: 1.765rem;
180
+ color: var(--autogrow-rt-h1);
181
+ }
182
+
183
+ .tiptap h2 {
184
+ font-size: 1.471rem;
185
+ color: var(--autogrow-rt-h2);
186
+ }
187
+
188
+ .tiptap h3 {
189
+ font-size: 1.235rem;
190
+ color: var(--autogrow-rt-h3);
191
+ }
192
+
193
+ .tiptap h4 {
194
+ font-size: 1.118rem;
195
+ color: var(--autogrow-rt-h4);
196
+ }
197
+
198
+ .tiptap h5 {
199
+ font-size: 1rem;
200
+ color: var(--autogrow-rt-h5);
201
+ }
202
+
203
+ .tiptap h6 {
204
+ font-size: 0.941rem;
205
+ color: var(--autogrow-rt-h6);
206
+ }
207
+
208
+ .tiptap p {
209
+ line-height: 1.7;
210
+ color: var(--autogrow-rt-paragraph);
211
+ }
@@ -0,0 +1,28 @@
1
+ /* Light theme */
2
+ :root {
3
+ /* AutogrowTextView colors - using primary/default values from original */
4
+ --autogrow-bg: #ffffff;
5
+ --autogrow-border: #d9d9d9;
6
+ --autogrow-focus-border: #0090ff;
7
+ --autogrow-text-color: #202020;
8
+ --autogrow-placeholder-color: rgba(26, 29, 35, 0.5);
9
+
10
+ /* Customizable properties */
11
+ --autogrow-padding: 1.176rem;
12
+ --autogrow-border-radius: 0.706rem;
13
+ }
14
+
15
+ /* Dark theme */
16
+ .dark,
17
+ .dark-theme {
18
+ /* AutogrowTextView colors - using primary/default values from original */
19
+ --autogrow-bg: #484848;
20
+ --autogrow-border: #606060;
21
+ --autogrow-focus-border: #0090ff;
22
+ --autogrow-text-color: #eeeeee;
23
+ --autogrow-placeholder-color: rgba(238, 238, 238, 0.5);
24
+
25
+ /* Customizable properties */
26
+ --autogrow-padding: 1.176rem;
27
+ --autogrow-border-radius: 0.706rem;
28
+ }