diff --git a/src/app/shared/index.ts b/src/app/shared/index.ts new file mode 100644 index 0000000..9723bff --- /dev/null +++ b/src/app/shared/index.ts @@ -0,0 +1,2 @@ +export * from './models'; +export * from './types'; diff --git a/src/app/shared/models/config/api-endpoints.model.ts b/src/app/shared/models/config/api-endpoints.model.ts new file mode 100644 index 0000000..dd3c866 --- /dev/null +++ b/src/app/shared/models/config/api-endpoints.model.ts @@ -0,0 +1,12 @@ +export interface ApiEndpointConfig { + path: string; + method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'; + timeoutMs?: number; +} + +export interface ApiEndpointsConfig { + bootstrap: ApiEndpointConfig; + website: Record; + builder: Record; + backoffice: Record; +} diff --git a/src/app/shared/models/config/bootstrap-config.model.ts b/src/app/shared/models/config/bootstrap-config.model.ts new file mode 100644 index 0000000..2b8d443 --- /dev/null +++ b/src/app/shared/models/config/bootstrap-config.model.ts @@ -0,0 +1,27 @@ +import { ApiEndpointsConfig } from './api-endpoints.model'; +import { BrandingConfig } from './branding.model'; +import { CompanyConfig } from './company.model'; +import { FeatureFlagsConfig } from './feature-flags.model'; +import { LocalizationConfig } from './localization.model'; +import { NavigationConfig } from './navigation.model'; +import { PageConfig } from './page.model'; +import { PermissionsConfig } from './permissions.model'; +import { SeoConfig } from './seo.model'; +import { TenantConfig } from './tenant.model'; +import { ThemeConfig } from './theme.model'; + +export interface BootstrapConfig { + schemaVersion: string; + generatedAt: string; + tenant: TenantConfig; + branding: BrandingConfig; + theme: ThemeConfig; + company: CompanyConfig; + featureFlags: FeatureFlagsConfig; + apiEndpoints: ApiEndpointsConfig; + localization: LocalizationConfig; + seo: SeoConfig; + permissions: PermissionsConfig; + navigation: NavigationConfig; + pages: PageConfig[]; +} diff --git a/src/app/shared/models/config/branding.model.ts b/src/app/shared/models/config/branding.model.ts new file mode 100644 index 0000000..86f434b --- /dev/null +++ b/src/app/shared/models/config/branding.model.ts @@ -0,0 +1,13 @@ +import { UrlString } from '../../types/primitive.types'; + +export interface BrandingConfig { + brandName: string; + legalName: string; + slogan?: string; + logoUrl: UrlString; + logoCompactUrl?: UrlString; + faviconUrl: UrlString; + appIconUrl?: UrlString; + supportEmail?: string; + supportPhone?: string; +} diff --git a/src/app/shared/models/config/company.model.ts b/src/app/shared/models/config/company.model.ts new file mode 100644 index 0000000..2c45bc9 --- /dev/null +++ b/src/app/shared/models/config/company.model.ts @@ -0,0 +1,22 @@ +export interface CompanyAddressConfig { + country: string; + region?: string; + city: string; + street?: string; + postalCode?: string; +} + +export interface CompanyContactConfig { + email: string; + phone?: string; + telegram?: string; + website?: string; +} + +export interface CompanyConfig { + companyName: string; + registrationNumber?: string; + taxId?: string; + address: CompanyAddressConfig; + contacts: CompanyContactConfig; +} diff --git a/src/app/shared/models/config/feature-flags.model.ts b/src/app/shared/models/config/feature-flags.model.ts new file mode 100644 index 0000000..da3fcc6 --- /dev/null +++ b/src/app/shared/models/config/feature-flags.model.ts @@ -0,0 +1,14 @@ +export interface FeatureFlagsConfig { + wishlist: boolean; + compare: boolean; + reviews: boolean; + blog: boolean; + chat: boolean; + analytics: boolean; + notifications: boolean; + coupons: boolean; + loyalty: boolean; + giftCards: boolean; + invoices: boolean; + [key: string]: boolean; +} diff --git a/src/app/shared/models/config/index.ts b/src/app/shared/models/config/index.ts new file mode 100644 index 0000000..fda5cc9 --- /dev/null +++ b/src/app/shared/models/config/index.ts @@ -0,0 +1,14 @@ +export * from './api-endpoints.model'; +export * from './bootstrap-config.model'; +export * from './branding.model'; +export * from './company.model'; +export * from './feature-flags.model'; +export * from './localization.model'; +export * from './navigation.model'; +export * from './page.model'; +export * from './permissions.model'; +export * from './section.model'; +export * from './seo.model'; +export * from './tenant.model'; +export * from './theme.model'; +export * from './widget.model'; diff --git a/src/app/shared/models/config/localization.model.ts b/src/app/shared/models/config/localization.model.ts new file mode 100644 index 0000000..376540f --- /dev/null +++ b/src/app/shared/models/config/localization.model.ts @@ -0,0 +1,12 @@ +export interface LocalizationDictionaryRef { + locale: string; + dictionaryUrl: string; + version: string; +} + +export interface LocalizationConfig { + defaultLocale: string; + supportedLocales: string[]; + currencyByLocale: Record; + dictionaries: LocalizationDictionaryRef[]; +} diff --git a/src/app/shared/models/config/navigation.model.ts b/src/app/shared/models/config/navigation.model.ts new file mode 100644 index 0000000..0add129 --- /dev/null +++ b/src/app/shared/models/config/navigation.model.ts @@ -0,0 +1,15 @@ +export interface NavigationItemConfig { + id: string; + labelKey: string; + route: string; + icon?: string; + order: number; + visibleWhenFlags?: string[]; + children?: NavigationItemConfig[]; +} + +export interface NavigationConfig { + header: NavigationItemConfig[]; + footer: NavigationItemConfig[]; + sidebar?: NavigationItemConfig[]; +} diff --git a/src/app/shared/models/config/page.model.ts b/src/app/shared/models/config/page.model.ts new file mode 100644 index 0000000..fd8061c --- /dev/null +++ b/src/app/shared/models/config/page.model.ts @@ -0,0 +1,18 @@ +import { SectionConfig } from './section.model'; + +export interface PageRouteConfig { + path: string; + exact?: boolean; +} + +export interface PageConfig { + id: string; + key: string; + title: string; + route: PageRouteConfig; + layout: string; + sections: SectionConfig[]; + seoKey?: string; + featureFlag?: string; + visible?: boolean; +} diff --git a/src/app/shared/models/config/permissions.model.ts b/src/app/shared/models/config/permissions.model.ts new file mode 100644 index 0000000..278d5aa --- /dev/null +++ b/src/app/shared/models/config/permissions.model.ts @@ -0,0 +1,14 @@ +export interface PermissionDefinition { + key: string; + description?: string; +} + +export interface RolePermissions { + role: string; + permissions: string[]; +} + +export interface PermissionsConfig { + definitions: PermissionDefinition[]; + roles: RolePermissions[]; +} diff --git a/src/app/shared/models/config/section.model.ts b/src/app/shared/models/config/section.model.ts new file mode 100644 index 0000000..33a5f6b --- /dev/null +++ b/src/app/shared/models/config/section.model.ts @@ -0,0 +1,17 @@ +import { WidgetConfig } from './widget.model'; + +export interface SectionLayoutConfig { + columns?: number; + gap?: string; + align?: 'start' | 'center' | 'end' | 'stretch'; +} + +export interface SectionConfig { + id: string; + type: string; + order: number; + layout?: SectionLayoutConfig; + widgets: WidgetConfig[]; + featureFlag?: string; + visible?: boolean; +} diff --git a/src/app/shared/models/config/seo.model.ts b/src/app/shared/models/config/seo.model.ts new file mode 100644 index 0000000..33e11fd --- /dev/null +++ b/src/app/shared/models/config/seo.model.ts @@ -0,0 +1,18 @@ +export interface SeoMetaTagConfig { + name?: string; + property?: string; + content: string; +} + +export interface SeoPageConfig { + title: string; + description: string; + canonicalUrl?: string; + robots?: string; + metaTags?: SeoMetaTagConfig[]; +} + +export interface SeoConfig { + default: SeoPageConfig; + byPageKey: Record; +} diff --git a/src/app/shared/models/config/tenant.model.ts b/src/app/shared/models/config/tenant.model.ts new file mode 100644 index 0000000..c0bc1e2 --- /dev/null +++ b/src/app/shared/models/config/tenant.model.ts @@ -0,0 +1,17 @@ +import { UUID, UrlString } from '../../types/primitive.types'; + +export interface TenantConfig { + id: UUID; + slug: string; + code: string; + host: string; + name: string; + websiteBaseUrl: UrlString; + builderBaseUrl: UrlString; + backofficeBaseUrl: UrlString; + defaultLocale: string; + supportedLocales: string[]; + defaultCurrency: string; + supportedCurrencies: string[]; + timezone: string; +} diff --git a/src/app/shared/models/config/theme.model.ts b/src/app/shared/models/config/theme.model.ts new file mode 100644 index 0000000..d241dac --- /dev/null +++ b/src/app/shared/models/config/theme.model.ts @@ -0,0 +1,36 @@ +export interface ThemeTypographyConfig { + primaryFontFamily: string; + headingFontFamily?: string; + baseFontSize: number; +} + +export interface ThemeSpacingConfig { + unit: number; + scale: number[]; +} + +export interface ThemePaletteConfig { + primary: string; + secondary: string; + accent: string; + success: string; + warning: string; + danger: string; + info: string; + textPrimary: string; + textSecondary: string; + backgroundPrimary: string; + backgroundSecondary: string; + border: string; +} + +export interface ThemeConfig { + themeId: string; + mode: 'light' | 'dark' | 'system'; + palette: ThemePaletteConfig; + typography: ThemeTypographyConfig; + spacing: ThemeSpacingConfig; + borderRadiusScale: Record; + shadows: Record; + iconSet: string; +} diff --git a/src/app/shared/models/config/widget.model.ts b/src/app/shared/models/config/widget.model.ts new file mode 100644 index 0000000..48b0c02 --- /dev/null +++ b/src/app/shared/models/config/widget.model.ts @@ -0,0 +1,15 @@ +export interface WidgetActionConfig { + type: 'navigate' | 'open' | 'submit' | 'custom'; + target?: string; + payload?: Record; +} + +export interface WidgetConfig { + id: string; + type: string; + version: string; + props: Record; + actions?: Record; + featureFlag?: string; + visible?: boolean; +} diff --git a/src/app/shared/models/domain/index.ts b/src/app/shared/models/domain/index.ts new file mode 100644 index 0000000..cc6c09f --- /dev/null +++ b/src/app/shared/models/domain/index.ts @@ -0,0 +1 @@ +export * from './user-preferences.model'; diff --git a/src/app/shared/models/domain/user-preferences.model.ts b/src/app/shared/models/domain/user-preferences.model.ts new file mode 100644 index 0000000..4a4aba2 --- /dev/null +++ b/src/app/shared/models/domain/user-preferences.model.ts @@ -0,0 +1,8 @@ +export interface UserPreferences { + locale: string; + currency: string; + themeMode: 'light' | 'dark' | 'system'; + compactMode?: boolean; + wishlistEnabled?: boolean; + notificationsEnabled?: boolean; +} diff --git a/src/app/shared/models/index.ts b/src/app/shared/models/index.ts new file mode 100644 index 0000000..3e3515e --- /dev/null +++ b/src/app/shared/models/index.ts @@ -0,0 +1,3 @@ +export * as ConfigModels from './config'; +export * as DomainModels from './domain'; +export * as UiModels from './ui'; diff --git a/src/app/shared/models/ui/button.model.ts b/src/app/shared/models/ui/button.model.ts new file mode 100644 index 0000000..82707c5 --- /dev/null +++ b/src/app/shared/models/ui/button.model.ts @@ -0,0 +1,13 @@ +export interface ButtonConfig { + id?: string; + label: string; + variant: 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'danger'; + size?: 'sm' | 'md' | 'lg'; + icon?: string; + disabled?: boolean; + loading?: boolean; + action?: { + type: 'navigate' | 'submit' | 'emit' | 'custom'; + target?: string; + }; +} diff --git a/src/app/shared/models/ui/category-card.model.ts b/src/app/shared/models/ui/category-card.model.ts new file mode 100644 index 0000000..a9b8b6e --- /dev/null +++ b/src/app/shared/models/ui/category-card.model.ts @@ -0,0 +1,11 @@ +import { ButtonConfig } from './button.model'; + +export interface CategoryCardConfig { + id: string; + title: string; + description?: string; + imageUrl?: string; + icon?: string; + itemsCount?: number; + action?: ButtonConfig; +} diff --git a/src/app/shared/models/ui/index.ts b/src/app/shared/models/ui/index.ts new file mode 100644 index 0000000..d7c5e2b --- /dev/null +++ b/src/app/shared/models/ui/index.ts @@ -0,0 +1,3 @@ +export * from './button.model'; +export * from './category-card.model'; +export * from './product-card.model'; diff --git a/src/app/shared/models/ui/product-card.model.ts b/src/app/shared/models/ui/product-card.model.ts new file mode 100644 index 0000000..df9afd2 --- /dev/null +++ b/src/app/shared/models/ui/product-card.model.ts @@ -0,0 +1,23 @@ +import { ButtonConfig } from './button.model'; + +export interface ProductCardPrice { + amount: number; + currency: string; + originalAmount?: number; +} + +export interface ProductCardConfig { + id: string; + sku: string; + title: string; + subtitle?: string; + imageUrl: string; + badges?: string[]; + tags?: string[]; + rating?: number; + reviewsCount?: number; + price: ProductCardPrice; + stockStatus?: 'in_stock' | 'low_stock' | 'out_of_stock'; + primaryAction?: ButtonConfig; + secondaryAction?: ButtonConfig; +} diff --git a/src/app/shared/types/index.ts b/src/app/shared/types/index.ts new file mode 100644 index 0000000..3a4c267 --- /dev/null +++ b/src/app/shared/types/index.ts @@ -0,0 +1 @@ +export * from './primitive.types'; diff --git a/src/app/shared/types/primitive.types.ts b/src/app/shared/types/primitive.types.ts new file mode 100644 index 0000000..bd055a8 --- /dev/null +++ b/src/app/shared/types/primitive.types.ts @@ -0,0 +1,5 @@ +export type UUID = string; +export type ISODateTime = string; +export type LocaleCode = string; +export type CurrencyCode = string; +export type UrlString = string;