@dyrected/admin 2.6.0 → 2.6.2

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 (55) hide show
  1. package/dist/admin.css +221 -32
  2. package/dist/components/forms/field-renderer.d.ts +3 -9
  3. package/dist/components/forms/fields/date-picker.d.ts +4 -1
  4. package/dist/components/forms/fields/format-aware-inputs.test.d.ts +1 -0
  5. package/dist/components/forms/fields/text-field.d.ts +1 -1
  6. package/dist/components/forms/fields/url-field.d.ts +1 -1
  7. package/dist/components/forms/form-engine.d.ts +13 -2
  8. package/dist/components/media/__tests__/media-library-dialog.test.d.ts +1 -0
  9. package/dist/components/media/storage-notice.d.ts +7 -0
  10. package/dist/components/workflow/WorkflowPanel.d.ts +8 -1
  11. package/dist/components/workflow/draft-live-compare-sheet.d.ts +6 -0
  12. package/dist/components/workflow/workflow-transition-controls.d.ts +60 -0
  13. package/dist/controllers/__tests__/field.test.d.ts +1 -0
  14. package/dist/controllers/__tests__/form.test.d.ts +1 -0
  15. package/dist/controllers/__tests__/media.test.d.ts +1 -0
  16. package/dist/controllers/__tests__/theme.test.d.ts +1 -0
  17. package/dist/controllers/field.d.ts +13 -0
  18. package/dist/controllers/form.d.ts +102 -0
  19. package/dist/controllers/media.d.ts +119 -0
  20. package/dist/controllers/theme.d.ts +28 -0
  21. package/dist/favicon.ico +0 -0
  22. package/dist/favicon.svg +85 -1
  23. package/dist/hooks/__tests__/use-add-media-from-url.test.d.ts +1 -0
  24. package/dist/hooks/__tests__/use-field.test.d.ts +1 -0
  25. package/dist/hooks/admin-theme-context.d.ts +2 -8
  26. package/dist/hooks/admin-theme-provider.d.ts +3 -1
  27. package/dist/hooks/admin-theme.d.ts +1 -0
  28. package/dist/hooks/use-add-media-from-url.d.ts +8 -17
  29. package/dist/hooks/use-admin-theme.d.ts +2 -1
  30. package/dist/hooks/use-dyrected-form.d.ts +2 -0
  31. package/dist/hooks/use-field.d.ts +2 -0
  32. package/dist/hooks/use-media-library.d.ts +26 -0
  33. package/dist/hooks/use-media-upload.d.ts +20 -0
  34. package/dist/hooks/use-media-url.d.ts +20 -0
  35. package/dist/index.d.ts +30 -3
  36. package/dist/index.mjs +2878 -1827
  37. package/dist/lib/__tests__/external-media.test.d.ts +1 -0
  38. package/dist/lib/__tests__/media-utils.test.d.ts +1 -0
  39. package/dist/lib/compress-image.d.ts +9 -0
  40. package/dist/lib/draft-live-compare.d.ts +38 -0
  41. package/dist/lib/draft-live-compare.test.d.ts +1 -0
  42. package/dist/lib/external-media.d.ts +9 -4
  43. package/dist/lib/media-utils.d.ts +26 -0
  44. package/dist/lib/workflow-autosave.d.ts +18 -0
  45. package/dist/lib/workflow-autosave.test.d.ts +1 -0
  46. package/dist/lib/workflow-ui.d.ts +22 -0
  47. package/dist/lib/workflow-ui.test.d.ts +1 -0
  48. package/dist/providers/dyrected-form-context.d.ts +14 -0
  49. package/dist/public/contracts.d.ts +230 -0
  50. package/dist/public/index.d.ts +26 -0
  51. package/dist/public/index.js +2 -0
  52. package/dist/public.d.ts +2 -0
  53. package/dist/types/admin-components.d.ts +17 -2
  54. package/dist/use-add-media-from-url-DHGAAVLY.js +1604 -0
  55. package/package.json +10 -4
