@dryui/ui 0.1.2 → 0.1.4

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 (79) hide show
  1. package/dist/accordion/accordion-trigger.svelte +5 -6
  2. package/dist/alert-dialog/alert-dialog-action.svelte +42 -6
  3. package/dist/alert-dialog/alert-dialog-cancel.svelte +44 -5
  4. package/dist/alert-dialog/alert-dialog-footer.svelte +3 -2
  5. package/dist/aurora/aurora.svelte.d.ts +6 -0
  6. package/dist/beam/beam.svelte +17 -10
  7. package/dist/button/button.svelte +51 -1
  8. package/dist/button-group/button-group.svelte +7 -62
  9. package/dist/button-group/context.svelte.d.ts +5 -0
  10. package/dist/button-group/context.svelte.js +11 -0
  11. package/dist/chromatic-aberration/chromatic-aberration.svelte +60 -18
  12. package/dist/collapsible/collapsible-trigger.svelte +4 -7
  13. package/dist/color-picker/color-picker-eyedropper.svelte +4 -11
  14. package/dist/combobox/combobox-group.svelte +1 -1
  15. package/dist/data-grid/data-grid-pagination.svelte +20 -2
  16. package/dist/data-grid/data-grid-root.svelte +1 -0
  17. package/dist/date-field/date-field-root.svelte +66 -20
  18. package/dist/date-field/date-field-segment.svelte +11 -9
  19. package/dist/date-field/date-field-separator.svelte +9 -1
  20. package/dist/date-picker/datepicker-calendar.svelte +168 -13
  21. package/dist/date-picker/datepicker-trigger.svelte +3 -8
  22. package/dist/date-range-picker/date-range-picker-calendar.svelte +177 -13
  23. package/dist/date-range-picker/date-range-picker-root.svelte +0 -6
  24. package/dist/date-range-picker/date-range-picker-trigger.svelte +18 -12
  25. package/dist/dialog/dialog-content.svelte +1 -0
  26. package/dist/field/field-root.svelte +0 -1
  27. package/dist/file-select/file-select-clear.svelte +2 -8
  28. package/dist/file-upload/file-upload-item-delete.svelte +4 -7
  29. package/dist/file-upload/file-upload-root.svelte +0 -4
  30. package/dist/flip-card/flip-card-back.svelte +2 -2
  31. package/dist/flip-card/flip-card-front.svelte +2 -2
  32. package/dist/flip-card/flip-card-root.svelte +2 -0
  33. package/dist/float-button/float-button-root.svelte +2 -1
  34. package/dist/image-comparison/image-comparison.svelte +16 -24
  35. package/dist/input-group/input-group-action.svelte +5 -0
  36. package/dist/input-group/input-group-input.svelte +7 -2
  37. package/dist/input-group/input-group-prefix.svelte +5 -0
  38. package/dist/input-group/input-group-root.svelte +10 -2
  39. package/dist/input-group/input-group-select.svelte +5 -0
  40. package/dist/input-group/input-group-separator.svelte +10 -0
  41. package/dist/input-group/input-group-suffix.svelte +5 -0
  42. package/dist/list/list-item-icon.svelte +8 -0
  43. package/dist/list/list-item-text.svelte +19 -0
  44. package/dist/list/list-item.svelte +42 -0
  45. package/dist/list/list-root.svelte +0 -71
  46. package/dist/list/list-subheader.svelte +11 -0
  47. package/dist/map/map-marker.svelte +10 -0
  48. package/dist/map/map-popup.svelte +7 -0
  49. package/dist/map/map-root.svelte +0 -30
  50. package/dist/multi-select-combobox/multi-select-combobox-group.svelte +1 -1
  51. package/dist/option-swatch-group/option-swatch-group-item.svelte +46 -0
  52. package/dist/option-swatch-group/option-swatch-group-label.svelte +10 -0
  53. package/dist/option-swatch-group/option-swatch-group-meta.svelte +10 -0
  54. package/dist/option-swatch-group/option-swatch-group-root.svelte +0 -79
  55. package/dist/option-swatch-group/option-swatch-group-swatch.svelte +25 -6
  56. package/dist/pin-input/pin-input-cell.svelte +4 -1
  57. package/dist/radio-group/radio-group-item.svelte +90 -0
  58. package/dist/radio-group/radio-group.svelte +0 -89
  59. package/dist/range-calendar/range-calendar-grid.svelte +217 -179
  60. package/dist/range-calendar/range-calendar-root.svelte +24 -10
  61. package/dist/rich-text-editor/rich-text-editor-content.svelte +91 -3
  62. package/dist/rich-text-editor/rich-text-editor-root.svelte +168 -3
  63. package/dist/rich-text-editor/rich-text-editor-toolbar.svelte +318 -275
  64. package/dist/select/select-trigger.svelte +5 -8
  65. package/dist/shader-canvas/shader-canvas.svelte +0 -3
  66. package/dist/sidebar/sidebar-trigger.svelte +3 -2
  67. package/dist/system-map/system-map.svelte +120 -674
  68. package/dist/tabs/tabs-trigger.svelte +7 -4
  69. package/dist/tags-input/tags-input-input.svelte +3 -0
  70. package/dist/tags-input/tags-input-root.svelte +4 -13
  71. package/dist/tags-input/tags-input-tag.svelte +3 -0
  72. package/dist/themes/dark.css +6 -0
  73. package/dist/themes/default.css +3 -0
  74. package/dist/toast/toast-action.svelte +1 -0
  75. package/dist/toast/toast-close.svelte +4 -0
  76. package/dist/toast/toast-provider.svelte +5 -26
  77. package/dist/toast/toast-root.svelte +5 -10
  78. package/dist/virtual-list/virtual-list.svelte +187 -3
  79. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
