@kustomizer/visual-editor 0.0.1 → 0.1.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.
@@ -3,9 +3,7 @@ import { InjectionToken, Type, EnvironmentProviders, OnInit, OnDestroy } from '@
3
3
  import { Observable } from 'rxjs';
4
4
  import * as _ngrx_store from '@ngrx/store';
5
5
  import * as _kustomizer_visual_editor from '@kustomizer/visual-editor';
6
- import { SafeHtml } from '@angular/platform-browser';
7
- import { Session, User, SupabaseClient } from '@supabase/supabase-js';
8
- import { CanActivateFn } from '@angular/router';
6
+ import { SafeResourceUrl } from '@angular/platform-browser';
9
7
 
10
8
  /**
11
9
  * Navigation target for the visual editor
@@ -18,6 +16,8 @@ type VisualEditorNavigationTarget = {
18
16
  } | {
19
17
  type: 'page-preview';
20
18
  pageId: string;
19
+ } | {
20
+ type: 'setup';
21
21
  };
22
22
  /**
23
23
  * Confirmation dialog options
@@ -84,12 +84,20 @@ interface VisualEditorState {
84
84
  declare const initialVisualEditorState: VisualEditorState;
85
85
  declare const VISUAL_EDITOR_FEATURE_KEY = "visualEditor";
86
86
 
87
- declare const SHOPIFY_API_VERSION = "2026-01";
87
+ /**
88
+ * Shopify configuration for GraphQL API access
89
+ */
88
90
  interface ShopifyConfig {
89
91
  shopDomain: string;
90
92
  accessToken: string;
91
93
  apiVersion: string;
94
+ /** Optional proxy URL for development (bypasses CORS) */
95
+ proxyUrl?: string;
92
96
  }
97
+ /**
98
+ * Injection token for Shopify configuration
99
+ * Can be provided as a static object or as an Observable for dynamic config
100
+ */
93
101
  declare const SHOPIFY_CONFIG: InjectionToken<ShopifyConfig | Observable<ShopifyConfig>>;
94
102
  /**
95
103
  * Metafield representation from Shopify
@@ -118,6 +126,8 @@ interface PageIndexEntry {
118
126
  updatedAt: string;
119
127
  publishedAt?: string;
120
128
  size: number;
129
+ /** MetafieldDefinition ID for this page's metafield (enables Storefront API access) */
130
+ definitionId?: string;
121
131
  }
122
132
  /**
123
133
  * Index of all pages stored in a single metafield
@@ -187,6 +197,28 @@ interface UpdatePageRequest {
187
197
  interface PublishPageRequest {
188
198
  version: number;
189
199
  }
200
+ /**
201
+ * Shopify Storefront API configuration (read-only, public access)
202
+ */
203
+ interface StorefrontConfig {
204
+ shopDomain: string;
205
+ storefrontAccessToken: string;
206
+ apiVersion: string;
207
+ /** Optional proxy URL for SSR (avoids CORS) */
208
+ proxyUrl?: string;
209
+ }
210
+ /**
211
+ * Injection token for Storefront API configuration.
212
+ * Used by the public-storefront to read metafields via the Storefront API.
213
+ */
214
+ declare const STOREFRONT_CONFIG: InjectionToken<StorefrontConfig>;
215
+ /**
216
+ * Injection token for the client storefront URL.
217
+ * The editor uses this to:
218
+ * 1. Fetch the component manifest (`{url}/kustomizer/manifest.json`)
219
+ * 2. Embed the live preview iframe (`{url}/kustomizer/editor`)
220
+ */
221
+ declare const STOREFRONT_URL: InjectionToken<string>;
190
222
 
191
223
  /**
192
224
  * Abstract strategy for loading pages into the editor
@@ -784,9 +816,11 @@ interface ComponentDefinition<TProps extends Record<string, unknown> = Record<st
784
816
  */
785
817
  icon?: string;
786
818
  /**
787
- * Angular component class to render
819
+ * Angular component class to render.
820
+ * Optional for manifest-loaded definitions where the component is rendered
821
+ * in a remote iframe and the editor only needs metadata.
788
822
  */
789
- component: Type<unknown>;
823
+ component?: Type<unknown>;
790
824
  /**
791
825
  * Schema of editable properties
792
826
  */