@@ -0,0 +1,60 @@
1
+ import { WorkflowConfig, WorkflowMetadata, WorkflowTransition } from '@dyrected/core';
2
+ import { TransitionOptions } from '@dyrected/sdk';
3
+ import * as React from "react";
4
+ export interface WorkflowCapableClient {
5
+ transition<T = unknown>(collection: string, id: string, transitionName: string, opts?: TransitionOptions): Promise<T>;
6
+ }
7
+ export type PreparedWorkflowTransitionContext = {
8
+ documentIds: string[];
9
+ documentLabels?: Record<string, string | undefined>;
10
+ expectedRevisions?: Record<string, number | undefined>;
11
+ invalidateQueryKeys?: Array<readonly unknown[]>;
12
+ };
13
+ export type PrepareWorkflowTransition = (transition: WorkflowTransition) => Promise<PreparedWorkflowTransitionContext | null>;
14
+ type TransitionExecutionResult = {
15
+ transition: WorkflowTransition;
16
+ successCount: number;
17
+ failureCount: number;
18
+ firstError?: Error;
19
+ };
20
+ export declare function WorkflowTransitionSplitButton({ collection, documentId, workflowConfig, workflowMeta, invalidateQueryKeys, onComplete, onPendingChange, onSaveDraft, saveDraftPending, documentLabel, className, prepareTransition, }: {
21
+ collection: string;
22
+ documentId: string;
23
+ workflowConfig: WorkflowConfig;
24
+ workflowMeta: WorkflowMetadata;
25
+ invalidateQueryKeys?: Array<readonly unknown[]>;
26
+ onComplete?: (result: TransitionExecutionResult) => void;
27
+ onPendingChange?: (pending: boolean) => void;
28
+ onSaveDraft?: () => Promise<void> | void;
29
+ saveDraftPending?: boolean;
30
+ documentLabel?: string;
31
+ className?: string;
32
+ prepareTransition?: PrepareWorkflowTransition;
33
+ }): React.JSX.Element;
34
+ export declare function WorkflowTransitionMenu({ collection, documentIds, workflowConfig, transitions, expectedRevisions, invalidateQueryKeys, onComplete, trigger, documentLabels, align, sideOffset, disabled, }: {
35
+ collection: string;
36
+ documentIds: string[];
37
+ workflowConfig: WorkflowConfig;
38
+ transitions: WorkflowTransition[];
39
+ expectedRevisions?: Record<string, number | undefined>;
40
+ invalidateQueryKeys?: Array<readonly unknown[]>;
41
+ onComplete?: (result: TransitionExecutionResult) => void;
42
+ trigger: React.ReactNode;
43
+ documentLabels?: Record<string, string | undefined>;
44
+ align?: "start" | "center" | "end";
45
+ sideOffset?: number;
46
+ disabled?: boolean;
47
+ }): React.JSX.Element;
48
+ export declare function WorkflowTransitionPanelActions({ collection, documentId, workflowConfig, workflowMeta, onSaveDraft, saveDraftPending, prepareTransition, }: {
49
+ collection: string;
50
+ documentId: string;
51
+ workflowConfig: WorkflowConfig;
52
+ workflowMeta: WorkflowMetadata;
53
+ onSaveDraft?: () => Promise<void> | void;
54
+ saveDraftPending?: boolean;
55
+ prepareTransition?: PrepareWorkflowTransition;
56
+ }): React.JSX.Element;
57
+ export declare function WorkflowDetailsMenuItem({ onSelect, }: {
58
+ onSelect: () => void;
59
+ }): React.JSX.Element;
60
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { DyrectedFieldState, DyrectedFormController, DyrectedSetValueOptions } from './form';
2
+ type Listener = () => void;
3
+ export interface DyrectedFieldController {
4
+ getState(): DyrectedFieldState;
5
+ subscribe(listener: Listener): () => void;
6
+ setValue(value: unknown, options?: DyrectedSetValueOptions): void;
7
+ validate(): Promise<boolean>;
8
+ }
9
+ /**
10
+ * Creates a field-scoped controller from a Dyrected form controller and a path.
11
+ */
12
+ export declare function createDyrectedFieldController(formController: DyrectedFormController, path: string): DyrectedFieldController;
13
+ export {};
@@ -0,0 +1,102 @@
1
+ import { Field as FieldSchema } from '@dyrected/sdk';
2
+ type Listener = () => void;
3
+ export type DyrectedFieldPathPart = string | number | null | undefined | false;
4
+ export interface DyrectedFormValues {
5
+ [key: string]: unknown;
6
+ }
7
+ export interface DyrectedFormState {
8
+ collection: string;
9
+ fields: FieldSchema[];
10
+ values: DyrectedFormValues;
11
+ errors: Record<string, string>;
12
+ dirtyFields: Record<string, boolean>;
13
+ touchedFields: Record<string, boolean>;
14
+ isDirty: boolean;
15
+ isSubmitting: boolean;
16
+ isValid: boolean;
17
+ submitCount: number;
18
+ readOnly: boolean;
19
+ documentId?: string;
20
+ }
21
+ export interface DyrectedSetValueOptions {
22
+ shouldDirty?: boolean;
23
+ shouldTouch?: boolean;
24
+ shouldValidate?: boolean;
25
+ }
26
+ export interface DyrectedFormControllerAdapters {
27
+ setValue?: (path: string, value: unknown, options?: DyrectedSetValueOptions) => void;
28
+ reset?: (values?: DyrectedFormValues) => void;
29
+ validate?: (paths?: string | string[]) => Promise<boolean>;
30
+ submit?: () => Promise<unknown>;
31
+ }
32
+ export interface DyrectedFormControllerOptions {
33
+ collection: string;
34
+ fields: FieldSchema[];
35
+ documentId?: string;
36
+ readOnly?: boolean;
37
+ initialValues?: DyrectedFormValues;
38
+ initialErrors?: Record<string, string>;
39
+ initialDirtyFields?: Record<string, boolean>;
40
+ initialTouchedFields?: Record<string, boolean>;
41
+ initialIsDirty?: boolean;
42
+ initialIsSubmitting?: boolean;
43
+ initialIsValid?: boolean;
44
+ initialSubmitCount?: number;
45
+ adapters?: DyrectedFormControllerAdapters;
46
+ }
47
+ export interface DyrectedFieldState {
48
+ path: string;
49
+ schema: FieldSchema | null;
50
+ value: unknown;
51
+ error?: string;
52
+ isDirty: boolean;
53
+ isTouched: boolean;
54
+ invalid: boolean;
55
+ setValue: (value: unknown, options?: DyrectedSetValueOptions) => void;
56
+ validate: () => Promise<boolean>;
57
+ }
58
+ export interface DyrectedFormController {
59
+ getState(): DyrectedFormState;
60
+ subscribe(listener: Listener): () => void;
61
+ setAdapters(adapters?: DyrectedFormControllerAdapters): void;
62
+ setState(nextState: Partial<DyrectedFormState> | ((currentState: DyrectedFormState) => DyrectedFormState)): void;
63
+ getValue(path: string): unknown;
64
+ getValues(): DyrectedFormValues;
65
+ setValue(path: string, value: unknown, options?: DyrectedSetValueOptions): void;
66
+ getFieldSchema(path: string): FieldSchema | null;
67
+ getFieldState(path: string): DyrectedFieldState;
68
+ reset(values?: DyrectedFormValues): void;
69
+ validate(paths?: string | string[]): Promise<boolean>;
70
+ submit(): Promise<unknown>;
71
+ }
72
+ /**
73
+ * Normalizes a dotted field path into path segments.
74
+ */
75
+ export declare function normalizeFieldPath(path: string): string[];
76
+ /**
77
+ * Alias for `normalizeFieldPath` used in public field/path helpers.
78
+ */
79
+ export declare function getFieldPathSegments(path: string): string[];
80
+ /**
81
+ * Joins path parts into one dotted Dyrected field path.
82
+ */
83
+ export declare function joinFieldPath(...parts: DyrectedFieldPathPart[]): string;
84
+ /**
85
+ * Returns the parent path for a given dotted field path.
86
+ */
87
+ export declare function getParentFieldPath(path: string): string;
88
+ /**
89
+ * Reads a nested value using a dotted Dyrected field path.
90
+ */
91
+ export declare function getValueAtPath(value: unknown, path: string): unknown;
92
+ /**
93
+ * Writes a nested value immutably using a dotted Dyrected field path.
94
+ */
95
+ export declare function setValueAtPath<T>(value: T, path: string, nextValue: unknown): T;
96
+ /**
97
+ * Creates a framework-agnostic Dyrected form controller.
98
+ *
99
+ * This is the low-level state contract behind the React and Vue form APIs.
100
+ */
101
+ export declare function createDyrectedFormController({ collection, fields, documentId, readOnly, initialValues, initialErrors, initialDirtyFields, initialTouchedFields, initialIsDirty, initialIsSubmitting, initialIsValid, initialSubmitCount, adapters, }: DyrectedFormControllerOptions): DyrectedFormController;
102
+ export {};
@@ -0,0 +1,119 @@
1
+ import { buildExternalMediaPayload } from '../lib/external-media';
2
+ import { DyrectedClient, Media } from '@dyrected/sdk';
3
+ type Listener = () => void;
4
+ type MaybePromise<T> = T | Promise<T>;
5
+ export interface MediaControllerSchemas {
6
+ collections?: Array<{
7
+ slug: string;
8
+ upload?: unknown;
9
+ }>;
10
+ }
11
+ export interface MediaRecord extends Media {
12
+ id: string;
13
+ }
14
+ export interface MediaUploadQueueItem {
15
+ id: string;
16
+ file: File;
17
+ originalSize: number;
18
+ compressedSize: number;
19
+ progress: number;
20
+ status: "queued" | "uploading" | "completed" | "error";
21
+ error?: string;
22
+ result?: MediaRecord;
23
+ }
24
+ export interface MediaUploadControllerState {
25
+ activeCollection: string;
26
+ isUploading: boolean;
27
+ queue: MediaUploadQueueItem[];
28
+ }
29
+ export interface MediaUploadControllerOptions {
30
+ client: DyrectedClient | null;
31
+ schemas?: MediaControllerSchemas | null;
32
+ collection: string;
33
+ compressImages?: boolean;
34
+ maxDimension?: number;
35
+ quality?: number;
36
+ onCompletedItem?: (item: MediaRecord) => MaybePromise<void>;
37
+ onAllCompleted?: (items: MediaRecord[]) => MaybePromise<void>;
38
+ onError?: (error: Error, file: File) => void;
39
+ }
40
+ /**
41
+ * Creates a framework-agnostic media upload controller.
42
+ *
43
+ * This is the low-level engine behind the React and Vue media upload APIs. Use
44
+ * it directly only when you need to build your own adapter layer outside the
45
+ * shipped framework packages.
46
+ */
47
+ export interface MediaUploadController {
48
+ getState(): MediaUploadControllerState;
49
+ subscribe(listener: Listener): () => void;
50
+ uploadFiles(files: File[]): Promise<MediaRecord[]>;
51
+ retryUpload(id: string): Promise<MediaRecord | null>;
52
+ removeQueueItem(id: string): void;
53
+ clearCompleted(): void;
54
+ }
55
+ export interface MediaURLClassification {
56
+ kind: "youtube" | "vimeo" | "direct-image" | "direct-video" | "generic-file" | "unknown";
57
+ payload: ReturnType<typeof buildExternalMediaPayload>;
58
+ }
59
+ export interface MediaURLControllerState {
60
+ activeCollection: string;
61
+ isSubmitting: boolean;
62
+ }
63
+ export interface MediaURLControllerOptions {
64
+ client: DyrectedClient | null;
65
+ schemas?: MediaControllerSchemas | null;
66
+ collection: string;
67
+ compressImages?: boolean;
68
+ maxDimension?: number;
69
+ quality?: number;
70
+ onAdded?: (item: MediaRecord) => MaybePromise<void>;
71
+ onError?: (error: Error) => void;
72
+ }
73
+ /**
74
+ * Creates a framework-agnostic media URL ingestion controller.
75
+ */
76
+ export interface MediaURLController {
77
+ getState(): MediaURLControllerState;
78
+ subscribe(listener: Listener): () => void;
79
+ classifyURL(url: string): MediaURLClassification;
80
+ importURL(url: string): Promise<MediaRecord>;
81
+ }
82
+ export interface MediaLibraryControllerState {
83
+ activeCollection: string;
84
+ items: MediaRecord[];
85
+ selectedIds: string[];
86
+ searchQuery: string;
87
+ page: number;
88
+ hasNextPage: boolean;
89
+ isLoading: boolean;
90
+ error: Error | null;
91
+ }
92
+ export interface MediaLibraryControllerOptions {
93
+ client: DyrectedClient | null;
94
+ schemas?: MediaControllerSchemas | null;
95
+ collection: string;
96
+ pageSize?: number;
97
+ initialSearchQuery?: string;
98
+ initialSelectedIds?: string[];
99
+ }
100
+ /**
101
+ * Creates a framework-agnostic media library controller for search, pagination,
102
+ * and selection state.
103
+ */
104
+ export interface MediaLibraryController {
105
+ getState(): MediaLibraryControllerState;
106
+ subscribe(listener: Listener): () => void;
107
+ load(): Promise<MediaRecord[]>;
108
+ search(query: string): Promise<MediaRecord[]>;
109
+ loadNextPage(): Promise<MediaRecord[]>;
110
+ setSelectedIds(ids: string[]): void;
111
+ select(id: string): void;
112
+ deselect(id: string): void;
113
+ toggle(id: string): void;
114
+ clearSelection(): void;
115
+ }
116
+ export declare function createMediaUploadController({ client, schemas, collection, compressImages, maxDimension, quality, onCompletedItem, onAllCompleted, onError, }: MediaUploadControllerOptions): MediaUploadController;
117
+ export declare function createMediaURLController({ client, schemas, collection, compressImages, maxDimension, quality, onAdded, onError, }: MediaURLControllerOptions): MediaURLController;
118
+ export declare function createMediaLibraryController({ client, schemas, collection, pageSize, initialSearchQuery, initialSelectedIds, }: MediaLibraryControllerOptions): MediaLibraryController;
119
+ export {};
@@ -0,0 +1,28 @@
1
+ import { AdminThemePreference, ResolvedAdminTheme } from '../hooks/admin-theme';
2
+ type Listener = () => void;
3
+ export interface AdminThemeControllerState {
4
+ theme: AdminThemePreference;
5
+ systemTheme: ResolvedAdminTheme;
6
+ resolvedTheme: ResolvedAdminTheme;
7
+ themeClassName: string;
8
+ }
9
+ export interface AdminThemeController {
10
+ getState(): AdminThemeControllerState;
11
+ subscribe(listener: Listener): () => void;
12
+ setTheme(theme: AdminThemePreference): void;
13
+ setSystemTheme(theme: ResolvedAdminTheme): void;
14
+ setState(nextState: Partial<AdminThemeControllerState> | ((currentState: AdminThemeControllerState) => AdminThemeControllerState)): void;
15
+ }
16
+ export interface AdminThemeControllerOptions {
17
+ theme?: AdminThemePreference;
18
+ systemTheme?: ResolvedAdminTheme;
19
+ onThemeChange?: (theme: AdminThemePreference) => void;
20
+ }
21
+ /**
22
+ * Creates a framework-agnostic admin theme controller.
23
+ *
24
+ * This controller is the shared theme engine used by the React and Vue public
25
+ * APIs, and can also be used directly by other framework adapters.
26
+ */
27
+ export declare function createAdminThemeController({ theme, systemTheme, onThemeChange, }?: AdminThemeControllerOptions): AdminThemeController;
28
+ export {};
Binary file
package/dist/favicon.svg CHANGED
@@ -1 +1,85 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="48" height="46" fill="none" viewBox="0 0 48 46"><path fill="#863bff" d="M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z" style="fill:#863bff;fill:color(display-p3 .5252 .23 1);fill-opacity:1"/><mask id="a" width="48" height="46" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z" style="fill:#000;fill-opacity:1"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#ede6ff" rx="5.508" ry="14.704" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -4.47 31.516)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#ede6ff" rx="10.399" ry="29.851" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -39.328 7.883)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#7e14ff" rx="5.508" ry="30.487" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -25.913 -14.639)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -32.644 -3.334)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -34.34 30.47)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#ede6ff" rx="14.072" ry="22.078" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="rotate(93.35 24.506 48.493)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx=".387" cy="8.972" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(39.51 .387 8.972)"/></g><g filter="url(#k)"><ellipse cx="47.523" cy="-6.092" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 47.523 -6.092)"/></g><g filter="url(#l)"><ellipse cx="41.412" cy="6.333" fill="#47bfff" rx="5.971" ry="9.665" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 41.412 6.333)"/></g><g filter="url(#m)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#n)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#o)"><ellipse cx="35.651" cy="29.907" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 35.651 29.907)"/></g><g filter="url(#p)"><ellipse cx="38.418" cy="32.4" fill="#47bfff" rx="5.971" ry="15.297" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 38.418 32.4)"/></g></g><defs><filter id="b" width="60.045" height="41.654" x="-19.77" y="16.149" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-54.613" y="-7.533" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-49.64" y="2.03" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-45.045" y="20.029" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-43.513" y="21.178" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="15.756" y="-17.901" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-27.636" y="-22.853" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="20.116" y="-38.415" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="24.641" y="-11.323" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="8.244" y="-2.416" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="18.713" y="10.588" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter></defs></svg>
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <!-- Creator: CorelDRAW 2020 (64-Bit) -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="512" height="512" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
5
+ viewBox="2871.23 1161.44 5949.65 5949.65"
6
+ xmlns:xlink="http://www.w3.org/1999/xlink"
7
+ xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
8
+ <defs>
9
+ <style type="text/css">
10
+ <![CDATA[
11
+ .bg {fill:#31106F}
12
+ .str0 {stroke:#F8F7F2;stroke-width:6.94;stroke-miterlimit:2.61313}
13
+ .fil0 {fill:none}
14
+ .fil2 {fill:#F8F7F2}
15
+ .fil1 {fill:#F8F7F2}
16
+ .fil3 {fill:#BCFF2E}
17
+ @media (prefers-color-scheme: dark) {
18
+ .bg {fill:#31106f}
19
+ .str0 {stroke:#F8F7F2}
20
+ }
21
+ ]]>
22
+ </style>
23
+ <clipPath id="id0">
24
+ <path d="M6112.57 3128.73c-14.76,21.66 -64.98,89.76 -67.68,108.99l331.68 1.15 -0.59 542.04c-121.35,-48.77 -145.85,-100.05 -360.87,-143.92 -1044.28,-213.08 -1790.7,1031.07 -1034.68,1851.73 140.35,152.35 374.13,305.87 670.59,343.11 324.68,40.78 583.4,-63.4 789.16,-206.96 99,-69.07 181.35,-156.72 252.76,-253.09 193.39,-261.02 206.15,-500.15 206,-808.62 -0.09,-163.72 5.83,-338.16 -0.27,-500.44l-12.15 12.5c-1.1,1.26 -2.52,2.89 -3.6,4.2l-63.76 88.39c-147.3,180.46 -313.49,250.43 -401.69,480.41 -34.56,90.13 -34.66,188.58 -68.36,278.48 -234.55,625.75 -1116.9,466.02 -1157.45,-160.94 -6.85,-105.99 15.51,-212.45 57.29,-295.74 203.72,-406.21 736.04,-456.04 1006.65,-111.88 23.54,29.95 45.26,76.2 69.75,105.61l27.05 -32.61c27.43,-43.07 101.06,-128.11 132.59,-156.44l173.41 -159c255,-291.62 229.88,-511.28 241.86,-877.89l334.64 0.96c-7.57,-26.85 -54.16,-83.21 -73.19,-112.04l-223.79 -332.67c-53.89,-76.28 -101.29,-149.25 -150.69,-225.38 -24.36,-37.54 -130.37,-198.76 -152.5,-216.82l-522.17 776.88z"/>
25
+ </clipPath>
26
+ </defs>
27
+ <g id="Layer_x0020_1">
28
+ <metadata id="CorelCorpID_0Corel-Layer"/>
29
+ <rect class="bg" x="2871.23" y="1161.44" width="5949.65" height="5949.65" rx="950" ry="950"/>
30
+ <g transform="translate(5846.05 4136.27) scale(1.16) translate(-5846.05 -4136.27)">
31
+ <rect class="fil0" x="-0.21" y="2.81" width="11692.91" height="8267.72"/>
32
+ <g id="_2489102217344">
33
+ <g>
34
+ <path class="fil1 str0" d="M5245.73 1985.39c-403.57,6 -838.7,0.41 -1245.91,0.4 -373.46,-0.01 -688.24,240.39 -745.02,620.87 -12.55,84.1 -5.65,559.58 -5.64,682.38 0.01,167.54 7.45,549.44 -1.06,690.4 -23.43,18.19 -47.01,26.73 -47.48,65.1 -0.42,33.96 21.13,61.06 57.67,62.64 50.25,2.17 110.25,-69.17 17.3,-125.1 -4.37,-327.5 -0.09,-658.26 -0.09,-986.13 0,-155.6 -13.85,-323.89 23.01,-466.31 32.06,-123.88 110.59,-249.44 181.75,-313.83 243.98,-220.83 390.88,-203.73 780.09,-203.73 328.56,0 658.74,-3.24 987.1,0.19 36.8,85.32 127.16,49.2 121.28,-18.66 -2.36,-27.22 -56.49,-113.16 -123,-8.21z"/>
35
+ <path class="fil1 str0" d="M5220.04 6287.94c-403.57,-6 -838.7,-0.41 -1245.91,-0.4 -373.46,0.01 -688.24,-240.39 -745.02,-620.87 -12.55,-84.1 -5.65,-559.58 -5.64,-682.38 0,-167.54 7.45,-549.44 -1.06,-690.4 -23.44,-18.19 -47.01,-26.73 -47.48,-65.1 -0.42,-33.96 21.13,-61.06 57.67,-62.64 50.25,-2.17 110.25,69.17 17.3,125.1 -4.37,327.5 -0.09,658.27 -0.09,986.13 0,155.6 -13.85,323.89 23.01,466.31 32.06,123.89 110.59,249.44 181.75,313.83 243.98,220.82 390.88,203.73 780.09,203.73 328.56,0 658.74,3.24 987.09,-0.19 36.81,-85.33 127.16,-49.21 121.28,18.65 -2.36,27.22 -56.49,113.16 -123,8.21z"/>
36
+ <path class="fil1 str0" d="M6472.46 1985.39c403.57,6 838.69,0.41 1245.9,0.4 373.46,-0.01 688.24,240.39 745.02,620.87 12.56,84.1 5.65,559.58 5.64,682.38 -0,167.54 -7.45,549.44 1.06,690.4 23.44,18.19 47.01,26.73 47.48,65.1 0.42,33.96 -21.13,61.06 -57.67,62.64 -50.25,2.17 -110.25,-69.17 -17.29,-125.1 4.37,-327.5 0.08,-658.26 0.08,-986.13 0,-155.6 13.85,-323.89 -23.01,-466.31 -32.06,-123.88 -110.59,-249.44 -181.75,-313.83 -243.98,-220.83 -390.88,-203.73 -780.09,-203.73 -328.56,0 -658.74,-3.24 -987.09,0.19 -36.81,85.32 -127.16,49.2 -121.28,-18.66 2.36,-27.22 56.48,-113.16 123,-8.21z"/>
37
+ <path class="fil1 str0" d="M6472.46 6287.94c403.57,-6 838.69,-0.41 1245.9,-0.4 373.46,0.01 688.24,-240.39 745.02,-620.87 12.56,-84.1 5.65,-559.58 5.64,-682.38 -0,-167.54 -7.45,-549.44 1.06,-690.4 23.44,-18.19 47.01,-26.73 47.48,-65.1 0.42,-33.96 -21.13,-61.06 -57.67,-62.64 -50.25,-2.17 -110.25,69.17 -17.29,125.1 4.37,327.5 0.08,658.27 0.08,986.13 0,155.6 13.85,323.89 -23.01,466.31 -32.06,123.89 -110.59,249.44 -181.75,313.83 -243.98,220.82 -390.88,203.73 -780.09,203.73 -328.56,0 -658.74,3.24 -987.09,-0.19 -36.81,-85.33 -127.16,-49.21 -121.28,18.65 2.36,27.22 56.48,113.16 123,8.21z"/>
38
+ <path class="fil1 str0" d="M5686.06 1519.39c-403.57,6 -838.69,0.41 -1245.9,0.4 -373.46,-0.01 -688.24,240.4 -745.02,620.87 -12.56,84.1 -5.65,559.58 -5.64,682.38 0,167.54 7.45,549.45 -1.06,690.41 -23.44,18.18 -47.01,26.73 -47.48,65.1 -0.42,33.96 21.13,61.06 57.67,62.64 50.25,2.17 110.25,-69.17 17.29,-125.1 -4.37,-327.5 -0.08,-658.26 -0.08,-986.13 0,-155.6 -13.85,-323.89 23.01,-466.31 32.06,-123.89 110.59,-249.44 181.75,-313.83 243.98,-220.83 390.88,-203.74 780.09,-203.74 328.56,0 658.74,-3.24 987.09,0.19 36.81,85.33 127.16,49.21 121.28,-18.65 -2.36,-27.22 -56.48,-113.16 -123,-8.21z"/>
39
+ <path class="fil1 str0" d="M5660.36 6753.94c-403.57,-6 -838.69,-0.41 -1245.9,-0.4 -373.46,0.01 -688.24,-240.39 -745.02,-620.87 -12.56,-84.1 -5.65,-559.58 -5.64,-682.38 0,-167.54 7.45,-549.44 -1.06,-690.4 -23.43,-18.19 -47.01,-26.73 -47.48,-65.1 -0.42,-33.96 21.13,-61.06 57.67,-62.64 50.25,-2.17 110.25,69.17 17.29,125.1 -4.37,327.5 -0.08,658.26 -0.08,986.13 0,155.59 -13.85,323.89 23.01,466.31 32.06,123.88 110.59,249.43 181.75,313.83 243.98,220.83 390.88,203.73 780.09,203.73 328.56,0 658.74,3.24 987.09,-0.19 36.8,-85.32 127.16,-49.21 121.28,18.65 -2.36,27.23 -56.48,113.16 -123,8.21z"/>
40
+ <path class="fil1 str0" d="M6032.14 1519.39c403.57,6 838.69,0.41 1245.91,0.4 373.46,-0.01 688.24,240.4 745.02,620.87 12.55,84.1 5.65,559.58 5.64,682.38 -0.01,167.54 -7.45,549.45 1.06,690.41 23.43,18.18 47.01,26.73 47.48,65.1 0.42,33.96 -21.13,61.06 -57.67,62.64 -50.25,2.17 -110.25,-69.17 -17.3,-125.1 4.37,-327.5 0.09,-658.26 0.09,-986.13 0,-155.6 13.85,-323.89 -23.01,-466.31 -32.06,-123.89 -110.59,-249.44 -181.75,-313.83 -243.98,-220.83 -390.88,-203.74 -780.09,-203.74 -328.56,0 -658.74,-3.24 -987.1,0.19 -36.8,85.33 -127.16,49.21 -121.28,-18.65 2.36,-27.22 56.49,-113.16 123,-8.21z"/>
41
+ <path class="fil1 str0" d="M6006.44 6753.94c403.57,-6 838.69,-0.41 1245.91,-0.4 373.46,0.01 688.24,-240.39 745.02,-620.87 12.56,-84.1 5.65,-559.58 5.64,-682.38 -0.01,-167.54 -7.45,-549.44 1.06,-690.4 23.43,-18.19 47.01,-26.73 47.48,-65.1 0.42,-33.96 -21.13,-61.06 -57.67,-62.64 -50.25,-2.17 -110.25,69.17 -17.3,125.1 4.37,327.5 0.09,658.26 0.09,986.13 0,155.59 13.85,323.89 -23.01,466.31 -32.06,123.88 -110.59,249.43 -181.75,313.83 -243.98,220.83 -390.88,203.73 -780.09,203.73 -328.56,0 -658.74,3.24 -987.1,-0.19 -36.8,-85.32 -127.16,-49.21 -121.28,18.65 2.36,27.23 56.48,113.16 123,8.21z"/>
42
+ <g>
43
+ <path class="fil1 str0" d="M5299.06 1898.16c2.08,0.61 37.97,22.87 40.8,24.59 9.16,5.58 116.45,70.48 121.57,74.45 -1.26,1.96 -35.61,24.56 -40.4,27.84 -13.62,9.33 -26.66,18.07 -40.27,27.28 -19.03,12.86 -42.03,29.02 -60.91,41.21 -3.39,2.19 -6.49,4.38 -10.01,6.75 -2.5,1.69 -7.77,5.71 -10.49,6.67l-0.04 -30.69c1.27,-2.27 5.05,-4.11 7.17,-5.55l108.26 -73.52 -3.69 -2.67c-1.13,-0.68 -2.38,-1.44 -3.6,-2.19 -2.65,-1.61 -4.68,-2.84 -7.15,-4.35l-101.23 -61.96 -0.02 -27.87zm-4.16 202.72c0.01,7.86 -1.72,16.14 5.37,11.28 3.71,-2.54 7.44,-5 11.25,-7.59l67.77 -45.85c25.2,-16.5 53.7,-36.24 79.01,-53.46 5.43,-3.69 9.97,-5.31 9.7,-9.23l-150.37 -91.86c-3.83,-2.33 -6.96,-4.34 -10.69,-6.59 -4.13,-2.49 -8.62,-6.14 -11.49,-5.43 -1.47,2.54 -0.86,26.91 -0.87,31.06 -2.28,-0.74 -22.34,-13.39 -26.3,-15.8l-25.76 -15.78 0.07 221.63c3.54,-0.2 46.94,-32.2 52.27,-34.33l0.04 21.97z"/>
44
+ <path class="fil1 str0" d="M5299.07 1926.03l101.23 61.96c2.47,1.52 4.5,2.74 7.15,4.35 1.22,0.75 2.48,1.5 3.6,2.19l3.69 2.67 -108.26 73.52c-2.12,1.44 -5.9,3.28 -7.17,5.55l0.04 30.69c2.72,-0.96 8,-4.99 10.49,-6.67 3.52,-2.37 6.62,-4.57 10.01,-6.75 18.88,-12.19 41.88,-28.35 60.91,-41.21 13.61,-9.2 26.65,-17.95 40.27,-27.28 4.78,-3.28 39.14,-25.88 40.4,-27.84 -5.11,-3.98 -112.41,-68.87 -121.57,-74.45 -2.83,-1.72 -38.71,-23.97 -40.8,-24.59l0.02 27.87z"/>
45
+ </g>
46
+ <g>
47
+ <path class="fil1 str0" d="M5257.85 6149.01c2.08,0.61 37.97,22.87 40.79,24.59 9.17,5.58 116.45,70.48 121.57,74.45 -1.26,1.96 -35.61,24.56 -40.4,27.84 -13.62,9.33 -26.66,18.07 -40.27,27.28 -19.03,12.86 -42.02,29.03 -60.91,41.21 -3.39,2.19 -6.49,4.38 -10,6.75 -2.5,1.69 -7.78,5.71 -10.5,6.67l-0.04 -30.68c1.27,-2.27 5.05,-4.11 7.17,-5.55l108.26 -73.52 -3.69 -2.67c-1.13,-0.68 -2.38,-1.44 -3.61,-2.19 -2.65,-1.61 -4.67,-2.84 -7.14,-4.36l-101.23 -61.96 -0.01 -27.87zm-4.16 202.72c0.01,7.86 -1.72,16.13 5.36,11.28 3.71,-2.54 7.44,-5 11.25,-7.6l67.77 -45.85c25.21,-16.5 53.7,-36.23 79.02,-53.46 5.42,-3.69 9.97,-5.32 9.7,-9.23l-150.37 -91.86c-3.83,-2.33 -6.96,-4.34 -10.69,-6.59 -4.13,-2.49 -8.61,-6.14 -11.49,-5.43 -1.47,2.53 -0.86,26.91 -0.87,31.06 -2.28,-0.74 -22.34,-13.39 -26.3,-15.8l-25.76 -15.78 0.07 221.63c3.54,-0.2 46.93,-32.2 52.27,-34.33l0.04 21.97z"/>
48
+ <path class="fil1 str0" d="M5257.86 6176.88l101.23 61.96c2.47,1.52 4.49,2.74 7.14,4.36 1.22,0.75 2.48,1.5 3.61,2.19l3.69 2.67 -108.26 73.52c-2.13,1.44 -5.91,3.28 -7.17,5.55l0.04 30.68c2.72,-0.96 8,-4.98 10.5,-6.67 3.52,-2.37 6.62,-4.56 10,-6.75 18.89,-12.19 41.88,-28.35 60.91,-41.21 13.61,-9.2 26.65,-17.94 40.27,-27.28 4.79,-3.28 39.14,-25.87 40.4,-27.84 -5.11,-3.97 -112.4,-68.87 -121.57,-74.45 -2.82,-1.72 -38.71,-23.97 -40.79,-24.59l0.01 27.87z"/>
49
+ </g>
50
+ <g>
51
+ <path class="fil1 str0" d="M7914.31 3545.21c0.61,2.08 22.87,37.97 24.59,40.8 5.58,9.16 70.48,116.45 74.45,121.56 1.96,-1.26 24.56,-35.61 27.84,-40.39 9.33,-13.62 18.07,-26.66 27.28,-40.28 12.86,-19.03 29.03,-42.02 41.21,-60.91 2.19,-3.39 4.38,-6.49 6.75,-10.01 1.69,-2.5 5.71,-7.77 6.67,-10.49l-30.68 -0.04c-2.27,1.27 -4.11,5.05 -5.55,7.17l-73.52 108.26 -2.67 -3.69c-0.68,-1.13 -1.44,-2.38 -2.19,-3.61 -1.61,-2.65 -2.84,-4.67 -4.36,-7.14l-61.96 -101.23 -27.87 -0.02zm202.72 -4.16c7.86,0.01 16.13,-1.72 11.28,5.37 -2.54,3.71 -5,7.44 -7.6,11.25l-45.85 67.78c-16.5,25.2 -36.23,53.7 -53.46,79.01 -3.69,5.43 -5.31,9.97 -9.22,9.7l-91.86 -150.37c-2.33,-3.83 -4.34,-6.96 -6.59,-10.69 -2.49,-4.13 -6.14,-8.62 -5.43,-11.49 2.53,-1.47 26.91,-0.86 31.06,-0.87 -0.74,-2.28 -13.39,-22.34 -15.8,-26.3l-15.78 -25.76 221.63 0.07c-0.2,3.54 -32.2,46.93 -34.33,52.27l21.97 0.04z"/>
52
+ <path class="fil1 str0" d="M7942.18 3545.23l61.96 101.23c1.52,2.47 2.74,4.5 4.36,7.14 0.75,1.23 1.5,2.48 2.19,3.61l2.67 3.69 73.52 -108.26c1.44,-2.12 3.28,-5.9 5.55,-7.17l30.68 0.04c-0.96,2.72 -4.98,8 -6.67,10.49 -2.37,3.52 -4.57,6.62 -6.75,10.01 -12.19,18.88 -28.35,41.88 -41.21,60.91 -9.2,13.62 -17.94,26.66 -27.28,40.28 -3.28,4.78 -25.87,39.14 -27.84,40.39 -3.97,-5.11 -68.87,-112.4 -74.45,-121.56 -1.72,-2.83 -23.98,-38.71 -24.59,-40.8l27.87 0.02z"/>
53
+ </g>
54
+ <g>
55
+ <path class="fil1 str0" d="M7893.48 4722.13c0.61,-2.08 22.87,-37.97 24.59,-40.79 5.58,-9.17 70.48,-116.45 74.45,-121.57 1.96,1.26 24.56,35.61 27.84,40.4 9.33,13.62 18.07,26.66 27.28,40.27 12.86,19.03 29.03,42.02 41.21,60.91 2.19,3.39 4.38,6.49 6.75,10 1.69,2.5 5.71,7.78 6.67,10.5l-30.69 0.04c-2.27,-1.27 -4.1,-5.05 -5.55,-7.17l-73.52 -108.26 -2.67 3.69c-0.68,1.13 -1.44,2.38 -2.19,3.6 -1.61,2.65 -2.84,4.67 -4.36,7.14l-61.96 101.23 -27.87 0.01zm202.72 4.17c7.86,-0.01 16.14,1.72 11.28,-5.37 -2.54,-3.71 -5,-7.44 -7.59,-11.25l-45.85 -67.77c-16.5,-25.2 -36.23,-53.7 -53.46,-79.02 -3.69,-5.42 -5.31,-9.97 -9.22,-9.7l-91.86 150.37c-2.33,3.83 -4.34,6.96 -6.59,10.69 -2.49,4.13 -6.14,8.61 -5.43,11.49 2.54,1.47 26.91,0.86 31.06,0.88 -0.74,2.28 -13.39,22.33 -15.8,26.3l-15.78 25.76 221.63 -0.07c-0.2,-3.53 -32.2,-46.93 -34.33,-52.27l21.97 -0.04z"/>
56
+ <path class="fil1 str0" d="M7921.35 4722.12l61.96 -101.23c1.52,-2.47 2.74,-4.49 4.36,-7.14 0.74,-1.22 1.5,-2.48 2.19,-3.6l2.67 -3.69 73.52 108.26c1.44,2.12 3.28,5.9 5.55,7.17l30.69 -0.04c-0.96,-2.72 -4.99,-8 -6.67,-10.5 -2.37,-3.52 -4.57,-6.62 -6.75,-10 -12.19,-18.89 -28.35,-41.88 -41.21,-60.91 -9.2,-13.61 -17.95,-26.65 -27.28,-40.27 -3.28,-4.78 -25.87,-39.14 -27.84,-40.4 -3.97,5.11 -68.87,112.4 -74.45,121.57 -1.72,2.82 -23.97,38.71 -24.59,40.79l27.87 -0.01z"/>
57
+ </g>
58
+ <g>
59
+ <path class="fil1 str0" d="M3601.32 3545.21c0.61,2.08 22.87,37.97 24.59,40.8 5.58,9.16 70.48,116.45 74.45,121.56 1.96,-1.26 24.56,-35.61 27.84,-40.39 9.33,-13.62 18.07,-26.66 27.28,-40.28 12.86,-19.03 29.03,-42.02 41.21,-60.91 2.19,-3.39 4.38,-6.49 6.76,-10.01 1.69,-2.5 5.7,-7.77 6.67,-10.49l-30.68 -0.04c-2.27,1.27 -4.11,5.05 -5.55,7.17l-73.52 108.26 -2.67 -3.69c-0.68,-1.13 -1.44,-2.38 -2.19,-3.61 -1.61,-2.65 -2.84,-4.67 -4.35,-7.14l-61.96 -101.23 -27.87 -0.02zm202.72 -4.16c7.86,0.01 16.13,-1.72 11.28,5.37 -2.54,3.71 -5,7.44 -7.6,11.25l-45.85 67.78c-16.5,25.2 -36.23,53.7 -53.46,79.01 -3.69,5.43 -5.32,9.97 -9.23,9.7l-91.86 -150.37c-2.33,-3.83 -4.34,-6.96 -6.59,-10.69 -2.49,-4.13 -6.14,-8.62 -5.43,-11.49 2.53,-1.47 26.91,-0.86 31.06,-0.87 -0.74,-2.28 -13.39,-22.34 -15.8,-26.3l-15.78 -25.76 221.63 0.07c-0.2,3.54 -32.2,46.93 -34.33,52.27l21.97 0.04z"/>
60
+ <path class="fil1 str0" d="M3629.19 3545.23l61.96 101.23c1.52,2.47 2.74,4.5 4.35,7.14 0.75,1.23 1.5,2.48 2.19,3.61l2.67 3.69 73.52 -108.26c1.44,-2.12 3.28,-5.9 5.55,-7.17l30.68 0.04c-0.96,2.72 -4.98,8 -6.67,10.49 -2.37,3.52 -4.57,6.62 -6.76,10.01 -12.19,18.88 -28.35,41.88 -41.21,60.91 -9.2,13.62 -17.94,26.66 -27.28,40.28 -3.28,4.78 -25.87,39.14 -27.84,40.39 -3.97,-5.11 -68.87,-112.4 -74.45,-121.56 -1.72,-2.83 -23.97,-38.71 -24.59,-40.8l27.87 0.02z"/>
61
+ </g>
62
+ <g>
63
+ <path class="fil1 str0" d="M3575.63 4724.07c0.61,-2.08 22.87,-37.97 24.59,-40.79 5.58,-9.17 70.48,-116.45 74.45,-121.57 1.96,1.26 24.56,35.61 27.84,40.4 9.33,13.62 18.07,26.66 27.28,40.27 12.86,19.03 29.03,42.02 41.21,60.91 2.19,3.39 4.38,6.49 6.76,10 1.69,2.5 5.7,7.78 6.67,10.5l-30.68 0.04c-2.27,-1.27 -4.11,-5.05 -5.55,-7.17l-73.52 -108.26 -2.67 3.69c-0.68,1.13 -1.44,2.38 -2.19,3.6 -1.61,2.65 -2.84,4.68 -4.35,7.14l-61.96 101.23 -27.87 0.01zm202.72 4.17c7.86,-0.01 16.14,1.72 11.28,-5.37 -2.54,-3.71 -5,-7.44 -7.6,-11.25l-45.85 -67.77c-16.5,-25.2 -36.23,-53.7 -53.46,-79.02 -3.69,-5.42 -5.32,-9.97 -9.23,-9.7l-91.86 150.37c-2.33,3.83 -4.34,6.96 -6.59,10.69 -2.49,4.13 -6.14,8.61 -5.43,11.49 2.53,1.47 26.91,0.86 31.06,0.88 -0.74,2.28 -13.39,22.33 -15.8,26.3l-15.78 25.76 221.63 -0.07c-0.2,-3.53 -32.2,-46.93 -34.33,-52.26l21.97 -0.04z"/>
64
+ <path class="fil1 str0" d="M3603.5 4724.06l61.96 -101.23c1.52,-2.46 2.74,-4.49 4.35,-7.14 0.75,-1.22 1.5,-2.48 2.19,-3.6l2.67 -3.69 73.52 108.26c1.44,2.12 3.28,5.9 5.55,7.17l30.68 -0.04c-0.96,-2.72 -4.98,-8 -6.67,-10.5 -2.37,-3.52 -4.57,-6.61 -6.76,-10 -12.19,-18.89 -28.35,-41.88 -41.21,-60.91 -9.2,-13.61 -17.94,-26.65 -27.28,-40.27 -3.28,-4.78 -25.87,-39.14 -27.84,-40.4 -3.97,5.11 -68.87,112.4 -74.45,121.57 -1.72,2.82 -23.97,38.71 -24.59,40.79l27.87 -0.01z"/>
65
+ </g>
66
+ <g>
67
+ <path class="fil1 str0" d="M6455.66 1898.16c-2.08,0.61 -37.97,22.87 -40.79,24.59 -9.16,5.58 -116.45,70.48 -121.57,74.45 1.26,1.96 35.61,24.56 40.4,27.84 13.62,9.33 26.66,18.07 40.27,27.28 19.03,12.86 42.03,29.02 60.91,41.21 3.39,2.19 6.49,4.38 10.01,6.75 2.5,1.69 7.77,5.71 10.49,6.67l0.04 -30.69c-1.27,-2.27 -5.05,-4.11 -7.17,-5.55l-108.26 -73.52 3.69 -2.67c1.13,-0.68 2.38,-1.44 3.6,-2.19 2.65,-1.61 4.68,-2.84 7.15,-4.35l101.23 -61.96 0.01 -27.87zm4.17 202.72c-0.01,7.86 1.72,16.14 -5.37,11.28 -3.71,-2.54 -7.44,-5 -11.25,-7.59l-67.77 -45.85c-25.2,-16.5 -53.7,-36.24 -79.02,-53.46 -5.42,-3.69 -9.97,-5.31 -9.7,-9.23l150.37 -91.86c3.83,-2.33 6.96,-4.34 10.69,-6.59 4.13,-2.49 8.62,-6.14 11.49,-5.43 1.47,2.54 0.86,26.91 0.88,31.06 2.28,-0.74 22.33,-13.39 26.3,-15.8l25.76 -15.78 -0.06 221.63c-3.54,-0.2 -46.94,-32.2 -52.27,-34.33l-0.04 21.97z"/>
68
+ <path class="fil1 str0" d="M6455.65 1926.03l-101.23 61.96c-2.47,1.52 -4.5,2.74 -7.15,4.35 -1.22,0.75 -2.48,1.5 -3.6,2.19l-3.69 2.67 108.26 73.52c2.12,1.44 5.9,3.28 7.17,5.55l-0.04 30.69c-2.72,-0.96 -8,-4.99 -10.49,-6.67 -3.52,-2.37 -6.62,-4.57 -10.01,-6.75 -18.88,-12.19 -41.88,-28.35 -60.91,-41.21 -13.61,-9.2 -26.65,-17.95 -40.27,-27.28 -4.78,-3.28 -39.14,-25.88 -40.4,-27.84 5.11,-3.98 112.41,-68.87 121.57,-74.45 2.82,-1.72 38.71,-23.97 40.79,-24.59l-0.01 27.87z"/>
69
+ </g>
70
+ <g>
71
+ <path class="fil1 str0" d="M6414.45 6149.01c-2.08,0.61 -37.97,22.87 -40.79,24.59 -9.17,5.58 -116.45,70.48 -121.57,74.45 1.26,1.96 35.61,24.56 40.4,27.84 13.62,9.33 26.66,18.07 40.27,27.28 19.03,12.86 42.02,29.03 60.91,41.21 3.39,2.19 6.49,4.38 10,6.75 2.5,1.69 7.78,5.71 10.5,6.67l0.04 -30.68c-1.27,-2.27 -5.05,-4.11 -7.17,-5.55l-108.26 -73.52 3.69 -2.67c1.13,-0.68 2.38,-1.44 3.61,-2.19 2.65,-1.61 4.67,-2.84 7.14,-4.36l101.23 -61.96 0.01 -27.87zm4.16 202.72c-0.01,7.86 1.72,16.13 -5.37,11.28 -3.7,-2.54 -7.44,-5 -11.25,-7.6l-67.77 -45.85c-25.21,-16.5 -53.7,-36.23 -79.02,-53.46 -5.42,-3.69 -9.97,-5.32 -9.7,-9.23l150.37 -91.86c3.83,-2.33 6.96,-4.34 10.69,-6.59 4.13,-2.49 8.61,-6.14 11.49,-5.43 1.47,2.53 0.86,26.91 0.87,31.06 2.28,-0.74 22.34,-13.39 26.3,-15.8l25.76 -15.78 -0.07 221.63c-3.54,-0.2 -46.93,-32.2 -52.27,-34.33l-0.04 21.97z"/>
72
+ <path class="fil1 str0" d="M6414.44 6176.88l-101.23 61.96c-2.47,1.52 -4.49,2.74 -7.14,4.36 -1.22,0.75 -2.48,1.5 -3.61,2.19l-3.69 2.67 108.26 73.52c2.13,1.44 5.91,3.28 7.17,5.55l-0.04 30.68c-2.72,-0.96 -8,-4.98 -10.5,-6.67 -3.52,-2.37 -6.62,-4.56 -10,-6.75 -18.89,-12.19 -41.88,-28.35 -60.91,-41.21 -13.61,-9.2 -26.65,-17.94 -40.27,-27.28 -4.79,-3.28 -39.14,-25.87 -40.4,-27.84 5.11,-3.97 112.4,-68.87 121.57,-74.45 2.82,-1.72 38.71,-23.97 40.79,-24.59l-0.01 27.87z"/>
73
+ </g>
74
+ </g>
75
+ <path class="fil2" d="M6112.57 3128.73c-14.76,21.66 -64.98,89.76 -67.68,108.99l331.68 1.15 -0.59 542.04c-121.35,-48.77 -145.85,-100.05 -360.87,-143.92 -1044.28,-213.08 -1790.7,1031.07 -1034.68,1851.73 140.35,152.35 374.13,305.87 670.59,343.11 324.68,40.78 583.4,-63.4 789.16,-206.96 99,-69.07 181.35,-156.72 252.76,-253.09 193.39,-261.02 206.15,-500.15 206,-808.62 -0.09,-163.72 5.83,-338.16 -0.27,-500.44l-12.15 12.5c-1.1,1.26 -2.52,2.89 -3.6,4.2l-63.76 88.39c-147.3,180.46 -313.49,250.43 -401.69,480.41 -34.56,90.13 -34.66,188.58 -68.36,278.48 -234.55,625.75 -1116.9,466.02 -1157.45,-160.94 -6.85,-105.99 15.51,-212.45 57.29,-295.74 203.72,-406.21 736.04,-456.04 1006.65,-111.88 23.54,29.95 45.26,76.2 69.75,105.61l27.05 -32.61c27.43,-43.07 101.06,-128.11 132.59,-156.44l173.41 -159c255,-291.62 229.88,-511.28 241.86,-877.89l334.64 0.96c-7.57,-26.85 -54.16,-83.21 -73.19,-112.04l-223.79 -332.67c-53.89,-76.28 -101.29,-149.25 -150.69,-225.38 -24.36,-37.54 -130.37,-198.76 -152.5,-216.82l-522.17 776.88z"/>
76
+ <g style="clip-path:url(#id0)">
77
+ <g>
78
+ <circle class="fil3" transform="matrix(2.68397 -0.91885 0.741946 2.05676 5231.11 3048.95)" r="807.29"/>
79
+ </g>
80
+ </g>
81
+ <path class="fil0" d="M6112.57 3128.73c-14.76,21.66 -64.98,89.76 -67.68,108.99l331.68 1.15 -0.59 542.04c-121.35,-48.77 -145.85,-100.05 -360.87,-143.92 -1044.28,-213.08 -1790.7,1031.07 -1034.68,1851.73 140.35,152.35 374.13,305.87 670.59,343.11 324.68,40.78 583.4,-63.4 789.16,-206.96 99,-69.07 181.35,-156.72 252.76,-253.09 193.39,-261.02 206.15,-500.15 206,-808.62 -0.09,-163.72 5.83,-338.16 -0.27,-500.44l-12.15 12.5c-1.1,1.26 -2.52,2.89 -3.6,4.2l-63.76 88.39c-147.3,180.46 -313.49,250.43 -401.69,480.41 -34.56,90.13 -34.66,188.58 -68.36,278.48 -234.55,625.75 -1116.9,466.02 -1157.45,-160.94 -6.85,-105.99 15.51,-212.45 57.29,-295.74 203.72,-406.21 736.04,-456.04 1006.65,-111.88 23.54,29.95 45.26,76.2 69.75,105.61l27.05 -32.61c27.43,-43.07 101.06,-128.11 132.59,-156.44l173.41 -159c255,-291.62 229.88,-511.28 241.86,-877.89l334.64 0.96c-7.57,-26.85 -54.16,-83.21 -73.19,-112.04l-223.79 -332.67c-53.89,-76.28 -101.29,-149.25 -150.69,-225.38 -24.36,-37.54 -130.37,-198.76 -152.5,-216.82l-522.17 776.88z"/>
82
+ </g>
83
+ </g>
84
+ </g>
85
+ </svg>
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,3 @@
1
- import { AdminThemePreference, ResolvedAdminTheme } from './admin-theme';
1
+ import { AdminThemeController } from '../controllers/theme';
2
2
  import * as React from "react";
3
- export interface AdminThemeContextValue {
4
- theme: AdminThemePreference;
5
- resolvedTheme: ResolvedAdminTheme;
6
- setTheme: (theme: AdminThemePreference) => void;
7
- themeClassName: string;
8
- }
9
- export declare const AdminThemeContext: React.Context<AdminThemeContextValue>;
3
+ export declare const AdminThemeContext: React.Context<AdminThemeController>;
@@ -1,6 +1,8 @@
1
+ import { AdminThemeController } from '../controllers/theme';
1
2
  import * as React from "react";
2
- export declare function AdminThemeProvider({ children }: {
3
+ export declare function AdminThemeProvider({ children, controller, }: {
3
4
  children: React.ReactNode;
5
+ controller?: AdminThemeController;
4
6
  }): React.JSX.Element;
5
7
  export declare function AdminThemedRoot({ children }: {
6
8
  children: React.ReactNode;
@@ -2,3 +2,4 @@ export type AdminThemePreference = "system" | "light" | "dark";
2
2
  export type ResolvedAdminTheme = "light" | "dark";
3
3
  export declare function resolveAdminTheme(preference: AdminThemePreference, systemTheme: ResolvedAdminTheme): ResolvedAdminTheme;
4
4
  export declare function adminThemeClassName(resolvedTheme: ResolvedAdminTheme): "dy-admin-ui dark" | "dy-admin-ui";
5
+ export declare function getSystemAdminTheme(): ResolvedAdminTheme;
@@ -1,25 +1,16 @@
1
- import { Media } from '@dyrected/sdk';
2
- import * as React from "react";
3
- export interface UseAddMediaFromUrlOptions {
4
- /** Collection slug to create the external media record in. */
5
- collection: string;
6
- /** Called with the created media record after a successful add. */
7
- onAdded: (media: Media & {
8
- id: string;
9
- }) => void | Promise<void>;
10
- /** Called if the create request fails. */
11
- onError?: (error: Error) => void;
1
+ import { UseMediaURLOptions } from './use-media-url';
2
+ export interface UseAddMediaFromUrlOptions extends UseMediaURLOptions {
12
3
  }
13
4
  /**
14
- * Shared behavior for the "add media from a URL" flow used by both the media page
15
- * upload dialog and the media library picker dialog. Owns the URL input state and
16
- * the detect → create → callback pipeline so every surface behaves identically for
17
- * YouTube, Vimeo, external images, and generic files.
5
+ * @deprecated Use `useMediaURL` for new code. This alias exists for backwards compatibility.
18
6
  */
19
- export declare function useAddMediaFromUrl({ collection, onAdded, onError }: UseAddMediaFromUrlOptions): {
7
+ export declare function useAddMediaFromUrl(options: UseAddMediaFromUrlOptions): {
20
8
  url: string;
21
- setUrl: React.Dispatch<React.SetStateAction<string>>;
9
+ setUrl: import('react').Dispatch<import('react').SetStateAction<string>>;
22
10
  submit: () => Promise<void>;
11
+ importURL: (url: string) => Promise<import('..').MediaRecord>;
12
+ classifyURL: (nextUrl: string) => import('..').MediaURLClassification;
23
13
  isSubmitting: boolean;
24
14
  canSubmit: boolean;
15
+ activeCollection: string;
25
16
  };
@@ -1,2 +1,3 @@
1
+ import { AdminThemeHookResult } from '../public/contracts';
1
2
  export type { AdminThemePreference, ResolvedAdminTheme } from './admin-theme';
2
- export declare function useAdminTheme(): import('./admin-theme-context').AdminThemeContextValue;
3
+ export declare function useAdminTheme(): AdminThemeHookResult;
@@ -0,0 +1,2 @@
1
+ import { DyrectedFormHookResult } from '../public/contracts';
2
+ export declare function useDyrectedForm(): DyrectedFormHookResult;
@@ -0,0 +1,2 @@
1
+ import { DyrectedFieldHookResult } from '../public/contracts';
2
+ export declare function useField(path?: string): DyrectedFieldHookResult;
@@ -0,0 +1,26 @@
1
+ import { MediaRecord } from '../controllers/media';
2
+ export interface UseMediaLibraryOptions {
3
+ collection: string;
4
+ pageSize?: number;
5
+ initialSearchQuery?: string;
6
+ initialSelectedIds?: string[];
7
+ }
8
+ export declare function useMediaLibrary({ collection, pageSize, initialSearchQuery, initialSelectedIds, }: UseMediaLibraryOptions): {
9
+ load: () => Promise<MediaRecord[]>;
10
+ search: (query: string) => Promise<MediaRecord[]>;
11
+ loadNextPage: () => Promise<MediaRecord[]>;
12
+ setSelectedIds: (ids: string[]) => void;
13
+ select: (id: string) => void;
14
+ deselect: (id: string) => void;
15
+ toggle: (id: string) => void;
16
+ clearSelection: () => void;
17
+ selectedItems: MediaRecord[];
18
+ activeCollection: string;
19
+ items: MediaRecord[];
20
+ selectedIds: string[];
21
+ searchQuery: string;
22
+ page: number;
23
+ hasNextPage: boolean;
24
+ isLoading: boolean;
25
+ error: Error | null;
26
+ };
@@ -0,0 +1,20 @@
1
+ import { MediaRecord } from '../controllers/media';
2
+ export interface UseMediaUploadOptions {
3
+ collectionSlug?: string;
4
+ compressImages?: boolean;
5
+ maxDimension?: number;
6
+ quality?: number;
7
+ onCompletedItem?: (item: MediaRecord) => void | Promise<void>;
8
+ onAllCompleted?: (items: MediaRecord[]) => void | Promise<void>;
9
+ onError?: (error: Error, file: File) => void;
10
+ }
11
+ export declare function useMediaUpload({ collectionSlug, compressImages, maxDimension, quality, onCompletedItem, onAllCompleted, onError, }?: UseMediaUploadOptions): {
12
+ queue: import('..').MediaUploadQueueItem[];
13
+ isUploading: boolean;
14
+ activeCollection: string;
15
+ uploadFiles: (files: File[]) => Promise<MediaRecord[]>;
16
+ retryUpload: (id: string) => Promise<MediaRecord | null>;
17
+ removeQueueItem: (id: string) => void;
18
+ clearCompleted: () => void;
19
+ clearQueue: () => void;
20
+ };
@@ -0,0 +1,20 @@
1
+ import { MediaRecord, MediaURLClassification } from '../controllers/media';
2
+ import * as React from "react";
3
+ export interface UseMediaURLOptions {
4
+ collection: string;
5
+ compressImages?: boolean;
6
+ maxDimension?: number;
7
+ quality?: number;
8
+ onAdded?: (media: MediaRecord) => void | Promise<void>;
9
+ onError?: (error: Error) => void;
10
+ }
11
+ export declare function useMediaURL({ collection, compressImages, maxDimension, quality, onAdded, onError, }: UseMediaURLOptions): {
12
+ url: string;
13
+ setUrl: React.Dispatch<React.SetStateAction<string>>;
14
+ submit: () => Promise<void>;
15
+ importURL: (url: string) => Promise<MediaRecord>;
16
+ classifyURL: (nextUrl: string) => MediaURLClassification;
17
+ isSubmitting: boolean;
18
+ canSubmit: boolean;
19
+ activeCollection: string;
20
+ };