- import { RichTextEditor as RichTextEditorPrimitive } from '@dryui/primitives/rich-text-editor';
4
+ import { setRichTextEditorCtx } from '@dryui/primitives/rich-text-editor';
5
5
 
6
6
  interface Props extends HTMLAttributes<HTMLDivElement> {
7
7
  value?: string;
@@ -10,10 +10,175 @@
10
10
  children: Snippet;
11
11
  }
12
12
 
13
- let { value = $bindable(''), children, ...rest }: Props = $props();
13
+ let {
14
+ value = $bindable(''),
15
+ placeholder = '',
16
+ readonly: readonlyProp = false,
17
+ children,
18
+ ...rest
19
+ }: Props = $props();
20
+
21
+ let isBold = $state(false);
22
+ let isItalic = $state(false);
23
+ let isUnderline = $state(false);
24
+ let isStrikethrough = $state(false);
25
+ let isOrderedList = $state(false);
26
+ let isUnorderedList = $state(false);
27
+ let currentHeading = $state<string | null>(null);
28
+ let currentLink = $state<string | null>(null);
29
+
30
+ function execCommand(command: string, cmdValue?: string) {
31
+ if (readonlyProp) return;
32
+ ctx.contentEl?.focus();
33
+ document.execCommand(command, false, cmdValue);
34
+ updateState();
35
+ syncValue();
36
+ }
37
+
38
+ function updateState() {
39
+ isBold = document.queryCommandState('bold');
40
+ isItalic = document.queryCommandState('italic');
41
+ isUnderline = document.queryCommandState('underline');
42
+ isStrikethrough = document.queryCommandState('strikethrough');
43
+ isOrderedList = document.queryCommandState('insertOrderedList');
44
+ isUnorderedList = document.queryCommandState('insertUnorderedList');
45
+
46
+ const block = document.queryCommandValue('formatBlock');
47
+ if (block && /^h[1-3]$/i.test(block)) {
48
+ currentHeading = block.toLowerCase();
49
+ } else {
50
+ currentHeading = null;
51
+ }
52
+
53
+ const sel = window.getSelection();
54
+ if (sel && sel.rangeCount > 0) {
55
+ let node: Node | null = sel.anchorNode;
56
+ while (node && node !== ctx.contentEl) {
57
+ if (node instanceof HTMLAnchorElement) {
58
+ currentLink = node.href;
59
+ return;
60
+ }
61
+ node = node.parentNode;
62
+ }
63
+ }
64
+ currentLink = null;
65
+ }
66
+
67
+ function syncValue() {
68
+ if (ctx.contentEl) {
69
+ value = ctx.contentEl.innerHTML;
70
+ }
71
+ }
72
+
73
+ const ctx = setRichTextEditorCtx({
74
+ get isBold() {
75
+ return isBold;
76
+ },
77
+ get isItalic() {
78
+ return isItalic;
79
+ },
80
+ get isUnderline() {
81
+ return isUnderline;
82
+ },
83
+ get isStrikethrough() {
84
+ return isStrikethrough;
85
+ },
86
+ get isOrderedList() {
87
+ return isOrderedList;
88
+ },
89
+ get isUnorderedList() {
90
+ return isUnorderedList;
91
+ },
92
+ get currentHeading() {
93
+ return currentHeading;
94
+ },
95
+ get currentLink() {
96
+ return currentLink;
97
+ },
98
+ get html() {
99
+ return value;
100
+ },
101
+ get readonly() {
102
+ return readonlyProp;
103
+ },
104
+ get placeholder() {
105
+ return placeholder;
106
+ },
107
+ contentEl: null,
108
+ execCommand,
109
+ toggleBold() {
110
+ execCommand('bold');
111
+ },
112
+ toggleItalic() {
113
+ execCommand('italic');
114
+ },
115
+ toggleUnderline() {
116
+ execCommand('underline');
117
+ },
118
+ toggleStrikethrough() {
119
+ execCommand('strikethrough');
120
+ },
121
+ toggleOrderedList() {
122
+ execCommand('insertOrderedList');
123
+ },
124
+ toggleUnorderedList() {
125
+ execCommand('insertUnorderedList');
126
+ },
127
+ setHeading(level: 'h1' | 'h2' | 'h3' | 'p') {
128
+ if (level === 'p') {
129
+ execCommand('formatBlock', 'p');
130
+ } else {
131
+ if (currentHeading === level) {
132
+ execCommand('formatBlock', 'p');
133
+ } else {
134
+ execCommand('formatBlock', level);
135
+ }
136
+ }
137
+ },
138
+ insertLink(url: string) {
139
+ if (readonlyProp) return;
140
+ const sel = window.getSelection();
141
+ if (!sel || sel.rangeCount === 0) return;
142
+
143
+ if (sel.isCollapsed) {
144
+ const a = document.createElement('a');
145
+ a.href = url;
146
+ a.textContent = url;
147
+ a.target = '_blank';
148
+ a.rel = 'noopener noreferrer';
149
+ const range = sel.getRangeAt(0);
150
+ range.insertNode(a);
151
+ range.setStartAfter(a);
152
+ range.collapse(true);
153
+ sel.removeAllRanges();
154
+ sel.addRange(range);
155
+ } else {
156
+ document.execCommand('createLink', false, url);
157
+ if (ctx.contentEl) {
158
+ const links = ctx.contentEl.querySelectorAll('a[href="' + CSS.escape(url) + '"]');
159
+ links.forEach((link) => {
160
+ link.setAttribute('target', '_blank');
161
+ link.setAttribute('rel', 'noopener noreferrer');
162
+ });
163
+ }
164
+ }
165
+ updateState();
166
+ syncValue();
167
+ },
168
+ removeLink() {
169
+ execCommand('unlink');
170
+ },
171
+ getContent() {
172
+ return ctx.contentEl?.innerHTML ?? '';
173
+ },
174
+ updateState,
175
+ syncValue
176
+ });
14
177
  </script>
15
178
 
16
- <RichTextEditorPrimitive.Root bind:value data-part="root" {children} {...rest} />
179
+ <div data-part="root" data-rte-root data-readonly={readonlyProp || undefined} {...rest}>
180
+ {@render children()}
181
+ </div>
17
182
 
18
183
  <style>
19
184
  [data-part='root'] {