@@ -1343,7 +1377,6 @@ interface BlockPickerTarget {
1343
1377
  declare class BlockTreeItemComponent {
1344
1378
  readonly facade: VisualEditorFacade;
1345
1379
  private readonly dndService;
1346
- private readonly sanitizer;
1347
1380
  private readonly treeBlock;
1348
1381
  readonly block: _angular_core.InputSignal<EditorElement>;
1349
1382
  readonly context: _angular_core.InputSignal<BlockTreeContext>;
@@ -1375,7 +1408,7 @@ declare class BlockTreeItemComponent {
1375
1408
  readonly blockSlots: _angular_core.Signal<SlotDefinition[]>;
1376
1409
  readonly children: _angular_core.Signal<EditorElement[]>;
1377
1410
  readonly childContext: _angular_core.Signal<BlockTreeContext>;
1378
- readonly blockIcon: _angular_core.Signal<SafeHtml>;
1411
+ readonly blockIcon: _angular_core.Signal<string>;
1379
1412
  readonly blockName: _angular_core.Signal<string>;
1380
1413
  readonly duplicable: _angular_core.Signal<boolean>;
1381
1414
  readonly canAddMore: _angular_core.Signal<boolean>;
@@ -1414,6 +1447,8 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
1414
1447
  private readonly loadingStrategy;
1415
1448
  private readonly config;
1416
1449
  private readonly dndService;
1450
+ private readonly iframeBridge;
1451
+ private readonly storefrontUrl;
1417
1452
  private readonly sanitizer;
1418
1453
  private readonly destroy$;
1419
1454
  readonly showBackButton: _angular_core.Signal<boolean>;
@@ -1424,6 +1459,9 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
1424
1459
  isEditor: boolean;
1425
1460
  }>;
1426
1461
  private readonly canvasEl;
1462
+ private readonly previewFrame;
1463
+ readonly previewUrl: _angular_core.Signal<SafeResourceUrl | null>;
1464
+ private iframeReady;
1427
1465
  readonly propertiesTab: _angular_core.WritableSignal<"props" | "blocks">;
1428
1466
  readonly expandedGroups: _angular_core.WritableSignal<Set<string>>;
1429
1467
  readonly expandedSections: _angular_core.WritableSignal<Set<string>>;
@@ -1465,19 +1503,18 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
1465
1503
  startEditingName(): void;
1466
1504
  saveEditingName(event: Event): void;
1467
1505
  cancelEditingName(): void;
1506
+ constructor();
1468
1507
  ngOnInit(): void;
1469
1508
  ngOnDestroy(): void;
1509
+ onIframeLoad(): void;
1470
1510
  goBack(): void;
1471
1511
  savePage(): void;
1472
1512
  publishPage(): void;
1473
1513
  unpublishPage(): void;
1474
- private readonly defaultSectionIcon;
1475
- private readonly defaultBlockIcon;
1476
- private toSafeIcon;
1477
- getIcon(def: ComponentDefinition): SafeHtml;
1478
- getBlockIcon(def: ComponentDefinition): SafeHtml;
1479
- getBlockIconByType(type: string): SafeHtml;
1480
- getSectionIcon(type: string): SafeHtml;
1514
+ getIcon(def: ComponentDefinition): string;
1515
+ getBlockIcon(def: ComponentDefinition): string;
1516
+ getBlockIconByType(type: string): string;
1517
+ getSectionIcon(type: string): string;
1481
1518
  isSectionExpanded(sectionId: string): boolean;
1482
1519
  isAllBlocksExpanded(sectionId: string): boolean;
1483
1520
  toggleSectionExpand(sectionId: string, event: Event): void;
@@ -1540,8 +1577,8 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
1540
1577
  addSectionFromPreset(rp: ResolvedPreset): void;
1541
1578
  addBlockToSectionFromPreset(section: EditorSection, rp: ResolvedPreset): void;
1542
1579
  addNestedBlockFromPreset(rp: ResolvedPreset): void;
1543
- getSectionPresetIcon(rp: ResolvedPreset): SafeHtml;
1544
- getBlockPresetIcon(rp: ResolvedPreset): SafeHtml;
1580
+ getSectionPresetIcon(rp: ResolvedPreset): string;
1581
+ getBlockPresetIcon(rp: ResolvedPreset): string;
1545
1582
  selectSection(section: EditorSection, event: Event): void;
1546
1583
  selectBlock(block: EditorElement): void;
1547
1584
  deleteSection(sectionId: string, event: Event): void;
@@ -1658,6 +1695,7 @@ declare class PageManagerComponent implements OnInit {
1658
1695
  readonly isDeleting: _angular_core.WritableSignal<boolean>;
1659
1696
  ngOnInit(): void;
1660
1697
  loadPages(): void;
1698
+ openSetup(): void;
1661
1699
  openCreateDialog(): void;
1662
1700
  closeCreateDialog(): void;
1663
1701
  onTitleInput(event: Event): void;
@@ -1673,345 +1711,63 @@ declare class PageManagerComponent implements OnInit {
1673
1711
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageManagerComponent, "lib-page-manager", never, {}, {}, never, never, true, never>;
1674
1712
  }
1675
1713
 
1676
- /**
1677
- * Token para inyectar el dominio de la tienda.
1678
- * Debe ser configurado por la aplicación que instala el editor.
1679
- *
1680
- * Ejemplo de uso:
1681
- * ```typescript
1682
- * providers: [
1683
- * { provide: STORE_DOMAIN, useValue: 'nike.com' }
1684
- * ]
1685
- * ```
1686
- *
1687
- * Si no se provee, el servicio intentará detectar el dominio desde window.location.hostname
1688
- */
1689
- declare const STORE_DOMAIN: InjectionToken<string>;
1690
- interface Shop {
1691
- id: string;
1692
- name: string;
1693
- shopify_domain: string;
1694
- }
1695
- interface ShopUser {
1696
- email: string;
1697
- role: 'owner' | 'admin' | 'reader';
1698
- }
1699
- interface ShopLicense {
1700
- tier: 'starter' | 'growth' | 'enterprise';
1701
- expires_at: string | null;
1702
- active: boolean;
1703
- }
1704
- interface ShopAuthData {
1705
- shop: Shop | null;
1706
- user: ShopUser | null;
1707
- license: ShopLicense | null;
1708
- }
1709
- interface ShopAuthError {
1710
- code: string;
1711
- message: string;
1712
- }
1713
- declare class ShopAuthService {
1714
- private http;
1715
- private config;
1716
- private authService;
1717
- private storeDomainConfig;
1718
- private _shop;
1719
- private _user;
1720
- private _license;
1721
- private _loading;
1722
- private _error;
1723
- private _initialized;
1724
- readonly shop: _angular_core.Signal<Shop | null>;
1725
- readonly user: _angular_core.Signal<ShopUser | null>;
1726
- readonly license: _angular_core.Signal<ShopLicense | null>;
1727
- readonly loading: _angular_core.Signal<boolean>;
1728
- readonly error: _angular_core.Signal<ShopAuthError | null>;
1729
- readonly initialized: _angular_core.Signal<boolean>;
1730
- readonly shopId: _angular_core.Signal<string | null>;
1731
- readonly shopName: _angular_core.Signal<string | null>;
1732
- readonly shopifyDomain: _angular_core.Signal<string | null>;
1733
- readonly userEmail: _angular_core.Signal<string | null>;
1734
- readonly userRole: _angular_core.Signal<"owner" | "admin" | "reader" | null>;
1735
- readonly isOwner: _angular_core.Signal<boolean>;
1736
- readonly isAdmin: _angular_core.Signal<boolean>;
1737
- readonly canEdit: _angular_core.Signal<boolean>;
1738
- readonly licenseTier: _angular_core.Signal<"starter" | "growth" | "enterprise" | null>;
1739
- readonly licenseActive: _angular_core.Signal<boolean>;
1740
- readonly licenseExpiresAt: _angular_core.Signal<string | null>;
1741
- readonly hasAccess: _angular_core.Signal<boolean>;
1742
- readonly daysRemaining: _angular_core.Signal<number | null>;
1743
- readonly isLicenseExpiringSoon: _angular_core.Signal<boolean>;
1744
- /**
1745
- * Obtiene el dominio actual.
1746
- * Prioridad:
1747
- * 1. STORE_DOMAIN token (inyectado)
1748
- * 2. Query param ?shop= (solo en localhost)
1749
- * 3. window.location.hostname
1750
- */
1751
- getCurrentDomain(): string;
1752
- /**
1753
- * Autentica al usuario para el dominio actual.
1754
- * Esta es la función principal que debe llamarse al cargar la app.
1755
- */
1756
- authenticate(): Promise<ShopAuthData>;
1757
- /**
1758
- * Limpia el estado (para logout)
1759
- */
1760
- clear(): void;
1761
- /**
1762
- * Refresca la autenticación
1763
- */
1764
- refresh(): Promise<ShopAuthData>;
1765
- /**
1766
- * Verifica si el error actual indica que el usuario no tiene acceso
1767
- */
1768
- isNoAccessError(): boolean;
1769
- /**
1770
- * Verifica si el error actual indica que la licencia expiró
1771
- */
1772
- isLicenseExpiredError(): boolean;
1773
- /**
1774
- * Verifica si el usuario está inactivo
1775
- */
1776
- isUserInactiveError(): boolean;
1777
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopAuthService, never>;
1778
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopAuthService>;
1779
- }
1780
-
1781
- declare class LicenseGuardComponent {
1782
- shopAuthService: ShopAuthService;
1783
- showExpirationWarning: _angular_core.InputSignal<boolean>;
1784
- subscribe: _angular_core.OutputEmitterRef<void>;
1785
- renew: _angular_core.OutputEmitterRef<void>;
1786
- reauth: _angular_core.OutputEmitterRef<void>;
1787
- retry: _angular_core.OutputEmitterRef<void>;
1788
- onSubscribe(): void;
1789
- onRenew(): void;
1790
- onReauth(): void;
1791
- onRetry(): void;
1792
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<LicenseGuardComponent, never>;
1793
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<LicenseGuardComponent, "lib-license-guard", never, { "showExpirationWarning": { "alias": "showExpirationWarning"; "required": false; "isSignal": true; }; }, { "subscribe": "subscribe"; "renew": "renew"; "reauth": "reauth"; "retry": "retry"; }, never, ["*"], true, never>;
1794
- }
1795
-
1796
- declare class LoginComponent {
1797
- private authService;
1798
- private router;
1799
- loginSuccess: _angular_core.OutputEmitterRef<void>;
1800
- email: _angular_core.WritableSignal<string>;
1801
- password: _angular_core.WritableSignal<string>;
1802
- error: _angular_core.WritableSignal<string | null>;
1803
- loading: _angular_core.WritableSignal<boolean>;
1804
- isSignUp: _angular_core.WritableSignal<boolean>;
1805
- showPassword: _angular_core.WritableSignal<boolean>;
1806
- toggleMode(): void;
1807
- togglePassword(): void;
1808
- onSubmit(): Promise<void>;
1809
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoginComponent, never>;
1810
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoginComponent, "lib-login", never, {}, { "loginSuccess": "loginSuccess"; }, never, never, true, never>;
1811
- }
1812
-
1813
- type ViewState = 'loading' | 'no-store' | 'license-expired';
1814
- declare class ActivateLicenseComponent implements OnInit {
1815
- shopAuthService: ShopAuthService;
1816
- viewState: _angular_core.Signal<ViewState>;
1817
- ngOnInit(): void;
1818
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActivateLicenseComponent, never>;
1819
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ActivateLicenseComponent, "lib-activate-license", never, {}, {}, never, never, true, never>;
1820
- }
1821
-
1822
- interface SupabaseConfig {
1823
- supabaseUrl: string;
1824
- supabaseAnonKey: string;
1825
- }
1826
- declare const SUPABASE_CONFIG: InjectionToken<SupabaseConfig>;
1827
- declare class SupabaseAuthService implements OnDestroy {
1828
- private config;
1829
- private supabase;
1830
- private supabasePromise;
1831
- private authSubscription;
1832
- private _session;
1833
- private _user;
1834
- private _loading;
1835
- private _error;
1836
- private _initialized;
1837
- readonly session: _angular_core.Signal<Session | null>;
1838
- readonly user: _angular_core.Signal<User | null>;
1839
- readonly loading: _angular_core.Signal<boolean>;
1840
- readonly error: _angular_core.Signal<string | null>;
1841
- readonly initialized: _angular_core.Signal<boolean>;
1842
- readonly isAuthenticated: _angular_core.Signal<boolean>;
1843
- readonly accessToken: _angular_core.Signal<string | null>;
1844
- readonly userEmail: _angular_core.Signal<string | null>;
1845
- private getSupabaseClient;
1846
- private initializeClient;
1847
- ensureInitialized(): Promise<void>;
1848
- signInWithPassword(email: string, password: string): Promise<{
1849
- success: boolean;
1850
- error?: string;
1851
- }>;
1852
- signUp(email: string, password: string): Promise<{
1853
- success: boolean;
1854
- error?: string;
1855
- }>;
1856
- signOut(): Promise<void>;
1857
- resetPassword(email: string): Promise<{
1858
- success: boolean;
1859
- error?: string;
1860
- }>;
1861
- getClient(): Promise<SupabaseClient | null>;
1862
- ngOnDestroy(): void;
1863
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SupabaseAuthService, never>;
1864
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<SupabaseAuthService>;
1865
- }
1866
-
1867
- declare class AppShellComponent {
1868
- authService: SupabaseAuthService;
1869
- shopAuthService: ShopAuthService;
1870
- loggedOut: _angular_core.OutputEmitterRef<void>;
1871
- logout(): Promise<void>;
1872
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppShellComponent, never>;
1873
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppShellComponent, "lib-app-shell", never, {}, { "loggedOut": "loggedOut"; }, never, ["*"], true, never>;
1874
- }
1875
-
1876
- declare class NoAccessComponent {
1877
- backToLogin: _angular_core.OutputEmitterRef<void>;
1878
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NoAccessComponent, never>;
1879
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NoAccessComponent, "ke-no-access", never, {}, { "backToLogin": "backToLogin"; }, never, never, true, never>;
1880
- }
1881
-
1882
- declare class LicenseExpiredComponent {
1883
- backToLogin: _angular_core.OutputEmitterRef<void>;
1884
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<LicenseExpiredComponent, never>;
1885
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<LicenseExpiredComponent, "ke-license-expired", never, {}, { "backToLogin": "backToLogin"; }, never, never, true, never>;
1886
- }
1887
-
1888
1714
  /**
1889
1715
  * Injection token to enable in-memory page storage (for development)
1890
1716
  * When false (default), uses Shopify metafields via GraphQL API
1891
1717
  */
1892
1718
  declare const USE_IN_MEMORY_PAGES: InjectionToken<boolean>;
1893
- /**
1894
- * Injection token for page environment (metafield key prefix).
1895
- * Default is 'production'.
1896
- */
1897
- declare const PAGE_ENVIRONMENT: InjectionToken<string>;
1898
1719
  declare class PageService {
1899
1720
  private readonly useInMemory;
1900
- private readonly pageEnvironment;
1901
1721
  private readonly memoryRepo;
1902
1722
  private readonly shopifyRepo;
1903
- private resolveEnvironment;
1904
1723
  /**
1905
1724
  * Get all pages (summaries only for listing)
1906
1725
  */
1907
- getPages(environment?: string): Observable<PageSummary[]>;
1726
+ getPages(): Observable<PageSummary[]>;
1908
1727
  /**
1909
1728
  * Get a single page by ID (full content)
1910
1729
  */
1911
- getPage(id: string, environment?: string): Observable<Page>;
1730
+ getPage(id: string): Observable<Page>;
1912
1731
  /**
1913
1732
  * Get a published page by slug (for public rendering)
1914
1733
  */
1915
- getPublishedPageBySlug(slug: string, environment?: string): Observable<Page>;
1734
+ getPublishedPageBySlug(slug: string): Observable<Page>;
1916
1735
  /**
1917
1736
  * Create a new page
1918
1737
  */
1919
- createPage(request: CreatePageRequest, environment?: string): Observable<Page>;
1738
+ createPage(request: CreatePageRequest): Observable<Page>;
1920
1739
  /**
1921
1740
  * Update an existing page
1922
1741
  */
1923
- updatePage(id: string, request: UpdatePageRequest, environment?: string): Observable<Page>;
1742
+ updatePage(id: string, request: UpdatePageRequest): Observable<Page>;
1924
1743
  /**
1925
1744
  * Delete a page
1926
1745
  */
1927
- deletePage(id: string, environment?: string): Observable<void>;
1746
+ deletePage(id: string): Observable<void>;
1928
1747
  /**
1929
1748
  * Publish a page (changes status to 'published')
1930
1749
  */
1931
- publishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page>;
1750
+ publishPage(id: string, request: PublishPageRequest): Observable<Page>;
1932
1751
  /**
1933
1752
  * Unpublish a page (changes status to 'draft')
1934
1753
  */
1935
- unpublishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page>;
1754
+ unpublishPage(id: string, request: PublishPageRequest): Observable<Page>;
1936
1755
  /**
1937
1756
  * Duplicate an existing page
1938
1757
  */
1939
- duplicatePage(id: string, environment?: string): Observable<Page>;
1940
- /**
1941
- * Delete all pages for a given environment
1942
- */
1943
- deletePagesByEnvironment(environment?: string): Observable<void>;
1758
+ duplicatePage(id: string): Observable<Page>;
1944
1759
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageService, never>;
1945
1760
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageService>;
1946
1761
  }
1947
1762
 
1948
- interface ShopifyAppConfig {
1949
- appUrl: string;
1950
- }
1951
- interface ShopifyTokenResponse {
1952
- accessToken: string;
1953
- shopifyDomain: string;
1954
- }
1955
- type TokenErrorCode = 'NOT_AUTHENTICATED' | 'NO_ACTIVE_STORE' | 'TOKEN_FETCH_FAILED' | 'SESSION_EXPIRED' | 'NO_STORE_ACCESS' | 'NETWORK_ERROR' | 'UNKNOWN_ERROR';
1956
- interface TokenError {
1957
- code: TokenErrorCode;
1958
- message: string;
1959
- status?: number;
1960
- }
1961
- declare const SHOPIFY_APP_CONFIG: InjectionToken<ShopifyAppConfig>;
1962
- declare class ShopifyTokenService {
1963
- private readonly http;
1964
- private readonly config;
1965
- private readonly authService;
1966
- private readonly shopAuthService;
1967
- private readonly CACHE_TTL_MS;
1968
- private readonly tokenCache;
1969
- private readonly _currentToken;
1970
- private readonly _currentDomain;
1971
- private readonly _loading;
1972
- private readonly _error;
1973
- private pendingRequest;
1974
- readonly currentToken: _angular_core.Signal<string | null>;
1975
- readonly currentDomain: _angular_core.Signal<string | null>;
1976
- readonly loading: _angular_core.Signal<boolean>;
1977
- readonly error: _angular_core.Signal<TokenError | null>;
1978
- readonly hasToken: _angular_core.Signal<boolean>;
1979
- readonly isReady: _angular_core.Signal<boolean>;
1980
- getToken(): Observable<ShopifyTokenResponse>;
1981
- getTokenForDomain(shopifyDomain: string): Observable<ShopifyTokenResponse>;
1982
- refreshToken(): Observable<ShopifyTokenResponse>;
1983
- invalidateCache(shopifyDomain?: string): void;
1984
- clear(): void;
1985
- private fetchToken;
1986
- private getCachedToken;
1987
- private setCachedToken;
1988
- private handleHttpError;
1989
- private createError;
1990
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopifyTokenService, never>;
1991
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopifyTokenService>;
1992
- }
1993
-
1994
- type GraphQLErrorCode = 'GRAPHQL_ERROR' | 'EMPTY_RESPONSE' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'RATE_LIMIT' | 'SERVER_ERROR' | 'NETWORK_ERROR' | 'HTTP_ERROR' | 'TOKEN_ERROR' | 'UNKNOWN_ERROR';
1995
- interface GraphQLError {
1996
- code: GraphQLErrorCode;
1997
- message: string;
1998
- status?: number;
1999
- errors?: Array<{
2000
- message: string;
2001
- }>;
2002
- original?: unknown;
2003
- }
2004
1763
  declare class ShopifyGraphQLClient {
2005
1764
  private readonly http;
2006
- private readonly authService;
2007
- private readonly shopAuthService;
2008
1765
  private readonly config;
2009
- query<T>(query: string, variables?: Record<string, unknown>): Observable<T>;
2010
- mutate<T>(mutation: string, variables?: Record<string, unknown>): Observable<T>;
1766
+ query<T>(query: string, variables?: Record<string, any>): Observable<T>;
1767
+ mutate<T>(mutation: string, variables?: Record<string, any>): Observable<T>;
2011
1768
  private executeOperation;
2012
1769
  private handleResponse;
2013
- private handleHttpError;
2014
- private createError;
1770
+ private handleError;
2015
1771
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopifyGraphQLClient, never>;
2016
1772
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopifyGraphQLClient>;
2017
1773
  }
@@ -2022,22 +1778,34 @@ declare const MAX_METAFIELD_SIZE: number;
2022
1778
  declare const GET_SHOP_METAFIELD_QUERY = "\n query GetShopMetafield($namespace: String!, $key: String!) {\n shop {\n id\n metafield(namespace: $namespace, key: $key) {\n id\n value\n createdAt\n updatedAt\n }\n }\n }\n";
2023
1779
  declare const SET_METAFIELD_MUTATION = "\n mutation SetMetafield($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields {\n id\n namespace\n key\n value\n }\n userErrors {\n field\n message\n }\n }\n }\n";
2024
1780
  declare const DELETE_METAFIELDS_MUTATION = "\n mutation DeleteMetafields($metafields: [MetafieldIdentifierInput!]!) {\n metafieldsDelete(metafields: $metafields) {\n deletedMetafields {\n key\n namespace\n }\n userErrors {\n field\n message\n }\n }\n }\n";
1781
+ declare const CREATE_METAFIELD_DEFINITION_MUTATION = "\n mutation CreateMetafieldDefinition($definition: MetafieldDefinitionInput!) {\n metafieldDefinitionCreate(definition: $definition) {\n createdDefinition {\n id\n }\n userErrors {\n field\n message\n code\n }\n }\n }\n";
1782
+ declare const DELETE_METAFIELD_DEFINITION_MUTATION = "\n mutation DeleteMetafieldDefinition($id: ID!) {\n metafieldDefinitionDelete(id: $id) {\n deletedDefinitionId\n userErrors {\n field\n message\n code\n }\n }\n }\n";
1783
+ declare const GET_METAFIELD_DEFINITION_QUERY = "\n query GetMetafieldDefinition($ownerType: MetafieldOwnerType!, $namespace: String, $key: String!) {\n metafieldDefinition(identifier: { ownerType: $ownerType, namespace: $namespace, key: $key }) {\n id\n }\n }\n";
2025
1784
  declare const GET_SHOP_ID_QUERY = "\n query GetShopId {\n shop {\n id\n }\n }\n";
2026
1785
  declare class ShopifyMetafieldRepository {
2027
1786
  private readonly client;
2028
- private resolveEnvironment;
2029
- private buildIndexKey;
2030
- private buildPageKey;
2031
1787
  getMetafield(namespace: string, key: string): Observable<Metafield | null>;
2032
1788
  setMetafield(namespace: string, key: string, value: any, ownerId: string): Observable<Metafield>;
2033
1789
  deleteMetafield(namespace: string, key: string): Observable<void>;
2034
1790
  getShopId(): Observable<string>;
2035
- getPageIndex(environment?: string): Observable<PagesIndex>;
2036
- updatePageIndex(index: PagesIndex, environment?: string): Observable<PagesIndex>;
2037
- getPageMetafield(pageId: string, environment?: string): Observable<Page | null>;
2038
- setPageMetafield(pageId: string, page: Page, environment?: string): Observable<Page>;
2039
- deletePageMetafield(pageId: string, environment?: string): Observable<void>;
2040
- resetPageIndex(environment?: string): Observable<PagesIndex>;
1791
+ getPageIndex(): Observable<PagesIndex>;
1792
+ updatePageIndex(index: PagesIndex): Observable<PagesIndex>;
1793
+ getPageMetafield(pageId: string): Observable<Page | null>;
1794
+ setPageMetafield(pageId: string, page: Page): Observable<Page>;
1795
+ deletePageMetafield(pageId: string): Observable<void>;
1796
+ /**
1797
+ * Create a MetafieldDefinition with PUBLIC_READ storefront access.
1798
+ * Idempotent: if definition already exists, returns the existing ID.
1799
+ */
1800
+ createMetafieldDefinition(namespace: string, key: string, name: string): Observable<string>;
1801
+ /**
1802
+ * Delete a MetafieldDefinition by ID. Does not delete associated metafields.
1803
+ */
1804
+ deleteMetafieldDefinition(definitionId: string): Observable<void>;
1805
+ /**
1806
+ * Look up a MetafieldDefinition ID by namespace and key.
1807
+ */
1808
+ getMetafieldDefinitionId(namespace: string, key: string): Observable<string>;
2041
1809
  validateSize(data: any): {
2042
1810
  valid: boolean;
2043
1811
  size: number;
@@ -2050,17 +1818,23 @@ declare class ShopifyMetafieldRepository {
2050
1818
 
2051
1819
  declare class PageShopifyRepository {
2052
1820
  private readonly metafieldRepo;
2053
- private resolveEnvironment;
2054
- getPages(environment?: string): Observable<PageSummary[]>;
2055
- getPage(id: string, environment?: string): Observable<Page>;
2056
- getPublishedPageBySlug(slug: string, environment?: string): Observable<Page>;
2057
- createPage(request: CreatePageRequest, environment?: string): Observable<Page>;
2058
- updatePage(id: string, request: UpdatePageRequest, environment?: string): Observable<Page>;
2059
- deletePage(id: string, environment?: string): Observable<void>;
2060
- publishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page>;
2061
- unpublishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page>;
2062
- duplicatePage(id: string, environment?: string): Observable<Page>;
2063
- deletePagesByEnvironment(environment?: string): Observable<void>;
1821
+ getPages(): Observable<PageSummary[]>;
1822
+ getPage(id: string): Observable<Page>;
1823
+ getPublishedPageBySlug(slug: string): Observable<Page>;
1824
+ createPage(request: CreatePageRequest): Observable<Page>;
1825
+ updatePage(id: string, request: UpdatePageRequest): Observable<Page>;
1826
+ deletePage(id: string): Observable<void>;
1827
+ publishPage(id: string, request: PublishPageRequest): Observable<Page>;
1828
+ unpublishPage(id: string, request: PublishPageRequest): Observable<Page>;
1829
+ duplicatePage(id: string): Observable<Page>;
1830
+ /**
1831
+ * Backfill MetafieldDefinitions for existing pages that don't have one.
1832
+ * Creates definitions with PUBLIC_READ storefront access.
1833
+ */
1834
+ ensureDefinitionsExist(): Observable<{
1835
+ created: number;
1836
+ skipped: number;
1837
+ }>;
2064
1838
  private validateUniqueSlug;
2065
1839
  private generateUniqueSlug;
2066
1840
  private addPageToIndex;
@@ -2071,135 +1845,174 @@ declare class PageShopifyRepository {
2071
1845
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageShopifyRepository>;
2072
1846
  }
2073
1847
 
2074
- interface TeamMember {
2075
- email: string;
2076
- role: 'owner' | 'admin' | 'reader';
2077
- status: 'active' | 'inactive' | 'suspended';
2078
- invited_by: string | null;
2079
- joined_at: string;
2080
- is_current_user: boolean;
2081
- }
2082
- interface PendingInvitation {
2083
- id: string;
2084
- email: string;
2085
- role: 'admin' | 'reader';
2086
- invited_by: string;
2087
- created_at: string;
2088
- expires_at: string;
2089
- is_expired: boolean;
2090
- }
2091
- interface CurrentUser {
2092
- email: string;
2093
- role: string;
2094
- can_invite: boolean;
2095
- can_remove_members: boolean;
2096
- }
2097
- interface TeamData {
2098
- shop: {
2099
- id: string;
2100
- name: string;
2101
- shopify_domain: string;
2102
- allowed_domains: string[];
2103
- };
2104
- members: TeamMember[];
2105
- invitations: PendingInvitation[];
2106
- current_user: CurrentUser;
2107
- summary: {
2108
- total_members: number;
2109
- pending_invitations: number;
2110
- };
2111
- }
2112
- interface InviteResult {
2113
- invitation_id: string;
2114
- token: string;
2115
- expires_at: string;
2116
- email: string;
2117
- role: string;
2118
- }
2119
- interface AcceptInvitationResult {
2120
- success: boolean;
2121
- shop: {
2122
- id: string;
2123
- name: string;
2124
- shopify_domain: string;
2125
- };
2126
- role: string;
2127
- message: string;
2128
- }
2129
- declare class ShopTeamService {
2130
- private http;
2131
- private config;
2132
- private authService;
2133
- private shopAuthService;
2134
- private _team;
2135
- private _loading;
2136
- private _error;
2137
- readonly team: _angular_core.Signal<TeamData | null>;
2138
- readonly loading: _angular_core.Signal<boolean>;
2139
- readonly error: _angular_core.Signal<string | null>;
2140
- readonly members: _angular_core.Signal<TeamMember[]>;
2141
- readonly invitations: _angular_core.Signal<PendingInvitation[]>;
2142
- readonly currentUser: _angular_core.Signal<CurrentUser | null>;
2143
- readonly activeMembers: _angular_core.Signal<TeamMember[]>;
2144
- readonly pendingInvitations: _angular_core.Signal<PendingInvitation[]>;
2145
- readonly canInvite: _angular_core.Signal<boolean>;
2146
- /**
2147
- * Carga el equipo de la shop actual
2148
- */
2149
- loadTeam(): Promise<TeamData | null>;
2150
- /**
2151
- * Invita a un usuario a la shop
2152
- */
2153
- inviteUser(email: string, role: 'admin' | 'reader', message?: string): Promise<InviteResult | null>;
2154
- /**
2155
- * Acepta una invitación (usado cuando un usuario hace click en el link de invitación)
2156
- */
2157
- acceptInvitation(invitationToken: string): Promise<AcceptInvitationResult | null>;
2158
- /**
2159
- * Genera el URL de invitación (para copiar/compartir)
2160
- */
2161
- getInvitationUrl(token: string, baseUrl?: string): string;
2162
- /**
2163
- * Limpia el estado
2164
- */
2165
- clear(): void;
2166
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopTeamService, never>;
2167
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopTeamService>;
1848
+ /**
1849
+ * Read-only GraphQL client for the Shopify Storefront API.
1850
+ * Uses a Storefront Access Token (public, non-secret) instead of Admin API credentials.
1851
+ */
1852
+ declare class StorefrontGraphQLClient {
1853
+ private readonly http;
1854
+ private readonly config;
1855
+ query<T>(query: string, variables?: Record<string, any>): Observable<T>;
1856
+ private handleResponse;
1857
+ private handleError;
1858
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StorefrontGraphQLClient, never>;
1859
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<StorefrontGraphQLClient>;
2168
1860
  }
2169
1861
 
2170
- declare const authGuard: CanActivateFn;
2171
- declare const noAuthGuard: CanActivateFn;
1862
+ /**
1863
+ * Read-only metafield repository using the Shopify Storefront API.
1864
+ * Only works for metafields with MetafieldDefinitions that have `access.storefront: PUBLIC_READ`.
1865
+ */
1866
+ declare class StorefrontMetafieldRepository {
1867
+ private readonly client;
1868
+ getMetafield(namespace: string, key: string): Observable<{
1869
+ value: string;
1870
+ type: string;
1871
+ } | null>;
1872
+ getPageIndex(): Observable<PagesIndex>;
1873
+ getPageMetafield(pageId: string): Observable<Page | null>;
1874
+ private getDefaultIndex;
1875
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StorefrontMetafieldRepository, never>;
1876
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<StorefrontMetafieldRepository>;
1877
+ }
2172
1878
 
2173
- declare const licenseGuard: CanActivateFn;
2174
- declare const noLicenseGuard: CanActivateFn;
1879
+ /**
1880
+ * Read-only page repository using the Shopify Storefront API.
1881
+ * Used by the public-storefront to read published pages without Admin API access.
1882
+ */
1883
+ declare class PageStorefrontRepository {
1884
+ private readonly metafieldRepo;
1885
+ getPages(): Observable<PageSummary[]>;
1886
+ getPublishedPages(): Observable<PageSummary[]>;
1887
+ getPage(id: string): Observable<Page>;
1888
+ getPublishedPageBySlug(slug: string): Observable<Page>;
1889
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageStorefrontRepository, never>;
1890
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageStorefrontRepository>;
1891
+ }
2175
1892
 
2176
1893
  /**
2177
- * Guard que verifica:
2178
- * 1. Usuario autenticado
2179
- * 2. Usuario tiene acceso a la shop del dominio actual
2180
- * 3. Licencia activa
2181
- *
2182
- * Redirige a:
2183
- * - /login si no está autenticado
2184
- * - /no-access si no tiene acceso a la shop
2185
- * - /license-expired si la licencia expiró
1894
+ * A manifest describing all available components from a client's storefront.
1895
+ * Fetched at runtime by the editor via HTTP.
2186
1896
  */
2187
- declare const shopAuthGuard: CanActivateFn;
1897
+ interface ComponentManifest {
1898
+ version: string;
1899
+ components: ComponentManifestEntry[];
1900
+ }
2188
1901
  /**
2189
- * Guard que solo permite acceso si el usuario NO tiene acceso a una shop.
2190
- * Útil para páginas como /login que no deberían ser accesibles si ya tienes acceso.
1902
+ * A single component entry in the manifest same shape as ComponentDefinition
1903
+ * but without the Angular `component` class reference.
2191
1904
  */
2192
- declare const noShopAuthGuard: CanActivateFn;
1905
+ interface ComponentManifestEntry {
1906
+ type: string;
1907
+ name: string;
1908
+ description?: string;
1909
+ category: ComponentCategory;
1910
+ icon?: string;
1911
+ isSection?: boolean;
1912
+ isBlock?: boolean;
1913
+ blockScope?: 'section' | 'theme';
1914
+ sectionTypes?: string[];
1915
+ draggable?: boolean;
1916
+ deletable?: boolean;
1917
+ duplicable?: boolean;
1918
+ tags?: string[];
1919
+ order?: number;
1920
+ slots?: SlotDefinition[];
1921
+ props: PropSchemaMap;
1922
+ }
1923
+
2193
1924
  /**
2194
- * Guard que verifica que el usuario tenga rol de admin o owner.
2195
- * Requiere que shopAuthGuard se haya ejecutado primero.
1925
+ * Loads a component manifest from a remote storefront URL and registers
1926
+ * the entries in the ComponentRegistryService as "virtual" definitions
1927
+ * (no Angular component class — only metadata for palette and property panel).
2196
1928
  */
2197
- declare const shopAdminGuard: CanActivateFn;
1929
+ declare class ManifestLoaderService {
1930
+ private readonly http;
1931
+ private readonly registry;
1932
+ /**
1933
+ * Fetch the manifest from the given URL and register all components.
1934
+ */
1935
+ loadManifest(url: string): Observable<ComponentManifest>;
1936
+ /**
1937
+ * Register manifest entries in the ComponentRegistryService.
1938
+ * Each entry becomes a ComponentDefinition without a `component` field.
1939
+ */
1940
+ registerManifestComponents(manifest: ComponentManifest): void;
1941
+ private manifestEntryToDefinition;
1942
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ManifestLoaderService, never>;
1943
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ManifestLoaderService>;
1944
+ }
1945
+
1946
+ /** Parent → Iframe */
1947
+ interface PageUpdateMessage {
1948
+ type: 'kustomizer:page-update';
1949
+ sections: EditorSection[];
1950
+ }
1951
+ interface SelectElementMessage {
1952
+ type: 'kustomizer:select-element';
1953
+ elementId: string;
1954
+ }
1955
+ interface DeselectMessage {
1956
+ type: 'kustomizer:deselect';
1957
+ }
1958
+ /** Iframe → Parent */
1959
+ interface ReadyMessage {
1960
+ type: 'kustomizer:ready';
1961
+ }
1962
+ interface ElementClickedMessage {
1963
+ type: 'kustomizer:element-clicked';
1964
+ elementId: string;
1965
+ sectionId: string;
1966
+ }
1967
+ interface ElementHoverMessage {
1968
+ type: 'kustomizer:element-hover';
1969
+ elementId: string | null;
1970
+ }
1971
+ interface ElementMovedMessage {
1972
+ type: 'kustomizer:element-moved';
1973
+ elementId: string;
1974
+ newIndex: number;
1975
+ targetSectionId?: string;
1976
+ }
2198
1977
  /**
2199
- * Guard que verifica que el usuario pueda editar (owner o admin).
2200
- * Los readers solo pueden ver, no editar.
1978
+ * Manages postMessage communication between the editor (parent) and the
1979
+ * storefront preview (iframe).
2201
1980
  */
2202
- declare const shopEditorGuard: CanActivateFn;
1981
+ declare class IframeBridgeService implements OnDestroy {
1982
+ private readonly zone;
1983
+ private iframe;
1984
+ private origin;
1985
+ private readonly messages$;
1986
+ private readonly messageHandler;
1987
+ constructor();
1988
+ ngOnDestroy(): void;
1989
+ /**
1990
+ * Connect to an iframe element. Must be called after the iframe loads.
1991
+ */
1992
+ connect(iframe: HTMLIFrameElement, origin: string): void;
1993
+ /**
1994
+ * Disconnect from the current iframe.
1995
+ */
1996
+ disconnect(): void;
1997
+ sendPageUpdate(sections: EditorSection[]): void;
1998
+ sendSelectElement(elementId: string): void;
1999
+ sendDeselect(): void;
2000
+ onReady(): Observable<void>;
2001
+ onElementClicked(): Observable<{
2002
+ elementId: string;
2003
+ sectionId: string;
2004
+ }>;
2005
+ onElementHover(): Observable<string | null>;
2006
+ onElementMoved(): Observable<{
2007
+ elementId: string;
2008
+ newIndex: number;
2009
+ targetSectionId?: string;
2010
+ }>;
2011
+ private send;
2012
+ private handleMessage;
2013
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IframeBridgeService, never>;
2014
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<IframeBridgeService>;
2015
+ }
2203
2016
 
2204
2017
  declare class DragDropService {
2205
2018
  private readonly store;
@@ -2231,5 +2044,5 @@ declare class VisualEditor {
2231
2044
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<VisualEditor, "lib-visual-editor", never, {}, {}, never, never, true, never>;
2232
2045
  }
2233
2046
 
2234
- export { ActivateLicenseComponent, AppShellComponent, BlockTreeItemComponent, ComponentRegistryService, DEFAULT_ROUTER_NAVIGATION_CONFIG, DEFAULT_VISUAL_EDITOR_CONFIG, DELETE_METAFIELDS_MUTATION, DefaultRouterNavigationService, DragDropService, DynamicRendererComponent, EDITOR_COMPONENT_DEFINITIONS, FILES_QUERY, GET_SHOP_ID_QUERY, GET_SHOP_METAFIELD_QUERY, INDEX_KEY, InputPageLoadingStrategy, LicenseExpiredComponent, LicenseGuardComponent, LoginComponent, MAX_METAFIELD_SIZE, NAMESPACE, NoAccessComponent, PAGE_ENVIRONMENT, PageLoadingStrategy, PageManagerComponent, PageService, PageShopifyRepository, ROUTER_NAVIGATION_CONFIG, RoutePageLoadingStrategy, SET_METAFIELD_MUTATION, SHOPIFY_API_VERSION, SHOPIFY_APP_CONFIG, SHOPIFY_CONFIG, STORE_DOMAIN, SUPABASE_CONFIG, ShopAuthService, ShopTeamService, ShopifyFilePickerComponent, ShopifyFilesService, ShopifyGraphQLClient, ShopifyMetafieldRepository, ShopifyTokenService, SlotRendererComponent, SupabaseAuthService, USE_IN_MEMORY_PAGES, VISUAL_EDITOR_CONFIG, VISUAL_EDITOR_FEATURE_KEY, VisualEditor, VisualEditorActions, VisualEditorComponent, VisualEditorFacade, VisualEditorNavigation, authGuard, initialVisualEditorState, licenseGuard, noAuthGuard, noLicenseGuard, noShopAuthGuard, provideEditorComponents, provideVisualEditor, provideVisualEditorStore, selectBlocksForSection, selectBlocksForSlot, selectCanRedo, selectCanUndo, selectCurrentPage, selectCurrentPageId, selectCurrentPageSlug, selectCurrentPageStatus, selectCurrentPageTitle, selectCurrentPageVersion, selectDraggedElementId, selectElementById, selectHistory, selectHistoryIndex, selectHistoryLength, selectIsDirty, selectIsDragging, selectIsPageLoaded, selectLastAction, selectSectionById, selectSections, selectSelectedBlock, selectSelectedBlockSlotName, selectSelectedElement, selectSelectedElementId, selectSelectedElementType, selectSelectedSection, selectSelectedSectionId, selectSelectedSectionType, selectVisualEditorState, shopAdminGuard, shopAuthGuard, shopEditorGuard, visualEditorReducer };
2235
- export type { AcceptInvitationResult, BlockPickerTarget, BlockTreeContext, ComponentCategory, ComponentDefinition, ComponentPreset, ConfirmDialogOptions, CreatePageRequest, CurrentUser, DragItem, DragItemKind, DropTarget, DropZone, EditorElement, EditorSection, GraphQLError, GraphQLErrorCode, HistoryEntry, InviteResult, Metafield, Page, PageContext, PageIndexEntry, PageStatus, PageSummary, PagesIndex, PendingInvitation, PresetBlockConfig, PropCondition, PropSchema, PropSchemaMap, PropType, PropValidation, PublishPageRequest, ResolvedPreset, RouterNavigationConfig, SelectOption, Shop, ShopAuthData, ShopAuthError, ShopLicense, ShopUser, ShopifyAppConfig, ShopifyConfig, ShopifyFile, ShopifyFilesPage, ShopifyTokenResponse, SlotConstraints, SlotDefinition, SupabaseConfig, TeamData, TeamMember, TokenError, TokenErrorCode, UpdatePageRequest, VisualEditorConfig, VisualEditorNavigationTarget, VisualEditorState };
2047
+ export { BlockTreeItemComponent, CREATE_METAFIELD_DEFINITION_MUTATION, ComponentRegistryService, DEFAULT_ROUTER_NAVIGATION_CONFIG, DEFAULT_VISUAL_EDITOR_CONFIG, DELETE_METAFIELDS_MUTATION, DELETE_METAFIELD_DEFINITION_MUTATION, DefaultRouterNavigationService, DragDropService, DynamicRendererComponent, EDITOR_COMPONENT_DEFINITIONS, FILES_QUERY, GET_METAFIELD_DEFINITION_QUERY, GET_SHOP_ID_QUERY, GET_SHOP_METAFIELD_QUERY, INDEX_KEY, IframeBridgeService, InputPageLoadingStrategy, MAX_METAFIELD_SIZE, ManifestLoaderService, NAMESPACE, PageLoadingStrategy, PageManagerComponent, PageService, PageShopifyRepository, PageStorefrontRepository, ROUTER_NAVIGATION_CONFIG, RoutePageLoadingStrategy, SET_METAFIELD_MUTATION, SHOPIFY_CONFIG, STOREFRONT_CONFIG, STOREFRONT_URL, ShopifyFilePickerComponent, ShopifyFilesService, ShopifyGraphQLClient, ShopifyMetafieldRepository, SlotRendererComponent, StorefrontGraphQLClient, StorefrontMetafieldRepository, USE_IN_MEMORY_PAGES, VISUAL_EDITOR_CONFIG, VISUAL_EDITOR_FEATURE_KEY, VisualEditor, VisualEditorActions, VisualEditorComponent, VisualEditorFacade, VisualEditorNavigation, initialVisualEditorState, provideEditorComponents, provideVisualEditor, provideVisualEditorStore, selectBlocksForSection, selectBlocksForSlot, selectCanRedo, selectCanUndo, selectCurrentPage, selectCurrentPageId, selectCurrentPageSlug, selectCurrentPageStatus, selectCurrentPageTitle, selectCurrentPageVersion, selectDraggedElementId, selectElementById, selectHistory, selectHistoryIndex, selectHistoryLength, selectIsDirty, selectIsDragging, selectIsPageLoaded, selectLastAction, selectSectionById, selectSections, selectSelectedBlock, selectSelectedBlockSlotName, selectSelectedElement, selectSelectedElementId, selectSelectedElementType, selectSelectedSection, selectSelectedSectionId, selectSelectedSectionType, selectVisualEditorState, visualEditorReducer };
2048
+ export type { BlockPickerTarget, BlockTreeContext, ComponentCategory, ComponentDefinition, ComponentManifest, ComponentManifestEntry, ComponentPreset, ConfirmDialogOptions, CreatePageRequest, DeselectMessage, DragItem, DragItemKind, DropTarget, DropZone, EditorElement, EditorSection, ElementClickedMessage, ElementHoverMessage, ElementMovedMessage, HistoryEntry, Metafield, Page, PageContext, PageIndexEntry, PageStatus, PageSummary, PageUpdateMessage, PagesIndex, PresetBlockConfig, PropCondition, PropSchema, PropSchemaMap, PropType, PropValidation, PublishPageRequest, ReadyMessage, ResolvedPreset, RouterNavigationConfig, SelectElementMessage, SelectOption, ShopifyConfig, ShopifyFile, ShopifyFilesPage, SlotConstraints, SlotDefinition, StorefrontConfig, UpdatePageRequest, VisualEditorConfig, VisualEditorNavigationTarget, VisualEditorState };