@census-ai/census-sdk 0.2.2 → 0.2.3
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/react/index.cjs +6 -2
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +1 -44
- package/dist/react/index.d.ts +1 -44
- package/dist/react/index.js +6 -2
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/dist/react/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client.ts","../../src/react/context.tsx","../../src/react/hooks.ts","../../src/react/components/FeedbackButton.tsx","../../src/react/components/KnowledgeBase.tsx","../../src/react/components/Requests.tsx","../../src/react/components/HelpCenter.tsx"],"names":["DEFAULT_BASE_URL","CensusClient","config","prefix","user","options","validTypes","response","params","queryString","url","slugOrId","error","feedbackId","eventType","properties","events","event","guideId","path","method","body","headers","errorMessage","args","createCensus","CensusContext","createContext","CensusProvider","apiKey","baseUrl","debug","theme","children","isReady","setIsReady","useState","isIdentified","setIsIdentified","client","useMemo","useEffect","value","jsx","useCensus","context","useContext","useCensusContext","useIdentify","isIdentifying","setIsIdentifying","setError","err","useFeedback","isSubmitting","setIsSubmitting","isSuccess","setIsSuccess","setFeedbackId","submitFeedback","useCallback","result","reset","useArticles","data","setData","isLoading","setIsLoading","fetchArticles","useArticle","article","setArticle","fetchArticle","defaultSettings","useRequests","fetchRequests","useVote","isVoting","setIsVoting","useTrack","track","trackBatch","useFeatureGroups","featureGroups","setFeatureGroups","fetchFeatureGroups","defaultStyles","positionStyles","feedbackTypeLabels","feedbackTypeEmojis","getThemeStyles","FeedbackButton","position","text","allowedTypes","themeProp","onSubmit","onError","contextTheme","isOpen","setIsOpen","selectedType","setSelectedType","message","setMessage","themeStyles","handleOpen","handleClose","handleSubmit","e","feedbackData","jsxs","Fragment","FeedbackModal","onClose","onTypeChange","onMessageChange","type","KnowledgeBase","showSearch","showCategories","defaultCategory","className","onArticleView","searchQuery","setSearchQuery","selectedCategory","setSelectedCategory","selectedArticleSlug","setSelectedArticleSlug","articles","isLoadingArticles","articlesError","selectedArticle","isLoadingArticle","articleError","categories","cats","handleArticleClick","handleBack","category","typeConfig","statusConfig","formatDate","dateString","FORM_TYPES","Requests","status","limit","showEmptyState","onRequestClick","hoveredId","setHoveredId","showForm","setShowForm","formType","setFormType","formMessage","setFormMessage","localVotes","setLocalVotes","requests","refetch","settings","vote","handleRequestClick","request","handleVote","currentCount","currentHasVoted","prev","getVoteInfo","local","renderForm","t","canVote","typeInfo","statusInfo","isHovered","voteInfo","defaultTabLabels","HelpCenter","tabs","defaultTab","tabLabels","activeTab","setActiveTab","mergedLabels","tab"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CensusConfig,\n UserIdentity,\n FeedbackOptions,\n ArticlesOptions,\n ArticlesResponse,\n Article,\n RequestsOptions,\n RequestsResponse,\n BatchEventsOptions,\n CensusError,\n Guide,\n GuidesResponse,\n GuideAnalyticsEvent,\n FeatureGroupsResponse,\n} from './types';\n\n/**\n * Default API base URL\n */\nconst DEFAULT_BASE_URL = 'https://api.census.ai';\n\n/**\n * Census SDK Client\n *\n * The main client for interacting with the Census API.\n * Use `createCensus()` to create an instance.\n *\n * @example\n * ```typescript\n * import { createCensus } from '@census-ai/census-sdk';\n *\n * const census = createCensus({ apiKey: 'cs_live_xxx' });\n *\n * await census.identify({ userId: 'user_123', email: 'user@example.com' });\n * await census.submitFeedback({ type: 'bug_report', message: 'Button is broken' });\n * ```\n */\nexport class CensusClient {\n private apiKey: string;\n private baseUrl: string;\n private debug: boolean;\n private currentUserId: string | null = null;\n\n constructor(config: CensusConfig) {\n if (!config.apiKey) {\n throw new Error('Census: apiKey is required');\n }\n\n // Support both new (cs_) and legacy (op_) key prefixes\n const validPrefixes = ['cs_live_', 'cs_test_', 'op_live_', 'op_test_'];\n if (!validPrefixes.some(prefix => config.apiKey.startsWith(prefix))) {\n console.warn('Census: API key should start with \"cs_live_\" or \"cs_test_\"');\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n this.debug = config.debug || false;\n\n this.log('Initialized with base URL:', this.baseUrl);\n }\n\n /**\n * Identify a user for tracking purposes.\n * Call this when a user logs in or when you have user information.\n *\n * @param user - User identity information\n *\n * @example\n * ```typescript\n * await census.identify({\n * userId: 'user_123',\n * email: 'john@example.com',\n * name: 'John Doe',\n * organizationId: 'org_456',\n * organizationName: 'Acme Inc',\n * });\n * ```\n */\n async identify(user: UserIdentity): Promise<void> {\n if (!user.userId) {\n throw new Error('Census: userId is required for identify()');\n }\n\n this.currentUserId = user.userId;\n\n await this.request('/api/sdk/identify', 'POST', {\n userId: user.userId,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n metadata: user.metadata,\n organizationId: user.organizationId,\n organizationName: user.organizationName,\n organizationDomain: user.organizationDomain,\n organizationPlan: user.organizationPlan,\n });\n\n this.log('User identified:', user.userId);\n }\n\n /**\n * Clear the current user identity.\n * Call this when a user logs out.\n */\n reset(): void {\n this.currentUserId = null;\n this.log('User identity reset');\n }\n\n /**\n * Submit feedback, bug report, or feature request.\n *\n * @param options - Feedback options\n *\n * @example\n * ```typescript\n * // Submit a bug report\n * await census.submitFeedback({\n * type: 'bug_report',\n * message: 'The submit button is not working on Firefox',\n * });\n *\n * // Submit a feature request\n * await census.submitFeedback({\n * type: 'feature_request',\n * message: 'It would be great to have dark mode support',\n * });\n *\n * // Rate an article\n * await census.submitFeedback({\n * type: 'article_rating',\n * articleId: 'article_123',\n * helpful: true,\n * rating: 5,\n * });\n * ```\n */\n async submitFeedback(options: FeedbackOptions): Promise<{ feedbackId: string }> {\n const validTypes = ['feedback', 'bug_report', 'feature_request', 'article_rating'];\n if (!options.type || !validTypes.includes(options.type)) {\n throw new Error(`Census: type must be one of: ${validTypes.join(', ')}`);\n }\n\n if (options.type === 'article_rating') {\n if (options.rating === undefined && options.helpful === undefined) {\n throw new Error('Census: article_rating requires rating or helpful field');\n }\n } else if (!options.message) {\n throw new Error('Census: message is required for this feedback type');\n }\n\n const response = await this.request<{ success: boolean; feedbackId: string }>(\n '/api/sdk/feedback',\n 'POST',\n {\n type: options.type,\n message: options.message,\n rating: options.rating,\n helpful: options.helpful,\n userId: this.currentUserId,\n articleId: options.articleId,\n pageUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n metadata: options.metadata,\n }\n );\n\n this.log('Feedback submitted:', response.feedbackId);\n return { feedbackId: response.feedbackId };\n }\n\n /**\n * Fetch published articles from the knowledge base.\n *\n * @param options - Query options\n * @returns Articles and pagination info\n *\n * @example\n * ```typescript\n * // Get all articles\n * const { articles } = await census.getArticles();\n *\n * // Search articles\n * const { articles } = await census.getArticles({ search: 'getting started' });\n *\n * // Filter by category\n * const { articles } = await census.getArticles({ category: 'guides' });\n * ```\n */\n async getArticles(options?: ArticlesOptions): Promise<ArticlesResponse> {\n const params = new URLSearchParams();\n if (options?.category) params.set('category', options.category);\n if (options?.search) params.set('search', options.search);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const url = `/api/sdk/articles${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.request<ArticlesResponse>(url, 'GET');\n this.log('Fetched articles:', response.articles.length);\n return response;\n }\n\n /**\n * Fetch a single article by slug or ID.\n *\n * @param slugOrId - Article slug or ID\n * @returns Article or null if not found\n *\n * @example\n * ```typescript\n * const article = await census.getArticle('getting-started');\n * if (article) {\n * console.log(article.title, article.content_html);\n * }\n * ```\n */\n async getArticle(slugOrId: string): Promise<Article | null> {\n try {\n const response = await this.request<{ article: Article }>(\n `/api/sdk/articles/${encodeURIComponent(slugOrId)}`,\n 'GET'\n );\n this.log('Fetched article:', slugOrId);\n return response.article;\n } catch (error) {\n if ((error as CensusError).status === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Fetch feature groups with their features and article counts.\n * Used for navigation in the knowledge base.\n *\n * @returns Feature groups with nested features\n *\n * @example\n * ```typescript\n * const { feature_groups } = await census.getFeatureGroups();\n * feature_groups.forEach(group => {\n * console.log(group.name, group.features.length);\n * });\n * ```\n */\n async getFeatureGroups(): Promise<FeatureGroupsResponse> {\n const response = await this.request<FeatureGroupsResponse>(\n '/api/sdk/feature-groups',\n 'GET'\n );\n this.log('Fetched feature groups:', response.feature_groups.length);\n return response;\n }\n\n /**\n * Fetch the current user's submitted requests (feedback, bugs, feature requests).\n * Requires a user to be identified first.\n *\n * @param options - Query options\n * @returns Requests and pagination info\n *\n * @example\n * ```typescript\n * // Get all requests for the current user\n * const { requests } = await census.getRequests();\n *\n * // Filter by status\n * const { requests } = await census.getRequests({ status: 'in_progress' });\n *\n * // Filter by type\n * const { requests } = await census.getRequests({ type: 'bug_report' });\n * ```\n */\n async getRequests(options?: RequestsOptions): Promise<RequestsResponse> {\n if (!this.currentUserId) {\n throw new Error('Census: User must be identified before fetching requests. Call identify() first.');\n }\n\n const params = new URLSearchParams();\n params.set('userId', this.currentUserId);\n if (options?.status) params.set('status', options.status);\n if (options?.type) params.set('type', options.type);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n const response = await this.request<RequestsResponse>(\n `/api/sdk/requests?${params.toString()}`,\n 'GET'\n );\n this.log('Fetched requests:', response.requests.length);\n return response;\n }\n\n /**\n * Vote on a feedback request (toggle).\n * If the user has already voted, removes the vote.\n * If the user hasn't voted, adds a vote.\n *\n * @param feedbackId - ID of the feedback to vote on\n * @returns Vote result with action taken and new vote count\n *\n * @example\n * ```typescript\n * // Vote on a feedback request\n * const result = await census.vote('feedback-id-123');\n * console.log(result.action); // 'added' or 'removed'\n * console.log(result.vote_count); // 5\n * console.log(result.user_has_voted); // true\n * ```\n */\n async vote(feedbackId: string): Promise<{\n success: boolean;\n action: 'added' | 'removed';\n vote_count: number;\n user_has_voted: boolean;\n }> {\n if (!this.currentUserId) {\n throw new Error('Census: User must be identified before voting. Call identify() first.');\n }\n\n if (!feedbackId) {\n throw new Error('Census: feedbackId is required for vote()');\n }\n\n const response = await this.request<{\n success: boolean;\n action: 'added' | 'removed';\n vote_count: number;\n user_has_voted: boolean;\n }>('/api/sdk/requests/vote', 'POST', {\n feedbackId,\n userId: this.currentUserId,\n });\n\n this.log('Vote result:', response.action, 'for feedback:', feedbackId);\n return response;\n }\n\n /**\n * Track a custom analytics event.\n *\n * @param eventType - Name of the event\n * @param properties - Additional event properties\n *\n * @example\n * ```typescript\n * // Track a button click\n * await census.track('button_clicked', { buttonId: 'submit-form' });\n *\n * // Track a page view\n * await census.track('page_viewed', { page: '/pricing' });\n * ```\n */\n async track(eventType: string, properties?: Record<string, unknown>): Promise<void> {\n if (!eventType) {\n throw new Error('Census: eventType is required for track()');\n }\n\n await this.request('/api/sdk/events', 'POST', {\n eventType,\n userId: this.currentUserId,\n properties,\n });\n\n this.log('Event tracked:', eventType);\n }\n\n /**\n * Track multiple events in a single request.\n * More efficient than calling track() multiple times.\n *\n * @param events - Array of events to track\n *\n * @example\n * ```typescript\n * await census.trackBatch({\n * events: [\n * { eventType: 'page_viewed', properties: { page: '/home' } },\n * { eventType: 'button_clicked', properties: { button: 'cta' } },\n * ],\n * });\n * ```\n */\n async trackBatch(options: BatchEventsOptions): Promise<void> {\n if (!options.events || options.events.length === 0) {\n throw new Error('Census: at least one event is required');\n }\n\n if (options.events.length > 100) {\n throw new Error('Census: maximum 100 events per batch');\n }\n\n const events = options.events.map((event) => ({\n eventType: event.eventType,\n userId: this.currentUserId,\n articleId: event.articleId,\n featureId: event.featureId,\n properties: event.properties,\n }));\n\n await this.request('/api/sdk/events', 'POST', { events });\n\n this.log('Batch events tracked:', options.events.length);\n }\n\n /**\n * Fetch available guides for the current user.\n * Returns guides that match the user's context and haven't been completed.\n *\n * @returns Guides and list of completed guide IDs\n *\n * @example\n * ```typescript\n * const { guides, completedGuides } = await census.getGuides();\n * guides.forEach(guide => console.log(guide.name));\n * ```\n */\n async getGuides(): Promise<GuidesResponse> {\n const params = new URLSearchParams();\n if (this.currentUserId) {\n params.set('userId', this.currentUserId);\n }\n\n const queryString = params.toString();\n const url = `/api/sdk/guides${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.request<GuidesResponse>(url, 'GET');\n this.log('Fetched guides:', response.guides.length);\n return response;\n }\n\n /**\n * Fetch a single guide by slug or ID.\n *\n * @param slugOrId - Guide slug or ID\n * @returns Guide or null if not found\n *\n * @example\n * ```typescript\n * const guide = await census.getGuide('onboarding-tour');\n * if (guide) {\n * console.log(guide.name, guide.guide_steps.length);\n * }\n * ```\n */\n async getGuide(slugOrId: string): Promise<Guide | null> {\n try {\n const params = new URLSearchParams();\n if (this.currentUserId) {\n params.set('userId', this.currentUserId);\n }\n\n const queryString = params.toString();\n const url = `/api/sdk/guides/${encodeURIComponent(slugOrId)}${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.request<{ guide: Guide }>(url, 'GET');\n this.log('Fetched guide:', slugOrId);\n return response.guide;\n } catch (error) {\n if ((error as CensusError).status === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Track a guide analytics event.\n * Used to track user progress through guides.\n *\n * @param event - Guide analytics event\n *\n * @example\n * ```typescript\n * await census.trackGuideEvent({\n * guideId: 'guide_123',\n * eventType: 'step_completed',\n * stepId: 'step_456',\n * stepIndex: 2,\n * sessionId: 'session_789',\n * });\n * ```\n */\n async trackGuideEvent(event: GuideAnalyticsEvent): Promise<void> {\n if (!event.guideId || !event.eventType || !event.sessionId) {\n throw new Error('Census: guideId, eventType, and sessionId are required for trackGuideEvent()');\n }\n\n await this.request('/api/sdk/guides/events', 'POST', {\n guideId: event.guideId,\n eventType: event.eventType,\n stepId: event.stepId,\n stepIndex: event.stepIndex,\n pageUrl: event.pageUrl || (typeof window !== 'undefined' ? window.location.href : undefined),\n sessionId: event.sessionId,\n userId: event.userId || this.currentUserId,\n metadata: event.metadata,\n });\n\n this.log('Guide event tracked:', event.eventType, event.guideId);\n }\n\n /**\n * Mark a guide as completed for the current user.\n * Prevents the guide from showing again.\n *\n * @param guideId - ID of the guide to mark as completed\n *\n * @example\n * ```typescript\n * await census.markGuideCompleted('guide_123');\n * ```\n */\n async markGuideCompleted(guideId: string): Promise<void> {\n if (!guideId) {\n throw new Error('Census: guideId is required for markGuideCompleted()');\n }\n\n if (!this.currentUserId) {\n throw new Error('Census: User must be identified before marking guides complete. Call identify() first.');\n }\n\n await this.request('/api/sdk/guides/complete', 'POST', {\n guideId,\n userId: this.currentUserId,\n });\n\n this.log('Guide marked completed:', guideId);\n }\n\n /**\n * Get the current identified user ID\n */\n getCurrentUserId(): string | null {\n return this.currentUserId;\n }\n\n /**\n * Check if a user is currently identified\n */\n isIdentified(): boolean {\n return this.currentUserId !== null;\n }\n\n /**\n * Make an API request\n */\n private async request<T>(path: string, method: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'X-Census-Key': this.apiKey,\n };\n\n if (body) {\n headers['Content-Type'] = 'application/json';\n }\n\n this.log(`${method} ${path}`, body);\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n let errorMessage = `Request failed with status ${response.status}`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorMessage;\n } catch {\n // Use default error message\n }\n\n const error: CensusError = {\n error: errorMessage,\n status: response.status,\n };\n throw error;\n }\n\n return response.json();\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[Census]', ...args);\n }\n }\n}\n\n/**\n * Create a new Census SDK client.\n *\n * @param config - Configuration options\n * @returns Census client instance\n *\n * @example\n * ```typescript\n * import { createCensus } from '@census-ai/census-sdk';\n *\n * const census = createCensus({\n * apiKey: 'cs_live_your_key_here',\n * debug: true, // Enable debug logging\n * });\n * ```\n */\nexport function createCensus(config: CensusConfig): CensusClient {\n return new CensusClient(config);\n}\n","import { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { createCensus, CensusClient } from '../client';\nimport type { CensusProviderProps, CensusTheme, UserIdentity } from '../types';\n\n/**\n * Context value for the Census provider\n */\ninterface CensusContextValue {\n client: CensusClient;\n theme: CensusTheme;\n isReady: boolean;\n isIdentified: boolean;\n}\n\nconst CensusContext = createContext<CensusContextValue | null>(null);\n\n/**\n * Provider component for the Census SDK.\n * Wrap your app with this to use Census hooks and components.\n *\n * @example\n * ```tsx\n * import { CensusProvider } from '@census-ai/census-sdk/react';\n *\n * function App() {\n * return (\n * <CensusProvider\n * apiKey=\"cs_live_xxx\"\n * user={{ userId: 'user_123', email: 'user@example.com' }}\n * >\n * <YourApp />\n * </CensusProvider>\n * );\n * }\n * ```\n */\nexport function CensusProvider({\n apiKey,\n baseUrl,\n debug,\n user,\n theme = {},\n children,\n}: CensusProviderProps) {\n const [isReady, setIsReady] = useState(false);\n const [isIdentified, setIsIdentified] = useState(false);\n\n const client = useMemo(() => {\n return createCensus({ apiKey, baseUrl, debug });\n }, [apiKey, baseUrl, debug]);\n\n // Automatically identify user if provided\n useEffect(() => {\n if (user) {\n client\n .identify(user)\n .then(() => {\n setIsIdentified(true);\n setIsReady(true);\n })\n .catch((error) => {\n console.error('[Census] Failed to identify user:', error);\n setIsReady(true);\n });\n } else {\n setIsReady(true);\n }\n }, [client, user]);\n\n const value: CensusContextValue = useMemo(\n () => ({\n client,\n theme,\n isReady,\n isIdentified,\n }),\n [client, theme, isReady, isIdentified]\n );\n\n return <CensusContext.Provider value={value}>{children}</CensusContext.Provider>;\n}\n\n/**\n * Hook to access the Census client directly.\n *\n * @returns The Census client instance\n * @throws If used outside of CensusProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const census = useCensus();\n *\n * const handleClick = async () => {\n * await census.track('button_clicked');\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function useCensus(): CensusClient {\n const context = useContext(CensusContext);\n if (!context) {\n throw new Error('useCensus must be used within a CensusProvider');\n }\n return context.client;\n}\n\n/**\n * Hook to access the Census context (client, theme, and state).\n *\n * @returns The full Census context\n * @throws If used outside of CensusProvider\n */\nexport function useCensusContext(): CensusContextValue {\n const context = useContext(CensusContext);\n if (!context) {\n throw new Error('useCensusContext must be used within a CensusProvider');\n }\n return context;\n}\n\n/**\n * Hook to identify a user.\n *\n * @returns Object with identify function and state\n *\n * @example\n * ```tsx\n * function LoginHandler() {\n * const { identify, isIdentifying } = useIdentify();\n *\n * const handleLogin = async (user) => {\n * await identify({\n * userId: user.id,\n * email: user.email,\n * name: user.name,\n * });\n * };\n * }\n * ```\n */\nexport function useIdentify() {\n const { client } = useCensusContext();\n const [isIdentifying, setIsIdentifying] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const identify = async (user: UserIdentity) => {\n setIsIdentifying(true);\n setError(null);\n try {\n await client.identify(user);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to identify user'));\n throw err;\n } finally {\n setIsIdentifying(false);\n }\n };\n\n const reset = () => {\n client.reset();\n };\n\n return {\n identify,\n reset,\n isIdentifying,\n isIdentified: client.isIdentified(),\n error,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useCensusContext } from './context';\nimport type {\n FeedbackOptions,\n ArticlesOptions,\n ArticlesResponse,\n Article,\n RequestsOptions,\n RequestsResponse,\n RequestsSettings,\n FeatureGroup,\n} from '../types';\n\n/**\n * Hook for submitting feedback.\n *\n * @returns Object with submit function and state\n *\n * @example\n * ```tsx\n * function FeedbackForm() {\n * const { submitFeedback, isSubmitting, isSuccess, error } = useFeedback();\n *\n * const handleSubmit = async (message: string) => {\n * await submitFeedback({\n * type: 'feedback',\n * message,\n * });\n * };\n *\n * return (\n * <form onSubmit={...}>\n * {isSuccess && <p>Thanks for your feedback!</p>}\n * {error && <p>Error: {error.message}</p>}\n * <button disabled={isSubmitting}>Submit</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useFeedback() {\n const { client } = useCensusContext();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [feedbackId, setFeedbackId] = useState<string | null>(null);\n\n const submitFeedback = useCallback(\n async (options: FeedbackOptions) => {\n setIsSubmitting(true);\n setIsSuccess(false);\n setError(null);\n setFeedbackId(null);\n\n try {\n const result = await client.submitFeedback(options);\n setFeedbackId(result.feedbackId);\n setIsSuccess(true);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to submit feedback');\n setError(error);\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n },\n [client]\n );\n\n const reset = useCallback(() => {\n setIsSuccess(false);\n setError(null);\n setFeedbackId(null);\n }, []);\n\n return {\n submitFeedback,\n reset,\n isSubmitting,\n isSuccess,\n error,\n feedbackId,\n };\n}\n\n/**\n * Hook for fetching articles from the knowledge base.\n *\n * @param options - Query options (optional)\n * @returns Object with articles data and loading state\n *\n * @example\n * ```tsx\n * function ArticleList() {\n * const { articles, isLoading, error, refetch } = useArticles();\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n *\n * return (\n * <ul>\n * {articles.map(article => (\n * <li key={article.id}>{article.title}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useArticles(options?: ArticlesOptions) {\n const { client, isReady } = useCensusContext();\n const [data, setData] = useState<ArticlesResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchArticles = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getArticles(options);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch articles'));\n } finally {\n setIsLoading(false);\n }\n }, [client, options?.category, options?.search, options?.limit, options?.offset]);\n\n useEffect(() => {\n if (isReady) {\n fetchArticles();\n }\n }, [isReady, fetchArticles]);\n\n return {\n articles: data?.articles || [],\n pagination: data?.pagination,\n isLoading,\n error,\n refetch: fetchArticles,\n };\n}\n\n/**\n * Hook for fetching a single article.\n *\n * @param slugOrId - Article slug or ID\n * @returns Object with article data and loading state\n *\n * @example\n * ```tsx\n * function ArticlePage({ slug }) {\n * const { article, isLoading, error } = useArticle(slug);\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n * if (!article) return <p>Article not found</p>;\n *\n * return (\n * <article>\n * <h1>{article.title}</h1>\n * <div dangerouslySetInnerHTML={{ __html: article.content_html }} />\n * </article>\n * );\n * }\n * ```\n */\nexport function useArticle(slugOrId: string) {\n const { client, isReady } = useCensusContext();\n const [article, setArticle] = useState<Article | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchArticle = useCallback(async () => {\n if (!slugOrId) {\n setArticle(null);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getArticle(slugOrId);\n setArticle(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch article'));\n } finally {\n setIsLoading(false);\n }\n }, [client, slugOrId]);\n\n useEffect(() => {\n if (isReady) {\n fetchArticle();\n }\n }, [isReady, fetchArticle]);\n\n return {\n article,\n isLoading,\n error,\n refetch: fetchArticle,\n };\n}\n\nconst defaultSettings: RequestsSettings = {\n feedbackVisibility: 'own',\n allowVoting: false,\n allowRequestCreation: true,\n};\n\n/**\n * Hook for fetching the current user's submitted requests.\n *\n * @param options - Query options (optional)\n * @returns Object with requests data and loading state\n *\n * @example\n * ```tsx\n * function MyRequests() {\n * const { requests, isLoading, error, refetch, settings } = useRequests();\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n *\n * return (\n * <ul>\n * {requests.map(req => (\n * <li key={req.id}>{req.message} - {req.status}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useRequests(options?: RequestsOptions) {\n const { client, isReady, isIdentified } = useCensusContext();\n const [data, setData] = useState<RequestsResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchRequests = useCallback(async () => {\n if (!isIdentified) {\n setData(null);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getRequests(options);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch requests'));\n } finally {\n setIsLoading(false);\n }\n }, [client, isIdentified, options?.status, options?.type, options?.limit, options?.offset]);\n\n useEffect(() => {\n if (isReady) {\n if (isIdentified) {\n fetchRequests();\n } else {\n // Not identified - stop loading\n setIsLoading(false);\n }\n }\n }, [isReady, isIdentified, fetchRequests]);\n\n return {\n requests: data?.requests || [],\n pagination: data?.pagination,\n settings: data?.settings || defaultSettings,\n isLoading,\n error,\n refetch: fetchRequests,\n };\n}\n\n/**\n * Hook for voting on requests.\n *\n * @returns Object with vote function and loading state\n *\n * @example\n * ```tsx\n * function VoteButton({ feedbackId }: { feedbackId: string }) {\n * const { vote, isVoting } = useVote();\n *\n * const handleVote = async () => {\n * const result = await vote(feedbackId);\n * console.log('Voted:', result.action); // 'added' or 'removed'\n * };\n *\n * return (\n * <button onClick={handleVote} disabled={isVoting}>\n * Vote\n * </button>\n * );\n * }\n * ```\n */\nexport function useVote() {\n const { client } = useCensusContext();\n const [isVoting, setIsVoting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const vote = useCallback(\n async (feedbackId: string) => {\n setIsVoting(true);\n setError(null);\n\n try {\n const result = await client.vote(feedbackId);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to vote');\n setError(error);\n throw error;\n } finally {\n setIsVoting(false);\n }\n },\n [client]\n );\n\n return {\n vote,\n isVoting,\n error,\n };\n}\n\n/**\n * Hook for tracking events.\n *\n * @returns Object with track function\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { track } = useTrack();\n *\n * useEffect(() => {\n * track('page_viewed', { page: 'home' });\n * }, []);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTrack() {\n const { client } = useCensusContext();\n\n const track = useCallback(\n async (eventType: string, properties?: Record<string, unknown>) => {\n await client.track(eventType, properties);\n },\n [client]\n );\n\n const trackBatch = useCallback(\n async (\n events: Array<{\n eventType: string;\n articleId?: string;\n featureId?: string;\n properties?: Record<string, unknown>;\n }>\n ) => {\n await client.trackBatch({ events });\n },\n [client]\n );\n\n return {\n track,\n trackBatch,\n };\n}\n\n/**\n * Hook for fetching feature groups with their features.\n *\n * @returns Object with feature groups data and loading state\n *\n * @example\n * ```tsx\n * function FeatureNav() {\n * const { featureGroups, isLoading, error } = useFeatureGroups();\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n *\n * return (\n * <ul>\n * {featureGroups.map(group => (\n * <li key={group.id}>\n * {group.name} ({group.feature_count} features)\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useFeatureGroups() {\n const { client, isReady } = useCensusContext();\n const [featureGroups, setFeatureGroups] = useState<FeatureGroup[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchFeatureGroups = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getFeatureGroups();\n setFeatureGroups(result.feature_groups);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch feature groups'));\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n if (isReady) {\n fetchFeatureGroups();\n }\n }, [isReady, fetchFeatureGroups]);\n\n return {\n featureGroups,\n isLoading,\n error,\n refetch: fetchFeatureGroups,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useFeedback } from '../hooks';\nimport { useCensusContext } from '../context';\nimport type { FeedbackButtonProps, FeedbackType, CensusTheme } from '../../types';\n\nconst defaultStyles = {\n button: {\n position: 'fixed' as const,\n padding: '12px 20px',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n fontWeight: '500' as const,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n transition: 'transform 0.2s, box-shadow 0.2s',\n zIndex: 9999,\n },\n modal: {\n position: 'fixed' as const,\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 10000,\n },\n modalContent: {\n backgroundColor: 'white',\n borderRadius: '12px',\n padding: '24px',\n width: '100%',\n maxWidth: '400px',\n margin: '16px',\n boxShadow: '0 20px 50px rgba(0, 0, 0, 0.2)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n input: {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid #e0e0e0',\n borderRadius: '6px',\n fontSize: '14px',\n marginBottom: '12px',\n boxSizing: 'border-box' as const,\n fontFamily: 'inherit',\n },\n textarea: {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid #e0e0e0',\n borderRadius: '6px',\n fontSize: '14px',\n marginBottom: '16px',\n minHeight: '100px',\n resize: 'vertical' as const,\n boxSizing: 'border-box' as const,\n fontFamily: 'inherit',\n },\n submitButton: {\n width: '100%',\n padding: '12px',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500' as const,\n transition: 'opacity 0.2s',\n },\n typeButton: {\n padding: '8px 16px',\n border: '1px solid #e0e0e0',\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '13px',\n backgroundColor: 'white',\n transition: 'all 0.2s',\n marginRight: '8px',\n marginBottom: '8px',\n },\n};\n\nconst positionStyles = {\n 'bottom-right': { bottom: '20px', right: '20px' },\n 'bottom-left': { bottom: '20px', left: '20px' },\n 'top-right': { top: '20px', right: '20px' },\n 'top-left': { top: '20px', left: '20px' },\n};\n\nconst feedbackTypeLabels: Record<FeedbackType, string> = {\n feedback: 'General Feedback',\n bug_report: 'Bug Report',\n feature_request: 'Feature Request',\n article_rating: 'Article Rating',\n};\n\nconst feedbackTypeEmojis: Record<FeedbackType, string> = {\n feedback: '💬',\n bug_report: '🐛',\n feature_request: '💡',\n article_rating: '⭐',\n};\n\nfunction getThemeStyles(theme: CensusTheme) {\n return {\n primaryColor: theme.primaryColor || '#000000',\n textColor: theme.textColor || '#333333',\n backgroundColor: theme.backgroundColor || '#ffffff',\n borderRadius: theme.borderRadius || '8px',\n fontFamily: theme.fontFamily || 'system-ui, -apple-system, sans-serif',\n };\n}\n\n/**\n * Floating feedback button component.\n * Displays a button that opens a modal for submitting feedback.\n *\n * @example\n * ```tsx\n * import { FeedbackButton } from '@census-ai/census-sdk/react';\n *\n * function App() {\n * return (\n * <>\n * <YourApp />\n * <FeedbackButton\n * position=\"bottom-right\"\n * text=\"Send Feedback\"\n * allowedTypes={['feedback', 'bug_report', 'feature_request']}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function FeedbackButton({\n position = 'bottom-right',\n text = 'Feedback',\n allowedTypes = ['feedback', 'bug_report', 'feature_request'],\n theme: themeProp,\n onSubmit,\n onError,\n children,\n}: FeedbackButtonProps) {\n const { theme: contextTheme } = useCensusContext();\n const { submitFeedback, isSubmitting, isSuccess, reset } = useFeedback();\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectedType, setSelectedType] = useState<FeedbackType>(allowedTypes[0]);\n const [message, setMessage] = useState('');\n\n const theme = { ...contextTheme, ...themeProp };\n const themeStyles = getThemeStyles(theme);\n\n const handleOpen = useCallback(() => {\n setIsOpen(true);\n reset();\n }, [reset]);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n setMessage('');\n setSelectedType(allowedTypes[0]);\n }, [allowedTypes]);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n const feedbackData = {\n type: selectedType,\n message,\n };\n\n try {\n await submitFeedback(feedbackData);\n onSubmit?.(feedbackData);\n // Close after a short delay to show success\n setTimeout(handleClose, 1500);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to submit feedback'));\n }\n },\n [selectedType, message, submitFeedback, onSubmit, onError, handleClose]\n );\n\n // Custom trigger\n if (children) {\n return (\n <>\n <div onClick={handleOpen} style={{ cursor: 'pointer' }}>\n {children}\n </div>\n {isOpen && (\n <FeedbackModal\n isOpen={isOpen}\n onClose={handleClose}\n selectedType={selectedType}\n onTypeChange={setSelectedType}\n allowedTypes={allowedTypes}\n message={message}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n isSuccess={isSuccess}\n themeStyles={themeStyles}\n />\n )}\n </>\n );\n }\n\n return (\n <>\n <button\n onClick={handleOpen}\n style={{\n ...defaultStyles.button,\n ...positionStyles[position],\n backgroundColor: themeStyles.primaryColor,\n color: 'white',\n borderRadius: themeStyles.borderRadius,\n fontFamily: themeStyles.fontFamily,\n }}\n aria-label=\"Open feedback form\"\n >\n {text}\n </button>\n {isOpen && (\n <FeedbackModal\n isOpen={isOpen}\n onClose={handleClose}\n selectedType={selectedType}\n onTypeChange={setSelectedType}\n allowedTypes={allowedTypes}\n message={message}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n isSuccess={isSuccess}\n themeStyles={themeStyles}\n />\n )}\n </>\n );\n}\n\ninterface FeedbackModalProps {\n isOpen: boolean;\n onClose: () => void;\n selectedType: FeedbackType;\n onTypeChange: (type: FeedbackType) => void;\n allowedTypes: FeedbackType[];\n message: string;\n onMessageChange: (message: string) => void;\n onSubmit: (e: React.FormEvent) => void;\n isSubmitting: boolean;\n isSuccess: boolean;\n themeStyles: ReturnType<typeof getThemeStyles>;\n}\n\nfunction FeedbackModal({\n isOpen,\n onClose,\n selectedType,\n onTypeChange,\n allowedTypes,\n message,\n onMessageChange,\n onSubmit,\n isSubmitting,\n isSuccess,\n themeStyles,\n}: FeedbackModalProps) {\n if (!isOpen) return null;\n\n if (isSuccess) {\n return (\n <div style={defaultStyles.modal} onClick={onClose}>\n <div\n style={{\n ...defaultStyles.modalContent,\n textAlign: 'center',\n fontFamily: themeStyles.fontFamily,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>🎉</div>\n <h3 style={{ margin: '0 0 8px 0', color: themeStyles.textColor }}>\n Thanks for your feedback!\n </h3>\n <p style={{ margin: 0, color: '#666' }}>We appreciate you taking the time to share.</p>\n </div>\n </div>\n );\n }\n\n return (\n <div style={defaultStyles.modal} onClick={onClose}>\n <div\n style={{\n ...defaultStyles.modalContent,\n fontFamily: themeStyles.fontFamily,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '20px',\n }}\n >\n <h3 style={{ margin: 0, color: themeStyles.textColor }}>Send Feedback</h3>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '24px',\n cursor: 'pointer',\n color: '#999',\n padding: '0',\n lineHeight: '1',\n }}\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n\n <form onSubmit={onSubmit}>\n {/* Feedback type selection */}\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n color: '#666',\n fontWeight: '500',\n }}\n >\n What kind of feedback?\n </label>\n <div style={{ display: 'flex', flexWrap: 'wrap' }}>\n {allowedTypes.map((type) => (\n <button\n key={type}\n type=\"button\"\n onClick={() => onTypeChange(type)}\n style={{\n ...defaultStyles.typeButton,\n backgroundColor: selectedType === type ? themeStyles.primaryColor : 'white',\n color: selectedType === type ? 'white' : themeStyles.textColor,\n borderColor: selectedType === type ? themeStyles.primaryColor : '#e0e0e0',\n }}\n >\n {feedbackTypeEmojis[type]} {feedbackTypeLabels[type]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Message input */}\n <div>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n color: '#666',\n fontWeight: '500',\n }}\n >\n Your message\n </label>\n <textarea\n value={message}\n onChange={(e) => onMessageChange(e.target.value)}\n placeholder={\n selectedType === 'bug_report'\n ? 'Describe the bug and steps to reproduce...'\n : selectedType === 'feature_request'\n ? 'Describe the feature you would like...'\n : 'Share your thoughts...'\n }\n style={defaultStyles.textarea}\n required\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isSubmitting || !message.trim()}\n style={{\n ...defaultStyles.submitButton,\n backgroundColor: themeStyles.primaryColor,\n color: 'white',\n opacity: isSubmitting || !message.trim() ? 0.6 : 1,\n cursor: isSubmitting || !message.trim() ? 'not-allowed' : 'pointer',\n }}\n >\n {isSubmitting ? 'Sending...' : 'Send Feedback'}\n </button>\n </form>\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useArticles, useArticle } from '../hooks';\nimport { useCensusContext } from '../context';\nimport type { KnowledgeBaseProps, Article, CensusTheme } from '../../types';\n\nconst defaultStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n maxWidth: '800px',\n },\n searchInput: {\n width: '100%',\n padding: '12px 16px',\n border: '1px solid #e0e0e0',\n borderRadius: '8px',\n fontSize: '15px',\n marginBottom: '24px',\n boxSizing: 'border-box' as const,\n },\n categoryButton: {\n padding: '8px 16px',\n border: '1px solid #e0e0e0',\n borderRadius: '20px',\n cursor: 'pointer',\n fontSize: '13px',\n backgroundColor: 'white',\n transition: 'all 0.2s',\n marginRight: '8px',\n marginBottom: '8px',\n },\n articleCard: {\n padding: '20px',\n border: '1px solid #e0e0e0',\n borderRadius: '8px',\n marginBottom: '12px',\n cursor: 'pointer',\n transition: 'box-shadow 0.2s, border-color 0.2s',\n backgroundColor: 'white',\n },\n articleTitle: {\n margin: '0 0 8px 0',\n fontSize: '16px',\n fontWeight: '600' as const,\n },\n articleDescription: {\n margin: 0,\n fontSize: '14px',\n color: '#666',\n lineHeight: 1.5,\n },\n articleMeta: {\n display: 'flex',\n gap: '16px',\n marginTop: '12px',\n fontSize: '12px',\n color: '#999',\n },\n backButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '8px 0',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#666',\n marginBottom: '16px',\n },\n articleContent: {\n lineHeight: 1.7,\n fontSize: '15px',\n },\n loading: {\n textAlign: 'center' as const,\n padding: '40px',\n color: '#666',\n },\n error: {\n padding: '20px',\n backgroundColor: '#fef2f2',\n borderRadius: '8px',\n color: '#b91c1c',\n textAlign: 'center' as const,\n },\n empty: {\n textAlign: 'center' as const,\n padding: '40px',\n color: '#666',\n },\n};\n\nfunction getThemeStyles(theme: CensusTheme) {\n return {\n primaryColor: theme.primaryColor || '#000000',\n textColor: theme.textColor || '#333333',\n backgroundColor: theme.backgroundColor || '#ffffff',\n borderRadius: theme.borderRadius || '8px',\n fontFamily: theme.fontFamily || 'system-ui, -apple-system, sans-serif',\n };\n}\n\n/**\n * Embeddable knowledge base component.\n * Displays a searchable list of articles with full article view.\n *\n * @example\n * ```tsx\n * import { KnowledgeBase } from '@census-ai/census-sdk/react';\n *\n * function HelpPage() {\n * return (\n * <div className=\"help-container\">\n * <h1>Help Center</h1>\n * <KnowledgeBase\n * showSearch={true}\n * showCategories={true}\n * />\n * </div>\n * );\n * }\n * ```\n */\nexport function KnowledgeBase({\n showSearch = true,\n showCategories = true,\n defaultCategory,\n theme: themeProp,\n className,\n onArticleView,\n}: KnowledgeBaseProps) {\n const { theme: contextTheme } = useCensusContext();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string | undefined>(defaultCategory);\n const [selectedArticleSlug, setSelectedArticleSlug] = useState<string | null>(null);\n\n const theme = { ...contextTheme, ...themeProp };\n const themeStyles = getThemeStyles(theme);\n\n const {\n articles,\n isLoading: isLoadingArticles,\n error: articlesError,\n } = useArticles({\n category: selectedCategory,\n search: searchQuery || undefined,\n });\n\n const {\n article: selectedArticle,\n isLoading: isLoadingArticle,\n error: articleError,\n } = useArticle(selectedArticleSlug || '');\n\n // Extract unique categories\n const categories = useMemo(() => {\n const cats = new Set<string>();\n articles.forEach((article) => {\n if (article.category) {\n cats.add(article.category);\n }\n });\n return Array.from(cats).sort();\n }, [articles]);\n\n const handleArticleClick = (article: Article) => {\n setSelectedArticleSlug(article.slug);\n onArticleView?.(article);\n };\n\n const handleBack = () => {\n setSelectedArticleSlug(null);\n };\n\n // Article detail view\n if (selectedArticleSlug) {\n if (isLoadingArticle) {\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <div style={defaultStyles.loading}>Loading article...</div>\n </div>\n );\n }\n\n if (articleError) {\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <button onClick={handleBack} style={defaultStyles.backButton}>\n ← Back to articles\n </button>\n <div style={defaultStyles.error}>Failed to load article. Please try again.</div>\n </div>\n );\n }\n\n if (!selectedArticle) {\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <button onClick={handleBack} style={defaultStyles.backButton}>\n ← Back to articles\n </button>\n <div style={defaultStyles.empty}>Article not found.</div>\n </div>\n );\n }\n\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <button onClick={handleBack} style={defaultStyles.backButton}>\n ← Back to articles\n </button>\n <article>\n <h1 style={{ margin: '0 0 16px 0', color: themeStyles.textColor }}>\n {selectedArticle.title}\n </h1>\n {selectedArticle.read_time_minutes && (\n <div style={{ fontSize: '14px', color: '#666', marginBottom: '24px' }}>\n {selectedArticle.read_time_minutes} min read\n </div>\n )}\n {selectedArticle.content_html ? (\n <div\n style={{ ...defaultStyles.articleContent, color: themeStyles.textColor }}\n dangerouslySetInnerHTML={{ __html: selectedArticle.content_html }}\n />\n ) : (\n <div style={{ ...defaultStyles.articleContent, color: themeStyles.textColor }}>\n {typeof selectedArticle.content === 'string'\n ? selectedArticle.content\n : 'No content available.'}\n </div>\n )}\n </article>\n </div>\n );\n }\n\n // Articles list view\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n {/* Search */}\n {showSearch && (\n <input\n type=\"text\"\n placeholder=\"Search articles...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={defaultStyles.searchInput}\n />\n )}\n\n {/* Categories */}\n {showCategories && categories.length > 0 && (\n <div style={{ marginBottom: '24px' }}>\n <button\n onClick={() => setSelectedCategory(undefined)}\n style={{\n ...defaultStyles.categoryButton,\n backgroundColor: !selectedCategory ? themeStyles.primaryColor : 'white',\n color: !selectedCategory ? 'white' : themeStyles.textColor,\n borderColor: !selectedCategory ? themeStyles.primaryColor : '#e0e0e0',\n }}\n >\n All\n </button>\n {categories.map((category) => (\n <button\n key={category}\n onClick={() => setSelectedCategory(category)}\n style={{\n ...defaultStyles.categoryButton,\n backgroundColor: selectedCategory === category ? themeStyles.primaryColor : 'white',\n color: selectedCategory === category ? 'white' : themeStyles.textColor,\n borderColor: selectedCategory === category ? themeStyles.primaryColor : '#e0e0e0',\n }}\n >\n {category}\n </button>\n ))}\n </div>\n )}\n\n {/* Loading */}\n {isLoadingArticles && <div style={defaultStyles.loading}>Loading articles...</div>}\n\n {/* Error */}\n {articlesError && (\n <div style={defaultStyles.error}>Failed to load articles. Please try again.</div>\n )}\n\n {/* Empty state */}\n {!isLoadingArticles && !articlesError && articles.length === 0 && (\n <div style={defaultStyles.empty}>\n {searchQuery\n ? `No articles found for \"${searchQuery}\"`\n : 'No articles available yet.'}\n </div>\n )}\n\n {/* Articles list */}\n {!isLoadingArticles && !articlesError && articles.length > 0 && (\n <div>\n {articles.map((article) => (\n <div\n key={article.id}\n onClick={() => handleArticleClick(article)}\n style={defaultStyles.articleCard}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleArticleClick(article);\n }\n }}\n >\n <h3 style={{ ...defaultStyles.articleTitle, color: themeStyles.textColor }}>\n {article.title}\n </h3>\n {article.seo_description && (\n <p style={defaultStyles.articleDescription}>{article.seo_description}</p>\n )}\n <div style={defaultStyles.articleMeta}>\n {article.category && <span>{article.category}</span>}\n {article.read_time_minutes && <span>{article.read_time_minutes} min read</span>}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { useRequests, useVote, useFeedback } from '../hooks';\nimport { useCensusContext } from '../context';\nimport type { RequestsProps, Request, FeedbackType } from '../../types';\n\nconst defaultStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n list: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '12px',\n },\n card: {\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n padding: '16px',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n },\n cardHover: {\n borderColor: '#d1d5db',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n marginBottom: '8px',\n },\n badges: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n badge: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n },\n message: {\n fontSize: '14px',\n color: '#111827',\n margin: 0,\n lineHeight: 1.5,\n },\n meta: {\n display: 'flex',\n gap: '12px',\n marginTop: '8px',\n fontSize: '12px',\n color: '#6b7280',\n },\n empty: {\n textAlign: 'center' as const,\n padding: '32px 16px',\n color: '#6b7280',\n },\n emptyIcon: {\n width: '48px',\n height: '48px',\n margin: '0 auto 12px',\n color: '#d1d5db',\n },\n loading: {\n textAlign: 'center' as const,\n padding: '24px',\n color: '#6b7280',\n },\n error: {\n textAlign: 'center' as const,\n padding: '24px',\n color: '#dc2626',\n },\n voteButton: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n justifyContent: 'center',\n padding: '8px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n minWidth: '48px',\n transition: 'all 0.15s',\n },\n voteButtonActive: {\n backgroundColor: '#dbeafe',\n borderColor: '#2563eb',\n color: '#2563eb',\n },\n voteCount: {\n fontSize: '14px',\n fontWeight: 600,\n color: '#111827',\n },\n cardWithVote: {\n display: 'flex',\n gap: '12px',\n },\n cardContent: {\n flex: 1,\n },\n form: {\n marginBottom: '16px',\n padding: '16px',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n },\n formHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '12px',\n },\n formTitle: {\n fontSize: '14px',\n fontWeight: 500,\n color: '#111827',\n margin: 0,\n },\n typeSelector: {\n display: 'flex',\n gap: '8px',\n marginBottom: '12px',\n },\n typeButton: {\n padding: '6px 12px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n backgroundColor: '#ffffff',\n fontSize: '13px',\n cursor: 'pointer',\n transition: 'all 0.15s',\n },\n typeButtonActive: {\n backgroundColor: '#111827',\n borderColor: '#111827',\n color: '#ffffff',\n },\n textarea: {\n width: '100%',\n padding: '10px 12px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n fontSize: '14px',\n resize: 'vertical' as const,\n minHeight: '80px',\n fontFamily: 'inherit',\n marginBottom: '12px',\n },\n submitButton: {\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#111827',\n color: '#ffffff',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'opacity 0.15s',\n },\n successMessage: {\n padding: '12px',\n backgroundColor: '#d1fae5',\n borderRadius: '6px',\n color: '#059669',\n fontSize: '14px',\n marginBottom: '16px',\n },\n ownBadge: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 6px',\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 500,\n backgroundColor: '#f3f4f6',\n color: '#6b7280',\n marginLeft: '6px',\n },\n};\n\nconst typeConfig: Record<FeedbackType, { label: string; color: string; bg: string }> = {\n feedback: { label: 'Feedback', color: '#2563eb', bg: '#dbeafe' },\n bug_report: { label: 'Bug Report', color: '#dc2626', bg: '#fee2e2' },\n feature_request: { label: 'Feature Request', color: '#d97706', bg: '#fef3c7' },\n article_rating: { label: 'Article Rating', color: '#7c3aed', bg: '#ede9fe' },\n};\n\nconst statusConfig: Record<string, { label: string; color: string; bg: string }> = {\n new: { label: 'New', color: '#6b7280', bg: '#f3f4f6' },\n reviewed: { label: 'Reviewed', color: '#2563eb', bg: '#dbeafe' },\n in_progress: { label: 'In Progress', color: '#d97706', bg: '#fef3c7' },\n resolved: { label: 'Resolved', color: '#059669', bg: '#d1fae5' },\n closed: { label: 'Closed', color: '#6b7280', bg: '#f3f4f6' },\n};\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nconst FORM_TYPES: { value: FeedbackType; label: string }[] = [\n { value: 'feedback', label: 'Feedback' },\n { value: 'bug_report', label: 'Bug' },\n { value: 'feature_request', label: 'Feature' },\n];\n\n/**\n * Requests component for displaying user's submitted feedback and requests.\n *\n * @example\n * ```tsx\n * import { Requests } from '@census-ai/census-sdk/react';\n *\n * function MyRequestsPage() {\n * return (\n * <div>\n * <h1>My Requests</h1>\n * <Requests onRequestClick={(req) => console.log('Clicked:', req)} />\n * </div>\n * );\n * }\n * ```\n */\nexport function Requests({\n status,\n type,\n limit = 50,\n className,\n showEmptyState = true,\n onRequestClick,\n}: RequestsProps) {\n const { isIdentified } = useCensusContext();\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const [showForm, setShowForm] = useState(false);\n const [formType, setFormType] = useState<FeedbackType>('feedback');\n const [formMessage, setFormMessage] = useState('');\n const [localVotes, setLocalVotes] = useState<Record<string, { count: number; hasVoted: boolean }>>({});\n\n const { requests, isLoading, error, refetch, settings } = useRequests({\n status,\n type,\n limit,\n });\n\n const { vote, isVoting } = useVote();\n const { submitFeedback, isSubmitting, isSuccess, reset } = useFeedback();\n\n const handleRequestClick = useCallback(\n (request: Request) => {\n onRequestClick?.(request);\n },\n [onRequestClick]\n );\n\n const handleVote = useCallback(\n async (feedbackId: string, currentCount: number, currentHasVoted: boolean) => {\n if (isVoting) return;\n\n // Optimistic update\n setLocalVotes((prev) => ({\n ...prev,\n [feedbackId]: {\n count: currentHasVoted ? currentCount - 1 : currentCount + 1,\n hasVoted: !currentHasVoted,\n },\n }));\n\n try {\n const result = await vote(feedbackId);\n // Update with actual result\n setLocalVotes((prev) => ({\n ...prev,\n [feedbackId]: {\n count: result.vote_count,\n hasVoted: result.user_has_voted,\n },\n }));\n } catch {\n // Revert on error\n setLocalVotes((prev) => ({\n ...prev,\n [feedbackId]: {\n count: currentCount,\n hasVoted: currentHasVoted,\n },\n }));\n }\n },\n [vote, isVoting]\n );\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!formMessage.trim() || isSubmitting) return;\n\n try {\n await submitFeedback({\n type: formType,\n message: formMessage,\n });\n setFormMessage('');\n setShowForm(false);\n // Refetch after a short delay to allow DB to update\n setTimeout(() => {\n refetch();\n reset();\n }, 500);\n } catch {\n // Error is handled by useFeedback hook\n }\n },\n [formType, formMessage, isSubmitting, submitFeedback, refetch, reset]\n );\n\n const getVoteInfo = (request: Request) => {\n const local = localVotes[request.id];\n return {\n count: local?.count ?? request.vote_count,\n hasVoted: local?.hasVoted ?? request.user_has_voted,\n };\n };\n\n if (!isIdentified) {\n return showEmptyState ? (\n <div style={defaultStyles.empty}>\n <p>Please sign in to view your requests.</p>\n </div>\n ) : null;\n }\n\n if (isLoading) {\n return (\n <div style={defaultStyles.loading}>\n <p>Loading requests...</p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={defaultStyles.error}>\n <p>Failed to load requests. <button onClick={refetch} style={{ color: 'inherit', textDecoration: 'underline', background: 'none', border: 'none', cursor: 'pointer' }}>Try again</button></p>\n </div>\n );\n }\n\n // Request creation form component\n const renderForm = () => {\n if (!settings.allowRequestCreation) return null;\n\n if (isSuccess) {\n return (\n <div style={defaultStyles.successMessage}>\n Thanks for your feedback! It has been submitted.\n </div>\n );\n }\n\n if (!showForm) {\n return (\n <button\n onClick={() => setShowForm(true)}\n style={{\n ...defaultStyles.submitButton,\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n <svg width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n New Request\n </button>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} style={defaultStyles.form}>\n <div style={defaultStyles.formHeader}>\n <p style={defaultStyles.formTitle}>Submit a request</p>\n <button\n type=\"button\"\n onClick={() => setShowForm(false)}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n ✕\n </button>\n </div>\n <div style={defaultStyles.typeSelector}>\n {FORM_TYPES.map((t) => (\n <button\n key={t.value}\n type=\"button\"\n onClick={() => setFormType(t.value)}\n style={{\n ...defaultStyles.typeButton,\n ...(formType === t.value ? defaultStyles.typeButtonActive : {}),\n }}\n >\n {t.label}\n </button>\n ))}\n </div>\n <textarea\n value={formMessage}\n onChange={(e) => setFormMessage(e.target.value)}\n placeholder=\"Describe your request...\"\n style={defaultStyles.textarea}\n required\n />\n <button\n type=\"submit\"\n style={{\n ...defaultStyles.submitButton,\n opacity: isSubmitting ? 0.6 : 1,\n }}\n disabled={isSubmitting}\n >\n {isSubmitting ? 'Submitting...' : 'Submit'}\n </button>\n </form>\n );\n };\n\n if (requests.length === 0 && showEmptyState) {\n return (\n <div style={defaultStyles.container} className={className}>\n {renderForm()}\n <div style={defaultStyles.empty}>\n <svg\n style={defaultStyles.emptyIcon}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z\"\n />\n </svg>\n <p style={{ margin: 0, fontWeight: 500, color: '#111827' }}>No requests yet</p>\n <p style={{ margin: '8px 0 0', fontSize: '14px' }}>\n {settings.allowRequestCreation\n ? 'Submit your first request above.'\n : 'When you submit feedback, bug reports, or feature requests, they\\'ll appear here.'}\n </p>\n </div>\n </div>\n );\n }\n\n const canVote = settings.allowVoting && settings.feedbackVisibility !== 'own';\n\n return (\n <div style={defaultStyles.container} className={className}>\n {renderForm()}\n <ul style={defaultStyles.list}>\n {requests.map((request) => {\n const typeInfo = typeConfig[request.feedback_type] || typeConfig.feedback;\n const statusInfo = statusConfig[request.status] || statusConfig.new;\n const isHovered = hoveredId === request.id;\n const voteInfo = getVoteInfo(request);\n\n return (\n <li\n key={request.id}\n style={{\n ...defaultStyles.card,\n ...(isHovered ? defaultStyles.cardHover : {}),\n }}\n onMouseEnter={() => setHoveredId(request.id)}\n onMouseLeave={() => setHoveredId(null)}\n >\n <div style={canVote ? defaultStyles.cardWithVote : undefined}>\n {canVote && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleVote(request.id, voteInfo.count, voteInfo.hasVoted);\n }}\n disabled={isVoting}\n style={{\n ...defaultStyles.voteButton,\n ...(voteInfo.hasVoted ? defaultStyles.voteButtonActive : {}),\n }}\n title={voteInfo.hasVoted ? 'Remove vote' : 'Upvote this request'}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill={voteInfo.hasVoted ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n <span style={{\n ...defaultStyles.voteCount,\n ...(voteInfo.hasVoted ? { color: '#2563eb' } : {}),\n }}>\n {voteInfo.count}\n </span>\n </button>\n )}\n <div\n style={canVote ? defaultStyles.cardContent : undefined}\n onClick={() => handleRequestClick(request)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleRequestClick(request);\n }\n }}\n >\n <div style={defaultStyles.header}>\n <div style={defaultStyles.badges}>\n <span\n style={{\n ...defaultStyles.badge,\n color: typeInfo.color,\n backgroundColor: typeInfo.bg,\n }}\n >\n {typeInfo.label}\n </span>\n <span\n style={{\n ...defaultStyles.badge,\n color: statusInfo.color,\n backgroundColor: statusInfo.bg,\n }}\n >\n {statusInfo.label}\n </span>\n {request.is_own && (\n <span style={defaultStyles.ownBadge}>You</span>\n )}\n </div>\n </div>\n <p style={defaultStyles.message}>\n {request.message || 'No message provided'}\n </p>\n <div style={defaultStyles.meta}>\n <span>{formatDate(request.created_at)}</span>\n {!canVote && voteInfo.count > 0 && (\n <span>{voteInfo.count} vote{voteInfo.count !== 1 ? 's' : ''}</span>\n )}\n {request.page_url && (\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '200px' }}>\n From: {request.page_url}\n </span>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { KnowledgeBase } from './KnowledgeBase';\nimport { Requests } from './Requests';\n\nexport type HelpCenterTab = 'articles' | 'requests';\n\nexport interface HelpCenterProps {\n /**\n * Which tabs to show\n * @default ['articles', 'requests']\n */\n tabs?: HelpCenterTab[];\n\n /**\n * Default active tab\n * @default 'articles'\n */\n defaultTab?: HelpCenterTab;\n\n /**\n * Custom labels for tabs\n */\n tabLabels?: Partial<Record<HelpCenterTab, string>>;\n\n /**\n * Show search in knowledge base\n * @default true\n */\n showSearch?: boolean;\n\n /**\n * Show categories in knowledge base\n * @default true\n */\n showCategories?: boolean;\n\n /**\n * Custom CSS class\n */\n className?: string;\n}\n\nconst defaultTabLabels: Record<HelpCenterTab, string> = {\n articles: 'Articles',\n requests: 'My Requests',\n};\n\nconst defaultStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n tabsContainer: {\n display: 'flex',\n gap: '4px',\n padding: '4px',\n backgroundColor: '#f3f4f6',\n borderRadius: '8px',\n marginBottom: '24px',\n },\n tab: {\n flex: 1,\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n transition: 'all 0.15s',\n backgroundColor: 'transparent',\n color: '#6b7280',\n },\n tabActive: {\n backgroundColor: '#ffffff',\n color: '#111827',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n },\n};\n\n/**\n * HelpCenter component that combines KnowledgeBase and Requests with tabs.\n *\n * @example\n * ```tsx\n * import { CensusProvider, HelpCenter } from '@census-ai/census-sdk/react';\n *\n * function HelpPage() {\n * return (\n * <CensusProvider apiKey=\"cs_live_xxx\">\n * <HelpCenter\n * tabs={['articles', 'requests']}\n * defaultTab=\"articles\"\n * showSearch\n * />\n * </CensusProvider>\n * );\n * }\n * ```\n */\nexport function HelpCenter({\n tabs = ['articles', 'requests'],\n defaultTab = 'articles',\n tabLabels = {},\n showSearch = true,\n showCategories = true,\n className,\n}: HelpCenterProps) {\n const [activeTab, setActiveTab] = useState<HelpCenterTab>(defaultTab);\n\n const mergedLabels = { ...defaultTabLabels, ...tabLabels };\n\n // If only one tab, don't show tabs UI\n if (tabs.length === 1) {\n return (\n <div style={defaultStyles.container} className={className}>\n {tabs[0] === 'articles' && (\n <KnowledgeBase showSearch={showSearch} showCategories={showCategories} />\n )}\n {tabs[0] === 'requests' && <Requests />}\n </div>\n );\n }\n\n return (\n <div style={defaultStyles.container} className={className}>\n {/* Tabs */}\n <div style={defaultStyles.tabsContainer}>\n {tabs.map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n ...defaultStyles.tab,\n ...(activeTab === tab ? defaultStyles.tabActive : {}),\n }}\n >\n {mergedLabels[tab]}\n </button>\n ))}\n </div>\n\n {/* Content */}\n {activeTab === 'articles' && tabs.includes('articles') && (\n <KnowledgeBase showSearch={showSearch} showCategories={showCategories} />\n )}\n\n {activeTab === 'requests' && tabs.includes('requests') && <Requests />}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client.ts","../../src/react/context.tsx","../../src/react/hooks.ts","../../src/react/components/FeedbackButton.tsx","../../src/react/components/KnowledgeBase.tsx","../../src/react/components/Requests.tsx","../../src/react/components/HelpCenter.tsx"],"names":["DEFAULT_BASE_URL","CensusClient","config","prefix","user","options","validTypes","response","params","queryString","url","slugOrId","error","feedbackId","eventType","properties","events","event","guideId","path","method","body","headers","errorMessage","args","createCensus","CensusContext","createContext","CensusProvider","apiKey","baseUrl","debug","theme","children","isReady","setIsReady","useState","isIdentified","setIsIdentified","client","useMemo","useEffect","value","jsx","useCensus","context","useContext","useCensusContext","useIdentify","isIdentifying","setIsIdentifying","setError","err","useFeedback","isSubmitting","setIsSubmitting","isSuccess","setIsSuccess","setFeedbackId","submitFeedback","useCallback","result","reset","useArticles","data","setData","isLoading","setIsLoading","fetchArticles","useArticle","article","setArticle","fetchArticle","defaultSettings","useRequests","fetchRequests","useVote","isVoting","setIsVoting","useTrack","track","trackBatch","useFeatureGroups","featureGroups","setFeatureGroups","fetchFeatureGroups","defaultStyles","positionStyles","feedbackTypeLabels","feedbackTypeEmojis","getThemeStyles","FeedbackButton","position","text","allowedTypes","themeProp","onSubmit","onError","contextTheme","isOpen","setIsOpen","selectedType","setSelectedType","message","setMessage","themeStyles","handleOpen","handleClose","handleSubmit","e","feedbackData","jsxs","Fragment","FeedbackModal","onClose","onTypeChange","onMessageChange","type","KnowledgeBase","showSearch","showCategories","defaultCategory","className","onArticleView","searchQuery","setSearchQuery","selectedCategory","setSelectedCategory","selectedArticleSlug","setSelectedArticleSlug","articles","isLoadingArticles","articlesError","selectedArticle","isLoadingArticle","articleError","categories","cats","handleArticleClick","handleBack","category","typeConfig","statusConfig","formatDate","dateString","FORM_TYPES","Requests","status","limit","showEmptyState","onRequestClick","hoveredId","setHoveredId","showForm","setShowForm","formType","setFormType","formMessage","setFormMessage","localVotes","setLocalVotes","requests","refetch","settings","vote","handleRequestClick","request","handleVote","currentCount","currentHasVoted","prev","getVoteInfo","local","renderForm","t","canVote","typeInfo","statusInfo","isHovered","voteInfo","defaultTabLabels","feedbackTypeConfig","SearchIcon","BookIcon","ChevronRightIcon","ChevronDownIcon","ArrowLeftIcon","ClockIcon","LayersIcon","MessageIcon","PlusIcon","LoaderIcon","styles","spinnerStyles","HelpCenter","tabs","defaultTab","tabLabels","activeTab","setActiveTab","setSelectedArticle","expandedGroups","setExpandedGroups","selectedFeatureId","setSelectedFeatureId","searchInputRef","useRef","articlesLoading","fullArticle","articleLoading","requestsLoading","refetchRequests","groupsLoading","mergedLabels","handleKeyDown","toggleGroup","groupId","next","filteredArticles","renderArticleDetail","renderArticles","renderRequestForm","renderRequests","tab","group","feature"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CensusConfig,\n UserIdentity,\n FeedbackOptions,\n ArticlesOptions,\n ArticlesResponse,\n Article,\n RequestsOptions,\n RequestsResponse,\n BatchEventsOptions,\n CensusError,\n Guide,\n GuidesResponse,\n GuideAnalyticsEvent,\n FeatureGroupsResponse,\n} from './types';\n\n/**\n * Default API base URL\n */\nconst DEFAULT_BASE_URL = 'https://api.census.ai';\n\n/**\n * Census SDK Client\n *\n * The main client for interacting with the Census API.\n * Use `createCensus()` to create an instance.\n *\n * @example\n * ```typescript\n * import { createCensus } from '@census-ai/census-sdk';\n *\n * const census = createCensus({ apiKey: 'cs_live_xxx' });\n *\n * await census.identify({ userId: 'user_123', email: 'user@example.com' });\n * await census.submitFeedback({ type: 'bug_report', message: 'Button is broken' });\n * ```\n */\nexport class CensusClient {\n private apiKey: string;\n private baseUrl: string;\n private debug: boolean;\n private currentUserId: string | null = null;\n\n constructor(config: CensusConfig) {\n if (!config.apiKey) {\n throw new Error('Census: apiKey is required');\n }\n\n // Support both new (cs_) and legacy (op_) key prefixes\n const validPrefixes = ['cs_live_', 'cs_test_', 'op_live_', 'op_test_'];\n if (!validPrefixes.some(prefix => config.apiKey.startsWith(prefix))) {\n console.warn('Census: API key should start with \"cs_live_\" or \"cs_test_\"');\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n this.debug = config.debug || false;\n\n this.log('Initialized with base URL:', this.baseUrl);\n }\n\n /**\n * Identify a user for tracking purposes.\n * Call this when a user logs in or when you have user information.\n *\n * @param user - User identity information\n *\n * @example\n * ```typescript\n * await census.identify({\n * userId: 'user_123',\n * email: 'john@example.com',\n * name: 'John Doe',\n * organizationId: 'org_456',\n * organizationName: 'Acme Inc',\n * });\n * ```\n */\n async identify(user: UserIdentity): Promise<void> {\n if (!user.userId) {\n throw new Error('Census: userId is required for identify()');\n }\n\n this.currentUserId = user.userId;\n\n await this.request('/api/sdk/identify', 'POST', {\n userId: user.userId,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n metadata: user.metadata,\n organizationId: user.organizationId,\n organizationName: user.organizationName,\n organizationDomain: user.organizationDomain,\n organizationPlan: user.organizationPlan,\n });\n\n this.log('User identified:', user.userId);\n }\n\n /**\n * Clear the current user identity.\n * Call this when a user logs out.\n */\n reset(): void {\n this.currentUserId = null;\n this.log('User identity reset');\n }\n\n /**\n * Submit feedback, bug report, or feature request.\n *\n * @param options - Feedback options\n *\n * @example\n * ```typescript\n * // Submit a bug report\n * await census.submitFeedback({\n * type: 'bug_report',\n * message: 'The submit button is not working on Firefox',\n * });\n *\n * // Submit a feature request\n * await census.submitFeedback({\n * type: 'feature_request',\n * message: 'It would be great to have dark mode support',\n * });\n *\n * // Rate an article\n * await census.submitFeedback({\n * type: 'article_rating',\n * articleId: 'article_123',\n * helpful: true,\n * rating: 5,\n * });\n * ```\n */\n async submitFeedback(options: FeedbackOptions): Promise<{ feedbackId: string }> {\n const validTypes = ['feedback', 'bug_report', 'feature_request', 'article_rating'];\n if (!options.type || !validTypes.includes(options.type)) {\n throw new Error(`Census: type must be one of: ${validTypes.join(', ')}`);\n }\n\n if (options.type === 'article_rating') {\n if (options.rating === undefined && options.helpful === undefined) {\n throw new Error('Census: article_rating requires rating or helpful field');\n }\n } else if (!options.message) {\n throw new Error('Census: message is required for this feedback type');\n }\n\n const response = await this.request<{ success: boolean; feedbackId: string }>(\n '/api/sdk/feedback',\n 'POST',\n {\n type: options.type,\n message: options.message,\n rating: options.rating,\n helpful: options.helpful,\n userId: this.currentUserId,\n articleId: options.articleId,\n pageUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n metadata: options.metadata,\n }\n );\n\n this.log('Feedback submitted:', response.feedbackId);\n return { feedbackId: response.feedbackId };\n }\n\n /**\n * Fetch published articles from the knowledge base.\n *\n * @param options - Query options\n * @returns Articles and pagination info\n *\n * @example\n * ```typescript\n * // Get all articles\n * const { articles } = await census.getArticles();\n *\n * // Search articles\n * const { articles } = await census.getArticles({ search: 'getting started' });\n *\n * // Filter by category\n * const { articles } = await census.getArticles({ category: 'guides' });\n * ```\n */\n async getArticles(options?: ArticlesOptions): Promise<ArticlesResponse> {\n const params = new URLSearchParams();\n if (options?.category) params.set('category', options.category);\n if (options?.search) params.set('search', options.search);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const url = `/api/sdk/articles${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.request<ArticlesResponse>(url, 'GET');\n this.log('Fetched articles:', response.articles.length);\n return response;\n }\n\n /**\n * Fetch a single article by slug or ID.\n *\n * @param slugOrId - Article slug or ID\n * @returns Article or null if not found\n *\n * @example\n * ```typescript\n * const article = await census.getArticle('getting-started');\n * if (article) {\n * console.log(article.title, article.content_html);\n * }\n * ```\n */\n async getArticle(slugOrId: string): Promise<Article | null> {\n try {\n const response = await this.request<{ article: Article }>(\n `/api/sdk/articles/${encodeURIComponent(slugOrId)}`,\n 'GET'\n );\n this.log('Fetched article:', slugOrId);\n return response.article;\n } catch (error) {\n if ((error as CensusError).status === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Fetch feature groups with their features and article counts.\n * Used for navigation in the knowledge base.\n *\n * @returns Feature groups with nested features\n *\n * @example\n * ```typescript\n * const { feature_groups } = await census.getFeatureGroups();\n * feature_groups.forEach(group => {\n * console.log(group.name, group.features.length);\n * });\n * ```\n */\n async getFeatureGroups(): Promise<FeatureGroupsResponse> {\n const response = await this.request<FeatureGroupsResponse>(\n '/api/sdk/feature-groups',\n 'GET'\n );\n this.log('Fetched feature groups:', response.feature_groups.length);\n return response;\n }\n\n /**\n * Fetch the current user's submitted requests (feedback, bugs, feature requests).\n * Requires a user to be identified first.\n *\n * @param options - Query options\n * @returns Requests and pagination info\n *\n * @example\n * ```typescript\n * // Get all requests for the current user\n * const { requests } = await census.getRequests();\n *\n * // Filter by status\n * const { requests } = await census.getRequests({ status: 'in_progress' });\n *\n * // Filter by type\n * const { requests } = await census.getRequests({ type: 'bug_report' });\n * ```\n */\n async getRequests(options?: RequestsOptions): Promise<RequestsResponse> {\n if (!this.currentUserId) {\n throw new Error('Census: User must be identified before fetching requests. Call identify() first.');\n }\n\n const params = new URLSearchParams();\n params.set('userId', this.currentUserId);\n if (options?.status) params.set('status', options.status);\n if (options?.type) params.set('type', options.type);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n const response = await this.request<RequestsResponse>(\n `/api/sdk/requests?${params.toString()}`,\n 'GET'\n );\n this.log('Fetched requests:', response.requests.length);\n return response;\n }\n\n /**\n * Vote on a feedback request (toggle).\n * If the user has already voted, removes the vote.\n * If the user hasn't voted, adds a vote.\n *\n * @param feedbackId - ID of the feedback to vote on\n * @returns Vote result with action taken and new vote count\n *\n * @example\n * ```typescript\n * // Vote on a feedback request\n * const result = await census.vote('feedback-id-123');\n * console.log(result.action); // 'added' or 'removed'\n * console.log(result.vote_count); // 5\n * console.log(result.user_has_voted); // true\n * ```\n */\n async vote(feedbackId: string): Promise<{\n success: boolean;\n action: 'added' | 'removed';\n vote_count: number;\n user_has_voted: boolean;\n }> {\n if (!this.currentUserId) {\n throw new Error('Census: User must be identified before voting. Call identify() first.');\n }\n\n if (!feedbackId) {\n throw new Error('Census: feedbackId is required for vote()');\n }\n\n const response = await this.request<{\n success: boolean;\n action: 'added' | 'removed';\n vote_count: number;\n user_has_voted: boolean;\n }>('/api/sdk/requests/vote', 'POST', {\n feedbackId,\n userId: this.currentUserId,\n });\n\n this.log('Vote result:', response.action, 'for feedback:', feedbackId);\n return response;\n }\n\n /**\n * Track a custom analytics event.\n *\n * @param eventType - Name of the event\n * @param properties - Additional event properties\n *\n * @example\n * ```typescript\n * // Track a button click\n * await census.track('button_clicked', { buttonId: 'submit-form' });\n *\n * // Track a page view\n * await census.track('page_viewed', { page: '/pricing' });\n * ```\n */\n async track(eventType: string, properties?: Record<string, unknown>): Promise<void> {\n if (!eventType) {\n throw new Error('Census: eventType is required for track()');\n }\n\n await this.request('/api/sdk/events', 'POST', {\n eventType,\n userId: this.currentUserId,\n properties,\n });\n\n this.log('Event tracked:', eventType);\n }\n\n /**\n * Track multiple events in a single request.\n * More efficient than calling track() multiple times.\n *\n * @param events - Array of events to track\n *\n * @example\n * ```typescript\n * await census.trackBatch({\n * events: [\n * { eventType: 'page_viewed', properties: { page: '/home' } },\n * { eventType: 'button_clicked', properties: { button: 'cta' } },\n * ],\n * });\n * ```\n */\n async trackBatch(options: BatchEventsOptions): Promise<void> {\n if (!options.events || options.events.length === 0) {\n throw new Error('Census: at least one event is required');\n }\n\n if (options.events.length > 100) {\n throw new Error('Census: maximum 100 events per batch');\n }\n\n const events = options.events.map((event) => ({\n eventType: event.eventType,\n userId: this.currentUserId,\n articleId: event.articleId,\n featureId: event.featureId,\n properties: event.properties,\n }));\n\n await this.request('/api/sdk/events', 'POST', { events });\n\n this.log('Batch events tracked:', options.events.length);\n }\n\n /**\n * Fetch available guides for the current user.\n * Returns guides that match the user's context and haven't been completed.\n *\n * @returns Guides and list of completed guide IDs\n *\n * @example\n * ```typescript\n * const { guides, completedGuides } = await census.getGuides();\n * guides.forEach(guide => console.log(guide.name));\n * ```\n */\n async getGuides(): Promise<GuidesResponse> {\n const params = new URLSearchParams();\n if (this.currentUserId) {\n params.set('userId', this.currentUserId);\n }\n\n const queryString = params.toString();\n const url = `/api/sdk/guides${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.request<GuidesResponse>(url, 'GET');\n this.log('Fetched guides:', response.guides.length);\n return response;\n }\n\n /**\n * Fetch a single guide by slug or ID.\n *\n * @param slugOrId - Guide slug or ID\n * @returns Guide or null if not found\n *\n * @example\n * ```typescript\n * const guide = await census.getGuide('onboarding-tour');\n * if (guide) {\n * console.log(guide.name, guide.guide_steps.length);\n * }\n * ```\n */\n async getGuide(slugOrId: string): Promise<Guide | null> {\n try {\n const params = new URLSearchParams();\n if (this.currentUserId) {\n params.set('userId', this.currentUserId);\n }\n\n const queryString = params.toString();\n const url = `/api/sdk/guides/${encodeURIComponent(slugOrId)}${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.request<{ guide: Guide }>(url, 'GET');\n this.log('Fetched guide:', slugOrId);\n return response.guide;\n } catch (error) {\n if ((error as CensusError).status === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Track a guide analytics event.\n * Used to track user progress through guides.\n *\n * @param event - Guide analytics event\n *\n * @example\n * ```typescript\n * await census.trackGuideEvent({\n * guideId: 'guide_123',\n * eventType: 'step_completed',\n * stepId: 'step_456',\n * stepIndex: 2,\n * sessionId: 'session_789',\n * });\n * ```\n */\n async trackGuideEvent(event: GuideAnalyticsEvent): Promise<void> {\n if (!event.guideId || !event.eventType || !event.sessionId) {\n throw new Error('Census: guideId, eventType, and sessionId are required for trackGuideEvent()');\n }\n\n await this.request('/api/sdk/guides/events', 'POST', {\n guideId: event.guideId,\n eventType: event.eventType,\n stepId: event.stepId,\n stepIndex: event.stepIndex,\n pageUrl: event.pageUrl || (typeof window !== 'undefined' ? window.location.href : undefined),\n sessionId: event.sessionId,\n userId: event.userId || this.currentUserId,\n metadata: event.metadata,\n });\n\n this.log('Guide event tracked:', event.eventType, event.guideId);\n }\n\n /**\n * Mark a guide as completed for the current user.\n * Prevents the guide from showing again.\n *\n * @param guideId - ID of the guide to mark as completed\n *\n * @example\n * ```typescript\n * await census.markGuideCompleted('guide_123');\n * ```\n */\n async markGuideCompleted(guideId: string): Promise<void> {\n if (!guideId) {\n throw new Error('Census: guideId is required for markGuideCompleted()');\n }\n\n if (!this.currentUserId) {\n throw new Error('Census: User must be identified before marking guides complete. Call identify() first.');\n }\n\n await this.request('/api/sdk/guides/complete', 'POST', {\n guideId,\n userId: this.currentUserId,\n });\n\n this.log('Guide marked completed:', guideId);\n }\n\n /**\n * Get the current identified user ID\n */\n getCurrentUserId(): string | null {\n return this.currentUserId;\n }\n\n /**\n * Check if a user is currently identified\n */\n isIdentified(): boolean {\n return this.currentUserId !== null;\n }\n\n /**\n * Make an API request\n */\n private async request<T>(path: string, method: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'X-Census-Key': this.apiKey,\n };\n\n if (body) {\n headers['Content-Type'] = 'application/json';\n }\n\n this.log(`${method} ${path}`, body);\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n let errorMessage = `Request failed with status ${response.status}`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorMessage;\n } catch {\n // Use default error message\n }\n\n const error: CensusError = {\n error: errorMessage,\n status: response.status,\n };\n throw error;\n }\n\n return response.json();\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[Census]', ...args);\n }\n }\n}\n\n/**\n * Create a new Census SDK client.\n *\n * @param config - Configuration options\n * @returns Census client instance\n *\n * @example\n * ```typescript\n * import { createCensus } from '@census-ai/census-sdk';\n *\n * const census = createCensus({\n * apiKey: 'cs_live_your_key_here',\n * debug: true, // Enable debug logging\n * });\n * ```\n */\nexport function createCensus(config: CensusConfig): CensusClient {\n return new CensusClient(config);\n}\n","import { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { createCensus, CensusClient } from '../client';\nimport type { CensusProviderProps, CensusTheme, UserIdentity } from '../types';\n\n/**\n * Context value for the Census provider\n */\ninterface CensusContextValue {\n client: CensusClient;\n theme: CensusTheme;\n isReady: boolean;\n isIdentified: boolean;\n}\n\nconst CensusContext = createContext<CensusContextValue | null>(null);\n\n/**\n * Provider component for the Census SDK.\n * Wrap your app with this to use Census hooks and components.\n *\n * @example\n * ```tsx\n * import { CensusProvider } from '@census-ai/census-sdk/react';\n *\n * function App() {\n * return (\n * <CensusProvider\n * apiKey=\"cs_live_xxx\"\n * user={{ userId: 'user_123', email: 'user@example.com' }}\n * >\n * <YourApp />\n * </CensusProvider>\n * );\n * }\n * ```\n */\nexport function CensusProvider({\n apiKey,\n baseUrl,\n debug,\n user,\n theme = {},\n children,\n}: CensusProviderProps) {\n const [isReady, setIsReady] = useState(false);\n const [isIdentified, setIsIdentified] = useState(false);\n\n const client = useMemo(() => {\n return createCensus({ apiKey, baseUrl, debug });\n }, [apiKey, baseUrl, debug]);\n\n // Automatically identify user if provided\n useEffect(() => {\n if (user) {\n client\n .identify(user)\n .then(() => {\n setIsIdentified(true);\n setIsReady(true);\n })\n .catch((error) => {\n console.error('[Census] Failed to identify user:', error);\n setIsReady(true);\n });\n } else {\n setIsReady(true);\n }\n }, [client, user]);\n\n const value: CensusContextValue = useMemo(\n () => ({\n client,\n theme,\n isReady,\n isIdentified,\n }),\n [client, theme, isReady, isIdentified]\n );\n\n return <CensusContext.Provider value={value}>{children}</CensusContext.Provider>;\n}\n\n/**\n * Hook to access the Census client directly.\n *\n * @returns The Census client instance\n * @throws If used outside of CensusProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const census = useCensus();\n *\n * const handleClick = async () => {\n * await census.track('button_clicked');\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function useCensus(): CensusClient {\n const context = useContext(CensusContext);\n if (!context) {\n throw new Error('useCensus must be used within a CensusProvider');\n }\n return context.client;\n}\n\n/**\n * Hook to access the Census context (client, theme, and state).\n *\n * @returns The full Census context\n * @throws If used outside of CensusProvider\n */\nexport function useCensusContext(): CensusContextValue {\n const context = useContext(CensusContext);\n if (!context) {\n throw new Error('useCensusContext must be used within a CensusProvider');\n }\n return context;\n}\n\n/**\n * Hook to identify a user.\n *\n * @returns Object with identify function and state\n *\n * @example\n * ```tsx\n * function LoginHandler() {\n * const { identify, isIdentifying } = useIdentify();\n *\n * const handleLogin = async (user) => {\n * await identify({\n * userId: user.id,\n * email: user.email,\n * name: user.name,\n * });\n * };\n * }\n * ```\n */\nexport function useIdentify() {\n const { client } = useCensusContext();\n const [isIdentifying, setIsIdentifying] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const identify = async (user: UserIdentity) => {\n setIsIdentifying(true);\n setError(null);\n try {\n await client.identify(user);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to identify user'));\n throw err;\n } finally {\n setIsIdentifying(false);\n }\n };\n\n const reset = () => {\n client.reset();\n };\n\n return {\n identify,\n reset,\n isIdentifying,\n isIdentified: client.isIdentified(),\n error,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useCensusContext } from './context';\nimport type {\n FeedbackOptions,\n ArticlesOptions,\n ArticlesResponse,\n Article,\n RequestsOptions,\n RequestsResponse,\n RequestsSettings,\n FeatureGroup,\n} from '../types';\n\n/**\n * Hook for submitting feedback.\n *\n * @returns Object with submit function and state\n *\n * @example\n * ```tsx\n * function FeedbackForm() {\n * const { submitFeedback, isSubmitting, isSuccess, error } = useFeedback();\n *\n * const handleSubmit = async (message: string) => {\n * await submitFeedback({\n * type: 'feedback',\n * message,\n * });\n * };\n *\n * return (\n * <form onSubmit={...}>\n * {isSuccess && <p>Thanks for your feedback!</p>}\n * {error && <p>Error: {error.message}</p>}\n * <button disabled={isSubmitting}>Submit</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useFeedback() {\n const { client } = useCensusContext();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [feedbackId, setFeedbackId] = useState<string | null>(null);\n\n const submitFeedback = useCallback(\n async (options: FeedbackOptions) => {\n setIsSubmitting(true);\n setIsSuccess(false);\n setError(null);\n setFeedbackId(null);\n\n try {\n const result = await client.submitFeedback(options);\n setFeedbackId(result.feedbackId);\n setIsSuccess(true);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to submit feedback');\n setError(error);\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n },\n [client]\n );\n\n const reset = useCallback(() => {\n setIsSuccess(false);\n setError(null);\n setFeedbackId(null);\n }, []);\n\n return {\n submitFeedback,\n reset,\n isSubmitting,\n isSuccess,\n error,\n feedbackId,\n };\n}\n\n/**\n * Hook for fetching articles from the knowledge base.\n *\n * @param options - Query options (optional)\n * @returns Object with articles data and loading state\n *\n * @example\n * ```tsx\n * function ArticleList() {\n * const { articles, isLoading, error, refetch } = useArticles();\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n *\n * return (\n * <ul>\n * {articles.map(article => (\n * <li key={article.id}>{article.title}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useArticles(options?: ArticlesOptions) {\n const { client, isReady } = useCensusContext();\n const [data, setData] = useState<ArticlesResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchArticles = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getArticles(options);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch articles'));\n } finally {\n setIsLoading(false);\n }\n }, [client, options?.category, options?.search, options?.limit, options?.offset]);\n\n useEffect(() => {\n if (isReady) {\n fetchArticles();\n }\n }, [isReady, fetchArticles]);\n\n return {\n articles: data?.articles || [],\n pagination: data?.pagination,\n isLoading,\n error,\n refetch: fetchArticles,\n };\n}\n\n/**\n * Hook for fetching a single article.\n *\n * @param slugOrId - Article slug or ID\n * @returns Object with article data and loading state\n *\n * @example\n * ```tsx\n * function ArticlePage({ slug }) {\n * const { article, isLoading, error } = useArticle(slug);\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n * if (!article) return <p>Article not found</p>;\n *\n * return (\n * <article>\n * <h1>{article.title}</h1>\n * <div dangerouslySetInnerHTML={{ __html: article.content_html }} />\n * </article>\n * );\n * }\n * ```\n */\nexport function useArticle(slugOrId: string) {\n const { client, isReady } = useCensusContext();\n const [article, setArticle] = useState<Article | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchArticle = useCallback(async () => {\n if (!slugOrId) {\n setArticle(null);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getArticle(slugOrId);\n setArticle(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch article'));\n } finally {\n setIsLoading(false);\n }\n }, [client, slugOrId]);\n\n useEffect(() => {\n if (isReady) {\n fetchArticle();\n }\n }, [isReady, fetchArticle]);\n\n return {\n article,\n isLoading,\n error,\n refetch: fetchArticle,\n };\n}\n\nconst defaultSettings: RequestsSettings = {\n feedbackVisibility: 'own',\n allowVoting: false,\n allowRequestCreation: true,\n};\n\n/**\n * Hook for fetching the current user's submitted requests.\n *\n * @param options - Query options (optional)\n * @returns Object with requests data and loading state\n *\n * @example\n * ```tsx\n * function MyRequests() {\n * const { requests, isLoading, error, refetch, settings } = useRequests();\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n *\n * return (\n * <ul>\n * {requests.map(req => (\n * <li key={req.id}>{req.message} - {req.status}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useRequests(options?: RequestsOptions) {\n const { client, isReady, isIdentified } = useCensusContext();\n const [data, setData] = useState<RequestsResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchRequests = useCallback(async () => {\n if (!isIdentified) {\n setData(null);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getRequests(options);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch requests'));\n } finally {\n setIsLoading(false);\n }\n }, [client, isIdentified, options?.status, options?.type, options?.limit, options?.offset]);\n\n useEffect(() => {\n if (isReady) {\n if (isIdentified) {\n fetchRequests();\n } else {\n // Not identified - stop loading\n setIsLoading(false);\n }\n }\n }, [isReady, isIdentified, fetchRequests]);\n\n return {\n requests: data?.requests || [],\n pagination: data?.pagination,\n settings: data?.settings || defaultSettings,\n isLoading,\n error,\n refetch: fetchRequests,\n };\n}\n\n/**\n * Hook for voting on requests.\n *\n * @returns Object with vote function and loading state\n *\n * @example\n * ```tsx\n * function VoteButton({ feedbackId }: { feedbackId: string }) {\n * const { vote, isVoting } = useVote();\n *\n * const handleVote = async () => {\n * const result = await vote(feedbackId);\n * console.log('Voted:', result.action); // 'added' or 'removed'\n * };\n *\n * return (\n * <button onClick={handleVote} disabled={isVoting}>\n * Vote\n * </button>\n * );\n * }\n * ```\n */\nexport function useVote() {\n const { client } = useCensusContext();\n const [isVoting, setIsVoting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const vote = useCallback(\n async (feedbackId: string) => {\n setIsVoting(true);\n setError(null);\n\n try {\n const result = await client.vote(feedbackId);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to vote');\n setError(error);\n throw error;\n } finally {\n setIsVoting(false);\n }\n },\n [client]\n );\n\n return {\n vote,\n isVoting,\n error,\n };\n}\n\n/**\n * Hook for tracking events.\n *\n * @returns Object with track function\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { track } = useTrack();\n *\n * useEffect(() => {\n * track('page_viewed', { page: 'home' });\n * }, []);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTrack() {\n const { client } = useCensusContext();\n\n const track = useCallback(\n async (eventType: string, properties?: Record<string, unknown>) => {\n await client.track(eventType, properties);\n },\n [client]\n );\n\n const trackBatch = useCallback(\n async (\n events: Array<{\n eventType: string;\n articleId?: string;\n featureId?: string;\n properties?: Record<string, unknown>;\n }>\n ) => {\n await client.trackBatch({ events });\n },\n [client]\n );\n\n return {\n track,\n trackBatch,\n };\n}\n\n/**\n * Hook for fetching feature groups with their features.\n *\n * @returns Object with feature groups data and loading state\n *\n * @example\n * ```tsx\n * function FeatureNav() {\n * const { featureGroups, isLoading, error } = useFeatureGroups();\n *\n * if (isLoading) return <p>Loading...</p>;\n * if (error) return <p>Error: {error.message}</p>;\n *\n * return (\n * <ul>\n * {featureGroups.map(group => (\n * <li key={group.id}>\n * {group.name} ({group.feature_count} features)\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useFeatureGroups() {\n const { client, isReady } = useCensusContext();\n const [featureGroups, setFeatureGroups] = useState<FeatureGroup[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchFeatureGroups = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getFeatureGroups();\n setFeatureGroups(result.feature_groups);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch feature groups'));\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n if (isReady) {\n fetchFeatureGroups();\n }\n }, [isReady, fetchFeatureGroups]);\n\n return {\n featureGroups,\n isLoading,\n error,\n refetch: fetchFeatureGroups,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useFeedback } from '../hooks';\nimport { useCensusContext } from '../context';\nimport type { FeedbackButtonProps, FeedbackType, CensusTheme } from '../../types';\n\nconst defaultStyles = {\n button: {\n position: 'fixed' as const,\n padding: '12px 20px',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n fontWeight: '500' as const,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n transition: 'transform 0.2s, box-shadow 0.2s',\n zIndex: 9999,\n },\n modal: {\n position: 'fixed' as const,\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 10000,\n },\n modalContent: {\n backgroundColor: 'white',\n borderRadius: '12px',\n padding: '24px',\n width: '100%',\n maxWidth: '400px',\n margin: '16px',\n boxShadow: '0 20px 50px rgba(0, 0, 0, 0.2)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n input: {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid #e0e0e0',\n borderRadius: '6px',\n fontSize: '14px',\n marginBottom: '12px',\n boxSizing: 'border-box' as const,\n fontFamily: 'inherit',\n },\n textarea: {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid #e0e0e0',\n borderRadius: '6px',\n fontSize: '14px',\n marginBottom: '16px',\n minHeight: '100px',\n resize: 'vertical' as const,\n boxSizing: 'border-box' as const,\n fontFamily: 'inherit',\n },\n submitButton: {\n width: '100%',\n padding: '12px',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500' as const,\n transition: 'opacity 0.2s',\n },\n typeButton: {\n padding: '8px 16px',\n border: '1px solid #e0e0e0',\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '13px',\n backgroundColor: 'white',\n transition: 'all 0.2s',\n marginRight: '8px',\n marginBottom: '8px',\n },\n};\n\nconst positionStyles = {\n 'bottom-right': { bottom: '20px', right: '20px' },\n 'bottom-left': { bottom: '20px', left: '20px' },\n 'top-right': { top: '20px', right: '20px' },\n 'top-left': { top: '20px', left: '20px' },\n};\n\nconst feedbackTypeLabels: Record<FeedbackType, string> = {\n feedback: 'General Feedback',\n bug_report: 'Bug Report',\n feature_request: 'Feature Request',\n article_rating: 'Article Rating',\n};\n\nconst feedbackTypeEmojis: Record<FeedbackType, string> = {\n feedback: '💬',\n bug_report: '🐛',\n feature_request: '💡',\n article_rating: '⭐',\n};\n\nfunction getThemeStyles(theme: CensusTheme) {\n return {\n primaryColor: theme.primaryColor || '#000000',\n textColor: theme.textColor || '#333333',\n backgroundColor: theme.backgroundColor || '#ffffff',\n borderRadius: theme.borderRadius || '8px',\n fontFamily: theme.fontFamily || 'system-ui, -apple-system, sans-serif',\n };\n}\n\n/**\n * Floating feedback button component.\n * Displays a button that opens a modal for submitting feedback.\n *\n * @example\n * ```tsx\n * import { FeedbackButton } from '@census-ai/census-sdk/react';\n *\n * function App() {\n * return (\n * <>\n * <YourApp />\n * <FeedbackButton\n * position=\"bottom-right\"\n * text=\"Send Feedback\"\n * allowedTypes={['feedback', 'bug_report', 'feature_request']}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function FeedbackButton({\n position = 'bottom-right',\n text = 'Feedback',\n allowedTypes = ['feedback', 'bug_report', 'feature_request'],\n theme: themeProp,\n onSubmit,\n onError,\n children,\n}: FeedbackButtonProps) {\n const { theme: contextTheme } = useCensusContext();\n const { submitFeedback, isSubmitting, isSuccess, reset } = useFeedback();\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectedType, setSelectedType] = useState<FeedbackType>(allowedTypes[0]);\n const [message, setMessage] = useState('');\n\n const theme = { ...contextTheme, ...themeProp };\n const themeStyles = getThemeStyles(theme);\n\n const handleOpen = useCallback(() => {\n setIsOpen(true);\n reset();\n }, [reset]);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n setMessage('');\n setSelectedType(allowedTypes[0]);\n }, [allowedTypes]);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n const feedbackData = {\n type: selectedType,\n message,\n };\n\n try {\n await submitFeedback(feedbackData);\n onSubmit?.(feedbackData);\n // Close after a short delay to show success\n setTimeout(handleClose, 1500);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to submit feedback'));\n }\n },\n [selectedType, message, submitFeedback, onSubmit, onError, handleClose]\n );\n\n // Custom trigger\n if (children) {\n return (\n <>\n <div onClick={handleOpen} style={{ cursor: 'pointer' }}>\n {children}\n </div>\n {isOpen && (\n <FeedbackModal\n isOpen={isOpen}\n onClose={handleClose}\n selectedType={selectedType}\n onTypeChange={setSelectedType}\n allowedTypes={allowedTypes}\n message={message}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n isSuccess={isSuccess}\n themeStyles={themeStyles}\n />\n )}\n </>\n );\n }\n\n return (\n <>\n <button\n onClick={handleOpen}\n style={{\n ...defaultStyles.button,\n ...positionStyles[position],\n backgroundColor: themeStyles.primaryColor,\n color: 'white',\n borderRadius: themeStyles.borderRadius,\n fontFamily: themeStyles.fontFamily,\n }}\n aria-label=\"Open feedback form\"\n >\n {text}\n </button>\n {isOpen && (\n <FeedbackModal\n isOpen={isOpen}\n onClose={handleClose}\n selectedType={selectedType}\n onTypeChange={setSelectedType}\n allowedTypes={allowedTypes}\n message={message}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n isSuccess={isSuccess}\n themeStyles={themeStyles}\n />\n )}\n </>\n );\n}\n\ninterface FeedbackModalProps {\n isOpen: boolean;\n onClose: () => void;\n selectedType: FeedbackType;\n onTypeChange: (type: FeedbackType) => void;\n allowedTypes: FeedbackType[];\n message: string;\n onMessageChange: (message: string) => void;\n onSubmit: (e: React.FormEvent) => void;\n isSubmitting: boolean;\n isSuccess: boolean;\n themeStyles: ReturnType<typeof getThemeStyles>;\n}\n\nfunction FeedbackModal({\n isOpen,\n onClose,\n selectedType,\n onTypeChange,\n allowedTypes,\n message,\n onMessageChange,\n onSubmit,\n isSubmitting,\n isSuccess,\n themeStyles,\n}: FeedbackModalProps) {\n if (!isOpen) return null;\n\n if (isSuccess) {\n return (\n <div style={defaultStyles.modal} onClick={onClose}>\n <div\n style={{\n ...defaultStyles.modalContent,\n textAlign: 'center',\n fontFamily: themeStyles.fontFamily,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>🎉</div>\n <h3 style={{ margin: '0 0 8px 0', color: themeStyles.textColor }}>\n Thanks for your feedback!\n </h3>\n <p style={{ margin: 0, color: '#666' }}>We appreciate you taking the time to share.</p>\n </div>\n </div>\n );\n }\n\n return (\n <div style={defaultStyles.modal} onClick={onClose}>\n <div\n style={{\n ...defaultStyles.modalContent,\n fontFamily: themeStyles.fontFamily,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '20px',\n }}\n >\n <h3 style={{ margin: 0, color: themeStyles.textColor }}>Send Feedback</h3>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '24px',\n cursor: 'pointer',\n color: '#999',\n padding: '0',\n lineHeight: '1',\n }}\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n\n <form onSubmit={onSubmit}>\n {/* Feedback type selection */}\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n color: '#666',\n fontWeight: '500',\n }}\n >\n What kind of feedback?\n </label>\n <div style={{ display: 'flex', flexWrap: 'wrap' }}>\n {allowedTypes.map((type) => (\n <button\n key={type}\n type=\"button\"\n onClick={() => onTypeChange(type)}\n style={{\n ...defaultStyles.typeButton,\n backgroundColor: selectedType === type ? themeStyles.primaryColor : 'white',\n color: selectedType === type ? 'white' : themeStyles.textColor,\n borderColor: selectedType === type ? themeStyles.primaryColor : '#e0e0e0',\n }}\n >\n {feedbackTypeEmojis[type]} {feedbackTypeLabels[type]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Message input */}\n <div>\n <label\n style={{\n display: 'block',\n marginBottom: '8px',\n fontSize: '13px',\n color: '#666',\n fontWeight: '500',\n }}\n >\n Your message\n </label>\n <textarea\n value={message}\n onChange={(e) => onMessageChange(e.target.value)}\n placeholder={\n selectedType === 'bug_report'\n ? 'Describe the bug and steps to reproduce...'\n : selectedType === 'feature_request'\n ? 'Describe the feature you would like...'\n : 'Share your thoughts...'\n }\n style={defaultStyles.textarea}\n required\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isSubmitting || !message.trim()}\n style={{\n ...defaultStyles.submitButton,\n backgroundColor: themeStyles.primaryColor,\n color: 'white',\n opacity: isSubmitting || !message.trim() ? 0.6 : 1,\n cursor: isSubmitting || !message.trim() ? 'not-allowed' : 'pointer',\n }}\n >\n {isSubmitting ? 'Sending...' : 'Send Feedback'}\n </button>\n </form>\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useArticles, useArticle } from '../hooks';\nimport { useCensusContext } from '../context';\nimport type { KnowledgeBaseProps, Article, CensusTheme } from '../../types';\n\nconst defaultStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n maxWidth: '800px',\n },\n searchInput: {\n width: '100%',\n padding: '12px 16px',\n border: '1px solid #e0e0e0',\n borderRadius: '8px',\n fontSize: '15px',\n marginBottom: '24px',\n boxSizing: 'border-box' as const,\n },\n categoryButton: {\n padding: '8px 16px',\n border: '1px solid #e0e0e0',\n borderRadius: '20px',\n cursor: 'pointer',\n fontSize: '13px',\n backgroundColor: 'white',\n transition: 'all 0.2s',\n marginRight: '8px',\n marginBottom: '8px',\n },\n articleCard: {\n padding: '20px',\n border: '1px solid #e0e0e0',\n borderRadius: '8px',\n marginBottom: '12px',\n cursor: 'pointer',\n transition: 'box-shadow 0.2s, border-color 0.2s',\n backgroundColor: 'white',\n },\n articleTitle: {\n margin: '0 0 8px 0',\n fontSize: '16px',\n fontWeight: '600' as const,\n },\n articleDescription: {\n margin: 0,\n fontSize: '14px',\n color: '#666',\n lineHeight: 1.5,\n },\n articleMeta: {\n display: 'flex',\n gap: '16px',\n marginTop: '12px',\n fontSize: '12px',\n color: '#999',\n },\n backButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '8px 0',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#666',\n marginBottom: '16px',\n },\n articleContent: {\n lineHeight: 1.7,\n fontSize: '15px',\n },\n loading: {\n textAlign: 'center' as const,\n padding: '40px',\n color: '#666',\n },\n error: {\n padding: '20px',\n backgroundColor: '#fef2f2',\n borderRadius: '8px',\n color: '#b91c1c',\n textAlign: 'center' as const,\n },\n empty: {\n textAlign: 'center' as const,\n padding: '40px',\n color: '#666',\n },\n};\n\nfunction getThemeStyles(theme: CensusTheme) {\n return {\n primaryColor: theme.primaryColor || '#000000',\n textColor: theme.textColor || '#333333',\n backgroundColor: theme.backgroundColor || '#ffffff',\n borderRadius: theme.borderRadius || '8px',\n fontFamily: theme.fontFamily || 'system-ui, -apple-system, sans-serif',\n };\n}\n\n/**\n * Embeddable knowledge base component.\n * Displays a searchable list of articles with full article view.\n *\n * @example\n * ```tsx\n * import { KnowledgeBase } from '@census-ai/census-sdk/react';\n *\n * function HelpPage() {\n * return (\n * <div className=\"help-container\">\n * <h1>Help Center</h1>\n * <KnowledgeBase\n * showSearch={true}\n * showCategories={true}\n * />\n * </div>\n * );\n * }\n * ```\n */\nexport function KnowledgeBase({\n showSearch = true,\n showCategories = true,\n defaultCategory,\n theme: themeProp,\n className,\n onArticleView,\n}: KnowledgeBaseProps) {\n const { theme: contextTheme } = useCensusContext();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string | undefined>(defaultCategory);\n const [selectedArticleSlug, setSelectedArticleSlug] = useState<string | null>(null);\n\n const theme = { ...contextTheme, ...themeProp };\n const themeStyles = getThemeStyles(theme);\n\n const {\n articles,\n isLoading: isLoadingArticles,\n error: articlesError,\n } = useArticles({\n category: selectedCategory,\n search: searchQuery || undefined,\n });\n\n const {\n article: selectedArticle,\n isLoading: isLoadingArticle,\n error: articleError,\n } = useArticle(selectedArticleSlug || '');\n\n // Extract unique categories\n const categories = useMemo(() => {\n const cats = new Set<string>();\n articles.forEach((article) => {\n if (article.category) {\n cats.add(article.category);\n }\n });\n return Array.from(cats).sort();\n }, [articles]);\n\n const handleArticleClick = (article: Article) => {\n setSelectedArticleSlug(article.slug);\n onArticleView?.(article);\n };\n\n const handleBack = () => {\n setSelectedArticleSlug(null);\n };\n\n // Article detail view\n if (selectedArticleSlug) {\n if (isLoadingArticle) {\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <div style={defaultStyles.loading}>Loading article...</div>\n </div>\n );\n }\n\n if (articleError) {\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <button onClick={handleBack} style={defaultStyles.backButton}>\n ← Back to articles\n </button>\n <div style={defaultStyles.error}>Failed to load article. Please try again.</div>\n </div>\n );\n }\n\n if (!selectedArticle) {\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <button onClick={handleBack} style={defaultStyles.backButton}>\n ← Back to articles\n </button>\n <div style={defaultStyles.empty}>Article not found.</div>\n </div>\n );\n }\n\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n <button onClick={handleBack} style={defaultStyles.backButton}>\n ← Back to articles\n </button>\n <article>\n <h1 style={{ margin: '0 0 16px 0', color: themeStyles.textColor }}>\n {selectedArticle.title}\n </h1>\n {selectedArticle.read_time_minutes && (\n <div style={{ fontSize: '14px', color: '#666', marginBottom: '24px' }}>\n {selectedArticle.read_time_minutes} min read\n </div>\n )}\n {selectedArticle.content_html ? (\n <div\n style={{ ...defaultStyles.articleContent, color: themeStyles.textColor }}\n dangerouslySetInnerHTML={{ __html: selectedArticle.content_html }}\n />\n ) : (\n <div style={{ ...defaultStyles.articleContent, color: themeStyles.textColor }}>\n {typeof selectedArticle.content === 'string'\n ? selectedArticle.content\n : 'No content available.'}\n </div>\n )}\n </article>\n </div>\n );\n }\n\n // Articles list view\n return (\n <div style={{ ...defaultStyles.container, fontFamily: themeStyles.fontFamily }} className={className}>\n {/* Search */}\n {showSearch && (\n <input\n type=\"text\"\n placeholder=\"Search articles...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={defaultStyles.searchInput}\n />\n )}\n\n {/* Categories */}\n {showCategories && categories.length > 0 && (\n <div style={{ marginBottom: '24px' }}>\n <button\n onClick={() => setSelectedCategory(undefined)}\n style={{\n ...defaultStyles.categoryButton,\n backgroundColor: !selectedCategory ? themeStyles.primaryColor : 'white',\n color: !selectedCategory ? 'white' : themeStyles.textColor,\n borderColor: !selectedCategory ? themeStyles.primaryColor : '#e0e0e0',\n }}\n >\n All\n </button>\n {categories.map((category) => (\n <button\n key={category}\n onClick={() => setSelectedCategory(category)}\n style={{\n ...defaultStyles.categoryButton,\n backgroundColor: selectedCategory === category ? themeStyles.primaryColor : 'white',\n color: selectedCategory === category ? 'white' : themeStyles.textColor,\n borderColor: selectedCategory === category ? themeStyles.primaryColor : '#e0e0e0',\n }}\n >\n {category}\n </button>\n ))}\n </div>\n )}\n\n {/* Loading */}\n {isLoadingArticles && <div style={defaultStyles.loading}>Loading articles...</div>}\n\n {/* Error */}\n {articlesError && (\n <div style={defaultStyles.error}>Failed to load articles. Please try again.</div>\n )}\n\n {/* Empty state */}\n {!isLoadingArticles && !articlesError && articles.length === 0 && (\n <div style={defaultStyles.empty}>\n {searchQuery\n ? `No articles found for \"${searchQuery}\"`\n : 'No articles available yet.'}\n </div>\n )}\n\n {/* Articles list */}\n {!isLoadingArticles && !articlesError && articles.length > 0 && (\n <div>\n {articles.map((article) => (\n <div\n key={article.id}\n onClick={() => handleArticleClick(article)}\n style={defaultStyles.articleCard}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleArticleClick(article);\n }\n }}\n >\n <h3 style={{ ...defaultStyles.articleTitle, color: themeStyles.textColor }}>\n {article.title}\n </h3>\n {article.seo_description && (\n <p style={defaultStyles.articleDescription}>{article.seo_description}</p>\n )}\n <div style={defaultStyles.articleMeta}>\n {article.category && <span>{article.category}</span>}\n {article.read_time_minutes && <span>{article.read_time_minutes} min read</span>}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { useRequests, useVote, useFeedback } from '../hooks';\nimport { useCensusContext } from '../context';\nimport type { RequestsProps, Request, FeedbackType } from '../../types';\n\nconst defaultStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n list: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '12px',\n },\n card: {\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n padding: '16px',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n },\n cardHover: {\n borderColor: '#d1d5db',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n marginBottom: '8px',\n },\n badges: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n badge: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n },\n message: {\n fontSize: '14px',\n color: '#111827',\n margin: 0,\n lineHeight: 1.5,\n },\n meta: {\n display: 'flex',\n gap: '12px',\n marginTop: '8px',\n fontSize: '12px',\n color: '#6b7280',\n },\n empty: {\n textAlign: 'center' as const,\n padding: '32px 16px',\n color: '#6b7280',\n },\n emptyIcon: {\n width: '48px',\n height: '48px',\n margin: '0 auto 12px',\n color: '#d1d5db',\n },\n loading: {\n textAlign: 'center' as const,\n padding: '24px',\n color: '#6b7280',\n },\n error: {\n textAlign: 'center' as const,\n padding: '24px',\n color: '#dc2626',\n },\n voteButton: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n justifyContent: 'center',\n padding: '8px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n minWidth: '48px',\n transition: 'all 0.15s',\n },\n voteButtonActive: {\n backgroundColor: '#dbeafe',\n borderColor: '#2563eb',\n color: '#2563eb',\n },\n voteCount: {\n fontSize: '14px',\n fontWeight: 600,\n color: '#111827',\n },\n cardWithVote: {\n display: 'flex',\n gap: '12px',\n },\n cardContent: {\n flex: 1,\n },\n form: {\n marginBottom: '16px',\n padding: '16px',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n },\n formHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '12px',\n },\n formTitle: {\n fontSize: '14px',\n fontWeight: 500,\n color: '#111827',\n margin: 0,\n },\n typeSelector: {\n display: 'flex',\n gap: '8px',\n marginBottom: '12px',\n },\n typeButton: {\n padding: '6px 12px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n backgroundColor: '#ffffff',\n fontSize: '13px',\n cursor: 'pointer',\n transition: 'all 0.15s',\n },\n typeButtonActive: {\n backgroundColor: '#111827',\n borderColor: '#111827',\n color: '#ffffff',\n },\n textarea: {\n width: '100%',\n padding: '10px 12px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n fontSize: '14px',\n resize: 'vertical' as const,\n minHeight: '80px',\n fontFamily: 'inherit',\n marginBottom: '12px',\n },\n submitButton: {\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#111827',\n color: '#ffffff',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'opacity 0.15s',\n },\n successMessage: {\n padding: '12px',\n backgroundColor: '#d1fae5',\n borderRadius: '6px',\n color: '#059669',\n fontSize: '14px',\n marginBottom: '16px',\n },\n ownBadge: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 6px',\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 500,\n backgroundColor: '#f3f4f6',\n color: '#6b7280',\n marginLeft: '6px',\n },\n};\n\nconst typeConfig: Record<FeedbackType, { label: string; color: string; bg: string }> = {\n feedback: { label: 'Feedback', color: '#2563eb', bg: '#dbeafe' },\n bug_report: { label: 'Bug Report', color: '#dc2626', bg: '#fee2e2' },\n feature_request: { label: 'Feature Request', color: '#d97706', bg: '#fef3c7' },\n article_rating: { label: 'Article Rating', color: '#7c3aed', bg: '#ede9fe' },\n};\n\nconst statusConfig: Record<string, { label: string; color: string; bg: string }> = {\n new: { label: 'New', color: '#6b7280', bg: '#f3f4f6' },\n reviewed: { label: 'Reviewed', color: '#2563eb', bg: '#dbeafe' },\n in_progress: { label: 'In Progress', color: '#d97706', bg: '#fef3c7' },\n resolved: { label: 'Resolved', color: '#059669', bg: '#d1fae5' },\n closed: { label: 'Closed', color: '#6b7280', bg: '#f3f4f6' },\n};\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nconst FORM_TYPES: { value: FeedbackType; label: string }[] = [\n { value: 'feedback', label: 'Feedback' },\n { value: 'bug_report', label: 'Bug' },\n { value: 'feature_request', label: 'Feature' },\n];\n\n/**\n * Requests component for displaying user's submitted feedback and requests.\n *\n * @example\n * ```tsx\n * import { Requests } from '@census-ai/census-sdk/react';\n *\n * function MyRequestsPage() {\n * return (\n * <div>\n * <h1>My Requests</h1>\n * <Requests onRequestClick={(req) => console.log('Clicked:', req)} />\n * </div>\n * );\n * }\n * ```\n */\nexport function Requests({\n status,\n type,\n limit = 50,\n className,\n showEmptyState = true,\n onRequestClick,\n}: RequestsProps) {\n const { isIdentified } = useCensusContext();\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const [showForm, setShowForm] = useState(false);\n const [formType, setFormType] = useState<FeedbackType>('feedback');\n const [formMessage, setFormMessage] = useState('');\n const [localVotes, setLocalVotes] = useState<Record<string, { count: number; hasVoted: boolean }>>({});\n\n const { requests, isLoading, error, refetch, settings } = useRequests({\n status,\n type,\n limit,\n });\n\n const { vote, isVoting } = useVote();\n const { submitFeedback, isSubmitting, isSuccess, reset } = useFeedback();\n\n const handleRequestClick = useCallback(\n (request: Request) => {\n onRequestClick?.(request);\n },\n [onRequestClick]\n );\n\n const handleVote = useCallback(\n async (feedbackId: string, currentCount: number, currentHasVoted: boolean) => {\n if (isVoting) return;\n\n // Optimistic update\n setLocalVotes((prev) => ({\n ...prev,\n [feedbackId]: {\n count: currentHasVoted ? currentCount - 1 : currentCount + 1,\n hasVoted: !currentHasVoted,\n },\n }));\n\n try {\n const result = await vote(feedbackId);\n // Update with actual result\n setLocalVotes((prev) => ({\n ...prev,\n [feedbackId]: {\n count: result.vote_count,\n hasVoted: result.user_has_voted,\n },\n }));\n } catch {\n // Revert on error\n setLocalVotes((prev) => ({\n ...prev,\n [feedbackId]: {\n count: currentCount,\n hasVoted: currentHasVoted,\n },\n }));\n }\n },\n [vote, isVoting]\n );\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!formMessage.trim() || isSubmitting) return;\n\n try {\n await submitFeedback({\n type: formType,\n message: formMessage,\n });\n setFormMessage('');\n setShowForm(false);\n // Refetch after a short delay to allow DB to update\n setTimeout(() => {\n refetch();\n reset();\n }, 500);\n } catch {\n // Error is handled by useFeedback hook\n }\n },\n [formType, formMessage, isSubmitting, submitFeedback, refetch, reset]\n );\n\n const getVoteInfo = (request: Request) => {\n const local = localVotes[request.id];\n return {\n count: local?.count ?? request.vote_count,\n hasVoted: local?.hasVoted ?? request.user_has_voted,\n };\n };\n\n if (!isIdentified) {\n return showEmptyState ? (\n <div style={defaultStyles.empty}>\n <p>Please sign in to view your requests.</p>\n </div>\n ) : null;\n }\n\n if (isLoading) {\n return (\n <div style={defaultStyles.loading}>\n <p>Loading requests...</p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={defaultStyles.error}>\n <p>Failed to load requests. <button onClick={refetch} style={{ color: 'inherit', textDecoration: 'underline', background: 'none', border: 'none', cursor: 'pointer' }}>Try again</button></p>\n </div>\n );\n }\n\n // Request creation form component\n const renderForm = () => {\n if (!settings.allowRequestCreation) return null;\n\n if (isSuccess) {\n return (\n <div style={defaultStyles.successMessage}>\n Thanks for your feedback! It has been submitted.\n </div>\n );\n }\n\n if (!showForm) {\n return (\n <button\n onClick={() => setShowForm(true)}\n style={{\n ...defaultStyles.submitButton,\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n <svg width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n New Request\n </button>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} style={defaultStyles.form}>\n <div style={defaultStyles.formHeader}>\n <p style={defaultStyles.formTitle}>Submit a request</p>\n <button\n type=\"button\"\n onClick={() => setShowForm(false)}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n ✕\n </button>\n </div>\n <div style={defaultStyles.typeSelector}>\n {FORM_TYPES.map((t) => (\n <button\n key={t.value}\n type=\"button\"\n onClick={() => setFormType(t.value)}\n style={{\n ...defaultStyles.typeButton,\n ...(formType === t.value ? defaultStyles.typeButtonActive : {}),\n }}\n >\n {t.label}\n </button>\n ))}\n </div>\n <textarea\n value={formMessage}\n onChange={(e) => setFormMessage(e.target.value)}\n placeholder=\"Describe your request...\"\n style={defaultStyles.textarea}\n required\n />\n <button\n type=\"submit\"\n style={{\n ...defaultStyles.submitButton,\n opacity: isSubmitting ? 0.6 : 1,\n }}\n disabled={isSubmitting}\n >\n {isSubmitting ? 'Submitting...' : 'Submit'}\n </button>\n </form>\n );\n };\n\n if (requests.length === 0 && showEmptyState) {\n return (\n <div style={defaultStyles.container} className={className}>\n {renderForm()}\n <div style={defaultStyles.empty}>\n <svg\n style={defaultStyles.emptyIcon}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z\"\n />\n </svg>\n <p style={{ margin: 0, fontWeight: 500, color: '#111827' }}>No requests yet</p>\n <p style={{ margin: '8px 0 0', fontSize: '14px' }}>\n {settings.allowRequestCreation\n ? 'Submit your first request above.'\n : 'When you submit feedback, bug reports, or feature requests, they\\'ll appear here.'}\n </p>\n </div>\n </div>\n );\n }\n\n const canVote = settings.allowVoting && settings.feedbackVisibility !== 'own';\n\n return (\n <div style={defaultStyles.container} className={className}>\n {renderForm()}\n <ul style={defaultStyles.list}>\n {requests.map((request) => {\n const typeInfo = typeConfig[request.feedback_type] || typeConfig.feedback;\n const statusInfo = statusConfig[request.status] || statusConfig.new;\n const isHovered = hoveredId === request.id;\n const voteInfo = getVoteInfo(request);\n\n return (\n <li\n key={request.id}\n style={{\n ...defaultStyles.card,\n ...(isHovered ? defaultStyles.cardHover : {}),\n }}\n onMouseEnter={() => setHoveredId(request.id)}\n onMouseLeave={() => setHoveredId(null)}\n >\n <div style={canVote ? defaultStyles.cardWithVote : undefined}>\n {canVote && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleVote(request.id, voteInfo.count, voteInfo.hasVoted);\n }}\n disabled={isVoting}\n style={{\n ...defaultStyles.voteButton,\n ...(voteInfo.hasVoted ? defaultStyles.voteButtonActive : {}),\n }}\n title={voteInfo.hasVoted ? 'Remove vote' : 'Upvote this request'}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill={voteInfo.hasVoted ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n <span style={{\n ...defaultStyles.voteCount,\n ...(voteInfo.hasVoted ? { color: '#2563eb' } : {}),\n }}>\n {voteInfo.count}\n </span>\n </button>\n )}\n <div\n style={canVote ? defaultStyles.cardContent : undefined}\n onClick={() => handleRequestClick(request)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleRequestClick(request);\n }\n }}\n >\n <div style={defaultStyles.header}>\n <div style={defaultStyles.badges}>\n <span\n style={{\n ...defaultStyles.badge,\n color: typeInfo.color,\n backgroundColor: typeInfo.bg,\n }}\n >\n {typeInfo.label}\n </span>\n <span\n style={{\n ...defaultStyles.badge,\n color: statusInfo.color,\n backgroundColor: statusInfo.bg,\n }}\n >\n {statusInfo.label}\n </span>\n {request.is_own && (\n <span style={defaultStyles.ownBadge}>You</span>\n )}\n </div>\n </div>\n <p style={defaultStyles.message}>\n {request.message || 'No message provided'}\n </p>\n <div style={defaultStyles.meta}>\n <span>{formatDate(request.created_at)}</span>\n {!canVote && voteInfo.count > 0 && (\n <span>{voteInfo.count} vote{voteInfo.count !== 1 ? 's' : ''}</span>\n )}\n {request.page_url && (\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '200px' }}>\n From: {request.page_url}\n </span>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { useArticles, useArticle, useRequests, useFeedback, useFeatureGroups } from '../hooks';\nimport { useCensusContext } from '../context';\nimport type { Article, FeedbackType } from '../../types';\n\nexport type HelpCenterTab = 'articles' | 'requests';\n\nexport interface HelpCenterProps {\n tabs?: HelpCenterTab[];\n defaultTab?: HelpCenterTab;\n tabLabels?: Partial<Record<HelpCenterTab, string>>;\n showSearch?: boolean;\n className?: string;\n}\n\nconst defaultTabLabels: Record<HelpCenterTab, string> = {\n articles: 'Documentation',\n requests: 'My Requests',\n};\n\nconst feedbackTypeConfig: Record<FeedbackType, { label: string; color: string; bg: string }> = {\n feedback: { label: 'Feedback', color: '#2563eb', bg: '#dbeafe' },\n bug_report: { label: 'Bug Report', color: '#dc2626', bg: '#fee2e2' },\n feature_request: { label: 'Feature Request', color: '#d97706', bg: '#fef3c7' },\n article_rating: { label: 'Article Rating', color: '#7c3aed', bg: '#ede9fe' },\n};\n\nconst statusConfig: Record<string, { label: string; color: string; bg: string }> = {\n new: { label: 'New', color: '#6b7280', bg: '#f3f4f6' },\n reviewed: { label: 'Reviewed', color: '#2563eb', bg: '#dbeafe' },\n in_progress: { label: 'In Progress', color: '#d97706', bg: '#fef3c7' },\n resolved: { label: 'Resolved', color: '#059669', bg: '#d1fae5' },\n closed: { label: 'Closed', color: '#6b7280', bg: '#f3f4f6' },\n};\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nconst FORM_TYPES: { value: FeedbackType; label: string }[] = [\n { value: 'feedback', label: 'Feedback' },\n { value: 'bug_report', label: 'Bug' },\n { value: 'feature_request', label: 'Feature' },\n];\n\n// Icons as inline SVGs\nconst SearchIcon = () => (\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nconst BookIcon = () => (\n <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\" />\n </svg>\n);\n\nconst ChevronRightIcon = () => (\n <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\nconst ArrowLeftIcon = () => (\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n);\n\nconst ClockIcon = () => (\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst LayersIcon = () => (\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\" />\n </svg>\n);\n\nconst MessageIcon = () => (\n <svg width=\"48\" height=\"48\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z\" />\n </svg>\n);\n\nconst PlusIcon = () => (\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n);\n\nconst LoaderIcon = () => (\n <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" style={{ animation: 'spin 1s linear infinite' }}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n);\n\nconst styles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n minHeight: '400px',\n },\n grid: {\n display: 'grid',\n gridTemplateColumns: '240px 1fr',\n gap: '48px',\n },\n sidebar: {\n position: 'sticky' as const,\n top: '24px',\n height: 'fit-content',\n },\n main: {\n minWidth: 0,\n },\n tabs: {\n display: 'flex',\n gap: '4px',\n padding: '4px',\n backgroundColor: '#f3f4f6',\n borderRadius: '8px',\n marginBottom: '24px',\n },\n tab: {\n flex: 1,\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n transition: 'all 0.15s',\n backgroundColor: 'transparent',\n color: '#6b7280',\n },\n tabActive: {\n backgroundColor: '#ffffff',\n color: '#111827',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n },\n searchContainer: {\n position: 'relative' as const,\n marginBottom: '24px',\n },\n searchIcon: {\n position: 'absolute' as const,\n left: '12px',\n top: '50%',\n transform: 'translateY(-50%)',\n color: '#9ca3af',\n },\n searchInput: {\n width: '100%',\n padding: '8px 12px 8px 36px',\n fontSize: '14px',\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n outline: 'none',\n },\n sectionTitle: {\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n color: '#6b7280',\n marginBottom: '12px',\n },\n navList: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n },\n navItem: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: '8px 12px',\n fontSize: '14px',\n color: '#4b5563',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n textAlign: 'left' as const,\n },\n navItemActive: {\n backgroundColor: '#f3f4f6',\n color: '#111827',\n fontWeight: 500,\n },\n subNav: {\n marginLeft: '24px',\n marginTop: '4px',\n paddingLeft: '12px',\n borderLeft: '1px solid #e5e7eb',\n },\n articleGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',\n gap: '16px',\n },\n articleCard: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '16px',\n padding: '16px',\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n transition: 'all 0.15s',\n textAlign: 'left' as const,\n },\n articleIcon: {\n flexShrink: 0,\n width: '40px',\n height: '40px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f3f4f6',\n borderRadius: '8px',\n color: '#6b7280',\n },\n articleContent: {\n flex: 1,\n minWidth: 0,\n },\n articleTitle: {\n fontSize: '14px',\n fontWeight: 500,\n color: '#111827',\n margin: 0,\n },\n articleDesc: {\n fontSize: '13px',\n color: '#6b7280',\n margin: '4px 0 0',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical' as const,\n overflow: 'hidden',\n },\n articleMeta: {\n fontSize: '12px',\n color: '#9ca3af',\n marginTop: '8px',\n },\n backButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 0',\n fontSize: '14px',\n color: '#6b7280',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n marginBottom: '24px',\n },\n articleDetail: {\n maxWidth: '720px',\n },\n articleDetailTitle: {\n fontSize: '28px',\n fontWeight: 700,\n color: '#111827',\n margin: 0,\n },\n articleDetailMeta: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '14px',\n color: '#6b7280',\n marginTop: '8px',\n },\n articleDetailContent: {\n marginTop: '32px',\n fontSize: '15px',\n lineHeight: 1.7,\n color: '#374151',\n },\n emptyState: {\n textAlign: 'center' as const,\n padding: '48px 24px',\n color: '#6b7280',\n },\n emptyIcon: {\n color: '#d1d5db',\n marginBottom: '16px',\n },\n emptyTitle: {\n fontSize: '16px',\n fontWeight: 500,\n color: '#111827',\n margin: '0 0 8px',\n },\n emptyText: {\n fontSize: '14px',\n margin: 0,\n },\n loading: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '48px',\n color: '#6b7280',\n fontSize: '14px',\n },\n // Request styles\n requestCard: {\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n padding: '16px',\n backgroundColor: '#ffffff',\n marginBottom: '12px',\n },\n requestHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '8px',\n },\n badge: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n },\n requestMessage: {\n fontSize: '14px',\n color: '#111827',\n margin: 0,\n lineHeight: 1.5,\n },\n requestMeta: {\n display: 'flex',\n gap: '12px',\n marginTop: '8px',\n fontSize: '12px',\n color: '#6b7280',\n },\n form: {\n padding: '16px',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n marginBottom: '24px',\n },\n formHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '12px',\n },\n formTitle: {\n fontSize: '14px',\n fontWeight: 500,\n color: '#111827',\n margin: 0,\n },\n typeSelector: {\n display: 'flex',\n gap: '8px',\n marginBottom: '12px',\n },\n typeButton: {\n padding: '6px 12px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n backgroundColor: '#ffffff',\n fontSize: '13px',\n cursor: 'pointer',\n transition: 'all 0.15s',\n },\n typeButtonActive: {\n backgroundColor: '#111827',\n borderColor: '#111827',\n color: '#ffffff',\n },\n textarea: {\n width: '100%',\n padding: '10px 12px',\n borderRadius: '6px',\n border: '1px solid #e5e7eb',\n fontSize: '14px',\n resize: 'vertical' as const,\n minHeight: '80px',\n fontFamily: 'inherit',\n marginBottom: '12px',\n boxSizing: 'border-box' as const,\n },\n submitButton: {\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#111827',\n color: '#ffffff',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'opacity 0.15s',\n },\n newRequestButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#111827',\n color: '#ffffff',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n marginBottom: '24px',\n },\n successMessage: {\n padding: '12px',\n backgroundColor: '#d1fae5',\n borderRadius: '6px',\n color: '#059669',\n fontSize: '14px',\n marginBottom: '16px',\n },\n};\n\n// Add keyframes for spinner\nconst spinnerStyles = `\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n`;\n\nexport function HelpCenter({\n tabs = ['articles', 'requests'],\n defaultTab = 'articles',\n tabLabels = {},\n showSearch = true,\n className,\n}: HelpCenterProps) {\n const [activeTab, setActiveTab] = useState<HelpCenterTab>(defaultTab);\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedArticle, setSelectedArticle] = useState<Article | null>(null);\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(new Set());\n const [selectedFeatureId, setSelectedFeatureId] = useState<string | null>(null);\n const [showForm, setShowForm] = useState(false);\n const [formType, setFormType] = useState<FeedbackType>('feedback');\n const [formMessage, setFormMessage] = useState('');\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const { isIdentified } = useCensusContext();\n const { articles, isLoading: articlesLoading } = useArticles({ search: searchQuery || undefined });\n const { article: fullArticle, isLoading: articleLoading } = useArticle(selectedArticle?.slug || '');\n const { requests, isLoading: requestsLoading, refetch: refetchRequests, settings } = useRequests({ limit: 50 });\n const { featureGroups, isLoading: groupsLoading } = useFeatureGroups();\n const { submitFeedback, isSubmitting, isSuccess, reset } = useFeedback();\n\n const mergedLabels = { ...defaultTabLabels, ...tabLabels };\n\n // Cmd+K keyboard shortcut\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n searchInputRef.current?.focus();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const toggleGroup = (groupId: string) => {\n setExpandedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(groupId)) {\n next.delete(groupId);\n } else {\n next.add(groupId);\n }\n return next;\n });\n };\n\n const filteredArticles = useMemo(() => {\n return articles.filter((article) => {\n const matchesFeature = !selectedFeatureId || (article as any).feature_id === selectedFeatureId;\n return matchesFeature;\n });\n }, [articles, selectedFeatureId]);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!formMessage.trim() || isSubmitting) return;\n\n try {\n await submitFeedback({\n type: formType,\n message: formMessage,\n });\n setFormMessage('');\n setShowForm(false);\n setTimeout(() => {\n refetchRequests();\n reset();\n }, 500);\n } catch {\n // Error handled by hook\n }\n },\n [formType, formMessage, isSubmitting, submitFeedback, refetchRequests, reset]\n );\n\n const renderArticleDetail = () => {\n if (articleLoading || !fullArticle) {\n return (\n <div style={styles.loading}>\n <LoaderIcon />\n <span>Loading article...</span>\n </div>\n );\n }\n\n return (\n <div style={styles.articleDetail}>\n <button onClick={() => setSelectedArticle(null)} style={styles.backButton}>\n <ArrowLeftIcon />\n Back to articles\n </button>\n\n <h1 style={styles.articleDetailTitle}>{fullArticle.title}</h1>\n {fullArticle.read_time_minutes && (\n <div style={styles.articleDetailMeta}>\n <ClockIcon />\n {fullArticle.read_time_minutes} min read\n </div>\n )}\n\n {fullArticle.content_html ? (\n <div\n style={styles.articleDetailContent}\n dangerouslySetInnerHTML={{ __html: fullArticle.content_html }}\n />\n ) : (\n <p style={{ ...styles.articleDetailContent, color: '#6b7280' }}>No content available.</p>\n )}\n </div>\n );\n };\n\n const renderArticles = () => {\n if (selectedArticle) {\n return renderArticleDetail();\n }\n\n if (articlesLoading || groupsLoading) {\n return (\n <div style={styles.loading}>\n <LoaderIcon />\n <span>Loading...</span>\n </div>\n );\n }\n\n if (filteredArticles.length === 0) {\n return (\n <div style={styles.emptyState}>\n <div style={styles.emptyIcon}><BookIcon /></div>\n <h3 style={styles.emptyTitle}>No articles found</h3>\n <p style={styles.emptyText}>\n {searchQuery ? `No results for \"${searchQuery}\"` : 'No documentation articles available yet.'}\n </p>\n </div>\n );\n }\n\n return (\n <div style={styles.articleGrid}>\n {filteredArticles.map((article) => (\n <button\n key={article.id}\n onClick={() => setSelectedArticle(article)}\n style={styles.articleCard}\n >\n <div style={styles.articleIcon}>\n <BookIcon />\n </div>\n <div style={styles.articleContent}>\n <h3 style={styles.articleTitle}>{article.title}</h3>\n {article.seo_description && (\n <p style={styles.articleDesc}>{article.seo_description}</p>\n )}\n {article.read_time_minutes && (\n <p style={styles.articleMeta}>{article.read_time_minutes} min read</p>\n )}\n </div>\n <ChevronRightIcon />\n </button>\n ))}\n </div>\n );\n };\n\n const renderRequestForm = () => {\n if (!settings.allowRequestCreation) return null;\n\n if (isSuccess) {\n return (\n <div style={styles.successMessage}>\n Thanks for your feedback! It has been submitted.\n </div>\n );\n }\n\n if (!showForm) {\n return (\n <button onClick={() => setShowForm(true)} style={styles.newRequestButton}>\n <PlusIcon />\n New Request\n </button>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} style={styles.form}>\n <div style={styles.formHeader}>\n <p style={styles.formTitle}>Submit a request</p>\n <button\n type=\"button\"\n onClick={() => setShowForm(false)}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280', fontSize: '18px' }}\n >\n ×\n </button>\n </div>\n <div style={styles.typeSelector}>\n {FORM_TYPES.map((t) => (\n <button\n key={t.value}\n type=\"button\"\n onClick={() => setFormType(t.value)}\n style={{\n ...styles.typeButton,\n ...(formType === t.value ? styles.typeButtonActive : {}),\n }}\n >\n {t.label}\n </button>\n ))}\n </div>\n <textarea\n value={formMessage}\n onChange={(e) => setFormMessage(e.target.value)}\n placeholder=\"Describe your request...\"\n style={styles.textarea}\n required\n />\n <button\n type=\"submit\"\n style={{ ...styles.submitButton, opacity: isSubmitting ? 0.6 : 1 }}\n disabled={isSubmitting}\n >\n {isSubmitting ? 'Submitting...' : 'Submit'}\n </button>\n </form>\n );\n };\n\n const renderRequests = () => {\n if (!isIdentified) {\n return (\n <div style={styles.emptyState}>\n <p style={styles.emptyText}>Please sign in to view your requests.</p>\n </div>\n );\n }\n\n if (requestsLoading) {\n return (\n <div style={styles.loading}>\n <LoaderIcon />\n <span>Loading requests...</span>\n </div>\n );\n }\n\n return (\n <div>\n {renderRequestForm()}\n\n {requests.length === 0 ? (\n <div style={styles.emptyState}>\n <div style={styles.emptyIcon}><MessageIcon /></div>\n <h3 style={styles.emptyTitle}>No requests yet</h3>\n <p style={styles.emptyText}>\n {settings.allowRequestCreation\n ? 'Submit your first request above.'\n : \"When you submit feedback, they'll appear here.\"}\n </p>\n </div>\n ) : (\n <div>\n {requests.map((request) => {\n const typeInfo = feedbackTypeConfig[request.feedback_type] || feedbackTypeConfig.feedback;\n const statusInfo = statusConfig[request.status] || statusConfig.new;\n\n return (\n <div key={request.id} style={styles.requestCard}>\n <div style={styles.requestHeader}>\n <span style={{ ...styles.badge, color: typeInfo.color, backgroundColor: typeInfo.bg }}>\n {typeInfo.label}\n </span>\n <span style={{ ...styles.badge, color: statusInfo.color, backgroundColor: statusInfo.bg }}>\n {statusInfo.label}\n </span>\n </div>\n <p style={styles.requestMessage}>{request.message || 'No message provided'}</p>\n <div style={styles.requestMeta}>\n <span>{formatDate(request.created_at)}</span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div style={styles.container} className={className}>\n <style>{spinnerStyles}</style>\n\n {/* Tabs */}\n {tabs.length > 1 && (\n <div style={styles.tabs}>\n {tabs.map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n ...styles.tab,\n ...(activeTab === tab ? styles.tabActive : {}),\n }}\n >\n {mergedLabels[tab]}\n </button>\n ))}\n </div>\n )}\n\n <div style={styles.grid}>\n {/* Sidebar */}\n <aside style={styles.sidebar}>\n {/* Search */}\n {showSearch && activeTab === 'articles' && (\n <div style={styles.searchContainer}>\n <div style={styles.searchIcon}><SearchIcon /></div>\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={styles.searchInput}\n />\n </div>\n )}\n\n {/* Feature Groups */}\n {activeTab === 'articles' && featureGroups.length > 0 && (\n <nav>\n <h3 style={styles.sectionTitle}>Features</h3>\n <ul style={styles.navList}>\n <li>\n <button\n onClick={() => setSelectedFeatureId(null)}\n style={{\n ...styles.navItem,\n ...(!selectedFeatureId ? styles.navItemActive : {}),\n }}\n >\n All Articles\n </button>\n </li>\n {featureGroups.map((group) => (\n <li key={group.id}>\n <button\n onClick={() => toggleGroup(group.id)}\n style={styles.navItem}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <LayersIcon />\n {group.name}\n </span>\n {expandedGroups.has(group.id) ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </button>\n {expandedGroups.has(group.id) && group.features.length > 0 && (\n <ul style={styles.subNav}>\n {group.features.map((feature) => (\n <li key={feature.id}>\n <button\n onClick={() => setSelectedFeatureId(feature.id)}\n style={{\n ...styles.navItem,\n padding: '6px 12px',\n fontSize: '13px',\n ...(selectedFeatureId === feature.id ? styles.navItemActive : {}),\n }}\n >\n {feature.name}\n </button>\n </li>\n ))}\n </ul>\n )}\n </li>\n ))}\n </ul>\n </nav>\n )}\n </aside>\n\n {/* Main Content */}\n <main style={styles.main}>\n {activeTab === 'articles' && renderArticles()}\n {activeTab === 'requests' && renderRequests()}\n </main>\n </div>\n </div>\n );\n}\n"]}
|