@eduboxpro/studio 0.1.0 → 0.1.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.
- package/fesm2022/eduboxpro-studio.mjs +664 -37
- package/fesm2022/eduboxpro-studio.mjs.map +1 -1
- package/index.d.ts +283 -15
- package/package.json +5 -4
- package/src/styles/_mixins.scss +157 -0
- package/src/styles/_reset.scss +65 -0
- package/src/styles/_tokens.scss +181 -0
- package/src/styles/studio.scss +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eduboxpro-studio.mjs","sources":["../../../projects/studio/src/lib/config/studio.config.ts","../../../projects/studio/src/lib/config/studio.service.ts","../../../projects/studio/src/lib/config/provide-studio.ts","../../../projects/studio/src/lib/config/index.ts","../../../projects/studio/src/lib/primitives/button/button.component.ts","../../../projects/studio/src/lib/primitives/button/index.ts","../../../projects/studio/src/lib/primitives/index.ts","../../../projects/studio/src/lib/composites/index.ts","../../../projects/studio/src/lib/education/index.ts","../../../projects/studio/src/lib/utils/index.ts","../../../projects/studio/src/public-api.ts","../../../projects/studio/src/eduboxpro-studio.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Theme mode: light or dark\n */\nexport type ThemeMode = 'light' | 'dark';\n\n/**\n * Theme configuration interface\n */\nexport interface StudioThemeConfig {\n /**\n * Theme mode (default: 'light')\n */\n mode?: ThemeMode;\n\n /**\n * Color tokens override\n */\n colors?: {\n primary?: string;\n secondary?: string;\n success?: string;\n error?: string;\n warning?: string;\n info?: string;\n };\n\n /**\n * Typography tokens override\n */\n typography?: {\n fontFamily?: string;\n fontSize?: {\n xs?: string;\n sm?: string;\n base?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n };\n fontWeight?: {\n normal?: number;\n medium?: number;\n semibold?: number;\n bold?: number;\n };\n };\n\n /**\n * Spacing tokens override\n */\n spacing?: {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n };\n\n /**\n * Border radius tokens override\n */\n borderRadius?: {\n none?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n };\n\n /**\n * Shadow tokens override\n */\n shadows?: {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n };\n}\n\n/**\n * Main Studio configuration interface\n */\nexport interface StudioConfig {\n /**\n * Theme configuration\n */\n theme?: StudioThemeConfig;\n}\n\n/**\n * Injection token for Studio configuration\n */\nexport const STUDIO_CONFIG = new InjectionToken<StudioConfig>('STUDIO_CONFIG', {\n providedIn: 'root',\n factory: () => ({})\n});\n","import { Injectable, inject, signal, effect } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { StudioConfig, StudioThemeConfig, ThemeMode } from './studio.config';\n\n@Injectable({ providedIn: 'root' })\nexport class StudioConfigService {\n private readonly document = inject(DOCUMENT);\n\n readonly config = signal<StudioConfig>({});\n readonly themeMode = signal<ThemeMode>('light');\n\n constructor() {\n effect(() => {\n this.applyTheme(this.config().theme);\n }, { allowSignalWrites: false });\n }\n\n configure(config: StudioConfig): void {\n this.config.set(config);\n if (config.theme?.mode) {\n this.setThemeMode(config.theme.mode);\n }\n }\n\n setThemeMode(mode: ThemeMode): void {\n this.themeMode.set(mode);\n this.document.documentElement.setAttribute('data-theme', mode);\n }\n\n toggleTheme(): void {\n const newMode = this.themeMode() === 'light' ? 'dark' : 'light';\n this.setThemeMode(newMode);\n }\n\n async loadFromBackend(organizationSlug: string): Promise<void> {\n try {\n const response = await fetch(`/api/organizations/${organizationSlug}/design-config`);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const config = await response.json();\n this.configure(config);\n } catch (error) {\n console.error('[Studio] Failed to load config from backend:', error);\n throw error;\n }\n }\n\n private applyTheme(theme?: StudioThemeConfig): void {\n if (!theme) return;\n\n const root = this.document.documentElement;\n\n if (theme.colors) {\n this.applyTokens(root, 'studio', theme.colors);\n }\n if (theme.spacing) {\n this.applyTokens(root, 'studio-spacing', theme.spacing);\n }\n if (theme.borderRadius) {\n this.applyTokens(root, 'studio-radius', theme.borderRadius);\n }\n if (theme.shadows) {\n this.applyTokens(root, 'studio-shadow', theme.shadows);\n }\n if (theme.typography?.fontFamily) {\n root.style.setProperty('--studio-font-family', theme.typography.fontFamily);\n }\n if (theme.typography?.fontSize) {\n this.applyTokens(root, 'studio-font-size', theme.typography.fontSize);\n }\n if (theme.typography?.fontWeight) {\n this.applyTokens(root, 'studio-font-weight', theme.typography.fontWeight);\n }\n }\n\n private applyTokens(\n root: HTMLElement,\n prefix: string,\n tokens: Record<string, string | number>\n ): void {\n Object.entries(tokens).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n root.style.setProperty(`--${prefix}-${key}`, String(value));\n }\n });\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER, inject } from '@angular/core';\nimport { STUDIO_CONFIG, StudioConfig } from './studio.config';\nimport { StudioConfigService } from './studio.service';\n\n/**\n * Provide Studio configuration for the application\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { provideStudioConfig } from '@eduboxpro/studio/config';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideStudioConfig({\n * theme: {\n * mode: 'light',\n * colors: {\n * primary: '#3b82f6'\n * }\n * }\n * })\n * ]\n * };\n * ```\n */\nexport function provideStudioConfig(config: StudioConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: STUDIO_CONFIG,\n useValue: config\n },\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n const studioConfig = inject(StudioConfigService);\n const initialConfig = inject(STUDIO_CONFIG);\n studioConfig.configure(initialConfig);\n }\n }\n ]);\n}\n","/**\n * Configuration module\n * @module config\n */\n\nexport * from './studio.config';\nexport * from './studio.service';\nexport * from './provide-studio';\n","import { Component, input, output, computed, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'studio-button',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.disabled]': 'disabled() ? \"\" : null',\n '[attr.type]': 'type()',\n '(click)': 'handleClick($event)'\n },\n template: `\n <span class=\"studio-button__content\">\n <ng-content />\n </span>\n `,\n styleUrl: './button.component.scss'\n})\nexport class ButtonComponent {\n variant = input<'solid' | 'outline' | 'ghost'>('solid');\n size = input<'sm' | 'md' | 'lg'>('md');\n color = input<'primary' | 'secondary' | 'success' | 'error' | 'warning'>('primary');\n disabled = input<boolean>(false);\n fullWidth = input<boolean>(false);\n loading = input<boolean>(false);\n type = input<'button' | 'submit' | 'reset'>('button');\n\n clicked = output<MouseEvent>();\n\n protected hostClasses = computed(() => {\n return [\n 'studio-button',\n `studio-button--${this.variant()}`,\n `studio-button--${this.size()}`,\n `studio-button--${this.color()}`,\n this.fullWidth() ? 'studio-button--full' : '',\n this.loading() ? 'studio-button--loading' : ''\n ].filter(Boolean).join(' ');\n });\n\n protected handleClick(event: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","/**\n * Button component\n */\n\nexport * from './button.component';\n","/**\n * Primitives (Atoms)\n * Basic building blocks\n */\n\nexport * from './button';\n","/**\n * Composites (Molecules + Organisms)\n * Complex components built from primitives\n */\n\n// Export composite components here\n// Example: export * from './form-field';\n\n// Empty export to make this a valid module\nexport {};\n","/**\n * Education components\n * Domain-specific components for educational platforms\n */\n\n// Export education components here\n// Example: export * from './course-card';\n// Example: export * from './lesson-viewer';\n// Example: export * from './quiz-builder';\n\n// Empty export to make this a valid module\nexport {};\n","/**\n * Utilities\n * Helper functions, directives, pipes\n */\n\n// Export utilities here\n// Example: export * from './format-date.pipe';\n// Example: export * from './auto-focus.directive';\n\n// Empty export to make this a valid module\nexport {};\n","/**\n * Public API Surface of @eduboxpro/studio\n */\n\n/* ========================================\n * Configuration\n * ======================================== */\nexport * from './lib/config';\n\n/* ========================================\n * Components\n * ======================================== */\nexport * from './lib/primitives';\nexport * from './lib/composites';\nexport * from './lib/education';\n\n/* ========================================\n * Utilities\n * ======================================== */\nexport * from './lib/utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eduboxpro-studio.mjs","sources":["../../../projects/studio/src/lib/config/studio.config.ts","../../../projects/studio/src/lib/config/studio.service.ts","../../../projects/studio/src/lib/config/provide-studio.ts","../../../projects/studio/src/lib/config/index.ts","../../../projects/studio/src/lib/primitives/icon/icon.component.ts","../../../projects/studio/src/lib/primitives/icon/icon.provider.ts","../../../projects/studio/src/lib/utils/url-validator.ts","../../../projects/studio/src/lib/utils/class-names.ts","../../../projects/studio/src/lib/utils/config-helpers.ts","../../../projects/studio/src/lib/utils/index.ts","../../../projects/studio/src/lib/primitives/badge/badge.component.ts","../../../projects/studio/src/lib/primitives/badge/index.ts","../../../projects/studio/src/lib/primitives/button/button.component.ts","../../../projects/studio/src/lib/primitives/button/index.ts","../../../projects/studio/src/lib/primitives/index.ts","../../../projects/studio/src/lib/composites/index.ts","../../../projects/studio/src/lib/education/index.ts","../../../projects/studio/src/public-api.ts","../../../projects/studio/src/eduboxpro-studio.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Theme mode: light or dark\n */\nexport type ThemeMode = 'light' | 'dark';\n\n/**\n * Color configuration with hover and active states\n */\nexport interface ColorConfig {\n base?: string;\n hover?: string;\n active?: string;\n bg?: string;\n}\n\n/**\n * Theme configuration interface\n */\nexport interface StudioThemeConfig {\n /**\n * Theme mode (default: 'light')\n */\n mode?: ThemeMode;\n\n /**\n * Color tokens override with hover/active states\n */\n colors?: {\n primary?: ColorConfig | string;\n secondary?: ColorConfig | string;\n success?: ColorConfig | string;\n error?: ColorConfig | string;\n warning?: ColorConfig | string;\n info?: ColorConfig | string;\n bg?: {\n primary?: string;\n secondary?: string;\n tertiary?: string;\n };\n text?: {\n primary?: string;\n secondary?: string;\n tertiary?: string;\n inverse?: string;\n };\n border?: {\n primary?: string;\n secondary?: string;\n };\n };\n\n /**\n * Typography tokens override\n */\n typography?: {\n fontFamily?: string;\n fontMono?: string;\n fontSize?: {\n xs?: string;\n sm?: string;\n base?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n };\n fontWeight?: {\n normal?: number;\n medium?: number;\n semibold?: number;\n bold?: number;\n };\n lineHeight?: {\n tight?: number;\n normal?: number;\n relaxed?: number;\n };\n };\n\n /**\n * Spacing tokens override\n */\n spacing?: {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n };\n\n /**\n * Border radius tokens override\n */\n borderRadius?: {\n none?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n };\n\n /**\n * Shadow tokens override\n */\n shadows?: {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n };\n\n /**\n * Transition tokens override\n */\n transitions?: {\n fast?: string;\n base?: string;\n slow?: string;\n };\n\n /**\n * Z-index tokens override\n */\n zIndex?: {\n dropdown?: number;\n sticky?: number;\n fixed?: number;\n modalBackdrop?: number;\n modal?: number;\n popover?: number;\n tooltip?: number;\n };\n}\n\n/**\n * Button component defaults configuration\n */\nexport interface ButtonDefaultsConfig {\n variant?: 'solid' | 'outline' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n color?: 'primary' | 'secondary' | 'success' | 'error' | 'warning';\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n shadow?: 'none' | 'sm' | 'md' | 'lg';\n compact?: boolean;\n}\n\n/**\n * Badge component defaults configuration\n */\nexport interface BadgeDefaultsConfig {\n variant?: 'solid' | 'outline' | 'soft' | 'dot';\n size?: 'sm' | 'md' | 'lg';\n color?: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'neutral';\n radius?: 'sm' | 'md' | 'lg' | 'full';\n}\n\n/**\n * Components defaults configuration\n */\nexport interface ComponentsConfig {\n /**\n * Button component defaults\n */\n button?: ButtonDefaultsConfig;\n\n /**\n * Badge component defaults\n */\n badge?: BadgeDefaultsConfig;\n\n // Future components\n // input?: InputDefaultsConfig;\n // card?: CardDefaultsConfig;\n}\n\n/**\n * Main Studio configuration interface\n */\nexport interface StudioConfig {\n /**\n * Theme configuration\n */\n theme?: StudioThemeConfig;\n\n /**\n * Components default values configuration\n */\n components?: ComponentsConfig;\n}\n\n/**\n * Injection token for Studio configuration\n */\nexport const STUDIO_CONFIG = new InjectionToken<StudioConfig>('STUDIO_CONFIG', {\n providedIn: 'root',\n factory: () => ({})\n});\n","import { Injectable, inject, signal, effect } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { StudioConfig, StudioThemeConfig, ThemeMode, ColorConfig } from './studio.config';\n\n@Injectable({ providedIn: 'root' })\nexport class StudioConfigService {\n private readonly document = inject(DOCUMENT);\n\n readonly config = signal<StudioConfig>({});\n readonly themeMode = signal<ThemeMode>('light');\n\n constructor() {\n effect(() => {\n this.applyTheme(this.config().theme);\n }, { allowSignalWrites: false });\n }\n\n configure(config: StudioConfig): void {\n this.config.set(config);\n if (config.theme?.mode) {\n this.setThemeMode(config.theme.mode);\n }\n }\n\n setThemeMode(mode: ThemeMode): void {\n this.themeMode.set(mode);\n this.document.documentElement.setAttribute('data-theme', mode);\n }\n\n toggleTheme(): void {\n const newMode = this.themeMode() === 'light' ? 'dark' : 'light';\n this.setThemeMode(newMode);\n }\n\n async loadFromBackend(organizationSlug: string): Promise<void> {\n try {\n const response = await fetch(`/api/organizations/${organizationSlug}/design-config`);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const config = await response.json();\n this.configure(config);\n } catch (error) {\n console.error('[Studio] Failed to load config from backend:', error);\n throw error;\n }\n }\n\n private applyTheme(theme?: StudioThemeConfig): void {\n if (!theme) return;\n\n const root = this.document.documentElement;\n\n // Apply colors\n if (theme.colors) {\n this.applyColorTokens(root, theme.colors);\n }\n\n // Apply typography\n if (theme.typography) {\n if (theme.typography.fontFamily) {\n root.style.setProperty('--studio-font-family', theme.typography.fontFamily);\n }\n if (theme.typography.fontMono) {\n root.style.setProperty('--studio-font-mono', theme.typography.fontMono);\n }\n if (theme.typography.fontSize) {\n this.applyTokens(root, 'studio-font-size', theme.typography.fontSize);\n }\n if (theme.typography.fontWeight) {\n this.applyTokens(root, 'studio-font-weight', theme.typography.fontWeight);\n }\n if (theme.typography.lineHeight) {\n this.applyTokens(root, 'studio-line-height', theme.typography.lineHeight);\n }\n }\n\n // Apply spacing\n if (theme.spacing) {\n this.applyTokens(root, 'studio-spacing', theme.spacing);\n }\n\n // Apply border radius\n if (theme.borderRadius) {\n this.applyTokens(root, 'studio-radius', theme.borderRadius);\n }\n\n // Apply shadows\n if (theme.shadows) {\n this.applyTokens(root, 'studio-shadow', theme.shadows);\n }\n\n // Apply transitions\n if (theme.transitions) {\n this.applyTokens(root, 'studio-transition', theme.transitions);\n }\n\n // Apply z-index\n if (theme.zIndex) {\n this.applyZIndexTokens(root, theme.zIndex);\n }\n }\n\n private applyColorTokens(\n root: HTMLElement,\n colors: NonNullable<StudioThemeConfig['colors']>\n ): void {\n // Brand colors with hover/active states\n const brandColors = ['primary', 'secondary', 'success', 'error', 'warning', 'info'] as const;\n\n brandColors.forEach(colorName => {\n const colorValue = colors[colorName];\n if (!colorValue) return;\n\n if (typeof colorValue === 'string') {\n root.style.setProperty(`--studio-${colorName}`, colorValue);\n } else {\n const config = colorValue as ColorConfig;\n if (config.base) {\n root.style.setProperty(`--studio-${colorName}`, config.base);\n }\n if (config.hover) {\n root.style.setProperty(`--studio-${colorName}-hover`, config.hover);\n }\n if (config.active) {\n root.style.setProperty(`--studio-${colorName}-active`, config.active);\n }\n if (config.bg) {\n root.style.setProperty(`--studio-${colorName}-bg`, config.bg);\n }\n }\n });\n\n // Background colors\n if (colors.bg) {\n this.applyTokens(root, 'studio-bg', colors.bg);\n }\n\n // Text colors\n if (colors.text) {\n this.applyTokens(root, 'studio-text', colors.text);\n }\n\n // Border colors\n if (colors.border) {\n this.applyTokens(root, 'studio-border', colors.border);\n }\n }\n\n private applyZIndexTokens(\n root: HTMLElement,\n zIndex: NonNullable<StudioThemeConfig['zIndex']>\n ): void {\n const zIndexMap: Record<string, string> = {\n dropdown: 'dropdown',\n sticky: 'sticky',\n fixed: 'fixed',\n modalBackdrop: 'modal-backdrop',\n modal: 'modal',\n popover: 'popover',\n tooltip: 'tooltip'\n };\n\n Object.entries(zIndex).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n const cssKey = zIndexMap[key] || key;\n root.style.setProperty(`--studio-z-${cssKey}`, String(value));\n }\n });\n }\n\n private applyTokens(\n root: HTMLElement,\n prefix: string,\n tokens: Record<string, string | number>\n ): void {\n Object.entries(tokens).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n root.style.setProperty(`--${prefix}-${key}`, String(value));\n }\n });\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER, inject } from '@angular/core';\nimport { STUDIO_CONFIG, StudioConfig } from './studio.config';\nimport { StudioConfigService } from './studio.service';\n\n/**\n * Provide Studio configuration for the application\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { provideStudioConfig } from '@eduboxpro/studio/config';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideStudioConfig({\n * theme: {\n * mode: 'light',\n * colors: {\n * primary: '#3b82f6'\n * }\n * }\n * })\n * ]\n * };\n * ```\n */\nexport function provideStudioConfig(config: StudioConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: STUDIO_CONFIG,\n useValue: config\n },\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n const studioConfig = inject(StudioConfigService);\n const initialConfig = inject(STUDIO_CONFIG);\n studioConfig.configure(initialConfig);\n }\n }\n ]);\n}\n","/**\n * Configuration module\n * @module config\n */\n\nexport * from './studio.config';\nexport * from './studio.service';\nexport * from './provide-studio';\n","import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { LucideAngularModule, icons } from 'lucide-angular';\n\n@Component({\n selector: 'studio-icon',\n standalone: true,\n imports: [LucideAngularModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[style.width.px]': 'size()',\n '[style.height.px]': 'size()',\n },\n template: `\n @if (lucideIcon(); as iconName) {\n <lucide-icon\n [name]=\"iconName\"\n [size]=\"size()\"\n [color]=\"computedColor()\"\n [strokeWidth]=\"strokeWidth()\"\n [absoluteStrokeWidth]=\"absoluteStrokeWidth()\"\n />\n }\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n `]\n})\nexport class IconComponent {\n name = input.required<string>();\n size = input<number>(24);\n color = input<'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'inherit' | string>('inherit');\n strokeWidth = input<number>(2);\n absoluteStrokeWidth = input<boolean>(false);\n\n protected readonly icons = icons;\n\n protected lucideIcon = computed(() => {\n const iconName = this.name();\n return iconName;\n });\n\n protected computedColor = computed(() => {\n const colorValue = this.color();\n\n const colorMap: Record<string, string> = {\n 'primary': 'var(--studio-primary)',\n 'secondary': 'var(--studio-secondary)',\n 'success': 'var(--studio-success)',\n 'error': 'var(--studio-error)',\n 'warning': 'var(--studio-warning)',\n 'inherit': 'currentColor'\n };\n\n return colorMap[colorValue] || colorValue;\n });\n\n protected hostClasses = computed(() => {\n return ['studio-icon'];\n });\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { LUCIDE_ICONS, LucideIconProvider } from 'lucide-angular';\nimport {\n ArrowRight,\n ArrowLeft,\n ChevronDown,\n ChevronUp,\n ChevronLeft,\n ChevronRight,\n Download,\n Upload,\n Mail,\n Phone,\n Heart,\n Star,\n Settings,\n User,\n Trash2,\n Edit,\n Plus,\n Minus,\n Check,\n X,\n Search,\n Filter,\n ExternalLink,\n Link,\n Copy,\n Share2,\n Home,\n Menu,\n MoreVertical,\n MoreHorizontal,\n Bell,\n Calendar,\n Clock,\n Eye,\n EyeOff,\n Lock,\n Unlock,\n LogIn,\n LogOut,\n AlertCircle,\n AlertTriangle,\n Info,\n CheckCircle,\n XCircle,\n HelpCircle,\n File,\n FileText,\n Folder,\n Image,\n Save,\n Printer,\n RefreshCw,\n RotateCw,\n Loader,\n Loader2,\n ShoppingCart\n} from 'lucide-angular';\n\n/**\n * Провайдер иконок для Studio\n * Регистрирует базовый набор часто используемых иконок\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { provideStudioIcons } from '@eduboxpro/studio';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideStudioIcons()\n * ]\n * };\n * ```\n *\n * Для добавления дополнительных иконок:\n * @example\n * ```typescript\n * import { LUCIDE_ICONS, LucideIconProvider } from 'lucide-angular';\n * import { Zap, Wifi } from 'lucide-angular';\n *\n * providers: [\n * provideStudioIcons(),\n * {\n * provide: LUCIDE_ICONS,\n * multi: true,\n * useValue: new LucideIconProvider({ Zap, Wifi })\n * }\n * ]\n * ```\n */\nexport function provideStudioIcons(): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: LUCIDE_ICONS,\n multi: true,\n useValue: new LucideIconProvider({\n ArrowRight,\n ArrowLeft,\n ChevronDown,\n ChevronUp,\n ChevronLeft,\n ChevronRight,\n Download,\n Upload,\n Mail,\n Phone,\n Heart,\n Star,\n Settings,\n User,\n Trash2,\n Edit,\n Plus,\n Minus,\n Check,\n X,\n Search,\n Filter,\n ExternalLink,\n Link,\n Copy,\n Share2,\n Home,\n Menu,\n MoreVertical,\n MoreHorizontal,\n Bell,\n Calendar,\n Clock,\n Eye,\n EyeOff,\n Lock,\n Unlock,\n LogIn,\n LogOut,\n AlertCircle,\n AlertTriangle,\n Info,\n CheckCircle,\n XCircle,\n HelpCircle,\n File,\n FileText,\n Folder,\n Image,\n Save,\n Printer,\n RefreshCw,\n RotateCw,\n Loader,\n Loader2,\n ShoppingCart\n })\n }\n ]);\n}\n","/**\n * Проверяет безопасность URL для навигации\n *\n * @param url - URL для проверки\n * @returns true если URL безопасен (http/https или относительный)\n *\n * @example\n * ```typescript\n * isSafeUrl('https://example.com') // true\n * isSafeUrl('javascript:alert(1)') // false\n * isSafeUrl('/relative/path') // true\n * ```\n */\nexport function isSafeUrl(url: string): boolean {\n if (!url || typeof url !== 'string') {\n return false;\n }\n\n try {\n const parsed = new URL(url, window.location.origin);\n // Разрешаем только http(s) и относительные URL (пустой protocol)\n return ['http:', 'https:', ''].includes(parsed.protocol);\n } catch {\n // Невалидный URL\n return false;\n }\n}\n\n/**\n * Sanitize URL перед использованием в навигации\n *\n * @param url - URL для sanitization\n * @returns Безопасный URL или '#' если URL небезопасен\n *\n * @example\n * ```typescript\n * sanitizeUrl('https://example.com') // 'https://example.com'\n * sanitizeUrl('javascript:alert(1)') // '#' (с предупреждением в консоли)\n * ```\n */\nexport function sanitizeUrl(url: string): string {\n if (!isSafeUrl(url)) {\n console.warn(`[Studio] Unsafe URL blocked: ${url}`);\n return '#';\n }\n return url;\n}\n","/**\n * Объединяет CSS классы, игнорируя falsy значения\n *\n * @param classes - Массив классов (строки, undefined, null, false)\n * @returns Строка с объединенными классами\n *\n * @example\n * ```typescript\n * classNames('btn', 'btn-primary') // 'btn btn-primary'\n * classNames('btn', isActive && 'active') // 'btn active' если isActive=true, иначе 'btn'\n * classNames('btn', undefined, null, false, 'large') // 'btn large'\n * ```\n */\nexport function classNames(...classes: (string | false | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","import { computed, Signal } from '@angular/core';\n\n/**\n * Создает computed signal с fallback chain: input → config → default\n *\n * Упрощает паттерн configurable inputs, убирая boilerplate код.\n *\n * @param inputSignal - Input signal от пользователя\n * @param configSignal - Config значение (может быть undefined)\n * @param defaultValue - Fallback значение\n * @returns Computed signal с resolved значением\n *\n * @example\n * ```typescript\n * export class ButtonComponent {\n * private defaults = computed(() => this.configService.config().components?.button);\n *\n * // Input\n * variantInput = input<Variant | undefined>(undefined, { alias: 'variant' });\n *\n * // Resolved value с config fallback\n * variant = withConfigDefault(\n * this.variantInput,\n * computed(() => this.defaults()?.variant),\n * 'solid'\n * );\n * }\n * ```\n */\nexport function withConfigDefault<T>(\n inputSignal: Signal<T | undefined>,\n configSignal: Signal<T | undefined>,\n defaultValue: T\n): Signal<T> {\n return computed(() => {\n const inputValue = inputSignal();\n if (inputValue !== undefined) return inputValue;\n\n const configValue = configSignal();\n if (configValue !== undefined) return configValue;\n\n return defaultValue;\n });\n}\n","/**\n * @eduboxpro/studio - Utilities\n *\n * Helper functions and utilities for the Studio library\n */\n\nexport * from './url-validator';\nexport * from './class-names';\nexport * from './config-helpers';\n","import { Component, input, output, computed, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { IconComponent } from '../icon';\nimport { StudioConfigService } from '../../config';\nimport { sanitizeUrl, classNames, withConfigDefault } from '../../utils';\n\n@Component({\n selector: 'studio-badge',\n standalone: true,\n imports: [IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.disabled]': 'disabled() ? \"\" : null',\n '[attr.href]': 'href()',\n '[attr.target]': 'href() ? target() : null',\n '[attr.rel]': 'href() && target() === \"_blank\" ? \"noopener noreferrer\" : null',\n '[style.display]': 'isVisible() ? null : \"none\"',\n '(click)': 'handleClick($event)'\n },\n template: `\n <span class=\"studio-badge__content\">\n @if (dot()) {\n <span\n class=\"studio-badge__dot\"\n [class]=\"'studio-badge__dot--' + (dotColor() || color())\"\n ></span>\n }\n @if (icon() && iconPosition() === 'left') {\n <studio-icon [name]=\"icon()!\" [size]=\"iconSize()\" />\n }\n <span class=\"studio-badge__text\">\n @if (displayValue()) {\n {{ displayValue() }}\n } @else {\n <ng-content />\n }\n </span>\n @if (icon() && iconPosition() === 'right') {\n <studio-icon [name]=\"icon()!\" [size]=\"iconSize()\" />\n }\n @if (removable()) {\n <button\n type=\"button\"\n class=\"studio-badge__remove\"\n (click)=\"handleRemove($event)\"\n aria-label=\"Remove\"\n >\n <studio-icon name=\"x\" [size]=\"iconSize()\" />\n </button>\n }\n </span>\n `,\n styleUrl: './badge.component.scss'\n})\nexport class BadgeComponent {\n private readonly configService = inject(StudioConfigService);\n private readonly badgeDefaults = computed(() => this.configService.config().components?.badge);\n\n // Appearance - inputs\n variantInput = input<'solid' | 'outline' | 'soft' | 'dot' | undefined>(undefined, { alias: 'variant' });\n sizeInput = input<'sm' | 'md' | 'lg' | undefined>(undefined, { alias: 'size' });\n colorInput = input<'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'neutral' | undefined>(undefined, { alias: 'color' });\n radiusInput = input<'sm' | 'md' | 'lg' | 'full' | undefined>(undefined, { alias: 'radius' });\n\n // Values with config defaults\n variant = withConfigDefault(this.variantInput, computed(() => this.badgeDefaults()?.variant), 'solid');\n size = withConfigDefault(this.sizeInput, computed(() => this.badgeDefaults()?.size), 'md');\n color = withConfigDefault(this.colorInput, computed(() => this.badgeDefaults()?.color), 'primary');\n radius = withConfigDefault(this.radiusInput, computed(() => this.badgeDefaults()?.radius), 'full');\n\n // Icon\n icon = input<string>();\n iconPosition = input<'left' | 'right'>('left');\n\n // Dot indicator\n dot = input<boolean>(false);\n dotColor = input<'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'neutral'>();\n\n // Removable\n removable = input<boolean>(false);\n removed = output<void>();\n\n // Clickable & Navigation\n href = input<string>();\n target = input<'_blank' | '_self' | '_parent' | '_top'>('_self');\n disabled = input<boolean>(false);\n clicked = output<MouseEvent>();\n\n // Number badge\n value = input<string | number>();\n max = input<number>();\n showZero = input<boolean>(true);\n\n // Typography\n uppercase = input<boolean>(false);\n bold = input<boolean>(false);\n\n // Animation\n pulse = input<boolean>(false);\n\n // Auto color (будет реализовано позже если нужно)\n autoColor = input<boolean>(false);\n\n protected iconSize = computed(() => {\n const sizeMap = { sm: 12, md: 14, lg: 16 };\n return sizeMap[this.size()];\n });\n\n protected displayValue = computed(() => {\n const val = this.value();\n if (val === undefined || val === null) return '';\n\n const numVal = typeof val === 'number' ? val : parseInt(val, 10);\n\n // Если это число\n if (!isNaN(numVal)) {\n // Не показывать 0 если showZero = false\n if (numVal === 0 && !this.showZero()) return '';\n\n // Показать max+ если превышает максимум\n const maxVal = this.max();\n if (maxVal !== undefined && numVal > maxVal) {\n return `${maxVal}+`;\n }\n\n return numVal.toString();\n }\n\n return val.toString();\n });\n\n protected isVisible = computed(() => {\n // Скрыть если значение 0 и showZero = false\n const val = this.value();\n if (val !== undefined && val !== null) {\n const numVal = typeof val === 'number' ? val : parseInt(val, 10);\n if (!isNaN(numVal) && numVal === 0 && !this.showZero()) {\n return false;\n }\n }\n return true;\n });\n\n protected hostClasses = computed(() => classNames(\n 'studio-badge',\n `studio-badge--${this.variant()}`,\n `studio-badge--${this.size()}`,\n `studio-badge--${this.color()}`,\n `studio-badge--radius-${this.radius()}`,\n this.disabled() && 'studio-badge--disabled',\n this.uppercase() && 'studio-badge--uppercase',\n this.bold() && 'studio-badge--bold',\n this.pulse() && 'studio-badge--pulse',\n this.href() && 'studio-badge--clickable'\n ));\n\n protected handleClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // Handle link navigation\n const url = this.href();\n if (url) {\n const safeUrl = sanitizeUrl(url);\n if (safeUrl === '#') {\n // URL was blocked - don't navigate\n return;\n }\n\n const target = this.target();\n if (target === '_blank') {\n window.open(safeUrl, '_blank', 'noopener,noreferrer');\n } else {\n window.location.href = safeUrl;\n }\n }\n\n this.clicked.emit(event);\n }\n\n protected handleRemove(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.disabled()) return;\n\n this.removed.emit();\n }\n}\n","/**\n * Badge component\n */\n\nexport * from './badge.component';\n","import { Component, input, output, computed, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { IconComponent } from '../icon';\nimport { StudioConfigService } from '../../config';\nimport { sanitizeUrl, classNames, withConfigDefault } from '../../utils';\n\n@Component({\n selector: 'studio-button',\n standalone: true,\n imports: [IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.disabled]': 'disabled() || loading() ? \"\" : null',\n '[attr.type]': 'href() ? null : type()',\n '[attr.href]': 'href()',\n '[attr.target]': 'href() ? target() : null',\n '[attr.rel]': 'href() && target() === \"_blank\" ? \"noopener noreferrer\" : null',\n '[attr.aria-label]': 'ariaLabel()',\n '(click)': 'handleClick($event)'\n },\n template: `\n <span class=\"studio-button__content\">\n @if (loading()) {\n <studio-icon\n name=\"loader-2\"\n [size]=\"iconSize()\"\n class=\"studio-button__spinner\"\n />\n }\n @if (!loading() && icon() && iconPosition() === 'left') {\n <studio-icon [name]=\"icon()!\" [size]=\"iconSize()\" />\n }\n @if (iconPosition() !== 'only' && !loading()) {\n <ng-content />\n }\n @if (!loading() && icon() && iconPosition() === 'right') {\n <studio-icon [name]=\"icon()!\" [size]=\"iconSize()\" />\n }\n @if (!loading() && icon() && iconPosition() === 'only') {\n <studio-icon [name]=\"icon()!\" [size]=\"iconSize()\" />\n }\n @if (loading() && iconPosition() === 'only') {\n <!-- Empty, spinner already shown -->\n } @else if (loading()) {\n <span>{{ loadingText() }}</span>\n }\n @if (badge() !== undefined && badge() !== null && badge() !== '') {\n <span class=\"studio-button__badge studio-button__badge--{{ badgeColor() }}\">\n {{ badge() }}\n </span>\n }\n </span>\n `,\n styleUrl: './button.component.scss'\n})\nexport class ButtonComponent {\n private readonly configService = inject(StudioConfigService);\n private readonly buttonDefaults = computed(() => this.configService.config().components?.button);\n\n // Appearance - inputs\n variantInput = input<'solid' | 'outline' | 'ghost' | undefined>(undefined, { alias: 'variant' });\n sizeInput = input<'sm' | 'md' | 'lg' | undefined>(undefined, { alias: 'size' });\n colorInput = input<'primary' | 'secondary' | 'success' | 'error' | 'warning' | undefined>(undefined, { alias: 'color' });\n radiusInput = input<'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full' | undefined>(undefined, { alias: 'radius' });\n shadowInput = input<'none' | 'sm' | 'md' | 'lg' | undefined>(undefined, { alias: 'shadow' });\n compactInput = input<boolean | undefined>(undefined, { alias: 'compact' });\n\n // Values with config defaults\n variant = withConfigDefault(this.variantInput, computed(() => this.buttonDefaults()?.variant), 'solid');\n size = withConfigDefault(this.sizeInput, computed(() => this.buttonDefaults()?.size), 'md');\n color = withConfigDefault(this.colorInput, computed(() => this.buttonDefaults()?.color), 'primary');\n radius = withConfigDefault(this.radiusInput, computed(() => this.buttonDefaults()?.radius), 'sm');\n shadow = withConfigDefault(this.shadowInput, computed(() => this.buttonDefaults()?.shadow), 'none');\n compact = withConfigDefault(this.compactInput, computed(() => this.buttonDefaults()?.compact), false);\n\n // State\n disabled = input<boolean>(false);\n loading = input<boolean>(false);\n loadingText = input<string>('Loading...');\n\n // Layout\n fullWidth = input<boolean>(false);\n\n // Button props\n type = input<'button' | 'submit' | 'reset'>('button');\n\n // Icon\n icon = input<string>();\n iconPosition = input<'left' | 'right' | 'only'>('left');\n\n // Link mode\n href = input<string>();\n target = input<'_blank' | '_self' | '_parent' | '_top'>('_self');\n\n // Badge\n badge = input<string | number>();\n badgeColor = input<'primary' | 'error' | 'warning'>('error');\n\n // Accessibility\n ariaLabel = input<string>();\n\n clicked = output<MouseEvent>();\n\n protected iconSize = computed(() => {\n const sizeMap = { sm: 16, md: 18, lg: 20 };\n return sizeMap[this.size()];\n });\n\n protected hostClasses = computed(() => classNames(\n 'studio-button',\n `studio-button--${this.variant()}`,\n `studio-button--${this.size()}`,\n `studio-button--${this.color()}`,\n `studio-button--radius-${this.radius()}`,\n `studio-button--shadow-${this.shadow()}`,\n this.compact() && 'studio-button--compact',\n this.fullWidth() && 'studio-button--full',\n this.loading() && 'studio-button--loading',\n this.iconPosition() === 'only' && 'studio-button--icon-only'\n ));\n\n protected handleClick(event: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // Handle link navigation\n const url = this.href();\n if (url) {\n const safeUrl = sanitizeUrl(url);\n if (safeUrl === '#') {\n // URL was blocked - don't navigate\n return;\n }\n\n const target = this.target();\n if (target === '_blank') {\n window.open(safeUrl, '_blank', 'noopener,noreferrer');\n } else {\n window.location.href = safeUrl;\n }\n }\n\n this.clicked.emit(event);\n }\n}\n","/**\n * Button component\n */\n\nexport * from './button.component';\n","/**\n * Primitives (Atoms)\n * Basic building blocks\n */\n\nexport * from './badge';\nexport * from './button';\nexport * from './icon';\n","/**\n * Composites (Molecules + Organisms)\n * Complex components built from primitives\n */\n\n// Export composite components here\n// Example: export * from './form-field';\n\n// Empty export to make this a valid module\nexport {};\n","/**\n * Education components\n * Domain-specific components for educational platforms\n */\n\n// Export education components here\n// Example: export * from './course-card';\n// Example: export * from './lesson-viewer';\n// Example: export * from './quiz-builder';\n\n// Empty export to make this a valid module\nexport {};\n","/**\n * Public API Surface of @eduboxpro/studio\n */\n\n/* ========================================\n * Configuration\n * ======================================== */\nexport * from './lib/config';\n\n/* ========================================\n * Components\n * ======================================== */\nexport * from './lib/primitives';\nexport * from './lib/composites';\nexport * from './lib/education';\n\n/* ========================================\n * Utilities\n * ======================================== */\nexport * from './lib/utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { InjectionToken, EnvironmentProviders } from '@angular/core';
|
|
2
|
+
import { InjectionToken, EnvironmentProviders, Signal } from '@angular/core';
|
|
3
|
+
import { icons } from 'lucide-angular';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Theme mode: light or dark
|
|
6
7
|
*/
|
|
7
8
|
type ThemeMode = 'light' | 'dark';
|
|
9
|
+
/**
|
|
10
|
+
* Color configuration with hover and active states
|
|
11
|
+
*/
|
|
12
|
+
interface ColorConfig {
|
|
13
|
+
base?: string;
|
|
14
|
+
hover?: string;
|
|
15
|
+
active?: string;
|
|
16
|
+
bg?: string;
|
|
17
|
+
}
|
|
8
18
|
/**
|
|
9
19
|
* Theme configuration interface
|
|
10
20
|
*/
|
|
@@ -14,21 +24,37 @@ interface StudioThemeConfig {
|
|
|
14
24
|
*/
|
|
15
25
|
mode?: ThemeMode;
|
|
16
26
|
/**
|
|
17
|
-
* Color tokens override
|
|
27
|
+
* Color tokens override with hover/active states
|
|
18
28
|
*/
|
|
19
29
|
colors?: {
|
|
20
|
-
primary?: string;
|
|
21
|
-
secondary?: string;
|
|
22
|
-
success?: string;
|
|
23
|
-
error?: string;
|
|
24
|
-
warning?: string;
|
|
25
|
-
info?: string;
|
|
30
|
+
primary?: ColorConfig | string;
|
|
31
|
+
secondary?: ColorConfig | string;
|
|
32
|
+
success?: ColorConfig | string;
|
|
33
|
+
error?: ColorConfig | string;
|
|
34
|
+
warning?: ColorConfig | string;
|
|
35
|
+
info?: ColorConfig | string;
|
|
36
|
+
bg?: {
|
|
37
|
+
primary?: string;
|
|
38
|
+
secondary?: string;
|
|
39
|
+
tertiary?: string;
|
|
40
|
+
};
|
|
41
|
+
text?: {
|
|
42
|
+
primary?: string;
|
|
43
|
+
secondary?: string;
|
|
44
|
+
tertiary?: string;
|
|
45
|
+
inverse?: string;
|
|
46
|
+
};
|
|
47
|
+
border?: {
|
|
48
|
+
primary?: string;
|
|
49
|
+
secondary?: string;
|
|
50
|
+
};
|
|
26
51
|
};
|
|
27
52
|
/**
|
|
28
53
|
* Typography tokens override
|
|
29
54
|
*/
|
|
30
55
|
typography?: {
|
|
31
56
|
fontFamily?: string;
|
|
57
|
+
fontMono?: string;
|
|
32
58
|
fontSize?: {
|
|
33
59
|
xs?: string;
|
|
34
60
|
sm?: string;
|
|
@@ -43,6 +69,11 @@ interface StudioThemeConfig {
|
|
|
43
69
|
semibold?: number;
|
|
44
70
|
bold?: number;
|
|
45
71
|
};
|
|
72
|
+
lineHeight?: {
|
|
73
|
+
tight?: number;
|
|
74
|
+
normal?: number;
|
|
75
|
+
relaxed?: number;
|
|
76
|
+
};
|
|
46
77
|
};
|
|
47
78
|
/**
|
|
48
79
|
* Spacing tokens override
|
|
@@ -75,6 +106,59 @@ interface StudioThemeConfig {
|
|
|
75
106
|
lg?: string;
|
|
76
107
|
xl?: string;
|
|
77
108
|
};
|
|
109
|
+
/**
|
|
110
|
+
* Transition tokens override
|
|
111
|
+
*/
|
|
112
|
+
transitions?: {
|
|
113
|
+
fast?: string;
|
|
114
|
+
base?: string;
|
|
115
|
+
slow?: string;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Z-index tokens override
|
|
119
|
+
*/
|
|
120
|
+
zIndex?: {
|
|
121
|
+
dropdown?: number;
|
|
122
|
+
sticky?: number;
|
|
123
|
+
fixed?: number;
|
|
124
|
+
modalBackdrop?: number;
|
|
125
|
+
modal?: number;
|
|
126
|
+
popover?: number;
|
|
127
|
+
tooltip?: number;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Button component defaults configuration
|
|
132
|
+
*/
|
|
133
|
+
interface ButtonDefaultsConfig {
|
|
134
|
+
variant?: 'solid' | 'outline' | 'ghost';
|
|
135
|
+
size?: 'sm' | 'md' | 'lg';
|
|
136
|
+
color?: 'primary' | 'secondary' | 'success' | 'error' | 'warning';
|
|
137
|
+
radius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
138
|
+
shadow?: 'none' | 'sm' | 'md' | 'lg';
|
|
139
|
+
compact?: boolean;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Badge component defaults configuration
|
|
143
|
+
*/
|
|
144
|
+
interface BadgeDefaultsConfig {
|
|
145
|
+
variant?: 'solid' | 'outline' | 'soft' | 'dot';
|
|
146
|
+
size?: 'sm' | 'md' | 'lg';
|
|
147
|
+
color?: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'neutral';
|
|
148
|
+
radius?: 'sm' | 'md' | 'lg' | 'full';
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Components defaults configuration
|
|
152
|
+
*/
|
|
153
|
+
interface ComponentsConfig {
|
|
154
|
+
/**
|
|
155
|
+
* Button component defaults
|
|
156
|
+
*/
|
|
157
|
+
button?: ButtonDefaultsConfig;
|
|
158
|
+
/**
|
|
159
|
+
* Badge component defaults
|
|
160
|
+
*/
|
|
161
|
+
badge?: BadgeDefaultsConfig;
|
|
78
162
|
}
|
|
79
163
|
/**
|
|
80
164
|
* Main Studio configuration interface
|
|
@@ -84,6 +168,10 @@ interface StudioConfig {
|
|
|
84
168
|
* Theme configuration
|
|
85
169
|
*/
|
|
86
170
|
theme?: StudioThemeConfig;
|
|
171
|
+
/**
|
|
172
|
+
* Components default values configuration
|
|
173
|
+
*/
|
|
174
|
+
components?: ComponentsConfig;
|
|
87
175
|
}
|
|
88
176
|
/**
|
|
89
177
|
* Injection token for Studio configuration
|
|
@@ -100,6 +188,8 @@ declare class StudioConfigService {
|
|
|
100
188
|
toggleTheme(): void;
|
|
101
189
|
loadFromBackend(organizationSlug: string): Promise<void>;
|
|
102
190
|
private applyTheme;
|
|
191
|
+
private applyColorTokens;
|
|
192
|
+
private applyZIndexTokens;
|
|
103
193
|
private applyTokens;
|
|
104
194
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StudioConfigService, never>;
|
|
105
195
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<StudioConfigService>;
|
|
@@ -129,20 +219,198 @@ declare class StudioConfigService {
|
|
|
129
219
|
*/
|
|
130
220
|
declare function provideStudioConfig(config?: StudioConfig): EnvironmentProviders;
|
|
131
221
|
|
|
222
|
+
declare class BadgeComponent {
|
|
223
|
+
private readonly configService;
|
|
224
|
+
private readonly badgeDefaults;
|
|
225
|
+
variantInput: _angular_core.InputSignal<"solid" | "outline" | "soft" | "dot" | undefined>;
|
|
226
|
+
sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
|
|
227
|
+
colorInput: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral" | undefined>;
|
|
228
|
+
radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "full" | undefined>;
|
|
229
|
+
variant: _angular_core.Signal<"solid" | "outline" | "soft" | "dot">;
|
|
230
|
+
size: _angular_core.Signal<"sm" | "md" | "lg">;
|
|
231
|
+
color: _angular_core.Signal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral">;
|
|
232
|
+
radius: _angular_core.Signal<"sm" | "md" | "lg" | "full">;
|
|
233
|
+
icon: _angular_core.InputSignal<string | undefined>;
|
|
234
|
+
iconPosition: _angular_core.InputSignal<"left" | "right">;
|
|
235
|
+
dot: _angular_core.InputSignal<boolean>;
|
|
236
|
+
dotColor: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral" | undefined>;
|
|
237
|
+
removable: _angular_core.InputSignal<boolean>;
|
|
238
|
+
removed: _angular_core.OutputEmitterRef<void>;
|
|
239
|
+
href: _angular_core.InputSignal<string | undefined>;
|
|
240
|
+
target: _angular_core.InputSignal<"_blank" | "_self" | "_parent" | "_top">;
|
|
241
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
242
|
+
clicked: _angular_core.OutputEmitterRef<MouseEvent>;
|
|
243
|
+
value: _angular_core.InputSignal<string | number | undefined>;
|
|
244
|
+
max: _angular_core.InputSignal<number | undefined>;
|
|
245
|
+
showZero: _angular_core.InputSignal<boolean>;
|
|
246
|
+
uppercase: _angular_core.InputSignal<boolean>;
|
|
247
|
+
bold: _angular_core.InputSignal<boolean>;
|
|
248
|
+
pulse: _angular_core.InputSignal<boolean>;
|
|
249
|
+
autoColor: _angular_core.InputSignal<boolean>;
|
|
250
|
+
protected iconSize: _angular_core.Signal<number>;
|
|
251
|
+
protected displayValue: _angular_core.Signal<string>;
|
|
252
|
+
protected isVisible: _angular_core.Signal<boolean>;
|
|
253
|
+
protected hostClasses: _angular_core.Signal<string>;
|
|
254
|
+
protected handleClick(event: MouseEvent): void;
|
|
255
|
+
protected handleRemove(event: MouseEvent): void;
|
|
256
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeComponent, never>;
|
|
257
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeComponent, "studio-badge", never, { "variantInput": { "alias": "variant"; "required": false; "isSignal": true; }; "sizeInput": { "alias": "size"; "required": false; "isSignal": true; }; "colorInput": { "alias": "color"; "required": false; "isSignal": true; }; "radiusInput": { "alias": "radius"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "dotColor": { "alias": "dotColor"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "showZero": { "alias": "showZero"; "required": false; "isSignal": true; }; "uppercase": { "alias": "uppercase"; "required": false; "isSignal": true; }; "bold": { "alias": "bold"; "required": false; "isSignal": true; }; "pulse": { "alias": "pulse"; "required": false; "isSignal": true; }; "autoColor": { "alias": "autoColor"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "clicked": "clicked"; }, never, ["*"], true, never>;
|
|
258
|
+
}
|
|
259
|
+
|
|
132
260
|
declare class ButtonComponent {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
261
|
+
private readonly configService;
|
|
262
|
+
private readonly buttonDefaults;
|
|
263
|
+
variantInput: _angular_core.InputSignal<"solid" | "outline" | "ghost" | undefined>;
|
|
264
|
+
sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
|
|
265
|
+
colorInput: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | undefined>;
|
|
266
|
+
radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | "xl" | "full" | undefined>;
|
|
267
|
+
shadowInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | undefined>;
|
|
268
|
+
compactInput: _angular_core.InputSignal<boolean | undefined>;
|
|
269
|
+
variant: _angular_core.Signal<"solid" | "outline" | "ghost">;
|
|
270
|
+
size: _angular_core.Signal<"sm" | "md" | "lg">;
|
|
271
|
+
color: _angular_core.Signal<"primary" | "secondary" | "success" | "error" | "warning">;
|
|
272
|
+
radius: _angular_core.Signal<"sm" | "md" | "lg" | "none" | "xl" | "full">;
|
|
273
|
+
shadow: _angular_core.Signal<"sm" | "md" | "lg" | "none">;
|
|
274
|
+
compact: _angular_core.Signal<boolean>;
|
|
136
275
|
disabled: _angular_core.InputSignal<boolean>;
|
|
137
|
-
fullWidth: _angular_core.InputSignal<boolean>;
|
|
138
276
|
loading: _angular_core.InputSignal<boolean>;
|
|
277
|
+
loadingText: _angular_core.InputSignal<string>;
|
|
278
|
+
fullWidth: _angular_core.InputSignal<boolean>;
|
|
139
279
|
type: _angular_core.InputSignal<"button" | "submit" | "reset">;
|
|
280
|
+
icon: _angular_core.InputSignal<string | undefined>;
|
|
281
|
+
iconPosition: _angular_core.InputSignal<"left" | "right" | "only">;
|
|
282
|
+
href: _angular_core.InputSignal<string | undefined>;
|
|
283
|
+
target: _angular_core.InputSignal<"_blank" | "_self" | "_parent" | "_top">;
|
|
284
|
+
badge: _angular_core.InputSignal<string | number | undefined>;
|
|
285
|
+
badgeColor: _angular_core.InputSignal<"primary" | "error" | "warning">;
|
|
286
|
+
ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
140
287
|
clicked: _angular_core.OutputEmitterRef<MouseEvent>;
|
|
288
|
+
protected iconSize: _angular_core.Signal<number>;
|
|
141
289
|
protected hostClasses: _angular_core.Signal<string>;
|
|
142
290
|
protected handleClick(event: MouseEvent): void;
|
|
143
291
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
|
|
144
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "studio-button", never, { "
|
|
292
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "studio-button", never, { "variantInput": { "alias": "variant"; "required": false; "isSignal": true; }; "sizeInput": { "alias": "size"; "required": false; "isSignal": true; }; "colorInput": { "alias": "color"; "required": false; "isSignal": true; }; "radiusInput": { "alias": "radius"; "required": false; "isSignal": true; }; "shadowInput": { "alias": "shadow"; "required": false; "isSignal": true; }; "compactInput": { "alias": "compact"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "badgeColor": { "alias": "badgeColor"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
declare class IconComponent {
|
|
296
|
+
name: _angular_core.InputSignal<string>;
|
|
297
|
+
size: _angular_core.InputSignal<number>;
|
|
298
|
+
color: _angular_core.InputSignal<string>;
|
|
299
|
+
strokeWidth: _angular_core.InputSignal<number>;
|
|
300
|
+
absoluteStrokeWidth: _angular_core.InputSignal<boolean>;
|
|
301
|
+
protected readonly icons: typeof icons;
|
|
302
|
+
protected lucideIcon: _angular_core.Signal<string>;
|
|
303
|
+
protected computedColor: _angular_core.Signal<string>;
|
|
304
|
+
protected hostClasses: _angular_core.Signal<string[]>;
|
|
305
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<IconComponent, never>;
|
|
306
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<IconComponent, "studio-icon", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "absoluteStrokeWidth": { "alias": "absoluteStrokeWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
145
307
|
}
|
|
146
308
|
|
|
147
|
-
|
|
148
|
-
|
|
309
|
+
/**
|
|
310
|
+
* Провайдер иконок для Studio
|
|
311
|
+
* Регистрирует базовый набор часто используемых иконок
|
|
312
|
+
*
|
|
313
|
+
* @example
|
|
314
|
+
* ```typescript
|
|
315
|
+
* // app.config.ts
|
|
316
|
+
* import { provideStudioIcons } from '@eduboxpro/studio';
|
|
317
|
+
*
|
|
318
|
+
* export const appConfig: ApplicationConfig = {
|
|
319
|
+
* providers: [
|
|
320
|
+
* provideStudioIcons()
|
|
321
|
+
* ]
|
|
322
|
+
* };
|
|
323
|
+
* ```
|
|
324
|
+
*
|
|
325
|
+
* Для добавления дополнительных иконок:
|
|
326
|
+
* @example
|
|
327
|
+
* ```typescript
|
|
328
|
+
* import { LUCIDE_ICONS, LucideIconProvider } from 'lucide-angular';
|
|
329
|
+
* import { Zap, Wifi } from 'lucide-angular';
|
|
330
|
+
*
|
|
331
|
+
* providers: [
|
|
332
|
+
* provideStudioIcons(),
|
|
333
|
+
* {
|
|
334
|
+
* provide: LUCIDE_ICONS,
|
|
335
|
+
* multi: true,
|
|
336
|
+
* useValue: new LucideIconProvider({ Zap, Wifi })
|
|
337
|
+
* }
|
|
338
|
+
* ]
|
|
339
|
+
* ```
|
|
340
|
+
*/
|
|
341
|
+
declare function provideStudioIcons(): EnvironmentProviders;
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Проверяет безопасность URL для навигации
|
|
345
|
+
*
|
|
346
|
+
* @param url - URL для проверки
|
|
347
|
+
* @returns true если URL безопасен (http/https или относительный)
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* ```typescript
|
|
351
|
+
* isSafeUrl('https://example.com') // true
|
|
352
|
+
* isSafeUrl('javascript:alert(1)') // false
|
|
353
|
+
* isSafeUrl('/relative/path') // true
|
|
354
|
+
* ```
|
|
355
|
+
*/
|
|
356
|
+
declare function isSafeUrl(url: string): boolean;
|
|
357
|
+
/**
|
|
358
|
+
* Sanitize URL перед использованием в навигации
|
|
359
|
+
*
|
|
360
|
+
* @param url - URL для sanitization
|
|
361
|
+
* @returns Безопасный URL или '#' если URL небезопасен
|
|
362
|
+
*
|
|
363
|
+
* @example
|
|
364
|
+
* ```typescript
|
|
365
|
+
* sanitizeUrl('https://example.com') // 'https://example.com'
|
|
366
|
+
* sanitizeUrl('javascript:alert(1)') // '#' (с предупреждением в консоли)
|
|
367
|
+
* ```
|
|
368
|
+
*/
|
|
369
|
+
declare function sanitizeUrl(url: string): string;
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Объединяет CSS классы, игнорируя falsy значения
|
|
373
|
+
*
|
|
374
|
+
* @param classes - Массив классов (строки, undefined, null, false)
|
|
375
|
+
* @returns Строка с объединенными классами
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* ```typescript
|
|
379
|
+
* classNames('btn', 'btn-primary') // 'btn btn-primary'
|
|
380
|
+
* classNames('btn', isActive && 'active') // 'btn active' если isActive=true, иначе 'btn'
|
|
381
|
+
* classNames('btn', undefined, null, false, 'large') // 'btn large'
|
|
382
|
+
* ```
|
|
383
|
+
*/
|
|
384
|
+
declare function classNames(...classes: (string | false | undefined | null)[]): string;
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Создает computed signal с fallback chain: input → config → default
|
|
388
|
+
*
|
|
389
|
+
* Упрощает паттерн configurable inputs, убирая boilerplate код.
|
|
390
|
+
*
|
|
391
|
+
* @param inputSignal - Input signal от пользователя
|
|
392
|
+
* @param configSignal - Config значение (может быть undefined)
|
|
393
|
+
* @param defaultValue - Fallback значение
|
|
394
|
+
* @returns Computed signal с resolved значением
|
|
395
|
+
*
|
|
396
|
+
* @example
|
|
397
|
+
* ```typescript
|
|
398
|
+
* export class ButtonComponent {
|
|
399
|
+
* private defaults = computed(() => this.configService.config().components?.button);
|
|
400
|
+
*
|
|
401
|
+
* // Input
|
|
402
|
+
* variantInput = input<Variant | undefined>(undefined, { alias: 'variant' });
|
|
403
|
+
*
|
|
404
|
+
* // Resolved value с config fallback
|
|
405
|
+
* variant = withConfigDefault(
|
|
406
|
+
* this.variantInput,
|
|
407
|
+
* computed(() => this.defaults()?.variant),
|
|
408
|
+
* 'solid'
|
|
409
|
+
* );
|
|
410
|
+
* }
|
|
411
|
+
* ```
|
|
412
|
+
*/
|
|
413
|
+
declare function withConfigDefault<T>(inputSignal: Signal<T | undefined>, configSignal: Signal<T | undefined>, defaultValue: T): Signal<T>;
|
|
414
|
+
|
|
415
|
+
export { BadgeComponent, ButtonComponent, IconComponent, STUDIO_CONFIG, StudioConfigService, classNames, isSafeUrl, provideStudioConfig, provideStudioIcons, sanitizeUrl, withConfigDefault };
|
|
416
|
+
export type { BadgeDefaultsConfig, ButtonDefaultsConfig, ColorConfig, ComponentsConfig, StudioConfig, StudioThemeConfig, ThemeMode };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eduboxpro/studio",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Modern Angular UI library for educational platforms with customizable design system",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -16,11 +16,12 @@
|
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
19
|
-
"url": "https://github.com/eduboxpro/studio"
|
|
19
|
+
"url": "git+https://github.com/eduboxpro/studio.git"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@angular/common": "^20.
|
|
23
|
-
"@angular/core": "^20.
|
|
22
|
+
"@angular/common": "^20.0.0",
|
|
23
|
+
"@angular/core": "^20.0.0",
|
|
24
|
+
"lucide-angular": "^0.468.0"
|
|
24
25
|
},
|
|
25
26
|
"sideEffects": [
|
|
26
27
|
"*.css",
|