@framed-dev/core 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.
- package/dist/index.cjs +5799 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3314 -0
- package/dist/index.d.ts +3314 -0
- package/dist/index.js +5618 -0
- package/dist/index.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/localization.ts","../src/i18n.ts","../src/types.ts","../src/limits.ts","../src/modules.ts","../src/phases/phase4.ts","../src/api/framedClient.ts","../src/api/supabaseClient.ts","../src/api/callbacks.ts","../src/constants/layouts.ts","../../../../../node_modules/date-fns/constants.js","../../../../../node_modules/date-fns/constructFrom.js","../../../../../node_modules/date-fns/toDate.js","../../../../../node_modules/date-fns/addDays.js","../../../../../node_modules/date-fns/addMonths.js","../../../../../node_modules/date-fns/_lib/defaultOptions.js","../../../../../node_modules/date-fns/startOfWeek.js","../../../../../node_modules/date-fns/startOfISOWeek.js","../../../../../node_modules/date-fns/getISOWeekYear.js","../../../../../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../../../../../node_modules/date-fns/_lib/normalizeDates.js","../../../../../node_modules/date-fns/startOfDay.js","../../../../../node_modules/date-fns/differenceInCalendarDays.js","../../../../../node_modules/date-fns/startOfISOWeekYear.js","../../../../../node_modules/date-fns/isSameDay.js","../../../../../node_modules/date-fns/isDate.js","../../../../../node_modules/date-fns/isValid.js","../../../../../node_modules/date-fns/endOfDay.js","../../../../../node_modules/date-fns/endOfMonth.js","../../../../../node_modules/date-fns/startOfMonth.js","../../../../../node_modules/date-fns/startOfYear.js","../../../../../node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../../../../../node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../../../../../node_modules/date-fns/locale/en-US/_lib/formatLong.js","../../../../../node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../../../../../node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../../../../../node_modules/date-fns/locale/en-US/_lib/localize.js","../../../../../node_modules/date-fns/locale/_lib/buildMatchFn.js","../../../../../node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../../../../../node_modules/date-fns/locale/en-US/_lib/match.js","../../../../../node_modules/date-fns/locale/en-US.js","../../../../../node_modules/date-fns/getDayOfYear.js","../../../../../node_modules/date-fns/getISOWeek.js","../../../../../node_modules/date-fns/getWeekYear.js","../../../../../node_modules/date-fns/startOfWeekYear.js","../../../../../node_modules/date-fns/getWeek.js","../../../../../node_modules/date-fns/_lib/addLeadingZeros.js","../../../../../node_modules/date-fns/_lib/format/lightFormatters.js","../../../../../node_modules/date-fns/_lib/format/formatters.js","../../../../../node_modules/date-fns/_lib/format/longFormatters.js","../../../../../node_modules/date-fns/_lib/protectedTokens.js","../../../../../node_modules/date-fns/format.js","../../../../../node_modules/date-fns/subDays.js","../../../../../node_modules/date-fns/parseISO.js","../../../../../node_modules/date-fns/subMonths.js","../src/utils/dateFilters.ts","../src/utils/permissions.ts","../src/utils/commentUtils.ts","../src/utils/localizedContent.ts","../src/utils/formatFileSize.ts","../src/utils/storage.ts","../src/utils/featureFlags.ts","../src/utils/createComment.ts","../src/utils/compatibility.ts","../src/utils/feedUtils.ts","../src/utils/resolutionParser.ts","../src/utils/promptGenerator.ts","../src/utils/textDiff.ts","../src/utils/textContent.ts","../src/utils/screenshot.ts","../src/utils/seo.ts","../src/utils/performance.ts","../src/utils/maintenanceInstruction.ts"],"names":["createClient","defaultOptions","format","localize","formatLong","match","i","j","str"],"mappings":"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","file":"index.cjs","sourcesContent":["// @framed/core - Localization types and helpers\n// Source: framed-app/src/types/index.ts\n\n// Localized content type - stores content in multiple languages\n// Key is language code (e.g., 'nl', 'en'), value is the translated string\nexport type LocalizedContent = Record<string, string>\n\n// Helper type that can be either a simple string or localized content\n// Used for backwards compatibility with existing data\nexport type LocalizableString = string | LocalizedContent\n\n// Helper function to check if a value is LocalizedContent\nexport const isLocalizedContent = (value: LocalizableString): value is LocalizedContent => {\n return typeof value === 'object' && value !== null\n}\n\n// Helper function to get the string value for a specific language\n// Falls back to primary language, then first available, then empty string\nexport const getLocalizedValue = (\n value: LocalizableString | undefined,\n language: string,\n primaryLanguage?: string\n): string => {\n if (!value) return ''\n if (typeof value === 'string') return value\n // Try requested language first\n if (value[language]) return value[language]\n // Try primary language as fallback\n if (primaryLanguage && value[primaryLanguage]) return value[primaryLanguage]\n // Return first available value\n const firstValue = Object.values(value)[0]\n return firstValue || ''\n}\n\n// Helper function to convert string to LocalizedContent format\nexport const toLocalizedContent = (\n value: LocalizableString,\n primaryLanguage: string\n): LocalizedContent => {\n if (typeof value === 'string') {\n return { [primaryLanguage]: value }\n }\n return value\n}\n\n// Helper function to ensure a field is in LocalizedContent format\n// Useful when migrating data or normalizing input\nexport const ensureLocalizedContent = (\n value: LocalizableString | undefined,\n primaryLanguage: string\n): LocalizedContent => {\n if (!value) return { [primaryLanguage]: '' }\n return toLocalizedContent(value, primaryLanguage)\n}\n\n// Simple helper to safely get string from LocalizableString\n// Uses primary language 'en' by default\nexport const str = (value: LocalizableString | undefined, lang: string = 'en'): string => {\n if (!value) return ''\n if (typeof value === 'string') return value\n return value[lang] || Object.values(value)[0] || ''\n}\n","/**\n * i18n utilities - Stub implementations\n *\n * These are placeholder functions for internationalization.\n * In the full SaaS app, this would use react-i18next.\n * For the widget/SDK, translations should be provided by the host app.\n */\n\ntype TranslationOptions = {\n [key: string]: string | number\n}\n\n/**\n * Translation function type\n * Returns the translation for a key, or the fallback if provided\n */\ntype TFunction = (key: string, fallbackOrOptions?: string | TranslationOptions) => string\n\n/**\n * Stub useTranslation hook\n *\n * Returns a simple t function that:\n * - If second arg is a string, returns it as fallback\n * - If second arg is an object with interpolation values, returns key with values interpolated\n * - Otherwise returns the key\n */\nexport function useTranslation(_namespaces?: string[]): { t: TFunction } {\n const t: TFunction = (key: string, fallbackOrOptions?: string | TranslationOptions) => {\n // If fallback is a string, return it\n if (typeof fallbackOrOptions === 'string') {\n return fallbackOrOptions\n }\n\n // If options with interpolation values, try to replace {{key}} patterns\n if (typeof fallbackOrOptions === 'object') {\n let result = key\n // Extract fallback from key after last comma if present\n // e.g., \"wizard:localized.translationPartialError, Failed for: {{languages}}\"\n const parts = key.split(',')\n if (parts.length > 1) {\n result = parts.slice(1).join(',').trim()\n }\n // Replace {{key}} with values\n Object.entries(fallbackOrOptions).forEach(([k, v]) => {\n result = result.replace(new RegExp(`\\\\{\\\\{${k}\\\\}\\\\}`, 'g'), String(v))\n })\n return result\n }\n\n // Return key as fallback (extract text after colon if present)\n const colonIdx = key.lastIndexOf(':')\n if (colonIdx > 0) {\n return key.substring(colonIdx + 1).replace(/^[^a-zA-Z]*/, '')\n }\n return key\n }\n\n return { t }\n}\n","// @framed/core - Type definitions\n\nexport type PlanTier = 'free' | 'pro' | 'team';\n\nexport type AuthMode = 'dev' | 'local' | 'magic_link' | 'framed_login';\n\nexport type TaskStatus = 'open' | 'in_progress' | 'done' | 'rejected';\n\nexport type TaskType =\n | 'text_change'\n | 'bug_report'\n | 'style_change'\n | 'feature_request'\n | 'content_update'\n | 'general_feedback';\n\nexport interface FramedConfig {\n projectId: string;\n mode: 'local' | 'sync';\n\n auth: AuthConfig;\n ai?: AIConfig;\n sync?: SyncConfig;\n widget?: WidgetConfig;\n features?: Partial<WidgetFeatures>;\n}\n\nexport interface AuthConfig {\n mode: AuthMode;\n loginRoute?: string;\n allowedEmails?: string[];\n}\n\nexport interface AIConfig {\n provider: 'openrouter' | 'anthropic';\n apiKey: string;\n model?: string;\n}\n\nexport interface SyncConfig {\n apiKey: string;\n supabaseUrl: string; // https://xxx.supabase.co\n}\n\nexport interface WidgetConfig {\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n theme?: 'light' | 'dark' | 'auto';\n hotkey?: string;\n}\n\nexport interface WidgetFeatures {\n // Selection\n elementSelect: boolean;\n textEdit: boolean;\n annotate: boolean;\n\n // Capture\n screenshot: boolean;\n regionSelect: boolean;\n screenRecording: boolean;\n\n // Input\n voiceInput: boolean;\n\n // View\n mobilePreview: boolean;\n feedbackDrawer: boolean;\n\n // Team (Pro/Team)\n multiplayer: boolean;\n presence: boolean;\n assignments: boolean;\n mentions: boolean;\n activityFeed: boolean;\n teamRoles: boolean;\n}\n\nexport interface Session {\n id: string;\n user: {\n id: string;\n name: string;\n email?: string;\n };\n permissions: {\n canSubmitFeedback: boolean;\n canViewTasks: boolean;\n canEditTasks: boolean;\n };\n limits: UsageLimits;\n expiresAt: string;\n}\n\nexport interface UsageLimits {\n feedbackPerMonth: number;\n feedbackUsed: number;\n aiParsesPerMonth: number;\n aiParsesUsed: number;\n projects: number;\n reviewersPerProject: number;\n historyRetentionDays: number;\n}\n\nexport interface Task {\n id: string;\n type: TaskType;\n status: TaskStatus;\n\n element?: ElementInfo;\n page: PageInfo;\n feedback: FeedbackInfo;\n task: TaskInfo;\n attachments?: Attachment[];\n\n assignment?: Assignment;\n mentions?: Mention[];\n comments?: Comment[];\n\n meta: TaskMeta;\n}\n\nexport interface ElementInfo {\n selector: string;\n xpath: string;\n tagName: string;\n textContent?: string;\n rect: DOMRect;\n}\n\nexport interface PageInfo {\n url: string;\n path: string;\n title: string;\n}\n\nexport interface FeedbackInfo {\n text: string;\n originalText?: string;\n voiceTranscript?: string;\n}\n\nexport interface TaskInfo {\n title: string;\n description: string;\n suggestedChanges?: string;\n}\n\nexport interface Attachment {\n id: string;\n type: 'screenshot' | 'recording' | 'annotation';\n url: string;\n thumbnailUrl?: string;\n mimeType: string;\n size: number;\n}\n\nexport interface Assignment {\n userId: string;\n userName: string;\n assignedAt: string;\n}\n\nexport interface Mention {\n userId: string;\n userName: string;\n position: { start: number; end: number };\n}\n\nexport interface TaskComment {\n id: string;\n userId: string;\n userName: string;\n text: string;\n createdAt: string;\n}\n\n/** @deprecated Use TaskComment instead */\nexport type Comment = TaskComment;\n\nexport interface TaskMeta {\n createdAt: string;\n updatedAt: string;\n createdBy: string;\n projectId: string;\n}\n\n// Data layer interface\nexport interface WidgetDataLayer {\n getSession(): Promise<Session | null>;\n loadTasks(page?: string): Promise<Task[]>;\n saveTask(task: Task): Promise<void>;\n updateTask(id: string, updates: Partial<Task>): Promise<void>;\n uploadFile(file: File): Promise<{ url: string; path: string }>;\n checkLimits(): Promise<LimitStatus>;\n sync?(): Promise<SyncResult>;\n}\n\nexport interface LimitStatus {\n canSubmitFeedback: boolean;\n feedbackRemaining: number;\n canUseAI: boolean;\n aiParsesRemaining: number;\n}\n\nexport interface SyncResult {\n success: boolean;\n syncedTasks: number;\n errors?: string[];\n}\n\n// Widget-specific types for UI state\n\nexport type AnnotationMode =\n | 'select'\n | 'text-edit'\n | 'highlight'\n | 'underline'\n | 'strikethrough'\n | 'circle'\n | 'bracket'\n | 'draw'\n | null;\n\nexport type ViewportMode = 'desktop' | 'tablet' | 'mobile';\n\nexport interface Position {\n x: number;\n y: number;\n}\n\nexport interface AnnotationData {\n type: string;\n color: string;\n}\n\nexport interface PendingAttachment {\n id: string;\n file: File;\n type: string;\n previewUrl: string | null;\n}\n\nexport interface ElementHierarchy {\n tagName: string;\n id?: string;\n className?: string;\n}\n\nexport interface FeedbackComment {\n id: string;\n content: string;\n contentHtml?: string;\n author: string;\n createdAt: string;\n resolved: boolean;\n\n // Page info\n pageUrl?: string;\n pageTitle?: string;\n\n // Element info\n position?: Position;\n selector?: string;\n elementText?: string;\n elementType?: string;\n elementId?: string;\n elementClassName?: string;\n parentHierarchy?: ElementHierarchy[];\n\n attachments?: {\n url: string;\n type: string;\n fileName: string;\n }[];\n annotation?: AnnotationData;\n textEdit?: {\n originalText: string;\n newText: string;\n };\n viewport?: {\n width: number;\n height: number;\n type: ViewportMode;\n };\n}\n\nexport interface WidgetUIState {\n // Panel state\n feedbackPanelOpen: boolean;\n quickInputOpen: boolean;\n chatModalOpen: boolean;\n\n // Annotation mode\n annotationMode: AnnotationMode;\n annotationColor: string;\n\n // Selection\n selectedElement: Element | null;\n hoveredElement: Element | null;\n originalText: string;\n editedText: string;\n\n // Drawing\n isDrawing: boolean;\n drawingPaths: { points: Position[]; color: string }[];\n\n // Feedback\n comments: FeedbackComment[];\n showResolved: boolean;\n\n // Capture\n isCapturing: boolean;\n isRegionSelectMode: boolean;\n isRecording: boolean;\n\n // Attachments\n pendingAttachments: PendingAttachment[];\n\n // Rich text\n richTextMode: boolean;\n\n // Viewport\n viewportMode: ViewportMode;\n\n // Current page\n currentPageUrl: string;\n}\n\n// =============================================================================\n// SDK Dual-Client Configuration\n// =============================================================================\n\n/**\n * SDK Configuration for dual-client architecture.\n * - User's Supabase → Data storage (projects, tasks, files)\n * - Framed API → AI/premium features\n */\nexport interface SDKConfig {\n // Required - customer's own Supabase instance\n supabaseUrl: string;\n supabaseKey: string;\n\n // Optional - for AI/premium features via Framed API\n framedApiKey?: string;\n\n // Project identification\n projectId?: string;\n\n // Theme preference\n theme?: 'light' | 'dark';\n}\n\n/**\n * Result wrapper for AI-enhanced operations.\n * Indicates whether AI was used or fallback occurred.\n */\nexport interface AIFeatureResult<T> {\n data: T;\n wasEnhanced: boolean;\n fallbackReason?: string;\n}\n\n/**\n * Generic upload result for file operations.\n */\nexport interface UploadResult {\n url: string;\n name: string;\n type?: string;\n size?: number;\n format?: string;\n}\n\n/**\n * Result from AI translation service.\n */\nexport interface TranslationResult {\n translations: Record<string, string>;\n errors: Record<string, string>;\n}\n\n/**\n * Callback interface for wizard components.\n * These are implemented by the SDK using the dual-client architecture.\n */\nexport interface WizardCallbacks {\n onUploadFile: (file: File) => Promise<UploadResult>;\n onUploadFont: (file: File) => Promise<UploadResult>;\n onLogoUpload: (file: File) => Promise<void>;\n onTranslateAll: (\n value: Record<string, string>,\n primaryLanguage: string,\n targetLanguages: string[]\n ) => Promise<TranslationResult>;\n}\n\n// =============================================================================\n// Phase 2 Navigation Types (Data types are in ./phases/phase2.ts)\n// =============================================================================\n\n// Import localization utilities and phase2 types for helper functions\nimport { str } from './localization';\nimport type { PageDetail, Section } from './phases/phase2';\n\n// Re-export str for convenience\nexport { str };\n\n/**\n * Section completion status for Phase 2 navigation.\n */\nexport type SectionStatus = 'empty' | 'in_progress' | 'completed' | 'skipped';\n\n/**\n * Global subsection types for Phase 2 navigation.\n */\nexport type GlobalsSubType =\n | 'navigation'\n | 'footer'\n | 'cta'\n | 'sitemap'\n | 'media'\n | 'review';\n\n/**\n * Phase 2 navigation state.\n */\nexport interface Phase2NavigationState {\n activePageIndex: number;\n activeSectionIndex: number;\n activeGlobalsType: GlobalsSubType | null;\n isGlobalsExpanded: boolean;\n totalSections: number;\n}\n\n/**\n * Phase 2 navigation actions.\n */\nexport interface Phase2NavigationActions {\n setActivePageIndex: (index: number) => void;\n setActiveSectionIndex: (index: number) => void;\n setActiveGlobalsType: (type: GlobalsSubType | null) => void;\n setIsGlobalsExpanded: (expanded: boolean) => void;\n goToNextSection: () => void;\n goToPreviousSection: () => void;\n goToPage: (pageIndex: number, sectionIndex?: number) => void;\n goToGlobals: (type: GlobalsSubType) => void;\n}\n\n/**\n * Get page completion status based on sections.\n */\nexport const getPageStatus = (page: PageDetail): SectionStatus => {\n if (!page.sections || page.sections.length === 0) return 'empty';\n\n const completedCount = page.sections.filter(\n (s) => s.is_completed || s.skip_section\n ).length;\n const inProgressCount = page.sections.filter(\n (s) => !s.is_completed && !s.skip_section && (str(s.title) || str(s.content))\n ).length;\n\n if (completedCount === page.sections.length) return 'completed';\n if (completedCount > 0 || inProgressCount > 0) return 'in_progress';\n return 'empty';\n};\n\n/**\n * Get section completion status.\n */\nexport const getSectionStatus = (section: Section): SectionStatus => {\n if (section.skip_section) return 'skipped';\n if (section.is_completed) return 'completed';\n\n const hasTitle = Boolean(str(section.title));\n const hasContent = Boolean(str(section.content));\n const hasMedia = section.media?.some((m) => m.type !== 'none' || m.url);\n const hasCTA = section.ctas?.some((c) => str(c.text));\n\n if (hasTitle || hasContent || hasMedia || hasCTA) return 'in_progress';\n return 'empty';\n};\n","// @framed/core - Tier limits and feature defaults\n\nimport type { PlanTier, UsageLimits, WidgetFeatures } from './types';\n\nexport const PLAN_LIMITS: Record<PlanTier, UsageLimits> = {\n free: {\n feedbackPerMonth: 25,\n feedbackUsed: 0,\n aiParsesPerMonth: 25,\n aiParsesUsed: 0,\n projects: 1,\n reviewersPerProject: 3,\n historyRetentionDays: 30,\n },\n pro: {\n feedbackPerMonth: 500,\n feedbackUsed: 0,\n aiParsesPerMonth: 500,\n aiParsesUsed: 0,\n projects: 5,\n reviewersPerProject: 10,\n historyRetentionDays: 365,\n },\n team: {\n feedbackPerMonth: Infinity,\n feedbackUsed: 0,\n aiParsesPerMonth: Infinity,\n aiParsesUsed: 0,\n projects: Infinity,\n reviewersPerProject: Infinity,\n historyRetentionDays: Infinity,\n },\n};\n\nexport const FEATURE_DEFAULTS: Record<PlanTier, WidgetFeatures> = {\n free: {\n elementSelect: true,\n textEdit: true,\n annotate: true,\n screenshot: true,\n regionSelect: true,\n screenRecording: false,\n voiceInput: false,\n mobilePreview: false,\n feedbackDrawer: true,\n multiplayer: false,\n presence: false,\n assignments: false,\n mentions: false,\n activityFeed: false,\n teamRoles: false,\n },\n pro: {\n elementSelect: true,\n textEdit: true,\n annotate: true,\n screenshot: true,\n regionSelect: true,\n screenRecording: true,\n voiceInput: true,\n mobilePreview: true,\n feedbackDrawer: true,\n multiplayer: true,\n presence: true,\n assignments: true,\n mentions: true,\n activityFeed: true,\n teamRoles: false,\n },\n team: {\n elementSelect: true,\n textEdit: true,\n annotate: true,\n screenshot: true,\n regionSelect: true,\n screenRecording: true,\n voiceInput: true,\n mobilePreview: true,\n feedbackDrawer: true,\n multiplayer: true,\n presence: true,\n assignments: true,\n mentions: true,\n activityFeed: true,\n teamRoles: true,\n },\n};\n\nexport function canSubmitFeedback(limits: UsageLimits): boolean {\n return limits.feedbackUsed < limits.feedbackPerMonth;\n}\n\nexport function canUseAI(limits: UsageLimits): boolean {\n return limits.aiParsesUsed < limits.aiParsesPerMonth;\n}\n\nexport function getFeaturesForTier(tier: PlanTier): WidgetFeatures {\n return FEATURE_DEFAULTS[tier];\n}\n\nexport function mergeFeatures(\n tier: PlanTier,\n overrides?: Partial<WidgetFeatures>\n): WidgetFeatures {\n return {\n ...FEATURE_DEFAULTS[tier],\n ...overrides,\n };\n}\n","// @framed/core - Module management types\n// Source: framed-app/src/types/index.ts\n\n/**\n * Core modules in the Framed application\n * - build: Discovery (Phase 1), Project Details (Phase 2), Overview & Export (Phase 3)\n * - review: Feedback & Review (Phase 4)\n * - manage: Manage & Maintain (Phase 5)\n */\nexport type ModuleType = 'build' | 'review' | 'manage'\n\n/**\n * Mapping of modules to their constituent phases\n */\nexport const MODULE_PHASES: Record<ModuleType, number[]> = {\n build: [1, 2, 3],\n review: [4],\n manage: [5],\n}\n\n/**\n * Mapping of phases to their parent module\n */\nexport const PHASE_TO_MODULE: Record<number, ModuleType> = {\n 1: 'build',\n 2: 'build',\n 3: 'build',\n 4: 'review',\n 5: 'manage',\n}\n\n/**\n * Module display information\n */\nexport interface ModuleInfo {\n id: ModuleType\n name: string\n shortName: string\n description: string\n phases: number[]\n icon: string // Lucide icon name\n}\n\nexport const MODULES: ModuleInfo[] = [\n {\n id: 'build',\n name: 'Build',\n shortName: 'Build',\n description: 'Discovery, project details, and overview',\n phases: [1, 2, 3],\n icon: 'Hammer',\n },\n {\n id: 'review',\n name: 'Review',\n shortName: 'Review',\n description: 'Feedback and review process',\n phases: [4],\n icon: 'Eye',\n },\n {\n id: 'manage',\n name: 'Manage',\n shortName: 'Manage',\n description: 'Ongoing maintenance and management',\n phases: [5],\n icon: 'Wrench',\n },\n]\n\n/**\n * Module limits per agency (null = unlimited)\n */\nexport interface ModuleLimits {\n build: number | null\n review: number | null\n manage: number | null\n}\n\n/**\n * Module usage statistics for an agency\n */\nexport interface ModuleUsageStats {\n module: ModuleType\n used: number\n limit: number | null\n remaining: number | null // null if unlimited\n percentage: number | null // null if unlimited\n}\n\n/**\n * Plan configuration with module limits\n */\nexport interface PlanConfiguration {\n id: string\n plan_type: PlanType\n display_name: string\n description: string\n build_limit: number | null\n review_limit: number | null\n manage_limit: number | null\n total_project_limit: number | null\n included_features: string[]\n price_monthly_cents?: number\n price_yearly_cents?: number\n currency: string\n is_active: boolean\n sort_order: number\n}\n\n// Plan types\nexport type PlanType = 'oneoff' | 'silver' | 'gold'\nexport type SubscriptionStatus = 'active' | 'expired' | 'cancelled' | 'trialing'\n\n// ============================================\n// Module Management Utilities (Pure functions)\n// Source: framed-app/src/utils/moduleManagement.ts\n// ============================================\n\n// Import Project type inline to avoid circular dependency\ninterface ProjectLike {\n project_type?: 'standard' | 'review_only' | 'manage_only'\n enabled_modules?: ModuleType[] | null\n visible_modules?: ModuleType[] | null\n disabled_phases?: number[]\n}\n\ninterface AgencyLike {\n plan_type?: PlanType\n module_limits?: ModuleLimits\n}\n\n/**\n * Get default enabled modules based on project type\n */\nexport const getDefaultModules = (project: ProjectLike): ModuleType[] => {\n if (project.project_type === 'review_only') {\n return ['review', 'manage']\n }\n if (project.project_type === 'manage_only') {\n return ['manage']\n }\n return ['build', 'review', 'manage']\n}\n\n/**\n * Check if a module is enabled for a project\n * Enabled modules have the feature available (can be accessed)\n */\nexport const isModuleEnabled = (project: ProjectLike | null, module: ModuleType): boolean => {\n if (!project) return false\n\n // First check if the module is available for this project type\n const availableModules = getDefaultModules(project)\n if (!availableModules.includes(module)) {\n return false\n }\n\n // Use explicit enabled_modules if set, otherwise use defaults based on project_type\n const enabledModules = project.enabled_modules ?? availableModules\n return enabledModules.includes(module)\n}\n\n/**\n * Check if a module is visible in the UI for a project\n * Visible modules show in navigation (enabled + not hidden)\n */\nexport const isModuleVisible = (project: ProjectLike | null, module: ModuleType): boolean => {\n if (!project) return false\n\n // Must be enabled to be visible\n if (!isModuleEnabled(project, module)) return false\n\n // If visible_modules is explicitly set, check it\n if (project.visible_modules) {\n return project.visible_modules.includes(module)\n }\n\n // Default: all enabled modules are visible\n return true\n}\n\n/**\n * Check if a specific phase is accessible based on module configuration\n */\nexport const isPhaseAccessible = (project: ProjectLike | null, phase: number): boolean => {\n if (!project) return false\n\n const module = PHASE_TO_MODULE[phase]\n if (!module) return true // Unknown phase, allow by default\n\n return isModuleEnabled(project, module)\n}\n\n/**\n * Check if a specific phase should be shown in navigation\n * Combines module visibility with legacy disabled_phases support\n */\nexport const isPhaseVisible = (project: ProjectLike | null, phase: number): boolean => {\n if (!project) return false\n\n // Check module visibility first\n const module = PHASE_TO_MODULE[phase]\n if (module && !isModuleVisible(project, module)) {\n return false\n }\n\n // Also check legacy disabled_phases array for granular control\n if (project.disabled_phases?.includes(phase)) {\n return false\n }\n\n return true\n}\n\n/**\n * Get the phases that are visible for a project (shown in navigation)\n */\nexport const getVisiblePhases = (project: ProjectLike | null): number[] => {\n if (!project) return []\n\n const allPhases = [1, 2, 3, 4, 5]\n return allPhases.filter(phase => isPhaseVisible(project, phase))\n}\n\n/**\n * Get the phases that are accessible for a project (can be navigated to, even if hidden from nav)\n */\nexport const getAccessiblePhases = (project: ProjectLike | null): number[] => {\n if (!project) return []\n\n const allPhases = [1, 2, 3, 4, 5]\n return allPhases.filter(phase => isPhaseAccessible(project, phase))\n}\n\n/**\n * Get the first accessible phase for a project\n * Uses accessible phases (not just visible) so hidden phases can still be accessed\n */\nexport const getFirstAccessiblePhase = (project: ProjectLike | null): number => {\n if (!project) return 1\n\n const accessiblePhases = getAccessiblePhases(project)\n return accessiblePhases[0] ?? 1\n}\n\n/**\n * Get the first visible phase for a project\n * Used for dashboard navigation - respects hidden phases (e.g., completed review phase)\n */\nexport const getFirstVisiblePhase = (project: ProjectLike | null): number => {\n if (!project) return 1\n\n const visiblePhases = getVisiblePhases(project)\n return visiblePhases[0] ?? 1\n}\n\n/**\n * Get module limits for an agency based on plan type or explicit limits\n */\nexport const getModuleLimits = (agency: AgencyLike | null): ModuleLimits => {\n if (!agency) return { build: 0, review: 0, manage: 0 }\n\n // Use explicit module_limits if set\n if (agency.module_limits) {\n return {\n build: agency.module_limits.build,\n review: agency.module_limits.review,\n manage: agency.module_limits.manage,\n }\n }\n\n // Fall back to plan-based defaults\n switch (agency.plan_type) {\n case 'gold':\n return { build: null, review: null, manage: null } // unlimited\n case 'silver':\n return { build: 10, review: 10, manage: 5 }\n case 'oneoff':\n return { build: 1, review: 1, manage: 0 }\n default:\n return { build: 10, review: 10, manage: 5 }\n }\n}\n\n/**\n * Check if a module limit is unlimited\n */\nexport const isModuleUnlimited = (agency: AgencyLike | null, module: ModuleType): boolean => {\n const limits = getModuleLimits(agency)\n return limits[module] === null\n}\n\n/**\n * Get display name for a module\n */\nexport const getModuleDisplayName = (module: ModuleType): string => {\n switch (module) {\n case 'build':\n return 'Build'\n case 'review':\n return 'Review'\n case 'manage':\n return 'Manage'\n default:\n return module\n }\n}\n\n/**\n * Get module description\n */\nexport const getModuleDescription = (module: ModuleType): string => {\n switch (module) {\n case 'build':\n return 'Discovery, project details, and overview export'\n case 'review':\n return 'Feedback and review with visual annotations'\n case 'manage':\n return 'Ongoing maintenance and management'\n default:\n return ''\n }\n}\n\n/**\n * Get phases included in a module as a readable string\n */\nexport const getModulePhasesLabel = (module: ModuleType): string => {\n switch (module) {\n case 'build':\n return 'Phases 1-3: Discovery, Details, Export'\n case 'review':\n return 'Phase 4: Feedback & Review'\n case 'manage':\n return 'Phase 5: Manage & Maintain'\n default:\n return ''\n }\n}\n","// @framed/core - Phase 4 (Review & Feedback) types\n// Source: framed-app/src/types/index.ts\n\nimport type { LocalizableString } from '../localization'\nimport type { UserRole, ProjectStatus } from '../entities'\n\n// ============================================\n// Feedback Rounds Types\n// ============================================\n\nexport interface FeedbackRound {\n id: string\n round_number: number\n started_at: string\n started_by: string\n started_by_name: string\n ended_at?: string\n ended_by?: string\n ended_by_name?: string\n // Round lifecycle: active → feedback_complete → closed\n // - active: Clients can add new feedback items\n // - feedback_complete: Client marked all feedback as shared, devs can start working\n // (no new feedback items, but replies/discussion still allowed)\n // - closed: Round archived, new round started with fresh screenshots\n status: 'active' | 'feedback_complete' | 'closed'\n // Who marked feedback as complete (client action)\n feedback_completed_at?: string\n feedback_completed_by?: string\n feedback_completed_by_name?: string\n summary?: FeedbackRoundSummary\n // Screenshots captured at the start of this round\n screenshot_version?: number\n}\n\nexport interface FeedbackRoundSummary {\n total_items: number\n resolved_in_round: number\n carried_over: number\n unable_to_resolve: number\n new_items_added: number\n}\n\nexport interface ResolutionImportResult {\n imported_at: string\n imported_by: string\n imported_by_name: string\n round_number: number\n matched_items: number\n resolved_count: number\n unable_count: number\n unmatched_ids: string[]\n unmatched_notes: string // Note summarizing unmatched items\n}\n\nexport type ResolutionStatus = 'resolved' | 'unable_to_resolve' | 'needs_clarification'\n\nexport interface ParsedResolutionItem {\n feedback_id: string\n status: ResolutionStatus\n description: string\n question?: string // For needs_clarification items, the question to ask the client\n}\n\n// ============================================\n// Image Review Types\n// ============================================\n\nexport type ImageStatus = 'pending' | 'approved' | 'changes_requested'\n\nexport interface PageImage {\n id: string\n page_name: string\n image_url: string\n alt_text?: string\n detected_from: 'crawl' | 'manual' | 'upload'\n dimensions?: { width: number; height: number }\n file_size?: number\n\n // Approval workflow\n status: ImageStatus\n approved_by?: string\n approved_by_name?: string\n approved_at?: string\n\n // Suggested replacement\n suggested_replacement?: {\n url: string\n uploaded_by: string\n uploaded_by_name: string\n uploaded_at: string\n reason?: string\n }\n\n // Comments specific to this image\n comments?: ImageComment[]\n\n created_at: string\n updated_at: string\n}\n\nexport interface ImageComment {\n id: string\n user_id: string\n user_name: string\n user_role: UserRole\n comment: string\n created_at: string\n edited_at?: string\n}\n\n// ============================================\n// Section Suggestions\n// ============================================\n\nexport type SectionSuggestionStatus = 'pending' | 'approved' | 'rejected'\n\nexport interface SectionSuggestion {\n id: string\n page_name: string // Which page this suggestion is for\n type: string // Section type from sectionTypes\n title: LocalizableString\n content: LocalizableString\n media_type: 'image' | 'video' | 'illustration' | 'icon' | 'none'\n media_description?: LocalizableString\n notes?: string // Client notes explaining the suggestion\n\n // Metadata\n suggested_by: string\n suggested_by_name: string\n suggested_by_role: UserRole\n suggested_at: string\n\n // Status workflow\n status: SectionSuggestionStatus\n reviewed_by?: string\n reviewed_by_name?: string\n reviewed_at?: string\n review_notes?: string\n}\n\n// ============================================\n// Text Editing / Track Changes Types\n// ============================================\n\n// Content block within a section (heading, paragraph, list)\nexport interface ContentBlock {\n id: string\n type: 'heading' | 'text' | 'list'\n tagName: string // h1-h6, p, ul, ol, blockquote\n originalContent: string // Original text from crawl\n currentContent: string // Current (possibly edited) text\n order: number // Order within section\n level?: number // For headings: 1-6\n items?: string[] // For lists: original items\n currentItems?: string[] // For lists: edited items\n}\n\n// Section grouping content blocks (natural reading order)\nexport interface ContentSection {\n id: string\n name: string // Section title (from first heading or auto-generated)\n order: number // Order on page\n blocks: ContentBlock[]\n collapsed?: boolean // UI state for accordion\n}\n\n// Single text edit operation (for history tracking)\nexport interface TextEdit {\n id: string\n blockId: string // References ContentBlock.id\n sectionId: string // References ContentSection.id\n previousContent: string // Content before this edit\n newContent: string // Content after this edit\n editedAt: string // ISO timestamp\n editedBy: string // User ID\n editedByName: string // User display name\n editedByRole: UserRole\n editType: 'modify' | 'restore'\n comment?: string // Optional note about the change\n // Resolution tracking (similar to feedback comments)\n resolved?: boolean\n resolvedAt?: string\n resolvedBy?: string\n resolvedByName?: string\n}\n\n// Text content for a single language version\nexport interface LanguageContent {\n language: string // Language code: 'nl', 'en', etc.\n pageTitle?: string\n sections: ContentSection[]\n crawledAt: string\n crawledBy: string\n editHistory: TextEdit[]\n}\n\n// Text content for a single page (supports multiple languages)\nexport interface PageTextContent {\n pageUrl: string\n languages: Record<string, LanguageContent> // keyed by language code\n primaryLanguage: string // Default language to show\n version: number // Increments with each re-crawl\n}\n\n// Legacy types kept for backwards compatibility\nexport interface CrawledTextElement {\n id: string\n selector: string\n tagName: string\n elementType: CrawledElementType\n originalText: string\n currentText: string\n order: number\n parentSelector?: string\n}\n\nexport type CrawledElementType = 'heading' | 'paragraph' | 'link' | 'button' | 'label' | 'list-item' | 'other'\n\n// ============================================\n// Page Versions & Screenshots\n// ============================================\n\nexport interface PageVersion {\n version_number: number\n created_at: string\n created_by: string\n screenshot_desktop: ScreenshotInfo | null\n screenshot_mobile: ScreenshotInfo | null\n notes?: string\n approved?: boolean\n approved_by?: string\n approved_by_name?: string\n approved_at?: string\n // Track which feedback round this version belongs to\n round_number?: number\n}\n\nexport interface ScreenshotInfo {\n url: string\n uploaded_at: string\n uploaded_by: string\n file_name: string\n file_size: number\n}\n\n// ============================================\n// Comment Attachments & Page Comments\n// ============================================\n\nexport interface AttachmentTranscription {\n text: string\n language?: string\n duration?: number\n segments?: Array<{ start: number; end: number; text: string }>\n}\n\nexport interface CommentAttachment {\n id: string\n file_name: string\n file_url: string\n file_type: string // 'image/png', 'application/pdf', etc.\n file_size: number\n uploaded_at: string\n transcription?: AttachmentTranscription\n}\n\nexport interface PageComment {\n id: string\n user_id: string\n user_name: string\n user_role: UserRole\n version_number: number\n screenshot_type: 'desktop' | 'mobile'\n comment: string\n position: {\n x: number // percentage from left\n y: number // percentage from top\n }\n created_at: string\n updated_at?: string\n edited_at?: string\n resolved?: boolean\n\n // Thread support\n parent_id?: string // null/undefined for top-level comments\n replies?: PageComment[] // populated on read for display\n\n // Mentions\n mentions?: string[] // array of user_ids mentioned in comment\n\n // Attachments\n attachments?: CommentAttachment[]\n\n // Metadata for different review types\n metadata?: {\n reviewType?: 'screenshot' | 'live'\n viewMode?: 'desktop' | 'mobile'\n elementMetadata?: unknown\n pageUrl?: string // The actual URL where feedback was given\n pagePath?: string // The path portion of the URL for easy reference\n cssSelector?: string\n source?: 'widget' | 'screenshot' | 'app' | 'content_editor' // Where the feedback originated from\n // Content editor specific metadata\n changeType?: 'modified' | 'added' | 'deleted'\n originalContent?: string\n newContent?: string\n paragraphIndex?: number\n // Region capture specific metadata (from widget)\n hasScreenshot?: boolean // True if comment has its own screenshot attached\n screenshotUrl?: string // URL of the attached screenshot (for region captures)\n screenshotType?: 'region' | 'full' // Type of screenshot capture\n annotationsCount?: number // Number of annotations drawn on the screenshot\n }\n\n // New fields for live review\n selector?: string\n element_html?: string\n element_text?: string\n element_type?: string // e.g., 'button', 'link', 'image', 'text'\n element_styles?: Record<string, string>\n viewport_size?: { width: number; height: number }\n\n // Feedback rounds tracking\n created_in_round?: number // Which round this feedback was created in\n resolved_in_round?: number // Which round this feedback was resolved in\n resolution_status?: ResolutionStatus // 'resolved' | 'unable_to_resolve'\n resolution_description?: string // Description from resolution import\n\n // AI clarity validation\n needs_clarification?: boolean // True if AI flagged feedback as unclear\n clarification_suggestion?: string // AI's question asking for more detail\n}\n\n// ============================================\n// Phase 4 Page & Data\n// ============================================\n\nexport interface Phase4Page {\n page_name: string\n page_url?: string // URL for this specific page (for scraping)\n versions: PageVersion[]\n comments: PageComment[]\n textContent?: PageTextContent // Crawled text content for text editing mode\n // Virtual view properties (for tabs/modals that don't change URL)\n is_virtual_view?: boolean // Flag indicating this is a virtual view\n parent_url?: string // Original URL for reference (what URL this view was captured from)\n}\n\nexport interface Phase4Data {\n demo_url?: string\n pages: Phase4Page[]\n suggestions?: SectionSuggestion[] // Section suggestions from review\n // Feedback rounds\n rounds?: FeedbackRound[]\n current_round?: number\n import_history?: ResolutionImportResult[]\n // Project approval\n project_approved?: boolean\n project_approved_at?: string\n project_approved_by?: string\n project_approved_by_name?: string\n // Project completion (client marked as complete)\n completed_at?: string\n completed_by?: string\n completed_by_name?: string\n // Onboarding for review-only projects\n onboarding_completed?: boolean\n // Image review\n page_images?: PageImage[]\n}\n\n// ============================================\n// Unified Feed Types (for Phase 4 Feedback)\n// ============================================\n\n// Base interface for all feed items\nexport interface BaseFeedItem {\n id: string\n pageName: string\n pageUrl?: string\n timestamp: string\n userId: string\n userName: string\n userRole: UserRole\n}\n\n// Feedback feed item (screenshot/live review comments)\nexport interface FeedbackFeedItem extends BaseFeedItem {\n type: 'feedback'\n comment: PageComment\n screenshotUrl?: string\n versionNumber: number\n screenshotType: 'desktop' | 'mobile'\n position: { x: number; y: number }\n // Round tracking\n createdInRound?: number\n resolvedInRound?: number\n resolutionStatus?: ResolutionStatus\n resolutionDescription?: string\n}\n\n// Text edit feed item (crawled content changes)\nexport interface TextEditFeedItem extends BaseFeedItem {\n type: 'text_edit'\n edit: TextEdit\n language: string\n sectionName: string\n blockType: 'heading' | 'text' | 'list'\n tagName: string\n originalContent: string\n newContent: string\n}\n\n// Image feedback feed item (comments on page images)\nexport interface ImageFeedItem extends BaseFeedItem {\n type: 'image_feedback'\n imageId: string\n imageUrl: string\n imageAltText?: string\n imageStatus: ImageStatus\n comment: ImageComment\n usedOnPages: string[] // All pages this image appears on\n replacementUrl?: string // URL of suggested replacement image\n}\n\n// Union type for all feed items\nexport type FeedItem = FeedbackFeedItem | TextEditFeedItem | ImageFeedItem\n\n// Type guard for FeedbackFeedItem\nexport const isFeedbackItem = (item: FeedItem): item is FeedbackFeedItem => {\n return item.type === 'feedback'\n}\n\n// Type guard for TextEditFeedItem\nexport const isTextEditItem = (item: FeedItem): item is TextEditFeedItem => {\n return item.type === 'text_edit'\n}\n\n// Type guard for ImageFeedItem\nexport const isImageFeedItem = (item: FeedItem): item is ImageFeedItem => {\n return item.type === 'image_feedback'\n}\n\n// ============================================\n// Widget Session Types\n// ============================================\n\nexport interface WidgetSession {\n id: string\n project_id: string\n token: string\n created_by: string\n created_at: string\n expires_at: string\n last_activity: string\n guest_name?: string\n page_url?: string\n user_agent?: string\n is_active: boolean\n}\n\nexport interface WidgetSessionCreate {\n project_id: string\n page_url?: string\n guest_name?: string\n}\n\nexport interface WidgetSessionValidation {\n valid: boolean\n error?: string\n session?: {\n id: string\n project_id: string\n expires_at: string\n guest_name?: string\n }\n project?: {\n id: string\n name: string\n status: ProjectStatus\n pages: {\n page_name: string\n page_url: string\n comment_count: number\n has_approved_version: boolean\n }[]\n }\n}\n","/**\n * Framed API Client\n *\n * Handles communication with Framed's AI services (premium features).\n * Uses the customer's API key for authentication.\n */\n\nconst FRAMED_API_URL = 'https://jmlfggpacsnkpnpmsoup.supabase.co/functions/v1';\n\nexport interface FramedApiError {\n message: string;\n code?: string;\n status?: number;\n}\n\nexport class FramedApiClient {\n private apiKey: string | null;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || null;\n }\n\n /**\n * Check if the client is configured with an API key.\n */\n get isEnabled(): boolean {\n return this.apiKey !== null;\n }\n\n /**\n * Make a POST request to a Framed API endpoint.\n *\n * @param endpoint - The endpoint path (e.g., 'sdk-ai-translate')\n * @param data - The request payload\n * @returns The response data\n * @throws Error if API key is not configured or request fails\n */\n async post<T>(endpoint: string, data: unknown): Promise<T> {\n if (!this.apiKey) {\n throw new Error('Framed API key required for this feature');\n }\n\n const response = await fetch(`${FRAMED_API_URL}/${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({})) as Partial<FramedApiError>;\n throw new Error(error.message || `API error: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Make a GET request to a Framed API endpoint.\n *\n * @param endpoint - The endpoint path\n * @param params - Optional query parameters\n * @returns The response data\n */\n async get<T>(endpoint: string, params?: Record<string, string>): Promise<T> {\n if (!this.apiKey) {\n throw new Error('Framed API key required for this feature');\n }\n\n const url = new URL(`${FRAMED_API_URL}/${endpoint}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n }\n\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({})) as Partial<FramedApiError>;\n throw new Error(error.message || `API error: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * User Supabase Client Factory\n *\n * Creates and manages a Supabase client for the customer's own database.\n * This is where project data, tasks, and file uploads are stored.\n */\n\nimport { createClient, SupabaseClient } from '@supabase/supabase-js';\n\nlet userSupabaseClient: SupabaseClient | null = null;\n\n/**\n * Initialize the user's Supabase client.\n *\n * @param url - The customer's Supabase URL (e.g., https://xxx.supabase.co)\n * @param key - The customer's Supabase anon key\n * @returns The initialized Supabase client\n */\nexport function initUserSupabase(url: string, key: string): SupabaseClient {\n userSupabaseClient = createClient(url, key, {\n auth: {\n persistSession: true,\n autoRefreshToken: true,\n },\n });\n return userSupabaseClient;\n}\n\n/**\n * Get the current user Supabase client.\n *\n * @returns The Supabase client\n * @throws Error if client has not been initialized\n */\nexport function getUserSupabase(): SupabaseClient {\n if (!userSupabaseClient) {\n throw new Error(\n 'Supabase not initialized. Call initUserSupabase() first or wrap your app in FramedProvider.'\n );\n }\n return userSupabaseClient;\n}\n\n/**\n * Check if the Supabase client has been initialized.\n */\nexport function isSupabaseInitialized(): boolean {\n return userSupabaseClient !== null;\n}\n\n/**\n * Reset the Supabase client (useful for testing or logout).\n */\nexport function resetUserSupabase(): void {\n userSupabaseClient = null;\n}\n\n// Re-export SupabaseClient type for convenience\nexport type { SupabaseClient };\n","/**\n * Callback Implementations\n *\n * These functions implement the callback interfaces used by wizard components.\n * They use the dual-client architecture:\n * - File uploads → User's Supabase storage\n * - AI features → Framed API\n */\n\nimport { getUserSupabase } from './supabaseClient';\nimport { FramedApiClient } from './framedClient';\nimport type { UploadResult, TranslationResult } from '../types';\n\n/**\n * Upload a file to the user's Supabase storage.\n *\n * @param file - The file to upload\n * @param bucket - The storage bucket name (default: 'uploads')\n * @param path - Optional custom path for the file\n * @returns Upload result with URL and metadata\n */\nexport async function uploadFile(\n file: File,\n bucket: string = 'uploads',\n path?: string\n): Promise<UploadResult> {\n const supabase = getUserSupabase();\n\n // Generate unique filename if path not provided\n const fileName = path || `${Date.now()}-${file.name.replace(/[^a-zA-Z0-9.-]/g, '_')}`;\n\n const { data, error } = await supabase.storage.from(bucket).upload(fileName, file, {\n cacheControl: '3600',\n upsert: false,\n });\n\n if (error) {\n throw new Error(`Upload failed: ${error.message}`);\n }\n\n // Get the public URL\n const {\n data: { publicUrl },\n } = supabase.storage.from(bucket).getPublicUrl(data.path);\n\n return {\n url: publicUrl,\n name: file.name,\n type: file.type,\n size: file.size,\n };\n}\n\n/**\n * Upload a font file to the user's Supabase storage.\n *\n * @param file - The font file to upload\n * @returns Upload result with font-specific metadata\n */\nexport async function uploadFont(file: File): Promise<UploadResult> {\n const result = await uploadFile(file, 'fonts');\n\n // Determine font format from file extension\n const ext = file.name.split('.').pop()?.toLowerCase();\n const formatMap: Record<string, string> = {\n woff2: 'woff2',\n woff: 'woff',\n ttf: 'truetype',\n otf: 'opentype',\n eot: 'embedded-opentype',\n };\n\n return {\n ...result,\n format: formatMap[ext || ''] || 'unknown',\n };\n}\n\n/**\n * Upload a logo file to the user's Supabase storage.\n *\n * @param file - The logo image file to upload\n * @returns Upload result with URL\n */\nexport async function uploadLogo(file: File): Promise<UploadResult> {\n return uploadFile(file, 'logos');\n}\n\n/**\n * Translate content using the Framed AI API.\n *\n * @param framedApi - The Framed API client instance\n * @param value - The content to translate (language code to text mapping)\n * @param primaryLanguage - The source language code\n * @param targetLanguages - Array of target language codes\n * @returns Translation result with translations and any errors\n */\nexport async function translateContent(\n framedApi: FramedApiClient,\n value: Record<string, string>,\n primaryLanguage: string,\n targetLanguages: string[]\n): Promise<TranslationResult> {\n // If no API key, return a graceful fallback\n if (!framedApi.isEnabled) {\n return {\n translations: {},\n errors: {\n _fallback: 'AI translation requires a Framed API key. Upgrade to enable this feature.',\n },\n };\n }\n\n try {\n // Get the primary text to translate\n const sourceText = value[primaryLanguage] || '';\n\n if (!sourceText.trim()) {\n return {\n translations: {},\n errors: { _empty: 'No source text to translate' },\n };\n }\n\n const response = await framedApi.post<{\n translations: Record<string, string>;\n errors?: Record<string, string>;\n }>('sdk-ai-translate', {\n text: sourceText,\n from: primaryLanguage,\n to: targetLanguages,\n });\n\n return {\n translations: response.translations || {},\n errors: response.errors || {},\n };\n } catch (error) {\n return {\n translations: {},\n errors: {\n _error: error instanceof Error ? error.message : 'Translation failed',\n },\n };\n }\n}\n\n/**\n * Create the complete callbacks object for wizard components.\n *\n * @param framedApi - The Framed API client instance\n * @returns Object with all wizard callback implementations\n */\nexport function createWizardCallbacks(framedApi: FramedApiClient) {\n return {\n onUploadFile: (file: File) => uploadFile(file, 'uploads'),\n onUploadFont: (file: File) => uploadFont(file),\n onLogoUpload: async (file: File) => {\n await uploadLogo(file);\n },\n onTranslateAll: (\n value: Record<string, string>,\n primaryLanguage: string,\n targetLanguages: string[]\n ) => translateContent(framedApi, value, primaryLanguage, targetLanguages),\n };\n}\n","// Layout definitions for different page types in Phase 2\n\nexport interface LayoutOption {\n id: string\n name: string\n description: string\n sections: {\n type: string\n title: string\n requiresMedia: boolean\n requiresCTA: boolean\n }[]\n}\n\nexport interface PageTypeLayouts {\n [key: string]: LayoutOption[]\n}\n\nexport const PAGE_LAYOUTS: PageTypeLayouts = {\n home: [\n {\n id: 'hero-features-cta',\n name: 'Hero + Features + CTA',\n description: 'Large hero section with background image, feature highlights and call-to-action',\n sections: [\n { type: 'hero', title: 'Hero Section', requiresMedia: true, requiresCTA: true },\n { type: 'features', title: 'Features Section', requiresMedia: false, requiresCTA: false },\n { type: 'cta', title: 'Call-to-Action Section', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'hero-about-services',\n name: 'Hero + About + Services',\n description: 'Hero with introduction, brief about section and services overview',\n sections: [\n { type: 'hero', title: 'Hero Section', requiresMedia: true, requiresCTA: true },\n { type: 'about', title: 'About Section', requiresMedia: true, requiresCTA: false },\n { type: 'services', title: 'Services Overview', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'hero-testimonials-cta',\n name: 'Hero + Testimonials + CTA',\n description: 'Hero section, customer testimonials and strong call-to-action',\n sections: [\n { type: 'hero', title: 'Hero Section', requiresMedia: true, requiresCTA: true },\n { type: 'testimonials', title: 'Testimonials Section', requiresMedia: false, requiresCTA: false },\n { type: 'cta', title: 'Call-to-Action Section', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'full-page-hero',\n name: 'Full-Page Hero + Scroll Sections',\n description: 'Full-screen hero with scroll indicator and multiple content sections',\n sections: [\n { type: 'hero', title: 'Full-Page Hero', requiresMedia: true, requiresCTA: true },\n { type: 'content', title: 'Content Section 1', requiresMedia: true, requiresCTA: false },\n { type: 'content', title: 'Content Section 2', requiresMedia: true, requiresCTA: false },\n { type: 'cta', title: 'Call-to-Action Section', requiresMedia: false, requiresCTA: true },\n ],\n },\n ],\n about: [\n {\n id: 'story-team-values',\n name: 'Story + Team + Values',\n description: 'Company story, team members and company values',\n sections: [\n { type: 'story', title: 'Our Story', requiresMedia: true, requiresCTA: false },\n { type: 'team', title: 'Our Team', requiresMedia: true, requiresCTA: false },\n { type: 'values', title: 'Our Values', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'timeline-mission',\n name: 'Timeline + Mission & Vision',\n description: 'Company history timeline and mission/vision statement',\n sections: [\n { type: 'timeline', title: 'Our History', requiresMedia: false, requiresCTA: false },\n { type: 'mission', title: 'Mission & Vision', requiresMedia: true, requiresCTA: false },\n { type: 'cta', title: 'Get in Touch', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'simple-about',\n name: 'Simple About',\n description: 'Simple layout with company info and image',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: true, requiresCTA: false },\n { type: 'content', title: 'Our Approach', requiresMedia: true, requiresCTA: false },\n { type: 'cta', title: 'Contact Us', requiresMedia: false, requiresCTA: true },\n ],\n },\n ],\n services: [\n {\n id: 'services-grid-detail',\n name: 'Services Grid + Detail',\n description: 'Grid overview of services with details per service',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'services-grid', title: 'Services Overview', requiresMedia: false, requiresCTA: false },\n { type: 'cta', title: 'Request Quote', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'services-tabs',\n name: 'Services with Tabs',\n description: 'Services displayed in tabs for easy navigation',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: true, requiresCTA: false },\n { type: 'services-tabs', title: 'Services Tabs', requiresMedia: false, requiresCTA: false },\n { type: 'testimonials', title: 'Testimonials', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'services-process',\n name: 'Services + Process',\n description: 'Services with work process explanation',\n sections: [\n { type: 'services-list', title: 'Our Services', requiresMedia: true, requiresCTA: false },\n { type: 'process', title: 'Our Process', requiresMedia: false, requiresCTA: false },\n { type: 'cta', title: 'Contact Us', requiresMedia: false, requiresCTA: true },\n ],\n },\n ],\n contact: [\n {\n id: 'form-info-map',\n name: 'Form + Info + Map',\n description: 'Contact form, company details and Google Maps',\n sections: [\n { type: 'contact-form', title: 'Contact Form', requiresMedia: false, requiresCTA: false },\n { type: 'contact-info', title: 'Contact Details', requiresMedia: false, requiresCTA: false },\n { type: 'map', title: 'Location', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'simple-form',\n name: 'Simple Form',\n description: 'Simple contact form with company details',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'contact-form', title: 'Contact Form', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'contact-options',\n name: 'Multiple Contact Options',\n description: 'Various ways to get in touch',\n sections: [\n { type: 'contact-options', title: 'Contact Options', requiresMedia: false, requiresCTA: false },\n { type: 'contact-form', title: 'Quick Contact', requiresMedia: false, requiresCTA: false },\n { type: 'faq', title: 'Frequently Asked Questions', requiresMedia: false, requiresCTA: false },\n ],\n },\n ],\n portfolio: [\n {\n id: 'grid-filter',\n name: 'Project Grid + Filters',\n description: 'Grid of projects with filter options',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'portfolio-grid', title: 'Projects', requiresMedia: false, requiresCTA: false },\n { type: 'cta', title: 'Work Together?', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'featured-showcase',\n name: 'Featured Projects Showcase',\n description: 'Featured projects with large images',\n sections: [\n { type: 'featured', title: 'Featured Project', requiresMedia: true, requiresCTA: false },\n { type: 'portfolio-list', title: 'Other Projects', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'masonry-layout',\n name: 'Masonry Layout',\n description: 'Pinterest-style masonry layout for projects',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'portfolio-masonry', title: 'Projects Masonry', requiresMedia: false, requiresCTA: false },\n ],\n },\n ],\n blog: [\n {\n id: 'blog-grid-sidebar',\n name: 'Blog Grid + Sidebar',\n description: 'Blog posts in grid with sidebar for categories',\n sections: [\n { type: 'blog-grid', title: 'Recent Posts', requiresMedia: false, requiresCTA: false },\n { type: 'sidebar', title: 'Sidebar Content', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'blog-list-featured',\n name: 'Featured + List',\n description: 'Featured post at top with list below',\n sections: [\n { type: 'featured-post', title: 'Featured Post', requiresMedia: true, requiresCTA: false },\n { type: 'blog-list', title: 'Recent Posts', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'blog-magazine',\n name: 'Magazine Style',\n description: 'Magazine-style layout for blog',\n sections: [\n { type: 'hero-post', title: 'Hero Post', requiresMedia: true, requiresCTA: false },\n { type: 'blog-grid', title: 'Recent Posts Grid', requiresMedia: false, requiresCTA: false },\n { type: 'newsletter', title: 'Newsletter Signup', requiresMedia: false, requiresCTA: true },\n ],\n },\n ],\n faq: [\n {\n id: 'accordion-categories',\n name: 'Accordion with Categories',\n description: 'FAQ in accordion form with categories',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'faq-accordion', title: 'Frequently Asked Questions', requiresMedia: false, requiresCTA: false },\n { type: 'cta', title: 'Still Have Questions?', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'faq-search',\n name: 'FAQ with Search',\n description: 'Searchable FAQ page',\n sections: [\n { type: 'search', title: 'Search FAQ', requiresMedia: false, requiresCTA: false },\n { type: 'faq-list', title: 'All Questions', requiresMedia: false, requiresCTA: false },\n ],\n },\n ],\n team: [\n {\n id: 'team-grid-bios',\n name: 'Team Grid + Bios',\n description: 'Grid of team members with extended bios',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'team-grid', title: 'Our Team', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'team-carousel',\n name: 'Team Carousel',\n description: 'Team members in carousel format',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: true, requiresCTA: false },\n { type: 'team-carousel', title: 'Team Carousel', requiresMedia: false, requiresCTA: false },\n { type: 'cta', title: 'Join Us', requiresMedia: false, requiresCTA: true },\n ],\n },\n ],\n careers: [\n {\n id: 'jobs-benefits-culture',\n name: 'Jobs + Benefits + Culture',\n description: 'Job overview with company culture',\n sections: [\n { type: 'intro', title: 'Work With Us', requiresMedia: true, requiresCTA: false },\n { type: 'benefits', title: 'What We Offer', requiresMedia: false, requiresCTA: false },\n { type: 'jobs-list', title: 'Open Positions', requiresMedia: false, requiresCTA: false },\n ],\n },\n {\n id: 'culture-jobs',\n name: 'Culture + Jobs',\n description: 'Focus on company culture and values',\n sections: [\n { type: 'culture', title: 'Our Culture', requiresMedia: true, requiresCTA: false },\n { type: 'values', title: 'Our Values', requiresMedia: false, requiresCTA: false },\n { type: 'jobs-list', title: 'Open Positions', requiresMedia: false, requiresCTA: false },\n ],\n },\n ],\n 'privacy-policy': [\n {\n id: 'legal-document',\n name: 'Legal Document',\n description: 'Standard privacy policy layout',\n sections: [\n { type: 'legal-intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'legal-content', title: 'Privacy Policy Content', requiresMedia: false, requiresCTA: false },\n ],\n },\n ],\n 'terms-conditions': [\n {\n id: 'legal-document',\n name: 'Legal Document',\n description: 'Standard terms and conditions layout',\n sections: [\n { type: 'legal-intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'legal-content', title: 'Terms and Conditions Content', requiresMedia: false, requiresCTA: false },\n ],\n },\n ],\n // Default layout for custom pages\n default: [\n {\n id: 'simple-content',\n name: 'Simple Content Page',\n description: 'Basic content page with text and images',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: false, requiresCTA: false },\n { type: 'content', title: 'Main Content', requiresMedia: true, requiresCTA: false },\n { type: 'cta', title: 'Call-to-Action', requiresMedia: false, requiresCTA: true },\n ],\n },\n {\n id: 'two-column',\n name: 'Two Column Layout',\n description: 'Content divided over two columns',\n sections: [\n { type: 'intro', title: 'Introduction', requiresMedia: true, requiresCTA: false },\n { type: 'content', title: 'Content Section 1', requiresMedia: true, requiresCTA: false },\n { type: 'content', title: 'Content Section 2', requiresMedia: true, requiresCTA: false },\n ],\n },\n ],\n}\n\n// Helper function to get layouts for a page\nexport const getLayoutsForPage = (pageId: string): LayoutOption[] => {\n return PAGE_LAYOUTS[pageId] ?? PAGE_LAYOUTS['default'] ?? []\n}\n\n// Helper function to get display name for page\nexport const getPageDisplayName = (pageId: string): string => {\n const pageNames: { [key: string]: string } = {\n home: 'Home',\n about: 'About',\n services: 'Services',\n contact: 'Contact',\n portfolio: 'Portfolio',\n blog: 'Blog',\n faq: 'FAQ',\n team: 'Team',\n careers: 'Careers',\n 'privacy-policy': 'Privacy Policy',\n 'terms-conditions': 'Terms & Conditions',\n }\n return pageNames[pageId] || pageId\n}\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addDays} function options.\n */\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n * @param options - An object with options\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nexport function addDays(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n\n // If 0 days, no-op to avoid changing times in the hour before end of DST\n if (!amount) return _date;\n\n _date.setDate(_date.getDate() + amount);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMonths} function options.\n */\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n * @param options - The options object\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n if (!amount) {\n // If 0 months, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n const dayOfMonth = _date.getDate();\n\n // The JS Date object supports date math by accepting out-of-bounds values for\n // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n // new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we\n // want except that dates will wrap around the end of a month, meaning that\n // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n // we'll default to the end of the desired month by adding 1 to the desired\n // month and using a date of 0 to back up one day to the end of the desired\n // month.\n const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());\n endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n const daysInMonth = endOfDesiredMonth.getDate();\n if (dayOfMonth >= daysInMonth) {\n // If we're already at the end of the month, then this is the correct date\n // and we're done.\n return endOfDesiredMonth;\n } else {\n // Otherwise, we now know that setting the original day-of-month value won't\n // cause an overflow, so set the desired day-of-month. Note that we can't\n // just set the date of `endOfDesiredMonth` because that object may have had\n // its time changed in the unusual case where where a DST transition was on\n // the last day of the month and its local time was in the hour skipped or\n // repeated next to a DST transition. So we use `date` instead which is\n // guaranteed to still have the original time.\n _date.setFullYear(\n endOfDesiredMonth.getFullYear(),\n endOfDesiredMonth.getMonth(),\n dayOfMonth,\n );\n return _date;\n }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link isSameDay} function options.\n */\n\n/**\n * @name isSameDay\n * @category Day Helpers\n * @summary Are the given dates in the same day (and year and month)?\n *\n * @description\n * Are the given dates in the same day (and year and month)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same day (and year and month)\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4, 6, 0), new Date(2014, 8, 4, 18, 0))\n * //=> true\n *\n * @example\n * // Are 4 September and 4 October in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2014, 9, 4))\n * //=> false\n *\n * @example\n * // Are 4 September, 2014 and 4 September, 2015 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2015, 8, 4))\n * //=> false\n */\nexport function isSameDay(laterDate, earlierDate, options) {\n const [dateLeft_, dateRight_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return +startOfDay(dateLeft_) === +startOfDay(dateRight_);\n}\n\n// Fallback for modularized imports:\nexport default isSameDay;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfDay} function options.\n */\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfMonth} function options.\n */\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfMonth} function options.\n */\n\n/**\n * @name startOfMonth\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date. The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments.\n * Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed,\n * or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n _date.setDate(1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link subDays} function options.\n */\n\n/**\n * @name subDays\n * @category Day Helpers\n * @summary Subtract the specified number of days from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the days subtracted\n *\n * @example\n * // Subtract 10 days from 1 September 2014:\n * const result = subDays(new Date(2014, 8, 1), 10)\n * //=> Fri Aug 22 2014 00:00:00\n */\nexport function subDays(date, amount, options) {\n return addDays(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subDays;\n","import {\n millisecondsInHour,\n millisecondsInMinute,\n} from \"./constants.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n const invalidDate = () => constructFrom(options?.in, NaN);\n\n const additionalDigits = options?.additionalDigits ?? 2;\n const dateStrings = splitDateString(argument);\n\n let date;\n if (dateStrings.date) {\n const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(+date)) return invalidDate();\n\n const timestamp = +date;\n let time = 0;\n let offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) return invalidDate();\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) return invalidDate();\n } else {\n const tmpDate = new Date(timestamp + time);\n const result = toDate(0, options?.in);\n result.setFullYear(\n tmpDate.getUTCFullYear(),\n tmpDate.getUTCMonth(),\n tmpDate.getUTCDate(),\n );\n result.setHours(\n tmpDate.getUTCHours(),\n tmpDate.getUTCMinutes(),\n tmpDate.getUTCSeconds(),\n tmpDate.getUTCMilliseconds(),\n );\n return result;\n }\n\n return toDate(timestamp + time + offset, options?.in);\n}\n\nconst patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n const dateStrings = {};\n const array = dateString.split(patterns.dateTimeDelimiter);\n let timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(\n dateStrings.date.length,\n dateString.length,\n );\n }\n }\n\n if (timeString) {\n const token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], \"\");\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n const regex = new RegExp(\n \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n (4 + additionalDigits) +\n \"})|(\\\\d{2}|[+-]\\\\d{\" +\n (2 + additionalDigits) +\n \"})$)\",\n );\n\n const captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return { year: NaN, restDateString: \"\" };\n\n const year = captures[1] ? parseInt(captures[1]) : null;\n const century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length),\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n\n const captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n\n const isWeekDate = !!captures[4];\n const dayOfYear = parseDateUnit(captures[1]);\n const month = parseDateUnit(captures[2]) - 1;\n const day = parseDateUnit(captures[3]);\n const week = parseDateUnit(captures[4]);\n const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n const date = new Date(0);\n if (\n !validateDate(year, month, day) ||\n !validateDayOfYearDate(year, dayOfYear)\n ) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n const captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n const hours = parseTimeUnit(captures[1]);\n const minutes = parseTimeUnit(captures[2]);\n const seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return (\n hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n );\n}\n\nfunction parseTimeUnit(value) {\n return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === \"Z\") return 0;\n\n const captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n\n const sign = captures[1] === \"+\" ? -1 : 1;\n const hours = parseInt(captures[2]);\n const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n return (\n month >= 0 &&\n month <= 11 &&\n date >= 1 &&\n date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return (\n seconds >= 0 &&\n seconds < 60 &&\n minutes >= 0 &&\n minutes < 60 &&\n hours >= 0 &&\n hours < 25\n );\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","/**\n * Date filtering utilities for Phase 4 feedback views\n */\n\nimport {\n startOfDay,\n endOfDay,\n subDays,\n startOfMonth,\n endOfMonth,\n subMonths,\n parseISO,\n format,\n isSameDay\n} from 'date-fns'\n\nexport interface DateRange {\n startDate: Date | null\n endDate: Date | null\n}\n\nexport interface DatePreset {\n id: string\n label: string\n getRange: () => DateRange\n}\n\nexport const DATE_PRESETS: DatePreset[] = [\n {\n id: 'today',\n label: 'Today',\n getRange: () => ({\n startDate: startOfDay(new Date()),\n endDate: endOfDay(new Date())\n })\n },\n {\n id: 'yesterday',\n label: 'Yesterday',\n getRange: () => ({\n startDate: startOfDay(subDays(new Date(), 1)),\n endDate: endOfDay(subDays(new Date(), 1))\n })\n },\n {\n id: 'last7days',\n label: 'Last 7 days',\n getRange: () => ({\n startDate: startOfDay(subDays(new Date(), 6)),\n endDate: endOfDay(new Date())\n })\n },\n {\n id: 'last30days',\n label: 'Last 30 days',\n getRange: () => ({\n startDate: startOfDay(subDays(new Date(), 29)),\n endDate: endOfDay(new Date())\n })\n },\n {\n id: 'thisMonth',\n label: 'This month',\n getRange: () => ({\n startDate: startOfMonth(new Date()),\n endDate: endOfMonth(new Date())\n })\n },\n {\n id: 'lastMonth',\n label: 'Last month',\n getRange: () => ({\n startDate: startOfMonth(subMonths(new Date(), 1)),\n endDate: endOfMonth(subMonths(new Date(), 1))\n })\n }\n]\n\n/**\n * Check if a date string is within the given date range\n */\nexport function isWithinDateRange(dateString: string, range: DateRange): boolean {\n if (!range.startDate && !range.endDate) return true\n\n const date = parseISO(dateString)\n\n // If only start date, filter items from that date onwards\n if (range.startDate && !range.endDate) {\n return date >= startOfDay(range.startDate)\n }\n\n // If only end date, filter items up to that date\n if (!range.startDate && range.endDate) {\n return date <= endOfDay(range.endDate)\n }\n\n // Both dates specified - check if within interval\n return date >= startOfDay(range.startDate!) && date <= endOfDay(range.endDate!)\n}\n\n/**\n * Format a date range for display in the filter button\n */\nexport function formatDateRangeLabel(range: DateRange): string {\n if (!range.startDate && !range.endDate) {\n return 'All dates'\n }\n\n if (range.startDate && range.endDate) {\n if (isSameDay(range.startDate, range.endDate)) {\n return format(range.startDate, 'MMM d')\n }\n return `${format(range.startDate, 'MMM d')} - ${format(range.endDate, 'MMM d')}`\n }\n\n if (range.startDate) {\n return `From ${format(range.startDate, 'MMM d')}`\n }\n\n if (range.endDate) {\n return `Until ${format(range.endDate, 'MMM d')}`\n }\n\n return 'All dates'\n}\n\n/**\n * Check if a date range filter is active (has any date set)\n */\nexport function isDateRangeActive(range: DateRange): boolean {\n return range.startDate !== null || range.endDate !== null\n}\n\n/**\n * Get an empty date range\n */\nexport function getEmptyDateRange(): DateRange {\n return { startDate: null, endDate: null }\n}\n","/**\n * Permission utilities for multi-tenant SaaS\n * Source: framed-app/src/utils/permissions.ts\n */\n\nimport type { User, Agency, Project, ProjectMember } from '../entities'\nimport type { ModuleType } from '../modules'\nimport { isModuleEnabled, PHASE_TO_MODULE } from '../modules'\n\n// ====================================\n// SUBSCRIPTION HELPERS\n// ====================================\n\n/**\n * Check if an agency's subscription is currently valid\n */\nexport const isSubscriptionValid = (agency: Agency | null): boolean => {\n if (!agency) return false\n\n // Check if subscription status is active or trialing\n const validStatuses: Agency['subscription_status'][] = ['active', 'trialing']\n if (!validStatuses.includes(agency.subscription_status)) {\n return false\n }\n\n // If no end date, subscription is unlimited (valid)\n if (!agency.subscription_end_date) {\n return true\n }\n\n // Check if end date is in the future\n const endDate = new Date(agency.subscription_end_date)\n return endDate > new Date()\n}\n\n/**\n * Get the effective project limit based on the agency's plan type\n */\nexport const getEffectiveProjectLimit = (agency: Agency | null): number | null => {\n if (!agency) return 0\n\n // Gold tier has unlimited projects\n if (agency.plan_type === 'gold') {\n return null // null = unlimited\n }\n\n // One-off tier has 1 project\n if (agency.plan_type === 'oneoff') {\n return 1\n }\n\n // Silver tier (or custom) uses the project_limit field\n return agency.project_limit ?? 10\n}\n\n// ====================================\n// PROJECT PERMISSIONS\n// ====================================\n\nexport const canCreateProject = (\n user: User | null,\n agency: Agency | null,\n projectCount: number\n): boolean => {\n if (!user) return false\n\n // Super admins can always create projects, regardless of agency\n if (user.role === 'super_admin') return true\n\n // Admins need an agency\n if (!agency) return false\n\n // Only admins can create projects\n if (user.role !== 'admin' || user.agency_id !== agency.id) {\n return false\n }\n\n // Check if subscription is valid\n if (!isSubscriptionValid(agency)) {\n return false\n }\n\n // Get effective project limit\n const effectiveLimit = getEffectiveProjectLimit(agency)\n\n // If limit is null (unlimited), allow creation\n if (effectiveLimit === null) {\n return true\n }\n\n // Check if under limit\n return projectCount < effectiveLimit\n}\n\nexport const canViewProject = (\n user: User | null,\n project: Project | null,\n members: ProjectMember[] = []\n): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n if (user.role === 'admin' && user.agency_id === project.agency_id) return true\n // Check if user is assigned to project\n return members.some((m) => m.user_id === user.id)\n}\n\nexport const canEditProject = (\n user: User | null,\n project: Project | null,\n members: ProjectMember[] = []\n): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n if (user.role === 'admin' && user.agency_id === project.agency_id) return true\n // Managers can edit if assigned\n if (user.role === 'manager') {\n return members.some((m) => m.user_id === user.id && m.role === 'manager')\n }\n // Clients can edit if assigned to the project (they provide the content!)\n if (user.role === 'client') {\n return members.some((m) => m.user_id === user.id)\n }\n return false\n}\n\nexport const canDeleteProject = (\n user: User | null,\n project: Project | null\n): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n return user.role === 'admin' && user.agency_id === project.agency_id\n}\n\nexport const canLockPhase = (user: User | null, project: Project | null): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n return user.role === 'admin' && user.agency_id === project.agency_id\n}\n\n/**\n * Check if user can disable/enable phases (hide from navigation)\n * Same permissions as phase locking - admins can control phase visibility\n */\nexport const canDisablePhase = (user: User | null, project: Project | null): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n return user.role === 'admin' && user.agency_id === project.agency_id\n}\n\n/**\n * Check if a phase is disabled (hidden from navigation)\n */\nexport const isPhaseDisabled = (phase: number, project: Project | null): boolean => {\n if (!project) return false\n return project.disabled_phases?.includes(phase) ?? false\n}\n\n/**\n * Check if a phase is soft-locked (automatically disabled during review)\n * Soft-lock applies to Phase 1 and 2 when project is in Phase 3+ or not in draft status\n * Admins can override by adding phase to unlocked_phases\n */\nexport const isSoftLocked = (phase: number, project: Project | null): boolean => {\n if (!project) return false\n\n // Only Phase 1 and 2 can be soft-locked\n if (phase > 2) return false\n\n // Soft-lock when project is past Phase 2 (in review mode)\n const isPastPhase2 = (project.current_step ?? 1) >= 3 || project.status !== 'draft'\n if (!isPastPhase2) return false\n\n // Check if admin has unlocked this phase\n if (project.unlocked_phases?.includes(phase)) return false\n\n return true\n}\n\n/**\n * Check if user can unlock a soft-locked phase\n * Same permissions as hard lock\n */\nexport const canUnlockSoftLock = canLockPhase\n\n/**\n * Check if user can approve/reject section suggestions\n * Only admins and super_admins can approve suggestions\n */\nexport const canApproveSuggestion = (user: User | null, project: Project | null): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n return user.role === 'admin' && user.agency_id === project.agency_id\n}\n\n// ====================================\n// USER/TEAM PERMISSIONS\n// ====================================\n\nexport const canInviteUsers = (user: User | null): boolean => {\n if (!user) return false\n return user.role === 'super_admin' || user.role === 'admin'\n}\n\nexport const canManageProjectMembers = (\n user: User | null,\n project: Project | null\n): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n return user.role === 'admin' && user.agency_id === project.agency_id\n}\n\nexport const canRemoveUser = (\n actor: User | null,\n targetUser: User | null\n): boolean => {\n if (!actor || !targetUser) return false\n if (actor.role === 'super_admin') return true\n // Admins can remove users in their agency (except other admins)\n if (actor.role === 'admin' && actor.agency_id === targetUser.agency_id) {\n return targetUser.role !== 'admin' && targetUser.role !== 'super_admin'\n }\n return false\n}\n\n// ====================================\n// AGENCY PERMISSIONS\n// ====================================\n\nexport const canManageAgency = (user: User | null, agencyId: string): boolean => {\n if (!user) return false\n if (user.role === 'super_admin') return true\n return user.role === 'admin' && user.agency_id === agencyId\n}\n\nexport const canCreateAgency = (user: User | null): boolean => {\n if (!user) return false\n return user.role === 'super_admin'\n}\n\nexport const canDeleteAgency = (user: User | null): boolean => {\n if (!user) return false\n return user.role === 'super_admin'\n}\n\nexport const canSetProjectLimit = (user: User | null): boolean => {\n if (!user) return false\n return user.role === 'super_admin'\n}\n\n// ====================================\n// ROLE CHECKS\n// ====================================\n\nexport const isSuperAdmin = (user: User | null): boolean => {\n return user?.role === 'super_admin'\n}\n\nexport const isAdmin = (user: User | null): boolean => {\n return user?.role === 'admin'\n}\n\nexport const isManager = (user: User | null): boolean => {\n return user?.role === 'manager'\n}\n\nexport const isClient = (user: User | null): boolean => {\n return user?.role === 'client'\n}\n\nexport const hasRole = (user: User | null, role: User['role']): boolean => {\n return user?.role === role\n}\n\n// ====================================\n// ROLE HIERARCHY\n// ====================================\n\nconst roleHierarchy = {\n super_admin: 4,\n admin: 3,\n manager: 2,\n client: 1,\n}\n\nexport const hasHigherRole = (\n user: User | null,\n compareRole: User['role']\n): boolean => {\n if (!user) return false\n return roleHierarchy[user.role] > roleHierarchy[compareRole]\n}\n\nexport const hasEqualOrHigherRole = (\n user: User | null,\n compareRole: User['role']\n): boolean => {\n if (!user) return false\n return roleHierarchy[user.role] >= roleHierarchy[compareRole]\n}\n\n// ====================================\n// UI HELPERS\n// ====================================\n\nexport const getRoleBadgeColor = (role: User['role']): string => {\n switch (role) {\n case 'super_admin':\n return 'bg-purple-100 text-purple-700 border-purple-300'\n case 'admin':\n return 'bg-blue-100 text-blue-700 border-blue-300'\n case 'manager':\n return 'bg-green-100 text-green-700 border-green-300'\n case 'client':\n return 'bg-gray-100 text-gray-700 border-gray-300'\n }\n}\n\nexport const getRoleDisplayName = (role: User['role']): string => {\n switch (role) {\n case 'super_admin':\n return 'Super Admin'\n case 'admin':\n return 'Agency Admin'\n case 'manager':\n return 'Project Manager'\n case 'client':\n return 'Client'\n }\n}\n\nexport const getRoleBadge = (role: User['role']): string => {\n return getRoleDisplayName(role)\n}\n\nexport const canManageTeam = (user: User | null): boolean => {\n if (!user) return false\n return user.role === 'super_admin' || user.role === 'admin'\n}\n\n/**\n * Check if user has admin-level privileges (admin or super_admin)\n * Use this for features that should be available to both admins and super admins\n * Examples: export functionality, viewing admin-only UI elements\n */\nexport const hasAdminPrivileges = (user: User | null): boolean => {\n if (!user) return false\n return user.role === 'admin' || user.role === 'super_admin'\n}\n\n// ====================================\n// SUBSCRIPTION UI HELPERS\n// ====================================\n\n/**\n * Get display name for plan type\n */\nexport const getPlanDisplayName = (planType: Agency['plan_type']): string => {\n switch (planType) {\n case 'oneoff':\n return 'One-off (3 maanden)'\n case 'silver':\n return 'Silver'\n case 'gold':\n return 'Gold'\n default:\n return planType ?? 'Unknown'\n }\n}\n\n/**\n * Get display name for subscription status\n */\nexport const getSubscriptionStatusDisplayName = (status: Agency['subscription_status']): string => {\n switch (status) {\n case 'active':\n return 'Actief'\n case 'expired':\n return 'Verlopen'\n case 'cancelled':\n return 'Geannuleerd'\n case 'trialing':\n return 'Proefperiode'\n default:\n return status ?? 'Unknown'\n }\n}\n\n/**\n * Get badge color for subscription status\n */\nexport const getSubscriptionStatusBadgeColor = (status: Agency['subscription_status']): string => {\n switch (status) {\n case 'active':\n return 'bg-green-100 text-green-700 border-green-300'\n case 'trialing':\n return 'bg-blue-100 text-blue-700 border-blue-300'\n case 'expired':\n return 'bg-red-100 text-red-700 border-red-300'\n case 'cancelled':\n return 'bg-gray-100 text-gray-700 border-gray-300'\n default:\n return 'bg-gray-100 text-gray-700 border-gray-300'\n }\n}\n\n/**\n * Get badge color for plan type\n */\nexport const getPlanBadgeColor = (planType: Agency['plan_type']): string => {\n switch (planType) {\n case 'gold':\n return 'bg-yellow-100 text-yellow-700 border-yellow-300'\n case 'silver':\n return 'bg-gray-100 text-gray-700 border-gray-300'\n case 'oneoff':\n return 'bg-purple-100 text-purple-700 border-purple-300'\n default:\n return 'bg-gray-100 text-gray-700 border-gray-300'\n }\n}\n\n/**\n * Format date for display\n */\nexport const formatSubscriptionDate = (dateString: string | null): string => {\n if (!dateString) return 'Onbeperkt'\n const date = new Date(dateString)\n return date.toLocaleDateString('nl-NL', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n/**\n * Get days remaining until subscription expires\n */\nexport const getDaysRemaining = (endDate: string | null): number | null => {\n if (!endDate) return null\n\n const end = new Date(endDate)\n const now = new Date()\n const diff = end.getTime() - now.getTime()\n return Math.ceil(diff / (1000 * 60 * 60 * 24))\n}\n\n// ====================================\n// MODULE PERMISSIONS\n// ====================================\n\n/**\n * Check if user can configure modules for a project\n * Only admins and super_admins can change module settings\n */\nexport const canConfigureModules = (user: User | null, project: Project | null): boolean => {\n if (!user || !project) return false\n if (user.role === 'super_admin') return true\n return user.role === 'admin' && user.agency_id === project.agency_id\n}\n\n/**\n * Check if user can access a specific phase based on module configuration\n * Combines module availability with existing project permissions\n */\nexport const canAccessPhase = (\n user: User | null,\n project: Project | null,\n phase: number,\n members: ProjectMember[] = []\n): boolean => {\n if (!user || !project) return false\n\n // First check if user can view the project at all\n if (!canViewProject(user, project, members)) return false\n\n // Super admins can access all phases regardless of module config\n if (user.role === 'super_admin') return true\n\n // Check if the module for this phase is enabled\n const module = PHASE_TO_MODULE[phase]\n if (module && !isModuleEnabled(project, module)) {\n return false\n }\n\n return true\n}\n\n/**\n * Check if a module is available for a project (enabled)\n */\nexport const isModuleAvailable = (project: Project | null, module: ModuleType): boolean => {\n if (!project) return false\n return isModuleEnabled(project, module)\n}\n","/**\n * Comment utilities - Pure functions for mention handling\n * Source: framed-app/src/utils/commentUtils.ts\n *\n * Note: Upload functions are NOT included here as they require runtime\n * dependencies (supabase). Only pure utility functions are exported.\n *\n * For UploadResult type, use the one from @framed/core types.\n */\n\n/**\n * Extract user IDs from @mentions in text\n * Format: @[userId:userName] or @userName (if we have user list)\n */\nexport function extractMentions(\n text: string,\n availableUsers?: Array<{ id: string; name: string }>\n): string[] {\n const mentionRegex = /@\\[([^\\]]+)\\]/g\n const mentions: string[] = []\n let match\n\n while ((match = mentionRegex.exec(text)) !== null) {\n const mentionData = match[1]\n if (!mentionData) continue\n // Format is \"userId:userName\"\n const userId = mentionData.split(':')[0]\n if (userId && !mentions.includes(userId)) {\n mentions.push(userId)\n }\n }\n\n return mentions\n}\n\n/**\n * Format text with @mentions highlighted\n * Converts @[userId:userName] to styled mentions\n */\nexport function formatMentions(text: string): string {\n return text.replace(/@\\[([^\\]]+)\\]/g, (match, mentionData: string | undefined) => {\n if (!mentionData) return match\n // mentionData format is \"userId:userName\"\n const parts = mentionData.split(':')\n const userName = parts.length > 1 ? parts[1] : parts[0]\n return `<span class=\"mention\">@${userName}</span>`\n })\n}\n","/**\n * Localized content utilities\n * Source: framed-app/src/utils/localizedContent.ts\n */\n\nimport {\n LocalizableString,\n LocalizedContent,\n isLocalizedContent,\n getLocalizedValue,\n toLocalizedContent,\n ensureLocalizedContent\n} from '../localization'\n\n// Re-export from localization for convenience\nexport { isLocalizedContent, getLocalizedValue, toLocalizedContent, ensureLocalizedContent }\nexport type { LocalizableString, LocalizedContent }\n\n/**\n * Get language settings from Phase 1 functionality data\n */\nexport interface LanguageSettings {\n isMultilingual: boolean\n primaryLanguage: string\n additionalLanguages: string[]\n allLanguages: string[]\n}\n\nexport const getLanguageSettings = (functionality?: {\n languages?: {\n is_multilingual: boolean\n primary_language: string\n additional_languages: string[]\n }\n}): LanguageSettings => {\n const languages = functionality?.languages\n const isMultilingual = languages?.is_multilingual ?? false\n const primaryLanguage = languages?.primary_language || 'en'\n const additionalLanguages = languages?.additional_languages || []\n\n return {\n isMultilingual,\n primaryLanguage,\n additionalLanguages,\n allLanguages: [primaryLanguage, ...additionalLanguages],\n }\n}\n\n/**\n * Get display value for a LocalizableString\n * Always returns a string, handling both old (string) and new (LocalizedContent) formats\n */\nexport const getDisplayValue = (\n value: LocalizableString | undefined,\n languageSettings: LanguageSettings,\n displayLanguage?: string\n): string => {\n if (!value) return ''\n\n // If it's already a string, return it directly\n if (typeof value === 'string') return value\n\n // If we have localized content, get the appropriate language\n const targetLang = displayLanguage || languageSettings.primaryLanguage\n return getLocalizedValue(value, targetLang, languageSettings.primaryLanguage)\n}\n\n/**\n * Update a LocalizableString value for a specific language\n * Handles conversion from string to LocalizedContent if needed\n */\nexport const updateLocalizedValue = (\n currentValue: LocalizableString | undefined,\n newValue: string,\n language: string,\n languageSettings: LanguageSettings\n): LocalizableString => {\n // If not multilingual, store as simple string for primary language\n if (!languageSettings.isMultilingual && language === languageSettings.primaryLanguage) {\n return newValue\n }\n\n // For multilingual, always use LocalizedContent format\n const content = ensureLocalizedContent(currentValue, languageSettings.primaryLanguage)\n return {\n ...content,\n [language]: newValue,\n }\n}\n\n/**\n * Convert form data to the appropriate format based on language settings\n * Used when saving data - ensures format matches multilingual setting\n */\nexport const normalizeLocalizedField = (\n value: LocalizableString | undefined,\n languageSettings: LanguageSettings\n): LocalizableString => {\n if (!value) {\n return languageSettings.isMultilingual\n ? { [languageSettings.primaryLanguage]: '' }\n : ''\n }\n\n // If not multilingual, flatten to string\n if (!languageSettings.isMultilingual) {\n return getDisplayValue(value, languageSettings)\n }\n\n // If multilingual, ensure it's in LocalizedContent format\n return ensureLocalizedContent(value, languageSettings.primaryLanguage)\n}\n\n/**\n * Check if a localized field has content in all required languages\n */\nexport const isLocalizedFieldComplete = (\n value: LocalizableString | undefined,\n languageSettings: LanguageSettings,\n requireAllLanguages: boolean = false\n): boolean => {\n if (!value) return false\n\n const displayValue = getDisplayValue(value, languageSettings)\n const hasPrimaryContent = Boolean(displayValue.trim())\n\n if (!requireAllLanguages || !languageSettings.isMultilingual) {\n return hasPrimaryContent\n }\n\n // Check all languages\n if (typeof value === 'string') return hasPrimaryContent\n\n return languageSettings.allLanguages.every(lang =>\n Boolean(value[lang]?.trim())\n )\n}\n\n/**\n * Create initial localized content with empty values for all languages\n */\nexport const createEmptyLocalizedContent = (\n languageSettings: LanguageSettings\n): LocalizedContent => {\n const content: LocalizedContent = {}\n languageSettings.allLanguages.forEach(lang => {\n content[lang] = ''\n })\n return content\n}\n\n/**\n * Migrate a single string value to localized content format\n * Useful for database migrations or data upgrades\n */\nexport const migrateToLocalized = (\n value: string,\n sourceLanguage: string,\n languageSettings: LanguageSettings\n): LocalizedContent => {\n const content: LocalizedContent = { [sourceLanguage]: value }\n\n // Add empty strings for other languages\n languageSettings.allLanguages.forEach(lang => {\n if (!(lang in content)) {\n content[lang] = ''\n }\n })\n\n return content\n}\n","/**\n * Format file size for display\n * Source: framed-app/src/utils/storage.ts (pure function extracted)\n */\n\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes'\n\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i]\n}\n","/**\n * Storage utilities - Stub implementations\n *\n * These are placeholder functions that log warnings.\n * Actual storage operations should be handled by the parent app\n * via FramedProvider callbacks (onUploadFile, onDeleteFile).\n */\n\nexport interface UploadMediaOptions {\n file: File\n projectId: string\n path?: string\n}\n\nexport interface UploadMediaResult {\n url: string\n path: string\n}\n\n/**\n * Upload media file to storage\n * Stub - logs warning, actual upload should use FramedProvider callbacks\n */\nexport async function uploadMedia(\n _options: UploadMediaOptions\n): Promise<UploadMediaResult | null> {\n console.warn('[uploadMedia] Storage operations not available in widget-core - use FramedProvider.callbacks.onUploadFile')\n return null\n}\n\n/**\n * Delete media file from storage\n * Stub - logs warning, actual delete should use FramedProvider callbacks\n */\nexport async function deleteMedia(\n _path: string\n): Promise<boolean> {\n console.warn('[deleteMedia] Storage operations not available in widget-core - use FramedProvider.callbacks.onDeleteFile')\n return false\n}\n","/**\n * Feature flag utilities\n * Source: framed-app/src/utils/featureFlags.ts\n */\n\nimport type { User, Project } from '../entities'\n\n/**\n * Check if a user/project has access to a specific feature\n */\nexport const hasFeature = (\n user: User | null,\n project: Project | null,\n featureName: string\n): boolean => {\n if (!user || !project) return false\n\n // Super admins can always access all features\n if (user.role === 'super_admin') return true\n\n // Check project-specific override (manually enabled by super admin)\n if (project.enabled_features?.includes(featureName)) return true\n\n // Check agency plan features\n if (project.agency?.features?.[featureName]) return true\n\n return false\n}\n\n/**\n * Check if agency has a monitoring feature available\n * This is the \"capability\" check - can the agency use this feature at all?\n */\nexport const agencyHasMonitoringFeature = (\n project: Project | null,\n feature: 'seo' | 'performance' | 'uptime' | 'analytics'\n): boolean => {\n if (!project?.agency) return false\n\n // Gold plan agencies get all monitoring features\n if (project.agency.plan_type === 'gold') return true\n\n // Check explicit feature flags\n switch (feature) {\n case 'seo':\n return project.agency.features?.seo_audit === true\n case 'performance':\n return project.agency.features?.performance_analysis === true\n case 'uptime':\n return project.agency.features?.uptime_monitoring === true\n case 'analytics':\n return project.agency.features?.site_analytics === true\n default:\n return false\n }\n}\n\n/**\n * Check if a monitoring feature is enabled for a specific project\n * Returns true if:\n * 1. Agency has the feature available AND\n * 2. Project has the feature enabled (or no explicit setting = enabled by default)\n *\n * This allows agencies to selectively enable/disable features per project for billing\n */\nexport const projectHasMonitoringFeature = (\n user: User | null,\n project: Project | null,\n feature: 'seo' | 'performance' | 'uptime' | 'analytics'\n): boolean => {\n if (!user || !project) return false\n\n // Super admins always have access\n if (user.role === 'super_admin') return true\n\n // First check if agency has the feature available\n if (!agencyHasMonitoringFeature(project, feature)) return false\n\n // Check project-level settings\n // If no monitoring_features set, default to enabled (agency has feature, project inherits)\n if (!project.monitoring_features) return true\n\n switch (feature) {\n case 'seo':\n // Default to true if not explicitly set to false\n return project.monitoring_features.seo_enabled !== false\n case 'performance':\n return project.monitoring_features.performance_enabled !== false\n case 'uptime':\n return project.monitoring_features.uptime_enabled !== false\n case 'analytics':\n // Check both monitoring_features and top-level analytics_enabled flag\n // The top-level flag is the actual tracking flag set by agency\n if (project.monitoring_features.analytics_enabled === false) return false\n // Also respect the top-level analytics_enabled flag\n return (project as any).analytics_enabled !== false\n default:\n return false\n }\n}\n\n/**\n * Check if performance analysis feature is available\n * Available to:\n * - Super admins (always)\n * - Gold plan agencies (automatically)\n * - Agencies with feature explicitly enabled\n */\nexport const hasPerformanceAnalysis = (\n user: User | null,\n project: Project | null\n): boolean => {\n if (!user || !project) return false\n\n // Super admins always have access\n if (user.role === 'super_admin') return true\n\n // Gold plan agencies get this feature automatically\n if (project.agency?.plan_type === 'gold') return true\n\n // Check if explicitly enabled for this agency\n if (project.agency?.features?.performance_analysis === true) return true\n\n return false\n}\n\n/**\n * Check if SEO audit feature is available\n * Available to:\n * - Super admins (always)\n * - Gold plan agencies (automatically)\n * - Agencies with feature explicitly enabled\n */\nexport const hasSeoAudit = (\n user: User | null,\n project: Project | null\n): boolean => {\n if (!user || !project) return false\n\n // Super admins always have access\n if (user.role === 'super_admin') return true\n\n // Gold plan agencies get this feature automatically\n if (project.agency?.plan_type === 'gold') return true\n\n // Check if explicitly enabled for this agency\n if (project.agency?.features?.seo_audit === true) return true\n\n return false\n}\n\n/**\n * Get SEO audit credits info for an agency\n */\nexport const getSeoCreditsInfo = (\n project: Project | null\n): { used: number; limit: number; remaining: number } => {\n if (!project?.agency) return { used: 0, limit: 0, remaining: 0 }\n\n const used = project.agency.seo_credits_used || 0\n const limit = project.agency.seo_credits_limit || 0\n const remaining = Math.max(0, limit - used)\n\n return { used, limit, remaining }\n}\n\n/**\n * Check if AI content generation feature is available\n * This includes:\n * - AI content suggestions for sections\n * - AI translation for multilingual content\n * - Auto-generate all content feature\n *\n * Available to:\n * - Super admins (always)\n * - Gold plan agencies (automatically)\n * - Silver plan agencies (automatically)\n * - Agencies with feature explicitly enabled\n */\nexport const hasAIContentGeneration = (\n user: User | null,\n project: Project | null\n): boolean => {\n if (!user || !project) return false\n\n // Super admins always have access\n if (user.role === 'super_admin') return true\n\n // Gold and Silver plan agencies get this feature automatically\n if (project.agency?.plan_type === 'gold' || project.agency?.plan_type === 'silver') return true\n\n // Check if explicitly enabled for this agency\n if (project.agency?.features?.ai_content_generation === true) return true\n\n // Check project-specific override\n if (project.enabled_features?.includes('ai_content_generation')) return true\n\n return false\n}\n\n/**\n * Get all available features for a project\n */\nexport const getAvailableFeatures = (\n user: User | null,\n project: Project | null\n): string[] => {\n if (!user || !project) return []\n\n const features: string[] = []\n\n // Super admins get all features\n if (user.role === 'super_admin') {\n return ['performance_analysis', 'ai_content_generation']\n }\n\n // Get agency plan features\n if (project.agency?.features) {\n Object.entries(project.agency.features).forEach(([feature, enabled]) => {\n if (enabled) features.push(feature)\n })\n }\n\n // Add project-specific overrides\n if (project.enabled_features) {\n project.enabled_features.forEach(feature => {\n if (!features.includes(feature)) {\n features.push(feature)\n }\n })\n }\n\n return features\n}\n\n/**\n * Feature display names for UI\n */\nexport const FEATURE_NAMES: Record<string, string> = {\n performance_analysis: 'Performance Analysis',\n ai_content_generation: 'AI Content Generation',\n seo_audit: 'SEO Audit',\n uptime_monitoring: 'Uptime Monitoring',\n site_analytics: 'Site Analytics',\n}\n\n/**\n * Feature descriptions for UI\n */\nexport const FEATURE_DESCRIPTIONS: Record<string, string> = {\n performance_analysis: 'Analyze website performance, SEO, and accessibility using Lighthouse',\n ai_content_generation: 'AI-powered content suggestions, auto-translation, and bulk content generation',\n seo_audit: 'In-depth SEO audit with detailed recommendations powered by Apify',\n uptime_monitoring: 'Monitor website uptime and receive alerts when your site goes down',\n site_analytics: 'Privacy-friendly website analytics to track visitors and traffic sources',\n}\n\n/**\n * Monitoring feature display names for Phase 5\n */\nexport const MONITORING_FEATURE_NAMES: Record<'seo' | 'performance' | 'uptime' | 'analytics', string> = {\n seo: 'SEO Monitoring',\n performance: 'Performance Monitoring',\n uptime: 'Uptime Monitoring',\n analytics: 'Site Analytics',\n}\n\n/**\n * Monitoring feature descriptions for Phase 5\n */\nexport const MONITORING_FEATURE_DESCRIPTIONS: Record<'seo' | 'performance' | 'uptime' | 'analytics', string> = {\n seo: 'Track SEO issues and get recommendations for improving search engine visibility',\n performance: 'Analyze Core Web Vitals and Lighthouse scores to optimize page performance',\n uptime: 'Monitor website availability and get notified when your site goes down',\n analytics: 'Track website visitors, traffic sources, and page views with privacy-friendly analytics',\n}\n","/**\n * Shared comment factory utility\n * Source: framed-app/src/utils/createComment.ts\n *\n * Ensures consistent comment structure across all views:\n * - Page-level feedback (Phase4ReviewPageNew)\n * - All feedback view (AllFeedbackView)\n * - Mobile view (Phase4MobileView)\n */\n\nimport type { PageComment, CommentAttachment } from '../phases'\nimport type { UserRole } from '../entities'\n\nexport interface CreateCommentOptions {\n comment: string\n userId: string\n userName: string\n userRole?: UserRole\n attachments?: CommentAttachment[]\n versionNumber?: number\n position?: { x: number; y: number }\n screenshotType?: 'desktop' | 'mobile'\n source?: 'app' | 'widget' | 'screenshot' | 'content_editor'\n currentRound?: number\n}\n\n/**\n * Creates a standardized PageComment object with all required fields populated\n */\nexport function createComment(options: CreateCommentOptions): PageComment {\n return {\n id: crypto.randomUUID(),\n user_id: options.userId,\n user_name: options.userName,\n user_role: options.userRole ?? 'client',\n comment: options.comment,\n position: options.position ?? { x: 50, y: 50 },\n created_at: new Date().toISOString(),\n resolved: false,\n screenshot_type: options.screenshotType ?? 'desktop',\n version_number: options.versionNumber ?? 1,\n metadata: { source: options.source ?? 'app' },\n attachments: options.attachments,\n created_in_round: options.currentRound\n }\n}\n","/**\n * Backwards Compatibility Utilities\n * Source: framed-app/src/utils/compatibility.ts\n *\n * Helper functions to bridge the old website-only data model with the new\n * multi-project-type model. These ensure existing projects continue to work\n * while new projects can use the enhanced features.\n */\n\nimport type {\n Phase1Data,\n ProjectCategory,\n ScreenDefinition,\n ScreenType,\n} from '../phases'\n\n// ============================================\n// Project Category Helpers\n// ============================================\n\n/**\n * Get the project category from Phase1Data, defaulting to 'website' for backwards compatibility\n */\nexport function getProjectCategory(phase1: Phase1Data | undefined): ProjectCategory {\n if (!phase1) return 'website'\n\n // New field takes priority\n if (phase1.project_category) {\n return phase1.project_category\n }\n\n // Backwards compatibility: check is_ecommerce flag\n if (phase1.is_ecommerce) {\n return 'ecommerce'\n }\n\n return 'website'\n}\n\n/**\n * Check if a project is e-commerce (supports both old and new data models)\n */\nexport function isEcommerceProject(phase1: Phase1Data | undefined): boolean {\n if (!phase1) return false\n return getProjectCategory(phase1) === 'ecommerce'\n}\n\n/**\n * Check if a project is a website (includes e-commerce as a website subtype for UI purposes)\n */\nexport function isWebsiteBasedProject(phase1: Phase1Data | undefined): boolean {\n const category = getProjectCategory(phase1)\n return category === 'website' || category === 'ecommerce'\n}\n\n/**\n * Check if a project category should show the traditional page/section wizard (Phase 2)\n */\nexport function shouldShowTraditionalWizard(phase1: Phase1Data | undefined): boolean {\n const category = getProjectCategory(phase1)\n // Websites and e-commerce use the traditional page-based wizard\n // SaaS and mobile apps will eventually have their own Phase 2 flows\n return category === 'website' || category === 'ecommerce'\n}\n\n// ============================================\n// Screen/Page Helpers\n// ============================================\n\n/**\n * Get pages from Phase1Data - supports both old (pages array) and new (screens array) formats\n * Returns an array of page IDs for backwards compatibility\n */\nexport function getPages(phase1: Phase1Data | undefined): string[] {\n if (!phase1) return []\n\n // New format: screens array\n if (phase1.screens && phase1.screens.length > 0) {\n return phase1.screens\n .filter((s) => s.type === 'page')\n .sort((a, b) => a.order - b.order)\n .map((s) => s.id)\n }\n\n // Old format: pages array\n return phase1.pages || []\n}\n\n/**\n * Get custom pages from Phase1Data - supports both old and new formats\n */\nexport function getCustomPages(phase1: Phase1Data | undefined): string[] {\n if (!phase1) return []\n\n // New format: screens array (custom pages have ai_generated = false and no template_source)\n if (phase1.screens && phase1.screens.length > 0) {\n return phase1.screens\n .filter(\n (s) =>\n s.type === 'page' &&\n !s.template_source &&\n !isDefaultPage(s.id)\n )\n .map((s) => s.id)\n }\n\n // Old format: custom_pages array\n return phase1.custom_pages || []\n}\n\n/**\n * Get all screens from Phase1Data - returns screens array or converts pages to screens\n */\nexport function getScreens(phase1: Phase1Data | undefined): ScreenDefinition[] {\n if (!phase1) return []\n\n // New format: screens array\n if (phase1.screens && phase1.screens.length > 0) {\n return phase1.screens\n }\n\n // Convert old format to screens\n const screens: ScreenDefinition[] = []\n\n // Convert standard pages\n const pages = phase1.pages || []\n pages.forEach((pageId, index) => {\n screens.push(convertPageToScreen(pageId, index, phase1))\n })\n\n // Convert custom pages\n const customPages = phase1.custom_pages || []\n customPages.forEach((pageName, index) => {\n screens.push({\n id: `custom_${index}`,\n name: pageName,\n type: 'page',\n order: pages.length + index,\n features: [],\n description: phase1.page_content?.[`custom_${index}`]?.description || '',\n })\n })\n\n return screens\n}\n\n/**\n * Convert a legacy page ID to a ScreenDefinition\n */\nfunction convertPageToScreen(\n pageId: string,\n order: number,\n phase1: Phase1Data\n): ScreenDefinition {\n const customName = phase1.page_names?.[pageId]\n const pageContent = phase1.page_content?.[pageId]\n\n return {\n id: pageId,\n name: customName || getDefaultPageName(pageId),\n type: 'page',\n order,\n description: pageContent?.description || '',\n features: pageContent?.features || [],\n website_page: {\n is_landing_page: pageId === 'home',\n seo_priority: pageId === 'home' ? 'high' : 'medium',\n content_type: 'static',\n },\n }\n}\n\n/**\n * Check if a page ID is a default (predefined) page\n */\nconst DEFAULT_PAGE_IDS = [\n 'home',\n 'about',\n 'services',\n 'contact',\n 'portfolio',\n 'blog',\n 'faq',\n 'team',\n 'careers',\n 'privacy-policy',\n 'terms-conditions',\n]\n\nexport function isDefaultPage(pageId: string): boolean {\n return DEFAULT_PAGE_IDS.includes(pageId)\n}\n\n/**\n * Get the default display name for a page ID\n */\nexport function getDefaultPageName(pageId: string): string {\n const pageNames: Record<string, string> = {\n home: 'Home',\n about: 'About Us',\n services: 'Services',\n contact: 'Contact',\n portfolio: 'Portfolio',\n blog: 'Blog',\n faq: 'FAQ',\n team: 'Team',\n careers: 'Careers',\n 'privacy-policy': 'Privacy Policy',\n 'terms-conditions': 'Terms & Conditions',\n }\n return pageNames[pageId] || pageId\n}\n\n/**\n * Get the display name for a screen/page\n */\nexport function getScreenDisplayName(\n screen: ScreenDefinition | string,\n phase1?: Phase1Data\n): string {\n if (typeof screen === 'string') {\n // Legacy: just a page ID\n const customName = phase1?.page_names?.[screen]\n return customName || getDefaultPageName(screen)\n }\n\n return screen.name\n}\n\n// ============================================\n// Screen Type Helpers\n// ============================================\n\n/**\n * Get the appropriate screen type label for a project category\n */\nexport function getScreenTypeLabel(\n category: ProjectCategory,\n plural: boolean = false\n): string {\n const labels: Record<ProjectCategory, { singular: string; plural: string }> = {\n website: { singular: 'Page', plural: 'Pages' },\n ecommerce: { singular: 'Page', plural: 'Pages' },\n saas: { singular: 'Screen', plural: 'Screens' },\n mobile_app: { singular: 'Screen', plural: 'Screens' },\n api_backend: { singular: 'Endpoint', plural: 'Endpoints' },\n custom: { singular: 'Component', plural: 'Components' },\n }\n\n const label = labels[category] || labels.custom\n return plural ? label.plural : label.singular\n}\n\n/**\n * Get the default screen type for a project category\n */\nexport function getDefaultScreenType(category: ProjectCategory): ScreenType {\n const typeMap: Record<ProjectCategory, ScreenType> = {\n website: 'page',\n ecommerce: 'page',\n saas: 'screen',\n mobile_app: 'screen',\n api_backend: 'endpoint',\n custom: 'screen',\n }\n return typeMap[category] || 'screen'\n}\n\n// ============================================\n// Data Migration Helpers\n// ============================================\n\n/**\n * Migrate Phase1Data from old format to new format\n * This is a non-destructive operation that adds new fields without removing old ones\n */\nexport function migratePhase1Data(phase1: Phase1Data): Phase1Data {\n // Already has new fields? Return as-is\n if (phase1.project_category && phase1.screens) {\n return phase1\n }\n\n const migrated: Phase1Data = {\n ...phase1,\n // Set project category based on existing data\n project_category: getProjectCategory(phase1),\n // Convert pages to screens\n screens: getScreens(phase1),\n // Initialize AI conversation if not present\n ai_conversation: phase1.ai_conversation || {\n project_idea: phase1.goal\n ? typeof phase1.goal === 'string'\n ? phase1.goal\n : Object.values(phase1.goal)[0] || ''\n : '',\n follow_up_questions: [],\n answers: {},\n },\n }\n\n return migrated\n}\n\n/**\n * Check if Phase1Data needs migration\n */\nexport function needsMigration(phase1: Phase1Data | undefined): boolean {\n if (!phase1) return false\n\n // Has old format but no new format\n const hasOldFormat = phase1.pages && phase1.pages.length > 0\n const hasNewFormat = phase1.screens && phase1.screens.length > 0\n\n return hasOldFormat && !hasNewFormat\n}\n\n// ============================================\n// Category Display Helpers\n// ============================================\n\nexport interface ProjectCategoryInfo {\n id: ProjectCategory\n name: string\n description: string\n icon: string\n examples: string[]\n}\n\n/**\n * Get display information for project categories\n */\nexport function getProjectCategoryInfo(category: ProjectCategory): ProjectCategoryInfo {\n const categories: Record<ProjectCategory, ProjectCategoryInfo> = {\n website: {\n id: 'website',\n name: 'Website',\n description: 'Informational website, portfolio, blog',\n icon: 'Globe',\n examples: ['Business website', 'Portfolio', 'Blog', 'Landing page'],\n },\n saas: {\n id: 'saas',\n name: 'SaaS Application',\n description: 'Web application with user accounts',\n icon: 'AppWindow',\n examples: ['Project management', 'CRM', 'Dashboard', 'Booking system'],\n },\n mobile_app: {\n id: 'mobile_app',\n name: 'Mobile App',\n description: 'iOS, Android or cross-platform app',\n icon: 'Smartphone',\n examples: ['Social app', 'Fitness tracker', 'E-reader', 'Game'],\n },\n ecommerce: {\n id: 'ecommerce',\n name: 'E-commerce',\n description: 'Online store or marketplace',\n icon: 'ShoppingCart',\n examples: ['Webshop', 'Marketplace', 'Subscriptions', 'Digital products'],\n },\n api_backend: {\n id: 'api_backend',\n name: 'API / Backend',\n description: 'Headless services and APIs',\n icon: 'Server',\n examples: ['REST API', 'GraphQL service', 'Microservices', 'Data platform'],\n },\n custom: {\n id: 'custom',\n name: 'Custom',\n description: 'Define your own structure',\n icon: 'Puzzle',\n examples: ['Mixed project', 'Unique requirements', 'Experimental'],\n },\n }\n\n return categories[category] || categories.custom\n}\n\n/**\n * Get all project categories with their display info\n */\nexport function getAllProjectCategories(): ProjectCategoryInfo[] {\n const order: ProjectCategory[] = [\n 'website',\n 'saas',\n 'mobile_app',\n 'ecommerce',\n 'api_backend',\n 'custom',\n ]\n return order.map(getProjectCategoryInfo)\n}\n","/**\n * Utilities for collecting and filtering unified feed items\n * Source: framed-app/src/utils/feedUtils.ts\n *\n * Combines feedback comments, text edits, and image feedback into a single chronological feed\n */\n\nimport type {\n Phase4Page,\n PageComment,\n PageImage,\n FeedItem,\n FeedbackFeedItem,\n TextEditFeedItem,\n ImageFeedItem,\n} from '../phases'\n\nimport {\n isFeedbackItem,\n isTextEditItem,\n isImageFeedItem\n} from '../phases'\n\n// ============================================\n// Feed Collection\n// ============================================\n\n/**\n * Get screenshot URL for a comment based on version and screenshot type\n * For region captures from the widget, the screenshot is stored in comment.metadata.screenshotUrl\n */\nexport function getScreenshotUrl(\n page: Phase4Page,\n comment: PageComment\n): string | undefined {\n // First check if comment has its own screenshot (region capture from widget)\n if (comment.metadata?.screenshotUrl) {\n return comment.metadata.screenshotUrl\n }\n\n // Otherwise fall back to the page version screenshot\n const version = page.versions.find(v => v.version_number === comment.version_number)\n return comment.screenshot_type === 'desktop'\n ? version?.screenshot_desktop?.url\n : version?.screenshot_mobile?.url\n}\n\n/**\n * Collect all feed items from Phase 4 pages and images\n * Combines feedback comments, text edits, and image feedback into a single array\n */\nexport function collectFeedItems(pages: Phase4Page[], pageImages?: PageImage[]): FeedItem[] {\n const items: FeedItem[] = []\n\n pages.forEach(page => {\n // Collect feedback comments (only root comments, not replies)\n page.comments?.forEach(comment => {\n // Skip replies - they'll be handled as part of their parent thread\n if (comment.parent_id) return\n\n // For live review feedback, prefer the actual URL from metadata\n // This ensures feedback is associated with the correct page URL even if\n // the user navigated within the iframe\n const actualPageUrl = comment.metadata?.reviewType === 'live' && comment.metadata?.pageUrl\n ? comment.metadata.pageUrl\n : page.page_url\n\n items.push({\n type: 'feedback',\n id: comment.id,\n pageName: page.page_name,\n pageUrl: actualPageUrl,\n timestamp: comment.created_at,\n userId: comment.user_id,\n userName: comment.user_name,\n userRole: comment.user_role,\n comment,\n screenshotUrl: getScreenshotUrl(page, comment),\n versionNumber: comment.version_number,\n screenshotType: comment.screenshot_type,\n position: comment.position,\n // Round tracking\n createdInRound: comment.created_in_round,\n resolvedInRound: comment.resolved_in_round,\n resolutionStatus: comment.resolution_status,\n resolutionDescription: comment.resolution_description\n } as FeedbackFeedItem)\n })\n\n // Collect text edits from all languages\n if (page.textContent?.languages) {\n Object.entries(page.textContent.languages).forEach(([lang, langContent]) => {\n langContent.editHistory.forEach(edit => {\n const section = langContent.sections.find(s => s.id === edit.sectionId)\n const block = section?.blocks.find(b => b.id === edit.blockId)\n\n items.push({\n type: 'text_edit',\n id: edit.id,\n pageName: page.page_name,\n pageUrl: page.page_url,\n timestamp: edit.editedAt,\n userId: edit.editedBy,\n userName: edit.editedByName,\n userRole: edit.editedByRole,\n edit,\n language: lang,\n sectionName: section?.name || 'Unknown',\n blockType: block?.type || 'text',\n tagName: block?.tagName || 'p',\n originalContent: edit.previousContent,\n newContent: edit.newContent\n } as TextEditFeedItem)\n })\n })\n }\n })\n\n // Collect image feedback (comments and change requests)\n if (pageImages && pageImages.length > 0) {\n // Build a map of image URLs to all pages they appear on\n const imagePageMap = new Map<string, string[]>()\n pageImages.forEach(img => {\n const existing = imagePageMap.get(img.image_url) || []\n if (!existing.includes(img.page_name)) {\n existing.push(img.page_name)\n }\n imagePageMap.set(img.image_url, existing)\n })\n\n // Deduplicate images by URL to avoid duplicate comments\n const seenUrls = new Set<string>()\n\n pageImages.forEach(img => {\n // Skip if we've already processed this image URL\n if (seenUrls.has(img.image_url)) return\n seenUrls.add(img.image_url)\n\n const usedOnPages = imagePageMap.get(img.image_url) || [img.page_name]\n\n // Collect comments from this image\n img.comments?.forEach(comment => {\n items.push({\n type: 'image_feedback',\n id: comment.id,\n pageName: img.page_name,\n timestamp: comment.created_at,\n userId: comment.user_id,\n userName: comment.user_name,\n userRole: comment.user_role,\n imageId: img.id,\n imageUrl: img.image_url,\n imageAltText: img.alt_text,\n imageStatus: img.status,\n comment,\n usedOnPages\n } as ImageFeedItem)\n })\n\n // Create an item for images with suggested replacements\n if (img.suggested_replacement) {\n const replacement = img.suggested_replacement\n items.push({\n type: 'image_feedback',\n id: `${img.id}-replacement`,\n pageName: img.page_name,\n timestamp: replacement.uploaded_at,\n userId: replacement.uploaded_by,\n userName: replacement.uploaded_by_name,\n userRole: 'client', // Default role for replacement uploads\n imageId: img.id,\n imageUrl: img.image_url,\n imageAltText: img.alt_text,\n imageStatus: img.status,\n comment: {\n id: `${img.id}-replacement`,\n user_id: replacement.uploaded_by,\n user_name: replacement.uploaded_by_name,\n user_role: 'client',\n comment: replacement.reason || 'Suggested a replacement image',\n created_at: replacement.uploaded_at\n },\n usedOnPages,\n replacementUrl: replacement.url\n } as ImageFeedItem)\n }\n\n // Note: We no longer create feed items for images that are just \"pending\" without feedback.\n // Images are considered OK by default. Only images with comments, replacements,\n // or explicit change requests appear in the feed.\n\n // Create an item for images with change requests (even without comments or replacements)\n if (img.status === 'changes_requested' && (!img.comments || img.comments.length === 0) && !img.suggested_replacement) {\n items.push({\n type: 'image_feedback',\n id: `${img.id}-status`,\n pageName: img.page_name,\n timestamp: img.updated_at || img.created_at,\n userId: '',\n userName: 'System',\n userRole: 'admin',\n imageId: img.id,\n imageUrl: img.image_url,\n imageAltText: img.alt_text,\n imageStatus: img.status,\n comment: {\n id: `${img.id}-status`,\n user_id: '',\n user_name: 'System',\n user_role: 'admin',\n comment: 'Changes requested for this image',\n created_at: img.updated_at || img.created_at\n },\n usedOnPages\n } as ImageFeedItem)\n }\n })\n }\n\n // Sort by timestamp descending (newest first)\n return items.sort((a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n )\n}\n\n// ============================================\n// Filtering\n// ============================================\n\nexport type FeedTypeFilter = 'all' | 'feedback' | 'text_edits' | 'image_feedback'\nexport type FeedStatusFilter = 'all' | 'open' | 'resolved'\n\nexport interface FeedFilters {\n type: FeedTypeFilter\n status: FeedStatusFilter\n page?: string\n language?: string\n round?: number // Filter by feedback round\n}\n\n/**\n * Filter feed items based on selected filters\n */\nexport function filterFeedItems(\n items: FeedItem[],\n filters: FeedFilters\n): FeedItem[] {\n return items.filter(item => {\n // Type filter\n if (filters.type === 'feedback' && item.type !== 'feedback') return false\n if (filters.type === 'text_edits' && item.type !== 'text_edit') return false\n if (filters.type === 'image_feedback' && item.type !== 'image_feedback') return false\n\n // Status filter (applies to feedback, text edits, and image feedback)\n if (filters.status !== 'all') {\n if (isFeedbackItem(item)) {\n const isResolved = item.comment.resolved\n if (filters.status === 'open' && isResolved) return false\n if (filters.status === 'resolved' && !isResolved) return false\n }\n if (isTextEditItem(item)) {\n const isResolved = item.edit.resolved\n if (filters.status === 'open' && isResolved) return false\n if (filters.status === 'resolved' && !isResolved) return false\n }\n if (isImageFeedItem(item)) {\n // For image feedback, \"resolved\" means the image is approved\n // Note: Only images with actual feedback (comments/changes_requested/replacements)\n // appear in the feed, so we only need to check approved status here\n const isResolved = item.imageStatus === 'approved'\n if (filters.status === 'open' && isResolved) return false\n if (filters.status === 'resolved' && !isResolved) return false\n }\n }\n\n // Page filter - for image feedback, check if any of the pages match\n if (filters.page) {\n if (isImageFeedItem(item)) {\n if (!item.usedOnPages.includes(filters.page)) return false\n } else if (item.pageName !== filters.page) {\n return false\n }\n }\n\n // Language filter (only applies to text edits)\n if (filters.language && isTextEditItem(item)) {\n if (item.language !== filters.language) return false\n }\n\n // Round filter (only applies to feedback)\n if (filters.round !== undefined && isFeedbackItem(item)) {\n if (item.createdInRound !== filters.round) return false\n }\n\n return true\n })\n}\n\n// ============================================\n// Grouping\n// ============================================\n\nexport interface GroupedFeedItems {\n [pageName: string]: FeedItem[]\n}\n\n/**\n * Group feed items by page name\n */\nexport function groupFeedItemsByPage(items: FeedItem[]): GroupedFeedItems {\n const grouped: GroupedFeedItems = {}\n\n items.forEach(item => {\n if (!grouped[item.pageName]) {\n grouped[item.pageName] = []\n }\n grouped[item.pageName]!.push(item)\n })\n\n return grouped\n}\n\n// ============================================\n// Statistics\n// ============================================\n\nexport interface FeedStats {\n total: number\n feedbackCount: number\n textEditCount: number\n imageFeedbackCount: number\n openFeedback: number\n resolvedFeedback: number\n openTextEdits: number\n resolvedTextEdits: number\n openImageFeedback: number\n resolvedImageFeedback: number\n pagesAffected: number\n languagesUsed: string[]\n}\n\n/**\n * Calculate statistics for feed items\n */\nexport function calculateFeedStats(items: FeedItem[]): FeedStats {\n const feedbackItems = items.filter(isFeedbackItem)\n const textEditItems = items.filter(isTextEditItem)\n const imageFeedbackItems = items.filter(isImageFeedItem)\n const pages = new Set(items.map(i => i.pageName))\n const languages = new Set(textEditItems.map(i => i.language))\n\n return {\n total: items.length,\n feedbackCount: feedbackItems.length,\n textEditCount: textEditItems.length,\n imageFeedbackCount: imageFeedbackItems.length,\n openFeedback: feedbackItems.filter(i => !i.comment.resolved).length,\n resolvedFeedback: feedbackItems.filter(i => i.comment.resolved).length,\n openTextEdits: textEditItems.filter(i => !i.edit.resolved).length,\n resolvedTextEdits: textEditItems.filter(i => i.edit.resolved).length,\n openImageFeedback: imageFeedbackItems.filter(i => i.imageStatus !== 'approved').length,\n resolvedImageFeedback: imageFeedbackItems.filter(i => i.imageStatus === 'approved').length,\n pagesAffected: pages.size,\n languagesUsed: Array.from(languages)\n }\n}\n\n// ============================================\n// Export Utilities\n// ============================================\n\n/**\n * Get available languages from feed items\n */\nexport function getAvailableLanguages(items: FeedItem[]): string[] {\n const languages = new Set<string>()\n items.forEach(item => {\n if (isTextEditItem(item)) {\n languages.add(item.language)\n }\n })\n return Array.from(languages).sort()\n}\n\n/**\n * Get available pages from feed items\n */\nexport function getAvailablePages(items: FeedItem[]): string[] {\n const pages = new Set<string>()\n items.forEach(item => {\n pages.add(item.pageName)\n })\n return Array.from(pages).sort()\n}\n","/**\n * Resolution Report Parser\n * Source: framed-app/src/utils/resolutionParser.ts\n *\n * Parses markdown resolution reports from AI agents and applies changes to feedback\n *\n * Supports multiple formats:\n * 1. Checkbox format: **ID:** `feedback-id` with **Status:** [X] DONE / [ ] MANUAL / [ ] SKIPPED\n * 2. Simple format: ## Resolved Items / ## Unable to Resolve with - [id]: description\n * 3. Page-grouped format: ### Home Page (X items) with - [id]: description\n * 4. Mixed format with Notes, Clarification sections, etc.\n */\n\nimport type {\n Phase4Data,\n PageComment,\n ParsedResolutionItem,\n ResolutionStatus,\n ResolutionImportResult,\n} from '../phases'\n\nimport type { User } from '../entities'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface ResolutionParseResult {\n success: boolean\n resolved: ParsedResolutionItem[]\n unable_to_resolve: ParsedResolutionItem[]\n needs_clarification: ParsedResolutionItem[]\n unmatched_ids: string[]\n total_parsed: number\n errors: string[]\n notes?: string // Any additional notes from the AI report\n}\n\nexport interface ApplyResolutionOptions {\n user: User\n roundNumber: number\n createNotesForUnmatched?: boolean\n}\n\n// ============================================\n// Parser Functions\n// ============================================\n\n/**\n * Parse all feedback items from the entire markdown\n * This is the main parser that handles various AI response formats\n */\nfunction parseAllItems(markdown: string): ParsedResolutionItem[] {\n const items: ParsedResolutionItem[] = []\n\n // First, try to parse the checkbox format used by the AI Builder export\n // Format: **ID:** `feedback-id` ... **Status:** [X] DONE / [ ] MANUAL / [ ] SKIPPED ... **Notes:** description\n const checkboxItems = parseCheckboxFormat(markdown)\n if (checkboxItems.length > 0) {\n return checkboxItems\n }\n\n // Fallback: Pattern to match: - [feedback-id]: Description\n // Handles variations:\n // - [id]: description\n // - [`id`]: description\n // - [id]: description (with parenthetical notes)\n const pattern = /^-\\s*\\[`?([^\\]`]+)`?\\]:\\s*(.+)$/gm\n\n let match\n while ((match = pattern.exec(markdown)) !== null) {\n const feedbackId = match[1]\n const desc = match[2]\n if (!feedbackId || !desc) continue\n items.push({\n feedback_id: feedbackId.trim(),\n status: 'resolved', // Default, will be updated based on context\n description: desc.trim()\n })\n }\n\n return items\n}\n\n/**\n * Parse the checkbox format used by AI Builder exports\n * Looks for patterns like:\n * **ID:** `widget-text-123`\n * **Status:** [X] DONE / [ ] MANUAL / [ ] SKIPPED\n * **Notes:** Successfully replaced text\n */\nfunction parseCheckboxFormat(markdown: string): ParsedResolutionItem[] {\n const items: ParsedResolutionItem[] = []\n\n // Split by feedback item blocks (#### N. [...])\n const blocks = markdown.split(/####\\s*\\d+\\.\\s*\\[/)\n\n for (const block of blocks) {\n if (!block.trim()) continue\n\n // Extract the ID - look for **ID:** `some-id` pattern\n const idMatch = block.match(/\\*\\*ID:\\*\\*\\s*`([^`]+)`/)\n if (!idMatch || !idMatch[1]) continue\n\n const feedbackId = idMatch[1].trim()\n\n // Extract status - look for [X] DONE, [X] MANUAL, or [X] SKIPPED\n const statusLine = block.match(/\\*\\*Status:\\*\\*\\s*([^\\n]+)/)\n if (!statusLine || !statusLine[1]) continue\n\n const statusText = statusLine[1]\n\n // Determine status based on which checkbox is marked\n let status: ResolutionStatus = 'resolved'\n\n // Check for [X] or [x] before each status keyword\n const doneMarked = /\\[(?:X|x)\\]\\s*DONE/.test(statusText)\n const manualMarked = /\\[(?:X|x)\\]\\s*MANUAL/.test(statusText)\n const skippedMarked = /\\[(?:X|x)\\]\\s*SKIPPED/.test(statusText)\n\n if (doneMarked) {\n status = 'resolved'\n } else if (manualMarked) {\n status = 'needs_clarification' // Manual items need human attention\n } else if (skippedMarked) {\n status = 'unable_to_resolve'\n } else {\n // No checkbox marked - skip this item (still open)\n continue\n }\n\n // Extract notes/description\n const notesMatch = block.match(/\\*\\*Notes:\\*\\*\\s*([^\\n]+)/)\n let description = notesMatch && notesMatch[1] ? notesMatch[1].trim() : ''\n\n // Skip if notes are still the placeholder\n if (description === '_Add implementation notes here_' || !description) {\n description = status === 'resolved' ? 'Marked as completed' : 'Marked for review'\n }\n\n items.push({\n feedback_id: feedbackId,\n status,\n description\n })\n }\n\n return items\n}\n\n/**\n * Determine the status of an item based on its context in the markdown\n */\nfunction determineItemStatus(markdown: string, feedbackId: string): ResolutionStatus {\n // Find the line containing this feedback ID\n const lines = markdown.split('\\n')\n const escapedId = feedbackId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const itemPattern = new RegExp('\\\\[`?' + escapedId + '`?\\\\]')\n\n let itemLineIndex = -1\n for (let i = 0; i < lines.length; i++) {\n const currentLine = lines[i]\n if (currentLine && itemPattern.test(currentLine)) {\n itemLineIndex = i\n break\n }\n }\n\n if (itemLineIndex === -1) return 'resolved'\n\n // Look backwards for the nearest section header to determine context\n for (let i = itemLineIndex; i >= 0; i--) {\n const currentLine = lines[i]\n if (!currentLine) continue\n const line = currentLine.toLowerCase()\n\n // Check for \"Unable to Resolve\" type headers\n if (line.includes('unable to resolve') ||\n line.includes('kon niet') ||\n line.includes('niet opgelost') ||\n line.includes('could not') ||\n line.includes('remaining') ||\n line.includes('need clarification') ||\n line.includes('require clarification')) {\n\n // Check if it's specifically a clarification section\n if (line.includes('clarification') || line.includes('require')) {\n return 'needs_clarification'\n }\n return 'unable_to_resolve'\n }\n\n // Check for \"Resolved\" type headers\n if (line.includes('resolved items') ||\n line.includes('opgelost') ||\n line.includes('### ') && line.includes('items resolved') ||\n (line.startsWith('### ') && line.includes('('))) {\n // This is either \"## Resolved Items\" or \"### Page Name (X items resolved)\"\n // Check if it says \"resolved\" explicitly\n if (line.includes('resolved') || !line.includes('unable') && !line.includes('clarification')) {\n return 'resolved'\n }\n }\n }\n\n // Default to resolved if we can't determine context\n return 'resolved'\n}\n\n/**\n * Extract notes section from the report\n */\nfunction extractNotes(markdown: string): string | undefined {\n // Look for a ## Notes section\n const notesMatch = markdown.match(/^##\\s*Notes?\\s*$/im)\n if (!notesMatch || notesMatch.index === undefined) return undefined\n\n const sectionStart = notesMatch.index + notesMatch[0].length\n\n // Find the end (next ## header or end of file)\n const rest = markdown.slice(sectionStart)\n const nextHeaderMatch = rest.match(/^##\\s+/m)\n const sectionEnd = nextHeaderMatch && nextHeaderMatch.index !== undefined\n ? sectionStart + nextHeaderMatch.index\n : markdown.length\n\n const notes = markdown.slice(sectionStart, sectionEnd).trim()\n return notes || undefined\n}\n\n/**\n * Parse a resolution markdown report\n * Handles various AI response formats including page-grouped items\n */\nexport function parseResolutionReport(\n markdown: string,\n existingIds: string[]\n): ResolutionParseResult {\n const result: ResolutionParseResult = {\n success: false,\n resolved: [],\n unable_to_resolve: [],\n needs_clarification: [],\n unmatched_ids: [],\n total_parsed: 0,\n errors: []\n }\n\n if (!markdown || !markdown.trim()) {\n result.errors.push('Geen inhoud om te verwerken')\n return result\n }\n\n // Parse all items from the markdown\n const allItems = parseAllItems(markdown)\n\n // Categorize each item based on its context\n for (const item of allItems) {\n const status = determineItemStatus(markdown, item.feedback_id)\n item.status = status\n\n // Check if ID exists in our feedback\n if (existingIds.includes(item.feedback_id)) {\n switch (status) {\n case 'resolved':\n result.resolved.push(item)\n break\n case 'unable_to_resolve':\n result.unable_to_resolve.push(item)\n break\n case 'needs_clarification':\n result.needs_clarification.push(item)\n break\n }\n } else {\n result.unmatched_ids.push(item.feedback_id)\n }\n }\n\n // Extract notes if present\n result.notes = extractNotes(markdown)\n\n result.total_parsed = result.resolved.length + result.unable_to_resolve.length + result.needs_clarification.length\n result.success = result.total_parsed > 0\n\n if (result.total_parsed === 0 && result.unmatched_ids.length === 0) {\n result.errors.push('Geen feedback items gevonden in het rapport. Controleer of het formaat klopt.')\n }\n\n return result\n}\n\n// ============================================\n// Apply Resolutions\n// ============================================\n\n/**\n * Apply parsed resolutions to Phase4 data\n * For \"needs_clarification\" items, creates a reply asking for clarification\n */\nexport function applyResolutions(\n phase4Data: Phase4Data,\n parsed: ResolutionParseResult,\n options: ApplyResolutionOptions\n): { updatedData: Phase4Data; importResult: ResolutionImportResult } {\n const { user, roundNumber, createNotesForUnmatched = true } = options\n const now = new Date().toISOString()\n\n // Create a map of feedback_id -> resolution for quick lookup\n const resolutionMap = new Map<string, ParsedResolutionItem>()\n\n parsed.resolved.forEach(item => resolutionMap.set(item.feedback_id, item))\n parsed.unable_to_resolve.forEach(item => resolutionMap.set(item.feedback_id, item))\n parsed.needs_clarification.forEach(item => resolutionMap.set(item.feedback_id, item))\n\n // Update comments in all pages\n const updatedPages = phase4Data.pages.map(page => ({\n ...page,\n comments: page.comments.map(comment => {\n const resolution = resolutionMap.get(comment.id)\n if (resolution) {\n // For needs_clarification, add a reply asking for clarification\n if (resolution.status === 'needs_clarification') {\n const clarificationReply: PageComment = {\n id: `clarification-${comment.id}-${Date.now()}`,\n user_id: user.id,\n user_name: user.name,\n user_role: 'admin',\n version_number: comment.version_number,\n screenshot_type: comment.screenshot_type,\n comment: `⚠️ **Verduidelijking nodig:** ${resolution.description}`,\n position: comment.position,\n created_at: now,\n resolved: false,\n parent_id: comment.id,\n created_in_round: roundNumber\n }\n\n return {\n ...comment,\n resolution_status: 'needs_clarification' as const,\n resolution_description: resolution.description,\n updated_at: now,\n replies: [...(comment.replies || []), clarificationReply]\n }\n }\n\n // For resolved/unable items\n return {\n ...comment,\n resolved: resolution.status === 'resolved',\n resolved_in_round: roundNumber,\n resolution_status: resolution.status,\n resolution_description: resolution.description,\n updated_at: now\n }\n }\n return comment\n })\n }))\n\n // Create import result\n const importResult: ResolutionImportResult = {\n imported_at: now,\n imported_by: user.id,\n imported_by_name: user.name,\n round_number: roundNumber,\n matched_items: parsed.resolved.length + parsed.unable_to_resolve.length + parsed.needs_clarification.length,\n resolved_count: parsed.resolved.length,\n unable_count: parsed.unable_to_resolve.length,\n unmatched_ids: parsed.unmatched_ids,\n unmatched_notes: createNotesForUnmatched && parsed.unmatched_ids.length > 0\n ? `${parsed.unmatched_ids.length} feedback ID(s) niet gevonden: ${parsed.unmatched_ids.slice(0, 5).join(', ')}${parsed.unmatched_ids.length > 5 ? '...' : ''}`\n : ''\n }\n\n // Add to import history\n const importHistory = [...(phase4Data.import_history || []), importResult]\n\n const updatedData: Phase4Data = {\n ...phase4Data,\n pages: updatedPages,\n import_history: importHistory\n }\n\n return { updatedData, importResult }\n}\n\n// ============================================\n// Round Management Helpers\n// ============================================\n\n/**\n * Get all feedback IDs from Phase4 data\n */\nexport function getAllFeedbackIds(phase4Data: Phase4Data): string[] {\n const ids: string[] = []\n\n phase4Data.pages.forEach(page => {\n page.comments.forEach(comment => {\n ids.push(comment.id)\n // Include reply IDs too\n if (comment.replies) {\n comment.replies.forEach(reply => ids.push(reply.id))\n }\n })\n })\n\n return ids\n}\n\n/**\n * Count feedback statistics for a round\n */\nexport function countRoundStats(\n phase4Data: Phase4Data,\n roundNumber: number\n): { total: number; open: number; resolved: number; unable: number } {\n let total = 0\n let open = 0\n let resolved = 0\n let unable = 0\n\n phase4Data.pages.forEach(page => {\n page.comments.forEach(comment => {\n // Skip replies for stats\n if (comment.parent_id) return\n\n // Count items from this round\n if (comment.created_in_round === roundNumber) {\n total++\n if (comment.resolution_status === 'resolved') {\n resolved++\n } else if (comment.resolution_status === 'unable_to_resolve') {\n unable++\n } else if (!comment.resolved) {\n open++\n } else {\n resolved++ // resolved but no status (legacy)\n }\n }\n })\n })\n\n return { total, open, resolved, unable }\n}\n\n/**\n * Calculate summary when closing a round\n */\nexport function calculateRoundSummary(\n phase4Data: Phase4Data,\n roundNumber: number\n): { total_items: number; resolved_in_round: number; carried_over: number; unable_to_resolve: number; new_items_added: number } {\n let total_items = 0\n let resolved_in_round = 0\n let carried_over = 0\n let unable_to_resolve = 0\n let new_items_added = 0\n\n phase4Data.pages.forEach(page => {\n page.comments.forEach(comment => {\n if (comment.parent_id) return // Skip replies\n\n // Items created in this round\n if (comment.created_in_round === roundNumber) {\n new_items_added++\n total_items++\n }\n\n // Items resolved in this round\n if (comment.resolved_in_round === roundNumber) {\n if (comment.resolution_status === 'resolved') {\n resolved_in_round++\n } else if (comment.resolution_status === 'unable_to_resolve') {\n unable_to_resolve++\n } else {\n resolved_in_round++ // Legacy resolved without status\n }\n }\n\n // Open items from this or earlier rounds = carried over\n if (\n !comment.resolved &&\n (comment.created_in_round || 1) <= roundNumber\n ) {\n carried_over++\n }\n })\n })\n\n return {\n total_items,\n resolved_in_round,\n carried_over,\n unable_to_resolve,\n new_items_added\n }\n}\n\n/**\n * Migrate existing comments to Round 1\n * Called when first round is started on a project with existing comments\n */\nexport function migrateToRounds(\n phase4Data: Phase4Data,\n userId: string,\n userName: string\n): Phase4Data {\n // Skip if already has rounds\n if (phase4Data.rounds && phase4Data.rounds.length > 0) {\n return phase4Data\n }\n\n // Check if there are any comments\n const hasComments = phase4Data.pages.some(p => p.comments.length > 0)\n if (!hasComments) {\n return phase4Data\n }\n\n // Find earliest comment date\n let earliestDate = new Date().toISOString()\n phase4Data.pages.forEach(page => {\n page.comments.forEach(comment => {\n if (comment.created_at < earliestDate) {\n earliestDate = comment.created_at\n }\n })\n })\n\n // Assign all existing comments to Round 1\n const migratedPages = phase4Data.pages.map(page => ({\n ...page,\n comments: page.comments.map(comment => ({\n ...comment,\n created_in_round: 1,\n resolved_in_round: comment.resolved ? 1 : undefined\n }))\n }))\n\n return {\n ...phase4Data,\n pages: migratedPages\n }\n}\n","/**\n * Prompt Generator Utilities\n * Source: framed-app/src/utils/promptGenerator.ts\n *\n * Generates AI prompts and exports for project data\n */\n\nimport type { MediaInfo, Phase1Data, ProjectCategory, BuildSpecData, PageDetail, Section, AdditionalContentItem, CTAInfo, Reference } from '../phases'\nimport type { ProjectData } from '../entities'\nimport { str } from '../localization'\nimport { getPageDisplayName } from '../constants/layouts'\nimport { getScreenTypeLabel, getProjectCategoryInfo } from './compatibility'\n\n// Default Framed script URL\nconst FRAMED_SCRIPT_URL = 'https://app.framed.dev/element-selection-script.js'\n\n// Helper to collect all media with full details\ninterface MediaAsset {\n pageName: string\n sectionType: string\n sectionTitle: string\n mediaType: string\n url: string\n alt: string\n description: string\n fileName?: string\n}\n\nconst collectAllMediaAssets = (data: ProjectData): MediaAsset[] => {\n const assets: MediaAsset[] = []\n\n // Logo\n if (data.phase1?.logo_url) {\n assets.push({\n pageName: 'Global',\n sectionType: 'Branding',\n sectionTitle: 'Logo',\n mediaType: 'image',\n url: data.phase1.logo_url,\n alt: `${data.phase1.business_name} logo`,\n description: 'Company logo',\n fileName: data.phase1.logo_url.split('/').pop() || 'logo'\n })\n }\n\n // Page section media\n data.phase2?.pages?.forEach((page: PageDetail) => {\n const displayName = getPageDisplayName(page.name)\n page.sections?.forEach((section: Section) => {\n if (section.media && Array.isArray(section.media)) {\n section.media.forEach((mediaItem: MediaInfo, idx: number) => {\n if (mediaItem.type !== 'none' && mediaItem.url) {\n assets.push({\n pageName: displayName,\n sectionType: section.type,\n sectionTitle: str(section.title) || section.type,\n mediaType: mediaItem.type,\n url: mediaItem.url,\n alt: mediaItem.alt || str(mediaItem.description) || `${str(section.title) || section.type} ${mediaItem.type} ${idx + 1}`,\n description: str(mediaItem.description) || '',\n fileName: mediaItem.uploaded_file?.name || mediaItem.url.split('/').pop() || `media-${idx + 1}`\n })\n }\n })\n }\n // Also check additional_content for media\n if (section.additional_content && Array.isArray(section.additional_content)) {\n section.additional_content.forEach((item: AdditionalContentItem, idx: number) => {\n if (item.data?.media && item.data.media.type !== 'none' && item.data.media.url) {\n const mediaItem = item.data.media\n const mediaUrl = mediaItem.url! // Already checked above\n assets.push({\n pageName: displayName,\n sectionType: section.type,\n sectionTitle: str(section.title) || section.type,\n mediaType: mediaItem.type,\n url: mediaUrl,\n alt: mediaItem.alt || str(mediaItem.description) || `${str(section.title) || section.type} additional ${mediaItem.type} ${idx + 1}`,\n description: str(mediaItem.description) || '',\n fileName: mediaItem.uploaded_file?.name || mediaUrl.split('/').pop() || `additional-media-${idx + 1}`\n })\n }\n })\n }\n })\n })\n\n return assets\n}\n\n// Helper functions for intelligent content analysis\nconst analyzeContentLength = (text: string | undefined): 'short' | 'medium' | 'long' => {\n if (!text) return 'short'\n const wordCount = text.split(/\\s+/).length\n if (wordCount < 30) return 'short'\n if (wordCount < 100) return 'medium'\n return 'long'\n}\n\nconst extractKeyThemes = (phase1: ProjectData['phase1']): string[] => {\n const themes: string[] = []\n\n if (phase1?.industry) themes.push(phase1.industry.toLowerCase())\n if (phase1?.style_keywords?.length) themes.push(...phase1.style_keywords.map((k: string) => k.toLowerCase()))\n\n // Extract themes from goal and audience\n const goalWords = str(phase1?.goal)?.toLowerCase() || ''\n const audienceWords = str(phase1?.audience)?.toLowerCase() || ''\n\n if (goalWords.includes('verkoop') || goalWords.includes('omzet') || goalWords.includes('sales') || goalWords.includes('revenue')) themes.push('conversion-focused')\n if (goalWords.includes('vertrouwen') || goalWords.includes('betrouwbaar') || goalWords.includes('trust') || goalWords.includes('reliable')) themes.push('trustworthy')\n if (goalWords.includes('informatie') || goalWords.includes('educatie') || goalWords.includes('information') || goalWords.includes('education')) themes.push('informative')\n if (audienceWords.includes('zakelijk') || audienceWords.includes('b2b') || audienceWords.includes('business')) themes.push('professional')\n if (audienceWords.includes('jong') || audienceWords.includes('millennials') || audienceWords.includes('young')) themes.push('modern')\n\n return [...new Set(themes)].slice(0, 6)\n}\n\nconst getDesignMoodFromKeywords = (keywords: string[]): string => {\n const keywordLower = keywords.map(k => k.toLowerCase())\n\n if (keywordLower.some(k => ['minimalistisch', 'minimalist', 'clean', 'strak', 'sleek'].includes(k))) {\n return 'minimalist and sleek with plenty of whitespace, subtle animations, and a focus on typography'\n }\n if (keywordLower.some(k => ['luxe', 'luxury', 'premium', 'elegant'].includes(k))) {\n return 'luxurious and elegant with rich colors, refined typography, and high-quality visual elements'\n }\n if (keywordLower.some(k => ['speels', 'playful', 'creatief', 'creative', 'kleurrijk', 'colorful'].includes(k))) {\n return 'playful and creative with bold colors, unique layouts, and dynamic interactions'\n }\n if (keywordLower.some(k => ['professioneel', 'professional', 'zakelijk', 'business', 'corporate'].includes(k))) {\n return 'professional and business-like with a structured layout, trustworthy appearance, and clear hierarchy'\n }\n if (keywordLower.some(k => ['warm', 'vriendelijk', 'friendly', 'toegankelijk', 'accessible', 'welcoming'].includes(k))) {\n return 'warm and inviting with soft colors, rounded shapes, and personal accents'\n }\n if (keywordLower.some(k => ['modern', 'innovatief', 'innovative', 'tech'].includes(k))) {\n return 'modern and innovative with a cutting-edge design, glassmorphism effects, and interactive elements'\n }\n\n return 'professional and user-friendly with a modern appearance that fits the industry'\n}\n\nconst countTotalSections = (phase2: ProjectData['phase2']): number => {\n return phase2?.pages?.reduce((acc: number, page: PageDetail) => acc + (page.sections?.length || 0), 0) || 0\n}\n\nconst hasFeature = (phase2: ProjectData['phase2'], featureType: string): boolean => {\n return phase2?.pages?.some((page: PageDetail) =>\n page.features?.some((f: string) => f.toLowerCase().includes(featureType.toLowerCase()))\n ) || false\n}\n\nconst getProjectTypeLabel = (category: ProjectCategory | undefined): string => {\n const labels: Record<ProjectCategory, string> = {\n website: 'Website',\n saas: 'SaaS Application',\n mobile_app: 'Mobile App',\n ecommerce: 'E-commerce Store',\n api_backend: 'API / Backend',\n custom: 'Custom Project',\n }\n return labels[category || 'website'] || labels.website\n}\n\n/**\n * Generate a natural language prompt for AI website builders\n */\nexport const generateNaturalLanguagePrompt = (data: ProjectData): string => {\n const phase1 = data.phase1\n const phase2 = data.phase2\n\n if (!phase1) {\n return 'No data available for export.'\n }\n\n // Content analysis\n const keyThemes = extractKeyThemes(phase1)\n const designMood = getDesignMoodFromKeywords(phase1.style_keywords || [])\n const totalSections = countTotalSections(phase2)\n const allPages = [...(phase1.pages || []), ...(phase1.custom_pages || [])]\n\n let prompt = `# Website Specification: ${phase1.business_name}\\n\\n`\n\n // AI Builder Instructions\n prompt += `## 🤖 AI Website Builder Instructions\\n\\n`\n prompt += `> **IMPORTANT:** This is a production-ready website specification. Use your best design skills to build a visually distinctive, high-quality website that doesn't look like a standard template.\\n\\n`\n\n prompt += `### Core Assignment\\n\\n`\n prompt += `Build a complete, functional website for **${phase1.business_name}** in the **${phase1.industry}** sector. `\n prompt += `The website should ${phase1.is_ecommerce ? 'include e-commerce functionality and ' : ''}convert visitors into ${phase1.is_ecommerce ? 'buyers' : 'leads/customers'}.\\n\\n`\n\n prompt += `### Design Skill Activation\\n\\n`\n prompt += `**Use your frontend-design expertise for:**\\n`\n prompt += `- A unique, memorable visual identity that fits the industry\\n`\n prompt += `- Micro-interactions and subtle animations for a premium feel\\n`\n prompt += `- Creative section layouts that go beyond standard grid patterns\\n`\n prompt += `- Typography combinations that strengthen the brand character\\n`\n prompt += `- Color usage that evokes emotion and stimulates conversion\\n`\n prompt += `- Visual hierarchy that guides the visitor through the content\\n\\n`\n\n prompt += `**Design mood:** ${designMood}\\n\\n`\n\n if (keyThemes.length > 0) {\n prompt += `**Core themes to incorporate in design:** ${keyThemes.join(', ')}\\n\\n`\n }\n\n prompt += `---\\n\\n`\n\n // Project Context\n prompt += `## 📋 Project Context\\n\\n`\n\n prompt += `| Property | Value |\\n`\n prompt += `|----------|-------|\\n`\n prompt += `| **Company** | ${phase1.business_name} |\\n`\n prompt += `| **Industry** | ${phase1.industry} |\\n`\n prompt += `| **Type** | ${phase1.is_ecommerce ? 'E-commerce Website' : 'Informational Website'} |\\n`\n prompt += `| **Pages** | ${allPages.length} |\\n`\n prompt += `| **Sections** | ${totalSections} |\\n\\n`\n\n prompt += `### Business Goal\\n\\n`\n prompt += `${str(phase1.goal) || 'Not specified'}\\n\\n`\n\n prompt += `### Target Audience\\n\\n`\n prompt += `${str(phase1.audience) || 'Not specified'}\\n\\n`\n\n prompt += `---\\n\\n`\n\n // Design System\n prompt += `## 🎨 Design System\\n\\n`\n\n // Logo\n prompt += `### Branding\\n\\n`\n if (phase1.has_logo && phase1.logo_url) {\n prompt += `**Logo:** Available at ${phase1.logo_url}\\n`\n prompt += `- Integrate the logo prominently in the header\\n`\n prompt += `- Use logo colors as a starting point for the color scheme if no colors are specified\\n\\n`\n } else if (phase1.has_logo) {\n prompt += `**Logo:** Client has a logo (will be provided separately)\\n\\n`\n } else {\n prompt += `**Logo:** Not available - create a stylish text logo with the company name\\n\\n`\n }\n\n // Colors\n prompt += `### Color Palette\\n\\n`\n if (!phase1.colors?.no_idea && (phase1.colors?.primary || phase1.colors?.secondary || phase1.colors?.accent)) {\n prompt += `| Role | Color | Usage |\\n`\n prompt += `|------|-------|-------|\\n`\n if (phase1.colors.primary) {\n prompt += `| Primary | \\`${phase1.colors.primary}\\` | Main color for CTAs, links, important elements |\\n`\n }\n if (phase1.colors.secondary) {\n prompt += `| Secondary | \\`${phase1.colors.secondary}\\` | Backgrounds, secondary buttons, sections |\\n`\n }\n if (phase1.colors.accent) {\n prompt += `| Accent | \\`${phase1.colors.accent}\\` | Highlights, hover states, decorative elements |\\n`\n }\n prompt += `\\n`\n prompt += `**Derived colors:** Automatically generate tints (lighter) and shades (darker) of the above colors for a complete palette.\\n\\n`\n } else {\n prompt += `**No colors specified** - Choose a professional color palette that fits:\\n`\n prompt += `- Industry: ${phase1.industry}\\n`\n prompt += `- Style: ${phase1.style_keywords?.join(', ') || 'Professional and modern'}\\n`\n prompt += `- Target audience: ${str(phase1.audience)?.substring(0, 100) || 'General public'}\\n\\n`\n }\n\n // Style Keywords\n if (phase1.style_keywords?.length > 0) {\n prompt += `### Style Guidelines\\n\\n`\n prompt += `The website should radiate these keywords:\\n\\n`\n phase1.style_keywords.forEach((keyword: string) => {\n prompt += `- **${keyword}**\\n`\n })\n prompt += `\\n`\n }\n\n // Reference websites\n if (phase1.references?.length > 0) {\n prompt += `### Reference Websites\\n\\n`\n prompt += `Study these websites for inspiration:\\n\\n`\n phase1.references.forEach((ref: Reference, idx: number) => {\n prompt += `${idx + 1}. **${ref.url}**\\n`\n if (ref.notes) {\n prompt += ` - ${ref.notes}\\n`\n }\n })\n prompt += `\\n`\n }\n\n prompt += `---\\n\\n`\n\n // Website Structure\n prompt += `## 🗂️ Website Structure\\n\\n`\n\n prompt += `### Page Overview\\n\\n`\n allPages.forEach((page: string, idx: number) => {\n const displayName = getPageDisplayName(page)\n const pageDetail = phase2?.pages?.find((p: PageDetail) => p.name === page)\n const sectionCount = pageDetail?.sections?.length || 0\n prompt += `${idx + 1}. **${displayName}** - ${sectionCount} sections\\n`\n })\n prompt += `\\n`\n\n // Detailed page specifications\n if (phase2?.pages && phase2.pages.length > 0) {\n prompt += `### Detailed Page Specifications\\n\\n`\n\n phase2.pages.forEach((pageDetail: PageDetail) => {\n const displayName = getPageDisplayName(pageDetail.name)\n prompt += `#### 📄 ${displayName}\\n\\n`\n\n if (pageDetail.layout_type) {\n prompt += `**Layout type:** ${pageDetail.layout_type}\\n\\n`\n }\n\n if (pageDetail.sections && pageDetail.sections.length > 0) {\n pageDetail.sections.forEach((section: Section, idx: number) => {\n prompt += `**Section ${idx + 1}: ${section.type}**\\n\\n`\n\n if (str(section.title)) {\n prompt += `- Title: \"${str(section.title)}\"\\n`\n }\n\n if (str(section.content)) {\n const contentLength = analyzeContentLength(str(section.content))\n prompt += `- Content (${contentLength}): ${str(section.content)}\\n`\n }\n\n // Media items\n if (section.media && section.media.length > 0) {\n const mediaItems = section.media.filter((m: MediaInfo) => m.type !== 'none')\n if (mediaItems.length > 0) {\n prompt += `- Media:\\n`\n mediaItems.forEach((m: MediaInfo, mediaIdx: number) => {\n const descriptionText = str(m.description) || ''\n const altText = m.alt || descriptionText || `${str(section.title) || section.type} ${m.type} ${mediaIdx + 1}`\n prompt += ` - **${m.type}**: ${descriptionText || 'No description'}\\n`\n prompt += ` - Alt text: \"${altText}\"\\n`\n if (m.url) {\n prompt += ` - Source URL: ${m.url}\\n`\n }\n })\n }\n }\n\n // CTA buttons\n if (section.ctas && section.ctas.length > 0) {\n const ctaItems = section.ctas.filter((c: CTAInfo) => c.text)\n if (ctaItems.length > 0) {\n prompt += `- CTAs:\\n`\n ctaItems.forEach((ctaItem: CTAInfo) => {\n prompt += ` - \"${ctaItem.text}\" → ${ctaItem.action}`\n if (ctaItem.target) prompt += ` (${ctaItem.target})`\n prompt += `\\n`\n })\n }\n }\n\n prompt += `\\n`\n })\n }\n\n // Page features\n if (pageDetail.features && pageDetail.features.length > 0) {\n prompt += `**Features:** ${pageDetail.features.join(', ')}\\n\\n`\n }\n\n prompt += `---\\n\\n`\n })\n }\n\n // Media Assets\n const mediaAssets = collectAllMediaAssets(data)\n\n if (mediaAssets.length > 0) {\n prompt += `## 📁 Media Assets\\n\\n`\n\n prompt += `> **⚠️ IMPORTANT - Media Instructions:**\\n`\n prompt += `> The media URLs below are **temporary development URLs** and must NOT be used directly as sources in the production website.\\n`\n prompt += `>\\n`\n prompt += `> **Required action:**\\n`\n prompt += `> 1. **Download** all files below to your local environment\\n`\n prompt += `> 2. **Upload** the files to the project storage bucket (e.g., Supabase Storage, S3, or Cloudinary)\\n`\n prompt += `> 3. **Use** the new permanent URLs in the website code\\n`\n prompt += `> 4. If the end user needs to specify where files should be stored, ask them explicitly\\n`\n prompt += `>\\n`\n prompt += `> The temporary URLs expire and are not suitable for production use.\\n\\n`\n\n prompt += `### Media Files (${mediaAssets.length} total)\\n\\n`\n\n // Group by page for better readability\n const groupedByPage = mediaAssets.reduce((acc: Record<string, MediaAsset[]>, asset: MediaAsset) => {\n if (!acc[asset.pageName]) acc[asset.pageName] = []\n acc[asset.pageName]!.push(asset)\n return acc\n }, {} as Record<string, MediaAsset[]>)\n\n Object.entries(groupedByPage).forEach(([pageName, assets]: [string, MediaAsset[]]) => {\n prompt += `#### ${pageName}\\n\\n`\n assets.forEach((asset: MediaAsset, idx: number) => {\n prompt += `**${idx + 1}. ${asset.sectionTitle} - ${asset.mediaType}**\\n`\n prompt += `- **Source URL:** ${asset.url}\\n`\n prompt += `- **Alt text:** \"${asset.alt}\"\\n`\n if (asset.description) {\n prompt += `- **Description:** ${asset.description}\\n`\n }\n if (asset.fileName) {\n prompt += `- **Filename:** ${asset.fileName}\\n`\n }\n prompt += `\\n`\n })\n })\n\n prompt += `---\\n\\n`\n }\n\n // SEO Optimization\n prompt += `## 🔍 SEO Optimization\\n\\n`\n\n prompt += `Implement the following SEO best practices:\\n\\n`\n\n prompt += `### On-Page SEO\\n\\n`\n prompt += `- **Meta tags:** Unique title (50-60 characters) and description (150-160 characters) per page\\n`\n prompt += `- **Heading hierarchy:** Correct H1 → H6 structure, one H1 per page\\n`\n prompt += `- **Alt texts:** Descriptive alt texts for all images\\n`\n prompt += `- **URL structure:** Short, descriptive URLs with keywords (e.g., /services/webdesign)\\n`\n prompt += `- **Internal links:** Logical internal link structure between related pages\\n`\n prompt += `- **Keyword focus:** Optimize for \"${phase1.industry}\" and related search terms\\n\\n`\n\n prompt += `### Technical SEO\\n\\n`\n prompt += `- **Sitemap.xml:** Auto-generated sitemap with all public pages\\n`\n prompt += `- **Robots.txt:** Correct robots.txt that allows search engines\\n`\n prompt += `- **Canonical URLs:** Prevent duplicate content with canonical tags\\n`\n prompt += `- **Schema.org markup:** Add structured data (Organization, ${phase1.is_ecommerce ? 'Product, Offer, ' : ''}LocalBusiness if relevant)\\n`\n prompt += `- **Open Graph tags:** Social media preview optimization for Facebook, LinkedIn\\n`\n prompt += `- **Twitter Cards:** Twitter preview meta tags\\n\\n`\n\n prompt += `---\\n\\n`\n\n // Technical Requirements\n prompt += `## 🛠️ Technical Requirements\\n\\n`\n\n prompt += `### Core Requirements\\n\\n`\n prompt += `- **Responsive:** Mobile-first, perfect from 320px to 2560px+\\n`\n prompt += `- **Browsers:** Chrome, Firefox, Safari, Edge (last 2 versions)\\n`\n prompt += `- **Accessibility:** WCAG 2.1 Level AA compliant\\n`\n prompt += `- **Security:** HTTPS, secure headers, XSS/CSRF prevention\\n`\n prompt += `- **Privacy:** GDPR compliant, cookie consent banner\\n\\n`\n\n prompt += `### Element Identification (Required)\\n\\n`\n prompt += `**IMPORTANT:** Add unique \\`id\\` attributes to ALL significant HTML elements.\\n\\n`\n\n // Tracking & Analytics\n prompt += `### Tracking & Analytics\\n\\n`\n prompt += `Add the following script to the \\`<head>\\` of every page:\\n\\n`\n prompt += `\\`\\`\\`html\\n`\n prompt += `<script src=\"${FRAMED_SCRIPT_URL}\"></script>\\n`\n prompt += `\\`\\`\\`\\n\\n`\n\n prompt += `---\\n\\n`\n\n // Deliverables\n prompt += `## 📦 Deliverables Checklist\\n\\n`\n\n prompt += `Upon completion, the website must include:\\n\\n`\n prompt += `- [ ] All ${allPages.length} pages fully built and filled\\n`\n prompt += `- [ ] Responsive design tested on mobile, tablet, and desktop\\n`\n prompt += `- [ ] SEO basics implemented (meta tags, sitemap, robots.txt)\\n`\n prompt += `- [ ] Performance optimized (PageSpeed score > 90)\\n`\n prompt += `- [ ] Accessibility tested (no critical issues)\\n`\n prompt += `- [ ] All forms working with validation\\n`\n prompt += `- [ ] Cookie consent banner implemented\\n`\n prompt += `- [ ] Framed.dev feedback script integrated\\n`\n prompt += `- [ ] Unique id attributes on all HTML elements\\n`\n prompt += `- [ ] Favicon and social media preview images\\n`\n prompt += `- [ ] 404 page\\n`\n if (mediaAssets.length > 0) {\n prompt += `- [ ] All ${mediaAssets.length} media files downloaded and uploaded to permanent storage\\n`\n }\n if (phase1.is_ecommerce) {\n prompt += `- [ ] E-commerce checkout flow working\\n`\n prompt += `- [ ] Payment integration configured (test mode)\\n`\n }\n prompt += `\\n`\n\n prompt += `---\\n\\n`\n\n // Footer\n prompt += `## 📝 Metadata\\n\\n`\n prompt += `| Field | Value |\\n`\n prompt += `|-------|-------|\\n`\n prompt += `| Project | ${phase1.business_name} |\\n`\n prompt += `| Generated | ${new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })} |\\n`\n prompt += `| Specification version | 2.0 |\\n`\n prompt += `| Generator | WebBuilder Discovery Wizard |\\n\\n`\n\n prompt += `---\\n\\n`\n prompt += `*This document was automatically generated based on the client requirements from the discovery process. For questions or changes, contact the project team.*\\n`\n\n return prompt\n}\n\n/**\n * Generate JSON export for programmatic use\n */\nexport const generateJSONExport = (data: ProjectData): Record<string, unknown> => {\n const mediaAssets = collectAllMediaAssets(data)\n\n return {\n metadata: {\n version: '2.0',\n generatedAt: new Date().toISOString(),\n exportType: 'website-specification',\n },\n project: {\n businessName: data.phase1?.business_name || '',\n industry: data.phase1?.industry || '',\n isEcommerce: data.phase1?.is_ecommerce || false,\n goal: data.phase1?.goal || '',\n audience: data.phase1?.audience || '',\n },\n branding: {\n hasLogo: data.phase1?.has_logo || false,\n logoUrl: data.phase1?.logo_url || null,\n colors: {\n primary: data.phase1?.colors?.primary || null,\n secondary: data.phase1?.colors?.secondary || null,\n accent: data.phase1?.colors?.accent || null,\n },\n styleKeywords: data.phase1?.style_keywords || [],\n },\n structure: {\n pages: [...(data.phase1?.pages || []), ...(data.phase1?.custom_pages || [])],\n },\n pageDetails: data.phase2?.pages?.map((page: PageDetail) => ({\n name: page.name,\n displayName: getPageDisplayName(page.name),\n layoutType: page.layout_type,\n sections: page.sections?.map((section: Section) => ({\n type: section.type,\n title: section.title,\n content: section.content,\n })),\n })) || [],\n mediaAssets: {\n totalCount: mediaAssets.length,\n items: mediaAssets,\n },\n }\n}\n\n/**\n * Generate a short prompt (max 1000 characters) for AI builders with limited input\n */\nexport const generateShortPrompt = (data: Phase1Data, isNl = false): string => {\n const parts: string[] = []\n const projectType = getProjectTypeLabel(data.project_category)\n const screenLabel = data.project_category ? getScreenTypeLabel(data.project_category, true) : 'Pages'\n\n // Project header (essential)\n if (data.business_name) {\n parts.push(`Build a ${projectType} for ${data.business_name}${data.industry ? ` (${data.industry})` : ''}.`)\n } else if (data.ai_conversation?.project_idea) {\n parts.push(`Build a ${projectType}: ${data.ai_conversation.project_idea.slice(0, 150)}${data.ai_conversation.project_idea.length > 150 ? '...' : ''}`)\n } else {\n parts.push(`Build a ${projectType}.`)\n }\n\n // Goal (if available and short enough)\n const goal = str(data.goal)\n if (goal && goal.length < 100) {\n parts.push(`Goal: ${goal}`)\n }\n\n // Pages/Screens (essential structure)\n const allPages = [...(data.pages || []), ...(data.custom_pages || [])]\n if (allPages.length > 0) {\n const pageNames = allPages.slice(0, 6).map(p => data.page_names?.[p] || getPageDisplayName(p))\n parts.push(`${screenLabel}: ${pageNames.join(', ')}${allPages.length > 6 ? ` (+${allPages.length - 6} more)` : ''}.`)\n }\n\n // Style keywords (if available)\n if (data.style_keywords && data.style_keywords.length > 0) {\n parts.push(`Style: ${data.style_keywords.slice(0, 4).join(', ')}.`)\n }\n\n // Core features from AI detection\n if (data.ai_conversation?.detected_features && data.ai_conversation.detected_features.length > 0) {\n const features = data.ai_conversation.detected_features.slice(0, 4).map(f => f.replace(/_/g, ' '))\n parts.push(`Features: ${features.join(', ')}.`)\n }\n\n // Essential requirements\n parts.push('Requirements: responsive, mobile-first, WCAG 2.1 AA accessible, unique id attributes on all HTML elements.')\n\n // Framed script integration (always include)\n parts.push(`Add <script src=\"${FRAMED_SCRIPT_URL}\"></script> to head.`)\n\n // Join and truncate to 1000 chars\n let prompt = parts.join(' ')\n if (prompt.length > 1000) {\n prompt = prompt.slice(0, 997) + '...'\n }\n\n return prompt\n}\n\n/**\n * Collect all media URLs from project\n */\nexport const collectProjectMedia = (data: ProjectData): string[] => {\n const mediaUrls: string[] = []\n\n // Logo\n if (data.phase1?.logo_url) {\n mediaUrls.push(data.phase1.logo_url)\n }\n\n // Page section media\n data.phase2?.pages?.forEach((page: PageDetail) => {\n page.sections?.forEach((section: Section) => {\n if (section.media && Array.isArray(section.media)) {\n section.media.forEach((mediaItem: MediaInfo) => {\n if (mediaItem.url) {\n mediaUrls.push(mediaItem.url)\n }\n })\n }\n })\n })\n\n return mediaUrls\n}\n\n/**\n * Generate planning section for project\n * Stub - full implementation in framed-app\n */\nexport const generatePlanningSection = (data: Phase1Data, isNl = false): string => {\n console.warn('[generatePlanningSection] Not fully implemented in widget-core')\n const projectType = getProjectTypeLabel(data.project_category)\n return isNl\n ? `# Planningssectie\\n\\n${projectType} voor ${data.business_name || 'Onbekend project'}`\n : `# Planning Section\\n\\n${projectType} for ${data.business_name || 'Unknown project'}`\n}\n\n/**\n * Generate project instructions markdown\n * Stub - full implementation in framed-app\n */\nexport const generateProjectInstructionsMd = (data: Phase1Data, isNl = false): string => {\n console.warn('[generateProjectInstructionsMd] Not fully implemented in widget-core')\n const projectType = getProjectTypeLabel(data.project_category)\n return isNl\n ? `# Project Instructies\\n\\n${projectType} voor ${data.business_name || 'Onbekend project'}`\n : `# Project Instructions\\n\\n${projectType} for ${data.business_name || 'Unknown project'}`\n}\n\n/**\n * Enhanced prompt response from AI enhancement\n */\nexport interface EnhancedPromptResponse {\n enhanced_prompt: string\n planning_section: string\n project_instructions_md: string\n error?: string\n}\n","/**\n * Text diff utilities\n *\n * Provides word-level diff computation for text comparison.\n * Used by CompactDiff component and text editing features.\n */\n\n// Re-export from diff library if available, otherwise provide fallback\nexport interface DiffPart {\n value: string\n added?: boolean\n removed?: boolean\n}\n\n/**\n * Simple word-level diff implementation\n * For production, consider using the 'diff' npm package\n */\nexport function computeTextDiff(original: string, current: string): DiffPart[] {\n // Simple word-based diff (for complex diffs, use 'diff' library)\n const originalWords = original.split(/(\\s+)/)\n const currentWords = current.split(/(\\s+)/)\n\n const result: DiffPart[] = []\n\n // Use longest common subsequence approach\n const lcs = longestCommonSubsequence(originalWords, currentWords)\n\n let origIdx = 0\n let currIdx = 0\n let lcsIdx = 0\n\n while (origIdx < originalWords.length || currIdx < currentWords.length) {\n const origWord = originalWords[origIdx]\n const currWord = currentWords[currIdx]\n const lcsWord = lcs[lcsIdx]\n\n if (lcsIdx < lcs.length && origWord === lcsWord && currWord === lcsWord) {\n // Common word\n result.push({ value: origWord! })\n origIdx++\n currIdx++\n lcsIdx++\n } else {\n // Find how many words to mark as removed/added before next common word\n const nextLcsWord = lcsWord\n\n // Removed words\n while (origIdx < originalWords.length && originalWords[origIdx] !== nextLcsWord) {\n result.push({ value: originalWords[origIdx]!, removed: true })\n origIdx++\n }\n\n // Added words\n while (currIdx < currentWords.length && currentWords[currIdx] !== nextLcsWord) {\n result.push({ value: currentWords[currIdx]!, added: true })\n currIdx++\n }\n }\n }\n\n return result\n}\n\n/**\n * Find longest common subsequence of two arrays\n */\nfunction longestCommonSubsequence(a: string[], b: string[]): string[] {\n const m = a.length\n const n = b.length\n const dp: number[][] = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0))\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i]![j] = dp[i - 1]![j - 1]! + 1\n } else {\n dp[i]![j] = Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!)\n }\n }\n }\n\n // Backtrack to find the actual subsequence\n const result: string[] = []\n let i = m\n let j = n\n\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n result.unshift(a[i - 1]!)\n i--\n j--\n } else if (dp[i - 1]![j]! > dp[i]![j - 1]!) {\n i--\n } else {\n j--\n }\n }\n\n return result\n}\n","/**\n * Text content utilities for managing page text edits\n * Pure functions for content manipulation - no API calls\n *\n * Source: framed-app/src/services/textContentService.ts (pure functions only)\n */\n\nimport {\n ContentBlock,\n ContentSection,\n TextEdit,\n LanguageContent,\n PageTextContent\n} from '../phases/phase4'\nimport type { UserRole } from '../entities'\n\n// ============================================\n// Constants\n// ============================================\n\n// Language display names\nexport const LANGUAGE_LABELS: Record<string, string> = {\n nl: 'Nederlands',\n en: 'English',\n de: 'Deutsch',\n fr: 'Français',\n es: 'Español',\n it: 'Italiano',\n pt: 'Português',\n unknown: 'Unknown'\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface ExportedChange {\n sectionName: string\n blockType: string\n tagName: string\n original: string\n updated: string\n editCount: number\n lastEditedBy: string\n lastEditedAt: string\n}\n\nexport interface TextChangesExport {\n pageUrl: string\n language: string\n crawledAt: string\n exportedAt: string\n totalBlocks: number\n changedBlocks: number\n changes: ExportedChange[]\n}\n\n// ============================================\n// Content Management Functions\n// ============================================\n\n/**\n * Add or update language content in PageTextContent\n */\nexport function addLanguageContent(\n textContent: PageTextContent | undefined,\n pageUrl: string,\n languageContent: LanguageContent\n): PageTextContent {\n // Handle undefined or old data format without languages\n if (!textContent || !textContent.languages) {\n return {\n pageUrl,\n languages: {\n [languageContent.language]: languageContent\n },\n primaryLanguage: languageContent.language,\n version: 1\n }\n }\n\n return {\n ...textContent,\n languages: {\n ...textContent.languages,\n [languageContent.language]: languageContent\n },\n version: (textContent.version || 0) + 1\n }\n}\n\n// ============================================\n// Edit Functions\n// ============================================\n\n/**\n * Apply a text edit to a block and return updated content\n */\nexport function applyBlockEdit(\n textContent: PageTextContent,\n language: string,\n sectionId: string,\n blockId: string,\n newContent: string,\n userId: string,\n userName: string,\n userRole: UserRole,\n comment?: string\n): PageTextContent {\n const langContent = textContent.languages[language]\n if (!langContent) return textContent\n\n // Find the block\n let foundBlock: ContentBlock | undefined\n let foundSection: ContentSection | undefined\n\n for (const section of langContent.sections) {\n if (section.id === sectionId) {\n foundSection = section\n foundBlock = section.blocks.find(b => b.id === blockId)\n break\n }\n }\n\n if (!foundBlock || !foundSection) return textContent\n if (foundBlock.currentContent === newContent) return textContent\n\n const edit: TextEdit = {\n id: generateId(),\n blockId,\n sectionId,\n previousContent: foundBlock.currentContent,\n newContent,\n editedAt: new Date().toISOString(),\n editedBy: userId,\n editedByName: userName,\n editedByRole: userRole,\n editType: 'modify',\n comment\n }\n\n // Update the block\n const updatedSections = langContent.sections.map(section => {\n if (section.id !== sectionId) return section\n return {\n ...section,\n blocks: section.blocks.map(block => {\n if (block.id !== blockId) return block\n return { ...block, currentContent: newContent }\n })\n }\n })\n\n return {\n ...textContent,\n languages: {\n ...textContent.languages,\n [language]: {\n ...langContent,\n sections: updatedSections,\n editHistory: [...langContent.editHistory, edit]\n }\n }\n }\n}\n\n/**\n * Apply list items edit\n */\nexport function applyListEdit(\n textContent: PageTextContent,\n language: string,\n sectionId: string,\n blockId: string,\n newItems: string[],\n userId: string,\n userName: string,\n userRole: UserRole,\n comment?: string\n): PageTextContent {\n const langContent = textContent.languages[language]\n if (!langContent) return textContent\n\n let foundBlock: ContentBlock | undefined\n\n for (const section of langContent.sections) {\n if (section.id === sectionId) {\n foundBlock = section.blocks.find(b => b.id === blockId)\n break\n }\n }\n\n if (!foundBlock || foundBlock.type !== 'list') return textContent\n\n const previousContent = foundBlock.currentItems?.join('\\n') || foundBlock.items?.join('\\n') || ''\n const newContent = newItems.join('\\n')\n\n if (previousContent === newContent) return textContent\n\n const edit: TextEdit = {\n id: generateId(),\n blockId,\n sectionId,\n previousContent,\n newContent,\n editedAt: new Date().toISOString(),\n editedBy: userId,\n editedByName: userName,\n editedByRole: userRole,\n editType: 'modify',\n comment\n }\n\n const updatedSections = langContent.sections.map(section => {\n if (section.id !== sectionId) return section\n return {\n ...section,\n blocks: section.blocks.map(block => {\n if (block.id !== blockId) return block\n return {\n ...block,\n currentContent: newContent,\n currentItems: newItems\n }\n })\n }\n })\n\n return {\n ...textContent,\n languages: {\n ...textContent.languages,\n [language]: {\n ...langContent,\n sections: updatedSections,\n editHistory: [...langContent.editHistory, edit]\n }\n }\n }\n}\n\n/**\n * Restore block to original content\n */\nexport function restoreBlockToOriginal(\n textContent: PageTextContent,\n language: string,\n sectionId: string,\n blockId: string,\n userId: string,\n userName: string,\n userRole: UserRole\n): PageTextContent {\n const langContent = textContent.languages[language]\n if (!langContent) return textContent\n\n let foundBlock: ContentBlock | undefined\n\n for (const section of langContent.sections) {\n if (section.id === sectionId) {\n foundBlock = section.blocks.find(b => b.id === blockId)\n break\n }\n }\n\n if (!foundBlock) return textContent\n if (foundBlock.currentContent === foundBlock.originalContent) return textContent\n\n const edit: TextEdit = {\n id: generateId(),\n blockId,\n sectionId,\n previousContent: foundBlock.currentContent,\n newContent: foundBlock.originalContent,\n editedAt: new Date().toISOString(),\n editedBy: userId,\n editedByName: userName,\n editedByRole: userRole,\n editType: 'restore'\n }\n\n const updatedSections = langContent.sections.map(section => {\n if (section.id !== sectionId) return section\n return {\n ...section,\n blocks: section.blocks.map(block => {\n if (block.id !== blockId) return block\n return {\n ...block,\n currentContent: block.originalContent,\n currentItems: block.items ? [...block.items] : undefined\n }\n })\n }\n })\n\n return {\n ...textContent,\n languages: {\n ...textContent.languages,\n [language]: {\n ...langContent,\n sections: updatedSections,\n editHistory: [...langContent.editHistory, edit]\n }\n }\n }\n}\n\n// ============================================\n// Block Analysis Functions\n// ============================================\n\n/**\n * Check if block has been modified\n */\nexport function isBlockModified(block: ContentBlock): boolean {\n if (block.type === 'list') {\n const original = block.items?.join('\\n') || ''\n const current = block.currentItems?.join('\\n') || block.currentContent\n return original !== current\n }\n return block.originalContent !== block.currentContent\n}\n\n/**\n * Get count of modified blocks in a language\n */\nexport function getModifiedCount(langContent: LanguageContent): number {\n let count = 0\n for (const section of langContent.sections) {\n for (const block of section.blocks) {\n if (isBlockModified(block)) count++\n }\n }\n return count\n}\n\n/**\n * Get total block count\n */\nexport function getTotalBlockCount(langContent: LanguageContent): number {\n return langContent.sections.reduce((sum, s) => sum + s.blocks.length, 0)\n}\n\n// ============================================\n// History Functions\n// ============================================\n\n/**\n * Get edit history for specific block\n */\nexport function getBlockHistory(langContent: LanguageContent, blockId: string): TextEdit[] {\n return langContent.editHistory.filter(edit => edit.blockId === blockId)\n}\n\n/**\n * Get recent edits across all blocks\n */\nexport function getRecentEdits(langContent: LanguageContent, limit: number = 10): TextEdit[] {\n return [...langContent.editHistory]\n .sort((a, b) => new Date(b.editedAt).getTime() - new Date(a.editedAt).getTime())\n .slice(0, limit)\n}\n\n// ============================================\n// Export Functions\n// ============================================\n\n/**\n * Export changes for developer handoff\n */\nexport function exportTextChanges(\n textContent: PageTextContent,\n language: string\n): TextChangesExport | null {\n const langContent = textContent.languages[language]\n if (!langContent) return null\n\n const changes: ExportedChange[] = []\n\n for (const section of langContent.sections) {\n for (const block of section.blocks) {\n if (isBlockModified(block)) {\n const history = getBlockHistory(langContent, block.id)\n const lastEdit = history[history.length - 1]\n\n changes.push({\n sectionName: section.name,\n blockType: block.type,\n tagName: block.tagName,\n original: block.originalContent,\n updated: block.currentContent,\n editCount: history.length,\n lastEditedBy: lastEdit?.editedByName || 'Unknown',\n lastEditedAt: lastEdit?.editedAt || langContent.crawledAt\n })\n }\n }\n }\n\n return {\n pageUrl: textContent.pageUrl,\n language,\n crawledAt: langContent.crawledAt,\n exportedAt: new Date().toISOString(),\n totalBlocks: getTotalBlockCount(langContent),\n changedBlocks: changes.length,\n changes\n }\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Get available languages for a page's text content\n */\nexport function getTextContentLanguages(textContent: PageTextContent | undefined): string[] {\n if (!textContent || !textContent.languages) return []\n return Object.keys(textContent.languages)\n}\n\n/**\n * Get language label for display\n */\nexport function getLanguageLabel(code: string): string {\n return LANGUAGE_LABELS[code] || code.toUpperCase()\n}\n\n/**\n * Format relative time (e.g., \"2 hours ago\")\n */\nexport function formatRelativeTime(dateString: string): string {\n const date = new Date(dateString)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'Zojuist'\n if (diffMins < 60) return `${diffMins} min geleden`\n if (diffHours < 24) return `${diffHours} uur geleden`\n if (diffDays < 7) return `${diffDays} dagen geleden`\n\n return date.toLocaleDateString('nl-NL', {\n day: 'numeric',\n month: 'short',\n year: diffDays > 365 ? 'numeric' : undefined\n })\n}\n","/**\n * Screenshot/scraping utility functions\n * Pure functions only - no API calls\n *\n * Source: framed-app/src/services/screenshotService.ts (pure functions only)\n */\n\n// ============================================\n// URL Utilities\n// ============================================\n\n/**\n * Convert URL to friendly page name (fallback when title can't be fetched)\n * Example: https://example.com/about-us -> About Us\n */\nexport function generatePageName(url: string): string {\n try {\n const urlObj = new URL(url)\n let path = urlObj.pathname\n\n // Remove leading/trailing slashes\n path = path.replace(/^\\/|\\/$/g, '')\n\n // If empty (homepage), return \"Home\"\n if (!path) return 'Home'\n\n // Remove common file extensions\n path = path.replace(/\\.(html|htm|php|asp|aspx)$/i, '')\n\n // Split by / and take the last segment (or use the whole path if you want)\n const segments = path.split('/')\n const lastSegment = segments[segments.length - 1] || path\n\n // Convert dashes/underscores to spaces and capitalize words\n const name = lastSegment\n .replace(/[-_]/g, ' ')\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n\n return name || 'Page'\n } catch (error) {\n console.error('Error generating page name:', error)\n return 'Page'\n }\n}\n\n// ============================================\n// Sitemap Parsing\n// ============================================\n\n/**\n * Parse sitemap XML and extract page URLs\n * Note: Uses browser DOMParser API\n */\nexport function parseSitemapXML(xmlText: string): string[] {\n const parser = new DOMParser()\n const xmlDoc = parser.parseFromString(xmlText, 'text/xml')\n\n // Check for parsing errors\n const parserError = xmlDoc.querySelector('parsererror')\n if (parserError) {\n console.error('XML parsing error:', parserError.textContent)\n return []\n }\n\n // Extract URLs from <loc> tags\n const locElements = xmlDoc.querySelectorAll('loc')\n const urls: string[] = []\n\n locElements.forEach((loc) => {\n const url = loc.textContent?.trim()\n if (url) {\n // Skip XML files (sitemaps, sitemap indexes, etc.)\n if (url.endsWith('.xml')) {\n return\n }\n\n // Only add actual page URLs\n urls.push(url)\n }\n })\n\n return urls\n}\n\n// ============================================\n// Phase 1 Data Generation\n// ============================================\n\n/**\n * Generate minimal Phase 1 data for review-only projects\n */\nexport function generateMinimalPhase1Data(businessName: string, pageNames: string[]) {\n return {\n business_name: businessName,\n industry: '',\n goal: '',\n audience: '',\n is_ecommerce: false,\n pages: pageNames.filter(name => ['Home', 'About', 'Contact', 'Services'].includes(name)),\n custom_pages: pageNames.filter(name => !['Home', 'About', 'Contact', 'Services'].includes(name)),\n page_content: {},\n legal_content_preference: 'not_sure' as const,\n has_logo: false,\n logo_url: null,\n colors: {\n primary: null,\n secondary: null,\n accent: null,\n no_idea: true\n },\n font: {\n primary: null,\n secondary: null,\n custom_fonts: [],\n no_idea: true\n },\n style_keywords: [],\n references: []\n }\n}\n","/**\n * SEO audit utility functions\n * Pure functions for parsing and scoring - no API calls\n *\n * Source: framed-app/src/services/seoService.ts (pure functions only)\n */\n\nimport type { SeoAuditResult } from '../entities'\n\n// ============================================\n// Apify Result Parsing\n// ============================================\n\n/**\n * Parse Apify SEO audit results into our format\n */\nexport const parseApifyResults = (apifyResults: any[]): SeoAuditResult[] => {\n if (!Array.isArray(apifyResults)) return []\n\n return apifyResults.map((item: any) => {\n const issues: SeoAuditResult['issues'] = []\n\n // Extract issues from various Apify result fields\n if (item.seoResults) {\n // Parse SEO issues\n Object.entries(item.seoResults).forEach(([key, value]: [string, any]) => {\n if (value?.status === 'error' || value?.status === 'warning') {\n issues.push({\n type: value.status === 'error' ? 'error' : 'warning',\n category: 'SEO',\n title: formatIssueTitle(key),\n description: value.message || value.description || '',\n impact: value.status === 'error' ? 'serious' : 'moderate'\n })\n }\n })\n }\n\n // Parse meta issues\n if (item.metaData) {\n if (!item.metaData.title) {\n issues.push({\n type: 'error',\n category: 'Meta',\n title: 'Missing Page Title',\n description: 'The page is missing a title tag, which is important for SEO and user experience.',\n impact: 'critical'\n })\n } else if (item.metaData.title.length > 60) {\n issues.push({\n type: 'warning',\n category: 'Meta',\n title: 'Title Too Long',\n description: `Title is ${item.metaData.title.length} characters. Keep it under 60 for optimal display in search results.`,\n impact: 'minor'\n })\n }\n\n if (!item.metaData.description) {\n issues.push({\n type: 'error',\n category: 'Meta',\n title: 'Missing Meta Description',\n description: 'The page is missing a meta description, which is important for search engine results.',\n impact: 'serious'\n })\n } else if (item.metaData.description.length > 160) {\n issues.push({\n type: 'warning',\n category: 'Meta',\n title: 'Meta Description Too Long',\n description: `Meta description is ${item.metaData.description.length} characters. Keep it under 160 for optimal display.`,\n impact: 'minor'\n })\n }\n }\n\n // Parse heading issues\n if (item.headings) {\n if (!item.headings.h1 || item.headings.h1.length === 0) {\n issues.push({\n type: 'error',\n category: 'Content',\n title: 'Missing H1 Heading',\n description: 'The page is missing an H1 heading, which is important for SEO and content structure.',\n impact: 'serious'\n })\n } else if (item.headings.h1.length > 1) {\n issues.push({\n type: 'warning',\n category: 'Content',\n title: 'Multiple H1 Headings',\n description: `Found ${item.headings.h1.length} H1 headings. Best practice is to have only one H1 per page.`,\n impact: 'moderate'\n })\n }\n }\n\n // Parse link issues\n if (item.links) {\n const brokenLinks = item.links.filter((l: any) => l.status >= 400)\n if (brokenLinks.length > 0) {\n issues.push({\n type: 'error',\n category: 'Links',\n title: `${brokenLinks.length} Broken Link(s) Found`,\n description: 'Broken links negatively impact user experience and SEO.',\n impact: 'serious'\n })\n }\n }\n\n // Parse image issues\n if (item.images) {\n const missingAlt = item.images.filter((img: any) => !img.alt)\n if (missingAlt.length > 0) {\n issues.push({\n type: 'warning',\n category: 'Accessibility',\n title: `${missingAlt.length} Image(s) Missing Alt Text`,\n description: 'Alt text is important for accessibility and SEO.',\n impact: 'moderate'\n })\n }\n }\n\n // Parse performance/technical issues\n if (item.performance) {\n if (item.performance.loadTime > 3000) {\n issues.push({\n type: 'warning',\n category: 'Performance',\n title: 'Slow Page Load Time',\n description: `Page load time is ${(item.performance.loadTime / 1000).toFixed(2)}s. Aim for under 3 seconds.`,\n impact: 'moderate'\n })\n }\n }\n\n // Calculate scores\n const scores = calculateScores(issues, item)\n\n return {\n url: item.url || item.pageUrl || '',\n title: item.metaData?.title || item.title,\n metaDescription: item.metaData?.description || item.metaDescription,\n h1: item.headings?.h1 || [],\n canonicalUrl: item.canonical || item.canonicalUrl,\n robotsDirectives: item.robots ? [item.robots] : [],\n issues,\n scores,\n pageData: item\n }\n })\n}\n\n// ============================================\n// Formatting Utilities\n// ============================================\n\n/**\n * Format issue title from camelCase key\n */\nexport const formatIssueTitle = (key: string): string => {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (str) => str.toUpperCase())\n .trim()\n}\n\n// ============================================\n// Score Calculation\n// ============================================\n\n/**\n * Calculate SEO scores based on issues\n */\nexport const calculateScores = (issues: SeoAuditResult['issues'], rawData: any): SeoAuditResult['scores'] => {\n // If Apify provides scores, use those\n if (rawData.scores) {\n return rawData.scores\n }\n\n // Otherwise calculate based on issues\n let overall = 100\n let content = 100\n let technical = 100\n\n issues.forEach(issue => {\n const penalty = issue.impact === 'critical' ? 20 :\n issue.impact === 'serious' ? 15 :\n issue.impact === 'moderate' ? 10 : 5\n\n overall -= penalty\n\n if (['Content', 'Meta'].includes(issue.category)) {\n content -= penalty\n }\n if (['Performance', 'Links', 'Technical'].includes(issue.category)) {\n technical -= penalty\n }\n })\n\n return {\n overall: Math.max(0, overall),\n content: Math.max(0, content),\n technical: Math.max(0, technical)\n }\n}\n","/**\n * Performance analysis utility functions\n * Pure functions for parsing and formatting - no API calls\n *\n * Source: framed-app/src/services/performanceService.ts (pure functions only)\n */\n\nimport type {\n PerformanceReport,\n PerformanceMetrics,\n PerformanceAudit,\n PerformanceOpportunity\n} from '../entities'\n\n// ============================================\n// Types\n// ============================================\n\ninterface PageSpeedResponse {\n lighthouseResult: {\n categories: {\n performance: { score: number }\n accessibility: { score: number }\n 'best-practices': { score: number }\n seo: { score: number }\n }\n audits: Record<string, any>\n lighthouseVersion: string\n }\n analysisUTCTimestamp: string\n}\n\n// ============================================\n// Response Parsing\n// ============================================\n\n/**\n * Parse PageSpeed Insights response into our format\n */\nexport const parsePageSpeedResponse = (\n data: PageSpeedResponse,\n url: string,\n strategy: 'mobile' | 'desktop'\n): PerformanceReport => {\n const { lighthouseResult } = data\n const { categories, audits } = lighthouseResult\n\n // Extract metrics\n const metrics: PerformanceMetrics = {\n performance: Math.round((categories.performance?.score || 0) * 100),\n accessibility: Math.round((categories.accessibility?.score || 0) * 100),\n bestPractices: Math.round((categories['best-practices']?.score || 0) * 100),\n seo: Math.round((categories.seo?.score || 0) * 100),\n firstContentfulPaint: audits['first-contentful-paint']?.numericValue || 0,\n largestContentfulPaint: audits['largest-contentful-paint']?.numericValue || 0,\n totalBlockingTime: audits['total-blocking-time']?.numericValue || 0,\n cumulativeLayoutShift: audits['cumulative-layout-shift']?.numericValue || 0,\n speedIndex: audits['speed-index']?.numericValue || 0,\n }\n\n // Extract opportunities (things that can be improved)\n const opportunities: PerformanceOpportunity[] = Object.entries(audits)\n .filter(([_, audit]: [string, any]) =>\n audit.details?.type === 'opportunity' && audit.score !== null && audit.score < 1\n )\n .map(([id, audit]: [string, any]) => ({\n id,\n title: audit.title,\n description: audit.description,\n score: audit.score,\n scoreDisplayMode: audit.scoreDisplayMode,\n displayValue: audit.displayValue,\n numericValue: audit.numericValue,\n numericUnit: audit.numericUnit,\n details: audit.details,\n overallSavingsMs: audit.details?.overallSavingsMs,\n overallSavingsBytes: audit.details?.overallSavingsBytes,\n }))\n .sort((a, b) => (b.overallSavingsMs || 0) - (a.overallSavingsMs || 0))\n\n // Extract diagnostics (informational items)\n const diagnostics: PerformanceAudit[] = Object.entries(audits)\n .filter(([_, audit]: [string, any]) =>\n audit.details?.type === 'debugdata' ||\n (audit.scoreDisplayMode === 'informative' && audit.score !== null)\n )\n .map(([id, audit]: [string, any]) => ({\n id,\n title: audit.title,\n description: audit.description,\n score: audit.score,\n scoreDisplayMode: audit.scoreDisplayMode,\n displayValue: audit.displayValue,\n numericValue: audit.numericValue,\n numericUnit: audit.numericUnit,\n details: audit.details,\n }))\n\n // Extract all audits for reference\n const allAudits: PerformanceAudit[] = Object.entries(audits)\n .map(([id, audit]: [string, any]) => ({\n id,\n title: audit.title,\n description: audit.description,\n score: audit.score,\n scoreDisplayMode: audit.scoreDisplayMode,\n displayValue: audit.displayValue,\n numericValue: audit.numericValue,\n numericUnit: audit.numericUnit,\n details: audit.details,\n }))\n\n return {\n id: '', // Will be set when saved to database\n projectId: '', // Will be set when saved\n pageName: '', // Will be set when saved\n pageUrl: url,\n strategy,\n metrics,\n audits: allAudits,\n opportunities,\n diagnostics,\n fetchTime: data.analysisUTCTimestamp,\n lighthouseVersion: lighthouseResult.lighthouseVersion,\n rawData: data,\n }\n}\n\n// ============================================\n// Formatters\n// ============================================\n\n/**\n * Format milliseconds to human-readable time\n */\nexport const formatMs = (ms: number): string => {\n if (ms < 1000) return `${Math.round(ms)}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * Format bytes to human-readable size\n */\nexport const formatBytes = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`\n}\n\n// ============================================\n// Score Utilities\n// ============================================\n\n/**\n * Get color class based on score\n */\nexport const getScoreColor = (score: number): string => {\n if (score >= 90) return 'text-green-600'\n if (score >= 50) return 'text-orange-600'\n return 'text-red-600'\n}\n\n/**\n * Get background color class based on score\n */\nexport const getScoreBgColor = (score: number): string => {\n if (score >= 90) return 'bg-green-100'\n if (score >= 50) return 'bg-orange-100'\n return 'bg-red-100'\n}\n","/**\n * Generate instruction text for maintenance items\n *\n * Creates concise, AI-friendly instructions that can be copied to clipboard\n * for use with tools like Claude, Cursor, etc.\n */\n\nimport type { MaintenanceItem, MaintenanceQuote } from '../phases/phase5'\n\n// Pure label lookups (no Lucide icon dependencies)\nconst CATEGORY_LABELS: Record<string, string> = {\n bug_fix: 'Bug Fix',\n performance: 'Performance',\n security: 'Security',\n content_update: 'Content',\n design_tweak: 'Design',\n new_feature: 'Feature',\n new_section: 'Section',\n new_page: 'Page',\n campaign: 'Campaign',\n seo: 'SEO',\n accessibility: 'Accessibility',\n technical_debt: 'Tech Debt',\n other: 'Other'\n}\n\nconst PRIORITY_LABELS: Record<string, string> = {\n critical: 'Critical',\n high: 'High',\n medium: 'Medium',\n low: 'Low'\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n backlog: 'Backlog',\n scheduled: 'Scheduled',\n in_progress: 'In Progress',\n review: 'Review',\n completed: 'Completed',\n wont_fix: \"Won't Fix\"\n}\n\nexport interface GenerateInstructionOptions {\n item: MaintenanceItem & { quote?: MaintenanceQuote }\n projectName?: string\n liveUrl?: string\n}\n\n/**\n * Generate a short, copyable instruction for a maintenance item\n */\nexport function generateItemInstruction({\n item,\n projectName,\n liveUrl\n}: GenerateInstructionOptions): string {\n const categoryLabel = CATEGORY_LABELS[item.category] || item.category\n const priorityLabel = PRIORITY_LABELS[item.priority] || item.priority\n const statusLabel = STATUS_LABELS[item.status] || item.status\n\n const lines: string[] = []\n\n // Header with title\n lines.push(`# ${item.title}`)\n lines.push('')\n\n // Quick metadata line\n const metaParts: string[] = []\n metaParts.push(`**Category:** ${categoryLabel}`)\n metaParts.push(`**Priority:** ${priorityLabel}`)\n metaParts.push(`**Status:** ${statusLabel}`)\n lines.push(metaParts.join(' | '))\n lines.push('')\n\n // Description\n if (item.description) {\n lines.push('## Description')\n lines.push('')\n lines.push(item.description)\n lines.push('')\n }\n\n // Location context\n if (item.page_name || item.page_url) {\n lines.push('## Location')\n lines.push('')\n if (item.page_name) {\n lines.push(`**Page:** ${item.page_name}`)\n }\n if (item.page_url) {\n lines.push(`**URL:** ${item.page_url}`)\n }\n if (item.element_selector) {\n lines.push(`**Element:** \\`${item.element_selector}\\``)\n }\n lines.push('')\n }\n\n // Project context if available\n if (projectName || liveUrl) {\n lines.push('## Project')\n lines.push('')\n if (projectName) {\n lines.push(`**Project:** ${projectName}`)\n }\n if (liveUrl) {\n lines.push(`**Live URL:** ${liveUrl}`)\n }\n lines.push('')\n }\n\n // Quote info if available\n if (item.quote && item.quote.estimated_hours) {\n lines.push('## Estimate')\n lines.push('')\n lines.push(`**Estimated hours:** ${item.quote.estimated_hours}h`)\n if (item.quote.quote_notes) {\n lines.push(`**Notes:** ${item.quote.quote_notes}`)\n }\n lines.push('')\n } else if (item.estimated_hours) {\n lines.push('## Estimate')\n lines.push('')\n lines.push(`**Estimated hours:** ${item.estimated_hours}h`)\n lines.push('')\n }\n\n // Attachments mention\n if (item.attachments && item.attachments.length > 0) {\n lines.push('## Attachments')\n lines.push('')\n lines.push(`${item.attachments.length} attachment(s) available - see original ticket for screenshots/files.`)\n lines.push('')\n } else if (item.screenshot_url) {\n lines.push('## Screenshot')\n lines.push('')\n lines.push(`Screenshot available: ${item.screenshot_url}`)\n lines.push('')\n }\n\n // Source info\n lines.push('---')\n lines.push(`*Source: ${item.source === 'widget' ? 'Widget feedback' : 'Manual entry'} by ${item.created_by_name || 'Unknown'}*`)\n\n return lines.join('\\n')\n}\n\n/**\n * Generate instruction for a page comment (Phase 4)\n */\nexport interface PageCommentLike {\n comment: string\n resolved?: boolean\n element_text?: string\n element_type?: string\n user_name?: string\n screenshot_type?: string\n attachments?: unknown[]\n metadata?: {\n source?: string\n originalContent?: string\n newContent?: string\n cssSelector?: string\n pageUrl?: string\n pagePath?: string\n }\n}\n\nexport interface GenerateCommentInstructionOptions {\n comment: PageCommentLike\n pageName?: string\n projectName?: string\n demoUrl?: string\n}\n\ntype CommentCategory = 'text_suggestion' | 'design' | 'content' | 'typo' | 'bug' | 'other'\n\nconst COMMENT_CATEGORY_LABELS: Record<CommentCategory, string> = {\n text_suggestion: 'Text Suggestion',\n design: 'Design',\n content: 'Content',\n typo: 'Typo',\n bug: 'Bug',\n other: 'Other'\n}\n\nfunction categorizeComment(comment: PageCommentLike): CommentCategory {\n if (comment.metadata?.source === 'content_editor') {\n return 'text_suggestion'\n }\n\n const text = comment.comment.toLowerCase()\n\n if (text.includes('typo') || text.includes('spelling') || text.includes('grammar')) {\n return 'typo'\n }\n if (text.includes('design') || text.includes('color') || text.includes('font') || text.includes('layout')) {\n return 'design'\n }\n if (text.includes('bug') || text.includes('broken') || text.includes('error') || text.includes('not working')) {\n return 'bug'\n }\n if (text.includes('content') || text.includes('text') || text.includes('copy') || text.includes('wording')) {\n return 'content'\n }\n return 'other'\n}\n\n/**\n * Generate a short, copyable instruction for a page comment (Phase 4)\n */\nexport function generateCommentInstruction({\n comment,\n pageName,\n projectName,\n demoUrl\n}: GenerateCommentInstructionOptions): string {\n const category = categorizeComment(comment)\n const categoryLabel = COMMENT_CATEGORY_LABELS[category]\n\n const lines: string[] = []\n\n // Header\n const title = comment.element_text\n ? `\"${comment.element_text.substring(0, 50)}${comment.element_text.length > 50 ? '...' : ''}\"`\n : comment.comment.substring(0, 60) + (comment.comment.length > 60 ? '...' : '')\n lines.push(`# Feedback: ${title}`)\n lines.push('')\n\n // Metadata\n const metaParts: string[] = []\n metaParts.push(`**Category:** ${categoryLabel}`)\n metaParts.push(`**Status:** ${comment.resolved ? 'Resolved' : 'Open'}`)\n metaParts.push(`**Viewport:** ${comment.screenshot_type === 'mobile' ? 'Mobile' : 'Desktop'}`)\n lines.push(metaParts.join(' | '))\n lines.push('')\n\n // Text suggestion diff\n if (comment.metadata?.originalContent && comment.metadata?.newContent) {\n lines.push('## Text Change')\n lines.push('')\n lines.push('**Original:**')\n lines.push(`> ${comment.metadata.originalContent}`)\n lines.push('')\n lines.push('**Suggested:**')\n lines.push(`> ${comment.metadata.newContent}`)\n lines.push('')\n }\n\n // Comment text\n if (comment.comment && !comment.comment.startsWith('Text ')) {\n lines.push('## Feedback')\n lines.push('')\n lines.push(comment.comment)\n lines.push('')\n }\n\n // Element context\n if (comment.element_type || comment.element_text) {\n lines.push('## Element')\n lines.push('')\n if (comment.element_type) {\n lines.push(`**Type:** \\`<${comment.element_type}>\\``)\n }\n if (comment.element_text) {\n lines.push(`**Text:** \"${comment.element_text}\"`)\n }\n if (comment.metadata?.cssSelector) {\n lines.push(`**Selector:** \\`${comment.metadata.cssSelector}\\``)\n }\n lines.push('')\n }\n\n // Location\n if (pageName || comment.metadata?.pageUrl) {\n lines.push('## Location')\n lines.push('')\n if (pageName) {\n lines.push(`**Page:** ${pageName}`)\n }\n if (comment.metadata?.pageUrl) {\n lines.push(`**URL:** ${comment.metadata.pageUrl}`)\n } else if (comment.metadata?.pagePath) {\n lines.push(`**Path:** ${comment.metadata.pagePath}`)\n }\n lines.push('')\n }\n\n // Project\n if (projectName || demoUrl) {\n lines.push('## Project')\n lines.push('')\n if (projectName) {\n lines.push(`**Project:** ${projectName}`)\n }\n if (demoUrl) {\n lines.push(`**Demo URL:** ${demoUrl}`)\n }\n lines.push('')\n }\n\n // Attachments\n if (comment.attachments && comment.attachments.length > 0) {\n lines.push('## Attachments')\n lines.push('')\n lines.push(`${comment.attachments.length} attachment(s) available.`)\n lines.push('')\n }\n\n // Source\n lines.push('---')\n const source = comment.metadata?.source === 'widget' ? 'Widget' :\n comment.metadata?.source === 'content_editor' ? 'Content Editor' :\n comment.metadata?.source === 'screenshot' ? 'Screenshot Review' : 'App'\n lines.push(`*Source: ${source} by ${comment.user_name || 'Unknown'}*`)\n\n return lines.join('\\n')\n}\n"]}
|