@svadmin/ui 0.21.0 → 0.22.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/ui",
3
- "version": "0.21.0",
3
+ "version": "0.22.1",
4
4
  "description": "Pre-built admin UI components — AdminApp, AutoTable, AutoForm, Sidebar, Layout",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -18,6 +18,7 @@
18
18
  import ArrayField from './fields/ArrayField.svelte';
19
19
  import { Plus, X } from 'lucide-svelte';
20
20
  import type { Snippet } from 'svelte';
21
+ import { getRichTextEditor } from '../editor-config.svelte.js';
21
22
 
22
23
  let { field, value, onchange, children } = $props<{
23
24
  field: FieldDefinition;
@@ -164,25 +165,16 @@
164
165
  />
165
166
 
166
167
  {:else if field.type === 'richtext'}
167
- {#await import('@svadmin/editor')}
168
- <Textarea
169
- id={field.key}
170
- value={strVal}
171
- oninput={(e) => onchange((e.target as HTMLTextAreaElement).value)}
172
- required={field.required}
173
- rows={10}
174
- placeholder={t('field.enterValue', { label: field.label })}
175
- class="resize-y"
176
- />
177
- {:then editorMod}
178
- <editorMod.Editor
168
+ {@const EditorComp = getRichTextEditor()}
169
+ {#if EditorComp}
170
+ <EditorComp
179
171
  id={field.key}
180
172
  value={strVal}
181
173
  placeholder={t('field.enterValue', { label: field.label })}
182
174
  preset="full"
183
175
  onchange={(html: string) => onchange(html)}
184
176
  />
185
- {:catch}
177
+ {:else}
186
178
  <Textarea
187
179
  id={field.key}
188
180
  value={strVal}
@@ -192,7 +184,7 @@
192
184
  placeholder={t('field.enterValue', { label: field.label })}
193
185
  class="resize-y"
194
186
  />
195
- {/await}
187
+ {/if}
196
188
 
197
189
  {:else if field.type === 'textarea'}
198
190
  <Textarea
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { cn, type WithElementRef } from "../../../utils.js";
3
3
  import type { HTMLAttributes } from "svelte/elements";
4
+ import { getContext } from "svelte";
4
5
 
5
6
  type Props = WithElementRef<HTMLAttributes<HTMLDivElement>> & {
6
7
  align?: "start" | "center" | "end";
@@ -13,8 +14,11 @@
13
14
  children,
14
15
  ...restProps
15
16
  }: Props = $props();
17
+
18
+ let isOpen = $derived(getContext<() => boolean>("svadmin-dropdown-open")?.() ?? true);
16
19
  </script>
17
20
 
21
+ {#if isOpen}
18
22
  <div
19
23
  bind:this={ref}
20
24
  data-slot="dropdown-menu-content"
@@ -28,3 +32,4 @@
28
32
  >
29
33
  {@render children?.()}
30
34
  </div>
35
+ {/if}
@@ -16,6 +16,8 @@
16
16
  ...restProps
17
17
  }: Props = $props();
18
18
 
19
+ import { setContext } from "svelte";
20
+
19
21
  function handleClickOutside(e: MouseEvent) {
20
22
  if (ref && !ref.contains(e.target as Node)) {
21
23
  open = false;
@@ -23,6 +25,8 @@
23
25
  }
24
26
  }
25
27
 
28
+ setContext("svadmin-dropdown-open", () => open);
29
+
26
30
  $effect(() => {
27
31
  if (open) {
28
32
  document.addEventListener('click', handleClickOutside, true);
@@ -0,0 +1,23 @@
1
+ import type { Component } from 'svelte';
2
+
3
+ let registeredEditor: Component<any> | undefined = $state(undefined);
4
+
5
+ /**
6
+ * Register a global Rich Text Editor component.
7
+ * This decouples @svadmin/ui from @svadmin/editor, making the editor completely optional.
8
+ *
9
+ * Usage:
10
+ * ```ts
11
+ * import { Editor } from '@svadmin/editor';
12
+ * import { setRichTextEditor } from '@svadmin/ui';
13
+ *
14
+ * setRichTextEditor(Editor);
15
+ * ```
16
+ */
17
+ export function setRichTextEditor(editorComponent: Component<any>): void {
18
+ registeredEditor = editorComponent;
19
+ }
20
+
21
+ export function getRichTextEditor(): Component<any> | undefined {
22
+ return registeredEditor;
23
+ }
package/src/index.ts CHANGED
@@ -61,6 +61,11 @@ export { default as InlineEdit } from "./components/InlineEdit.svelte";
61
61
  export { default as VirtualTable } from "./components/VirtualTable.svelte";
62
62
  export { default as DraggableHeader } from "./components/DraggableHeader.svelte";
63
63
  export { default as SettingsPage } from "./components/SettingsPage.svelte";
64
+
65
+ // Editor Registry
66
+ export { setRichTextEditor, getRichTextEditor } from "./editor-config.svelte.js";
67
+
68
+ // Settings & Preferences
64
69
  export { default as AppearanceSettings } from "./components/AppearanceSettings.svelte";
65
70
  export { default as AboutSettings } from "./components/AboutSettings.svelte";
66
71
  export { default as PermissionMatrix } from "./components/PermissionMatrix.svelte";