@zoiq.io/dev-kit 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.mts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import { P as ProjectSettings } from './types-DaSMeWe9.mjs';
4
4
  export { S as SectionFlag, a as SectionFlagsData } from './types-DaSMeWe9.mjs';
5
- export { Z as ZOIQProvider, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-oTb7n2Cg.mjs';
5
+ export { Z as ZOIQProvider, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-Cv9WBq8W.mjs';
6
6
 
7
7
  interface ScrollButtonProps {
8
8
  className?: string;
package/dist/client.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import { P as ProjectSettings } from './types-DaSMeWe9.js';
4
4
  export { S as SectionFlag, a as SectionFlagsData } from './types-DaSMeWe9.js';
5
- export { Z as ZOIQProvider, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-CkkGzG6D.js';
5
+ export { Z as ZOIQProvider, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-CfY8Ag40.js';
6
6
 
7
7
  interface ScrollButtonProps {
8
8
  className?: string;
package/dist/client.js CHANGED
@@ -103,7 +103,7 @@ var ToastContainer = () => {
103
103
 
104
104
  // src/api/client.ts
105
105
  async function fetchProjectConfig(projectKey, apiBaseUrl2) {
106
- const base = apiBaseUrl2 ?? (typeof window !== "undefined" ? window.location.origin : "");
106
+ const base = apiBaseUrl2;
107
107
  const url = `${base.replace(/\/$/, "")}/api/zoiq/project/${encodeURIComponent(projectKey)}`;
108
108
  const res = await fetch(url, { credentials: "include" });
109
109
  if (!res.ok) {
@@ -249,7 +249,7 @@ function applyTheme(settings) {
249
249
  }
250
250
  }
251
251
  var ZOIQContext = react.createContext(null);
252
- var apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || "https://portal.zoiq.io";
252
+ var apiBaseUrl = "https://portal.zoiq.io";
253
253
  function ZOIQProvider({ projectKey, children }) {
254
254
  const [settings, setSettings] = react.useState(null);
255
255
  const [loading, setLoading] = react.useState(true);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/components/atoms/ScrollButton.tsx","../src/components/atoms/Text.tsx","../src/components/atoms/Subtitle.tsx","../src/components/atoms/Title.tsx","../src/components/atoms/ToggleTheme.tsx","../src/components/layout/Footer.tsx","../src/components/layout/Header.tsx","../src/components/layout/Page.tsx","../src/components/layout/SecondarySidebar.tsx","../src/components/molecules/Section.tsx","../src/components/molecules/ToastContainer.tsx","../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useProjectSettings.ts","../src/hooks/useSectionFlags.ts","../src/hooks/useZOIQEntity.ts"],"names":["twMerge","clsx","useState","useEffect","jsx","jsxs","Fragment","apiBaseUrl","createContext","useCallback","useContext","fetch"],"mappings":"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","file":"client.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ScrollButtonProps {\n className?: string\n /** Scroll Y threshold above which the button is shown (default 200) */\n threshold?: number\n}\n\nexport const ScrollButton = ({ className, threshold = 200 }: ScrollButtonProps) => {\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const onScroll = () => setIsVisible(typeof window !== 'undefined' ? window.scrollY > threshold : false)\n window.addEventListener('scroll', onScroll, { passive: true })\n onScroll()\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold])\n\n return (\n <div className={cn('fixed bottom-10 right-10 z-50 hidden md:block', className)}>\n <button\n type=\"button\"\n className={cn(\n 'rounded-full p-2 cursor-pointer shadow-lg transition-all duration-300',\n 'bg-[var(--primary,hsl(220,70%,50%))] text-[var(--primary-foreground,#fff)]',\n isVisible ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}\n aria-label=\"Scroll to top\"\n >\n <span className=\"inline-block w-6 h-6\" aria-hidden>\n ↑\n </span>\n </button>\n </div>\n )\n}\n\nexport default ScrollButton\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TextProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n className?: string\n as?: 'span' | 'p' | 'div'\n}\n\nexport const Text = ({\n children,\n className,\n as: As = 'span',\n ...props\n}: TextProps) => {\n return (\n <As className={cn('text-[var(--text-primary,#111)]', className)} {...props}>\n {children}\n </As>\n )\n}\n\nexport default Text\n","'use client'\n\nimport React from 'react'\nimport { Text } from './Text'\nimport { cn } from '../../utils/cn'\n\nexport interface SubtitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Subtitle = ({ children, className }: SubtitleProps) => {\n return (\n <Text as=\"div\" className={cn('text-sm md:text-base text-[var(--text-secondary,#666)]', className)}>\n {children}\n </Text>\n )\n}\n\nexport default Subtitle\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Title = ({ children, className }: TitleProps) => {\n return (\n <h1\n className={cn(\n 'text-2xl md:text-3xl mb-0 font-semibold text-pretty text-[var(--text-primary,#111)]',\n className\n )}\n >\n {children}\n </h1>\n )\n}\n\nexport default Title\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ToggleThemeProps {\n className?: string\n /** Callback when user requests theme toggle; host app controls actual theme state */\n onToggle?: () => void\n /** Optional current theme name for rendering (e.g. \"light\" | \"dark\") */\n theme?: string\n /** Content to show (e.g. icon). If not provided, shows \"Theme\" */\n children?: React.ReactNode\n}\n\nexport const ToggleTheme = ({ className, onToggle, theme, children }: ToggleThemeProps) => {\n return (\n <button type=\"button\" onClick={onToggle} className={cn(className)} aria-label={`Toggle theme (current: ${theme ?? 'unknown'})`}>\n {children ?? 'Theme'}\n </button>\n )\n}\n\nexport default ToggleTheme\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface FooterProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Footer = ({ children, className }: FooterProps) => {\n return (\n <footer className={cn('w-full border-t border-[var(--border,transparent)] py-6 px-4 md:px-8', className)}>\n {children}\n </footer>\n )\n}\n\nexport default Footer\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface HeaderProps {\n children?: React.ReactNode\n className?: string\n /** Optional left slot (e.g. logo, nav) */\n left?: React.ReactNode\n /** Optional right slot (e.g. user menu, theme toggle) */\n right?: React.ReactNode\n}\n\nexport const Header = ({ children, className, left, right }: HeaderProps) => {\n return (\n <header\n className={cn(\n 'w-full h-14 sticky top-0 z-50 border-b border-[var(--border,transparent)]',\n 'bg-[var(--sidebar,var(--background))]',\n className\n )}\n >\n <nav className=\"flex h-full w-full items-center justify-between gap-4 px-4 md:px-6\" aria-label=\"Main\">\n {left != null ? <div className=\"flex items-center gap-3\">{left}</div> : null}\n {children}\n {right != null ? <div className=\"flex items-center gap-3\">{right}</div> : null}\n </nav>\n </header>\n )\n}\n\nexport default Header\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface PageProps {\n children?: React.ReactNode\n className?: string\n /** Optional full-width layout (no horizontal padding) */\n fullWidth?: boolean\n}\n\nexport const Page = ({ children, className, fullWidth }: PageProps) => {\n return (\n <div className={cn('w-full flex-1 flex flex-col min-h-screen', className)}>\n <main className={cn('w-full flex-1 flex flex-col', fullWidth ? 'px-0' : 'px-4 md:px-8')}>\n {children}\n </main>\n </div>\n )\n}\n\nexport default Page\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SecondarySidebarItem {\n label: string\n href: string\n icon?: React.ReactNode\n}\n\nexport interface SecondarySidebarProps {\n items: SecondarySidebarItem[]\n className?: string\n /** Optional: return true if item is active (e.g. from pathname) */\n isActive?: (item: SecondarySidebarItem) => boolean\n /** Optional: custom link renderer (e.g. Next.js Link). Default: <a> */\n renderLink?: (item: SecondarySidebarItem, children: React.ReactNode) => React.ReactNode\n}\n\nexport const SecondarySidebar = ({ items, className, isActive, renderLink }: SecondarySidebarProps) => {\n return (\n <div className={cn('px-4', className)}>\n <ul className=\"flex p-1 rounded-lg bg-[var(--accent,#f4f4f5)] border border-[var(--border,#e4e4e7)] w-full justify-between gap-4\">\n {items.map((item) => {\n const active = isActive?.(item) ?? false\n const content = (\n <>\n {item.icon}\n <span>{item.label}</span>\n </>\n )\n const child = renderLink ? (\n renderLink(item, content)\n ) : (\n <a href={item.href} className={cn('flex items-center justify-center gap-2 text-center h-8 w-full rounded-md text-sm font-medium transition-colors', active ? 'bg-[var(--sidebar-accent,var(--accent))] text-[var(--foreground)]' : 'text-[var(--muted-foreground,#71717a)]')}>\n {content}\n </a>\n )\n return (\n <li key={item.href} className=\"w-full\">\n {child}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\nexport default SecondarySidebar\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SectionProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Section = ({ children, className }: SectionProps) => {\n return (\n <section className={cn('max-w-7xl mx-auto w-full px-8 md:px-0 pt-12 md:pt-24 pb-12 md:pb-24', className)}>\n {children}\n </section>\n )\n}\n\nexport default Section\n","'use client'\n\nimport React from 'react'\n\n/**\n * Placeholder for toast container. Host app should render Toaster from \"sonner\" (or similar)\n * inside the app; ZOIQ does not bundle a toast library.\n */\nexport const ToastContainer = () => {\n return null\n}\n\nexport default ToastContainer\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseProjectSettingsResult {\n data: import('../context/types').ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns the full project theme/settings for the current project key.\n * Must be used within ZOIQProvider. Data is the same that the provider used to apply theme.\n */\nexport function useProjectSettings(): UseProjectSettingsResult {\n const ctx = useZOIQContext()\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useProjectSettings must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n return {\n data: ctx.settings,\n loading: ctx.loading,\n error: ctx.error,\n refetch: ctx.refetch,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchSectionFlags } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseSectionFlagsResult {\n enabledIds: Set<string>\n disabledIds: Set<string>\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns which section IDs are enabled or disabled for the current project.\n * Must be used within ZOIQProvider. Uses the same apiBaseUrl as the provider.\n */\nexport function useSectionFlags(): UseSectionFlagsResult {\n const ctx = useZOIQContext()\n const [enabledIds, setEnabledIds] = useState<Set<string>>(new Set())\n const [disabledIds, setDisabledIds] = useState<Set<string>>(new Set())\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchSectionFlags(ctx.projectKey, ctx.apiBaseUrl)\n setEnabledIds(new Set(data.enabledIds ?? []))\n setDisabledIds(new Set(data.disabledIds ?? []))\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setEnabledIds(new Set())\n setDisabledIds(new Set())\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, ctx?.apiBaseUrl])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n enabledIds: new Set(),\n disabledIds: new Set(),\n loading: false,\n error: new Error('useSectionFlags must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { enabledIds, disabledIds, loading, error, refetch: fetch }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/components/atoms/ScrollButton.tsx","../src/components/atoms/Text.tsx","../src/components/atoms/Subtitle.tsx","../src/components/atoms/Title.tsx","../src/components/atoms/ToggleTheme.tsx","../src/components/layout/Footer.tsx","../src/components/layout/Header.tsx","../src/components/layout/Page.tsx","../src/components/layout/SecondarySidebar.tsx","../src/components/molecules/Section.tsx","../src/components/molecules/ToastContainer.tsx","../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useProjectSettings.ts","../src/hooks/useSectionFlags.ts","../src/hooks/useZOIQEntity.ts"],"names":["twMerge","clsx","useState","useEffect","jsx","jsxs","Fragment","apiBaseUrl","createContext","useCallback","useContext","fetch"],"mappings":";;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACMO,IAAM,eAAe,CAAC,EAAE,SAAA,EAAW,SAAA,GAAY,KAAI,KAAyB;AACjF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,OAAA,GAAU,SAAA,GAAY,KAAK,CAAA;AACtG,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,QAAA,EAAS;AACT,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,+CAAA,EAAiD,SAAS,CAAA,EAC3E,QAAA,kBAAAC,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,uEAAA;AAAA,QACA,4EAAA;AAAA,QACA,YAAY,aAAA,GAAgB;AAAA,OAC9B;AAAA,MACA,OAAA,EAAS,MAAM,MAAA,CAAO,QAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,MAC7D,YAAA,EAAW,eAAA;AAAA,MAEX,yCAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAuB,aAAA,EAAW,MAAC,QAAA,EAAA,QAAA,EAEnD;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AC5BO,IAAM,OAAO,CAAC;AAAA,EACnB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAI,EAAA,GAAK,MAAA;AAAA,EACT,GAAG;AACL,CAAA,KAAiB;AACf,EAAA,uBACEA,cAAAA,CAAC,EAAA,EAAA,EAAG,SAAA,EAAW,EAAA,CAAG,mCAAmC,SAAS,CAAA,EAAI,GAAG,KAAA,EAClE,QAAA,EACH,CAAA;AAEJ;ACXO,IAAM,QAAA,GAAW,CAAC,EAAE,QAAA,EAAU,WAAU,KAAqB;AAClE,EAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,KAAA,EAAM,WAAW,EAAA,CAAG,wDAAA,EAA0D,SAAS,CAAA,EAC7F,QAAA,EACH,CAAA;AAEJ;ACPO,IAAM,KAAA,GAAQ,CAAC,EAAE,QAAA,EAAU,WAAU,KAAkB;AAC5D,EAAA,uBACEA,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,qFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACNO,IAAM,cAAc,CAAC,EAAE,WAAW,QAAA,EAAU,KAAA,EAAO,UAAS,KAAwB;AACzF,EAAA,uBACEA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAS,QAAA,EAAU,SAAA,EAAW,EAAA,CAAG,SAAS,GAAG,YAAA,EAAY,CAAA,uBAAA,EAA0B,SAAS,SAAS,CAAA,CAAA,CAAA,EACxH,sBAAY,OAAA,EACf,CAAA;AAEJ;ACXO,IAAM,MAAA,GAAS,CAAC,EAAE,QAAA,EAAU,WAAU,KAAmB;AAC9D,EAAA,uBACEA,eAAC,QAAA,EAAA,EAAO,SAAA,EAAW,GAAG,sEAAA,EAAwE,SAAS,GACpG,QAAA,EACH,CAAA;AAEJ;ACFO,IAAM,SAAS,CAAC,EAAE,UAAU,SAAA,EAAW,IAAA,EAAM,OAAM,KAAmB;AAC3E,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,2EAAA;AAAA,QACA,uCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EAAqE,cAAW,MAAA,EAC5F,QAAA,EAAA;AAAA,QAAA,IAAA,IAAQ,uBAAOD,cAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA2B,gBAAK,CAAA,GAAS,IAAA;AAAA,QACvE,QAAA;AAAA,QACA,KAAA,IAAS,uBAAOA,cAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA2B,iBAAM,CAAA,GAAS;AAAA,OAAA,EAC5E;AAAA;AAAA,GACF;AAEJ;AClBO,IAAM,OAAO,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,WAAU,KAAiB;AACrE,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,0CAAA,EAA4C,SAAS,CAAA,EACtE,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,6BAAA,EAA+B,SAAA,GAAY,SAAS,cAAc,CAAA,EACnF,UACH,CAAA,EACF,CAAA;AAEJ;ACAO,IAAM,mBAAmB,CAAC,EAAE,OAAO,SAAA,EAAW,QAAA,EAAU,YAAW,KAA6B;AACrG,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,QAAQ,SAAS,CAAA,EAClC,QAAA,kBAAAA,cAAAA,CAAC,QAAG,SAAA,EAAU,mHAAA,EACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,IAAA,MAAM,MAAA,GAAS,QAAA,GAAW,IAAI,CAAA,IAAK,KAAA;AACnC,IAAA,MAAM,OAAA,mBACJC,eAAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,IAAA;AAAA,sBACNF,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,KAAA,EACpB,CAAA;AAEF,IAAA,MAAM,QAAQ,UAAA,GACZ,UAAA,CAAW,MAAM,OAAO,CAAA,mBAExBA,cAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,WAAW,EAAA,CAAG,gHAAA,EAAkH,SAAS,mEAAA,GAAsE,wCAAwC,GACxQ,QAAA,EAAA,OAAA,EACH,CAAA;AAEF,IAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAAmB,WAAU,QAAA,EAC3B,QAAA,EAAA,KAAA,EAAA,EADM,KAAK,IAEd,CAAA;AAAA,EAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAEJ;ACtCO,IAAM,OAAA,GAAU,CAAC,EAAE,QAAA,EAAU,WAAU,KAAoB;AAChE,EAAA,uBACEA,eAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,GAAG,qEAAA,EAAuE,SAAS,GACpG,QAAA,EACH,CAAA;AAEJ;;;ACRO,IAAM,iBAAiB,MAAM;AAClC,EAAA,OAAO,IAAA;AACT;;;ACJA,eAAsB,kBAAA,CAAmB,YAAoBG,WAAAA,EAAsD;AACjH,EAAA,MAAM,OAAOA,WAAwE;AACrF,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AACzF,EAAA,MAAM,MAAM,MAAM,KAAA,CAAM,KAAK,EAAE,WAAA,EAAa,WAAW,CAAA;AACvD,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmC,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EACnF;AACA,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,iBAAA,CAAkB,YAAoBA,WAAAA,EAA+E;AACzI,EAAA,MAAM,OAAOA,WAAAA,KAAe,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA,CAAA;AACrF,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,UAAU,CAAC,CAAA,SAAA,CAAA;AACzF,EAAA,MAAM,MAAM,MAAM,KAAA,CAAM,KAAK,EAAE,WAAA,EAAa,WAAW,CAAA;AACvD,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,MAAM,CAAA,+BAAA,EAAkC,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB;AAMA,eAAsB,eAAA,CAAmB,UAAA,EAAoB,MAAA,EAAgB,OAAA,EAAkFA,WAAAA,EAAwC;AACrM,EAAA,MAAM,OAAOA,WAAAA,KAAe,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA,CAAA;AACrF,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,QAAQ,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,QAAQ,EAAE,CAAA;AAC3C,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAC,qBAAqB,kBAAA,CAAmB,UAAU,CAAC,CAAA,MAAA,EAAS,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAE,CAAA,CAAA;AACjJ,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,WAAW,IAAI,OAAA,CAAQ,MAAA;AACnD,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,MAAA,GAAS,OAAA,GAAU,QAAW,CAAA;AACnH,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAM,CAAA,EAAA,EAAK,IAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EACrF;AACA,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,EAAA,OAAO,IAAA;AACT;;;AC7CA,IAAM,sBAAA,GAAiD;AAAA,EACrD,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,WAAA;AAAA,EACT,SAAA,EAAW,aAAA;AAAA,EACX,IAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAgB,mBAAA;AAAA,EAChB,OAAA,EAAS,WAAA;AAAA,EACT,iBAAA,EAAmB,sBAAA;AAAA,EACnB,KAAA,EAAO,SAAA;AAAA,EACP,eAAA,EAAiB,oBAAA;AAAA,EACjB,MAAA,EAAQ,UAAA;AAAA,EACR,gBAAA,EAAkB,qBAAA;AAAA,EAClB,WAAA,EAAa,eAAA;AAAA,EACb,qBAAA,EAAuB,0BAAA;AAAA,EACvB,MAAA,EAAQ,UAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,iBAAA,EAAmB,sBAAA;AAAA,EACnB,cAAA,EAAgB,mBAAA;AAAA,EAChB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,aAAA,EAAe,kBAAA;AAAA,EACf,uBAAA,EAAyB,6BAAA;AAAA,EACzB,aAAA,EAAe,kBAAA;AAAA,EACf,WAAA,EAAa,gBAAA;AAAA,EACb,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,mBAAA,GAAsB,qBAAA;AAG5B,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAClC;AAOO,SAAS,WAAW,QAAA,EAAiC;AAC1D,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,IAAI,QAAA,CAAS,UAAA,IAAc,OAAO,QAAA,CAAS,eAAe,QAAA,EAAU;AAClE,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AAC9D,MAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AACnC,MAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,GAAG,CAAA,IAAK,KAAK,GAAG,CAAA,CAAA;AACtD,MAAA,MAAM,UAAA,GAAa,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAA,CAAkB,KAAK,KAAK,CAAA,GAAI,aAAA,CAAc,KAAK,CAAA,GAAK,KAAA;AACxG,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAC7C,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,eAAe,MAAA,EAAQ;AAClC,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,aAAA,EAAe;AAC1C,MAAA,IAAI,CAAC,KAAA,EAAO,IAAA,IAAQ,CAAC,OAAO,KAAA,EAAO;AACnC,MAAA,MAAM,OAAA,GAAU,WAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA;AACxE,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,aAAA,CAAc,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,CAAM,KAAA;AAC5F,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAC9C,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,OAAA,EAAS,UAAU,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,qBAAqB,MAAA,EAAQ;AACxC,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,mBAAA,EAAqB;AAC/C,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAc,KAAA;AAClC,MAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO;AACrB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA,CAAE,aAAa,CAAA,CAAA;AAC5D,MAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,GAAI,aAAA,CAAc,KAAK,CAAA,GAAI,KAAA;AAC1E,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAC9C,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,OAAA,EAAS,UAAU,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,GAAA,GAAM,CAAA;AAAA,EAAA,EAAc,YAAA,CAAa,IAAA,CAAK,MAAM,CAAC;AAAA;AAAA;AAAA,EAAA,EAAmB,YAAA,CAAa,IAAA,CAAK,MAAM,CAAC;AAAA;AAAA,CAAA;AAC/F,IAAA,IAAI,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,mBAAmB,CAAA;AACzD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,QAAA,CAAS,cAAc,OAAO,CAAA;AACxC,MAAA,OAAA,CAAQ,EAAA,GAAK,mBAAA;AACb,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IACnC;AACA,IAAA,OAAA,CAAQ,WAAA,GAAc,GAAA;AAAA,EACxB;AAEA,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAC1B,EAAA,IAAI,QAAA,EAAU,aAAa,IAAA,IAAQ,QAAA,EAAU,eAAe,IAAA,IAAQ,QAAA,EAAU,cAAc,IAAA,EAAM;AAChG,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,IAAI,QAAA,CAAS,aAAa,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA,6BAAA,EAAgC,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,IAAA,CAAM,CAAA;AAC9G,IAAA,IAAI,QAAA,CAAS,eAAe,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA,6BAAA,EAAgC,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,IAAA,CAAM,CAAA;AAClH,IAAA,IAAI,QAAA,CAAS,cAAc,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA,6BAAA,EAAgC,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,IAAA,CAAM,CAAA;AAChH,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,EAAA,GAAK,YAAA;AACX,MAAA,IAAI,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA;AACnC,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,EAAA,GAAK,QAAA,CAAS,cAAc,KAAK,CAAA;AACjC,QAAA,EAAA,CAAG,EAAA,GAAK,EAAA;AACR,QAAA,EAAA,CAAG,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAChC,QAAA,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,GAAG,EAAA,CAAG,QAAQ,CAAA;AACnC,QAAA,EAAA,CAAG,MAAA,EAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AChGA,IAAM,WAAA,GAAcC,oBAAuC,IAAI,CAAA;AAE/D,IAAM,UAAA,GAAa,wBAAA;AAEZ,SAAS,YAAA,CAAa,EAAE,UAAA,EAAY,QAAA,EAAS,EAAsB;AACxE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIN,eAAiC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,aAAA,GAAgBO,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,UAAA,EAAY,UAAU,CAAA;AAC5D,MAAA,WAAA,CAAY,QAAQ,IAAI,CAAA;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAN,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,MAAA,KAAW,WAAA,EAAa;AAElD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,KAAM,MAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAE1C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,aAAA,EAAc;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAA6B;AACjD,MAAA,WAAA,CAAY,OAAO,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,MAAK,EAAG;AACrC,MAAA,aAAA,EAAc;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,WAAW,IAAA,EAAK;AAC5B,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,WAAA,EAAa,QAAQ,CAAA,CAC/B,KAAK,CAAA,GAAA,KAAO;AACX,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,cAAc,wBAAwB,CAAA;AACvE,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,IAAA,KAA0B;AAC/B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,aAAa,CAAC,CAAA;AAI9B,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,QAAA,EAAU,QAAA;AAAA,IACpB,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,uBAAOC,cAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAe,QAAA,EAAA,OAAA,mBAAUA,cAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA,GAAS,QAAA,EAAS,CAAA;AACzF;AAEO,SAAS,cAAA,GAA0C;AACxD,EAAA,OAAOM,iBAAW,WAAW,CAAA;AAC/B;;;AC5GO,SAAS,kBAAA,GAA+C;AAC7D,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,IAAI,KAAA,CAAM,qDAAqD,CAAA;AAAA,MACtE,SAAS,YAAY;AAAA,MAAC;AAAA,KACxB;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,QAAA;AAAA,IACV,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAS,GAAA,CAAI;AAAA,GACf;AACF;ACbO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIR,cAAAA,iBAAsB,IAAI,KAAK,CAAA;AACnE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAIA,cAAAA,iBAAsB,IAAI,KAAK,CAAA;AACrE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAMS,MAAAA,GAAQF,kBAAY,YAAY;AACpC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,iBAAA,CAAkB,GAAA,CAAI,UAAA,EAAY,IAAI,UAAU,CAAA;AACnE,MAAA,aAAA,CAAc,IAAI,GAAA,CAAI,IAAA,CAAK,UAAA,IAAc,EAAE,CAAC,CAAA;AAC5C,MAAA,cAAA,CAAe,IAAI,GAAA,CAAI,IAAA,CAAK,WAAA,IAAe,EAAE,CAAC,CAAA;AAAA,IAChD,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,aAAA,iBAAc,IAAI,KAAK,CAAA;AACvB,MAAA,cAAA,iBAAe,IAAI,KAAK,CAAA;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,GAAA,EAAK,UAAA,EAAY,GAAA,EAAK,UAAU,CAAC,CAAA;AAErC,EAAAN,gBAAU,MAAM;AACd,IAAAQ,MAAAA,EAAM;AAAA,EACR,CAAA,EAAG,CAACA,MAAK,CAAC,CAAA;AAEV,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO;AAAA,MACL,UAAA,sBAAgB,GAAA,EAAI;AAAA,MACpB,WAAA,sBAAiB,GAAA,EAAI;AAAA,MACrB,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,IAAI,KAAA,CAAM,kDAAkD,CAAA;AAAA,MACnE,SAAS,YAAY;AAAA,MAAC;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,WAAA,EAAa,OAAA,EAAS,KAAA,EAAO,SAASA,MAAAA,EAAM;AACnE;AClCO,SAAS,aAAA,CAA2B,MAAA,EAAgB,OAAA,GAAgC,EAAC,EAA2B;AACrH,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIT,eAAmB,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAMS,MAAAA,GAAQF,kBAAY,YAAY;AACpC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,eAAA;AAAA,QACnB,GAAA,CAAI,UAAA;AAAA,QACJ,MAAA;AAAA,QACA;AAAA,UACE,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,IAAU,KAAA;AAAA,SAClC;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AACA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAEvE,EAAAN,gBAAU,MAAM;AACd,IAAAQ,MAAAA,EAAM;AAAA,EACR,CAAA,EAAG,CAACA,MAAK,CAAC,CAAA;AAEV,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,IAAI,KAAA,CAAM,gDAAgD,CAAA;AAAA,MACjE,SAAS,YAAY;AAAA,MAAC;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAASA,MAAAA,EAAM;AAChD","file":"client.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ScrollButtonProps {\n className?: string\n /** Scroll Y threshold above which the button is shown (default 200) */\n threshold?: number\n}\n\nexport const ScrollButton = ({ className, threshold = 200 }: ScrollButtonProps) => {\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const onScroll = () => setIsVisible(typeof window !== 'undefined' ? window.scrollY > threshold : false)\n window.addEventListener('scroll', onScroll, { passive: true })\n onScroll()\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold])\n\n return (\n <div className={cn('fixed bottom-10 right-10 z-50 hidden md:block', className)}>\n <button\n type=\"button\"\n className={cn(\n 'rounded-full p-2 cursor-pointer shadow-lg transition-all duration-300',\n 'bg-[var(--primary,hsl(220,70%,50%))] text-[var(--primary-foreground,#fff)]',\n isVisible ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}\n aria-label=\"Scroll to top\"\n >\n <span className=\"inline-block w-6 h-6\" aria-hidden>\n ↑\n </span>\n </button>\n </div>\n )\n}\n\nexport default ScrollButton\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TextProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n className?: string\n as?: 'span' | 'p' | 'div'\n}\n\nexport const Text = ({\n children,\n className,\n as: As = 'span',\n ...props\n}: TextProps) => {\n return (\n <As className={cn('text-[var(--text-primary,#111)]', className)} {...props}>\n {children}\n </As>\n )\n}\n\nexport default Text\n","'use client'\n\nimport React from 'react'\nimport { Text } from './Text'\nimport { cn } from '../../utils/cn'\n\nexport interface SubtitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Subtitle = ({ children, className }: SubtitleProps) => {\n return (\n <Text as=\"div\" className={cn('text-sm md:text-base text-[var(--text-secondary,#666)]', className)}>\n {children}\n </Text>\n )\n}\n\nexport default Subtitle\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Title = ({ children, className }: TitleProps) => {\n return (\n <h1\n className={cn(\n 'text-2xl md:text-3xl mb-0 font-semibold text-pretty text-[var(--text-primary,#111)]',\n className\n )}\n >\n {children}\n </h1>\n )\n}\n\nexport default Title\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ToggleThemeProps {\n className?: string\n /** Callback when user requests theme toggle; host app controls actual theme state */\n onToggle?: () => void\n /** Optional current theme name for rendering (e.g. \"light\" | \"dark\") */\n theme?: string\n /** Content to show (e.g. icon). If not provided, shows \"Theme\" */\n children?: React.ReactNode\n}\n\nexport const ToggleTheme = ({ className, onToggle, theme, children }: ToggleThemeProps) => {\n return (\n <button type=\"button\" onClick={onToggle} className={cn(className)} aria-label={`Toggle theme (current: ${theme ?? 'unknown'})`}>\n {children ?? 'Theme'}\n </button>\n )\n}\n\nexport default ToggleTheme\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface FooterProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Footer = ({ children, className }: FooterProps) => {\n return (\n <footer className={cn('w-full border-t border-[var(--border,transparent)] py-6 px-4 md:px-8', className)}>\n {children}\n </footer>\n )\n}\n\nexport default Footer\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface HeaderProps {\n children?: React.ReactNode\n className?: string\n /** Optional left slot (e.g. logo, nav) */\n left?: React.ReactNode\n /** Optional right slot (e.g. user menu, theme toggle) */\n right?: React.ReactNode\n}\n\nexport const Header = ({ children, className, left, right }: HeaderProps) => {\n return (\n <header\n className={cn(\n 'w-full h-14 sticky top-0 z-50 border-b border-[var(--border,transparent)]',\n 'bg-[var(--sidebar,var(--background))]',\n className\n )}\n >\n <nav className=\"flex h-full w-full items-center justify-between gap-4 px-4 md:px-6\" aria-label=\"Main\">\n {left != null ? <div className=\"flex items-center gap-3\">{left}</div> : null}\n {children}\n {right != null ? <div className=\"flex items-center gap-3\">{right}</div> : null}\n </nav>\n </header>\n )\n}\n\nexport default Header\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface PageProps {\n children?: React.ReactNode\n className?: string\n /** Optional full-width layout (no horizontal padding) */\n fullWidth?: boolean\n}\n\nexport const Page = ({ children, className, fullWidth }: PageProps) => {\n return (\n <div className={cn('w-full flex-1 flex flex-col min-h-screen', className)}>\n <main className={cn('w-full flex-1 flex flex-col', fullWidth ? 'px-0' : 'px-4 md:px-8')}>\n {children}\n </main>\n </div>\n )\n}\n\nexport default Page\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SecondarySidebarItem {\n label: string\n href: string\n icon?: React.ReactNode\n}\n\nexport interface SecondarySidebarProps {\n items: SecondarySidebarItem[]\n className?: string\n /** Optional: return true if item is active (e.g. from pathname) */\n isActive?: (item: SecondarySidebarItem) => boolean\n /** Optional: custom link renderer (e.g. Next.js Link). Default: <a> */\n renderLink?: (item: SecondarySidebarItem, children: React.ReactNode) => React.ReactNode\n}\n\nexport const SecondarySidebar = ({ items, className, isActive, renderLink }: SecondarySidebarProps) => {\n return (\n <div className={cn('px-4', className)}>\n <ul className=\"flex p-1 rounded-lg bg-[var(--accent,#f4f4f5)] border border-[var(--border,#e4e4e7)] w-full justify-between gap-4\">\n {items.map((item) => {\n const active = isActive?.(item) ?? false\n const content = (\n <>\n {item.icon}\n <span>{item.label}</span>\n </>\n )\n const child = renderLink ? (\n renderLink(item, content)\n ) : (\n <a href={item.href} className={cn('flex items-center justify-center gap-2 text-center h-8 w-full rounded-md text-sm font-medium transition-colors', active ? 'bg-[var(--sidebar-accent,var(--accent))] text-[var(--foreground)]' : 'text-[var(--muted-foreground,#71717a)]')}>\n {content}\n </a>\n )\n return (\n <li key={item.href} className=\"w-full\">\n {child}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\nexport default SecondarySidebar\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SectionProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Section = ({ children, className }: SectionProps) => {\n return (\n <section className={cn('max-w-7xl mx-auto w-full px-8 md:px-0 pt-12 md:pt-24 pb-12 md:pb-24', className)}>\n {children}\n </section>\n )\n}\n\nexport default Section\n","'use client'\n\nimport React from 'react'\n\n/**\n * Placeholder for toast container. Host app should render Toaster from \"sonner\" (or similar)\n * inside the app; ZOIQ does not bundle a toast library.\n */\nexport const ToastContainer = () => {\n return null\n}\n\nexport default ToastContainer\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseProjectSettingsResult {\n data: import('../context/types').ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns the full project theme/settings for the current project key.\n * Must be used within ZOIQProvider. Data is the same that the provider used to apply theme.\n */\nexport function useProjectSettings(): UseProjectSettingsResult {\n const ctx = useZOIQContext()\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useProjectSettings must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n return {\n data: ctx.settings,\n loading: ctx.loading,\n error: ctx.error,\n refetch: ctx.refetch,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchSectionFlags } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseSectionFlagsResult {\n enabledIds: Set<string>\n disabledIds: Set<string>\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns which section IDs are enabled or disabled for the current project.\n * Must be used within ZOIQProvider. Uses the same apiBaseUrl as the provider.\n */\nexport function useSectionFlags(): UseSectionFlagsResult {\n const ctx = useZOIQContext()\n const [enabledIds, setEnabledIds] = useState<Set<string>>(new Set())\n const [disabledIds, setDisabledIds] = useState<Set<string>>(new Set())\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchSectionFlags(ctx.projectKey, ctx.apiBaseUrl)\n setEnabledIds(new Set(data.enabledIds ?? []))\n setDisabledIds(new Set(data.disabledIds ?? []))\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setEnabledIds(new Set())\n setDisabledIds(new Set())\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, ctx?.apiBaseUrl])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n enabledIds: new Set(),\n disabledIds: new Set(),\n loading: false,\n error: new Error('useSectionFlags must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { enabledIds, disabledIds, loading, error, refetch: fetch }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n *\n * For entities with REFERENCE fields (e.g. events with a partner field pointing to partners),\n * the API expands the field value so the id is replaced with the full referenced record:\n * e.g. events → { id, partner: { id, name, ... }, ...other event values }.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n"]}
package/dist/client.mjs CHANGED
@@ -101,7 +101,7 @@ var ToastContainer = () => {
101
101
 
102
102
  // src/api/client.ts
103
103
  async function fetchProjectConfig(projectKey, apiBaseUrl2) {
104
- const base = apiBaseUrl2 ?? (typeof window !== "undefined" ? window.location.origin : "");
104
+ const base = apiBaseUrl2;
105
105
  const url = `${base.replace(/\/$/, "")}/api/zoiq/project/${encodeURIComponent(projectKey)}`;
106
106
  const res = await fetch(url, { credentials: "include" });
107
107
  if (!res.ok) {
@@ -247,7 +247,7 @@ function applyTheme(settings) {
247
247
  }
248
248
  }
249
249
  var ZOIQContext = createContext(null);
250
- var apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || "https://portal.zoiq.io";
250
+ var apiBaseUrl = "https://portal.zoiq.io";
251
251
  function ZOIQProvider({ projectKey, children }) {
252
252
  const [settings, setSettings] = useState(null);
253
253
  const [loading, setLoading] = useState(true);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/components/atoms/ScrollButton.tsx","../src/components/atoms/Text.tsx","../src/components/atoms/Subtitle.tsx","../src/components/atoms/Title.tsx","../src/components/atoms/ToggleTheme.tsx","../src/components/layout/Footer.tsx","../src/components/layout/Header.tsx","../src/components/layout/Page.tsx","../src/components/layout/SecondarySidebar.tsx","../src/components/molecules/Section.tsx","../src/components/molecules/ToastContainer.tsx","../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useProjectSettings.ts","../src/hooks/useSectionFlags.ts","../src/hooks/useZOIQEntity.ts"],"names":["jsx","jsxs","apiBaseUrl","useState","useEffect","fetch","useCallback"],"mappings":"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","file":"client.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ScrollButtonProps {\n className?: string\n /** Scroll Y threshold above which the button is shown (default 200) */\n threshold?: number\n}\n\nexport const ScrollButton = ({ className, threshold = 200 }: ScrollButtonProps) => {\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const onScroll = () => setIsVisible(typeof window !== 'undefined' ? window.scrollY > threshold : false)\n window.addEventListener('scroll', onScroll, { passive: true })\n onScroll()\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold])\n\n return (\n <div className={cn('fixed bottom-10 right-10 z-50 hidden md:block', className)}>\n <button\n type=\"button\"\n className={cn(\n 'rounded-full p-2 cursor-pointer shadow-lg transition-all duration-300',\n 'bg-[var(--primary,hsl(220,70%,50%))] text-[var(--primary-foreground,#fff)]',\n isVisible ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}\n aria-label=\"Scroll to top\"\n >\n <span className=\"inline-block w-6 h-6\" aria-hidden>\n ↑\n </span>\n </button>\n </div>\n )\n}\n\nexport default ScrollButton\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TextProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n className?: string\n as?: 'span' | 'p' | 'div'\n}\n\nexport const Text = ({\n children,\n className,\n as: As = 'span',\n ...props\n}: TextProps) => {\n return (\n <As className={cn('text-[var(--text-primary,#111)]', className)} {...props}>\n {children}\n </As>\n )\n}\n\nexport default Text\n","'use client'\n\nimport React from 'react'\nimport { Text } from './Text'\nimport { cn } from '../../utils/cn'\n\nexport interface SubtitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Subtitle = ({ children, className }: SubtitleProps) => {\n return (\n <Text as=\"div\" className={cn('text-sm md:text-base text-[var(--text-secondary,#666)]', className)}>\n {children}\n </Text>\n )\n}\n\nexport default Subtitle\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Title = ({ children, className }: TitleProps) => {\n return (\n <h1\n className={cn(\n 'text-2xl md:text-3xl mb-0 font-semibold text-pretty text-[var(--text-primary,#111)]',\n className\n )}\n >\n {children}\n </h1>\n )\n}\n\nexport default Title\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ToggleThemeProps {\n className?: string\n /** Callback when user requests theme toggle; host app controls actual theme state */\n onToggle?: () => void\n /** Optional current theme name for rendering (e.g. \"light\" | \"dark\") */\n theme?: string\n /** Content to show (e.g. icon). If not provided, shows \"Theme\" */\n children?: React.ReactNode\n}\n\nexport const ToggleTheme = ({ className, onToggle, theme, children }: ToggleThemeProps) => {\n return (\n <button type=\"button\" onClick={onToggle} className={cn(className)} aria-label={`Toggle theme (current: ${theme ?? 'unknown'})`}>\n {children ?? 'Theme'}\n </button>\n )\n}\n\nexport default ToggleTheme\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface FooterProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Footer = ({ children, className }: FooterProps) => {\n return (\n <footer className={cn('w-full border-t border-[var(--border,transparent)] py-6 px-4 md:px-8', className)}>\n {children}\n </footer>\n )\n}\n\nexport default Footer\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface HeaderProps {\n children?: React.ReactNode\n className?: string\n /** Optional left slot (e.g. logo, nav) */\n left?: React.ReactNode\n /** Optional right slot (e.g. user menu, theme toggle) */\n right?: React.ReactNode\n}\n\nexport const Header = ({ children, className, left, right }: HeaderProps) => {\n return (\n <header\n className={cn(\n 'w-full h-14 sticky top-0 z-50 border-b border-[var(--border,transparent)]',\n 'bg-[var(--sidebar,var(--background))]',\n className\n )}\n >\n <nav className=\"flex h-full w-full items-center justify-between gap-4 px-4 md:px-6\" aria-label=\"Main\">\n {left != null ? <div className=\"flex items-center gap-3\">{left}</div> : null}\n {children}\n {right != null ? <div className=\"flex items-center gap-3\">{right}</div> : null}\n </nav>\n </header>\n )\n}\n\nexport default Header\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface PageProps {\n children?: React.ReactNode\n className?: string\n /** Optional full-width layout (no horizontal padding) */\n fullWidth?: boolean\n}\n\nexport const Page = ({ children, className, fullWidth }: PageProps) => {\n return (\n <div className={cn('w-full flex-1 flex flex-col min-h-screen', className)}>\n <main className={cn('w-full flex-1 flex flex-col', fullWidth ? 'px-0' : 'px-4 md:px-8')}>\n {children}\n </main>\n </div>\n )\n}\n\nexport default Page\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SecondarySidebarItem {\n label: string\n href: string\n icon?: React.ReactNode\n}\n\nexport interface SecondarySidebarProps {\n items: SecondarySidebarItem[]\n className?: string\n /** Optional: return true if item is active (e.g. from pathname) */\n isActive?: (item: SecondarySidebarItem) => boolean\n /** Optional: custom link renderer (e.g. Next.js Link). Default: <a> */\n renderLink?: (item: SecondarySidebarItem, children: React.ReactNode) => React.ReactNode\n}\n\nexport const SecondarySidebar = ({ items, className, isActive, renderLink }: SecondarySidebarProps) => {\n return (\n <div className={cn('px-4', className)}>\n <ul className=\"flex p-1 rounded-lg bg-[var(--accent,#f4f4f5)] border border-[var(--border,#e4e4e7)] w-full justify-between gap-4\">\n {items.map((item) => {\n const active = isActive?.(item) ?? false\n const content = (\n <>\n {item.icon}\n <span>{item.label}</span>\n </>\n )\n const child = renderLink ? (\n renderLink(item, content)\n ) : (\n <a href={item.href} className={cn('flex items-center justify-center gap-2 text-center h-8 w-full rounded-md text-sm font-medium transition-colors', active ? 'bg-[var(--sidebar-accent,var(--accent))] text-[var(--foreground)]' : 'text-[var(--muted-foreground,#71717a)]')}>\n {content}\n </a>\n )\n return (\n <li key={item.href} className=\"w-full\">\n {child}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\nexport default SecondarySidebar\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SectionProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Section = ({ children, className }: SectionProps) => {\n return (\n <section className={cn('max-w-7xl mx-auto w-full px-8 md:px-0 pt-12 md:pt-24 pb-12 md:pb-24', className)}>\n {children}\n </section>\n )\n}\n\nexport default Section\n","'use client'\n\nimport React from 'react'\n\n/**\n * Placeholder for toast container. Host app should render Toaster from \"sonner\" (or similar)\n * inside the app; ZOIQ does not bundle a toast library.\n */\nexport const ToastContainer = () => {\n return null\n}\n\nexport default ToastContainer\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseProjectSettingsResult {\n data: import('../context/types').ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns the full project theme/settings for the current project key.\n * Must be used within ZOIQProvider. Data is the same that the provider used to apply theme.\n */\nexport function useProjectSettings(): UseProjectSettingsResult {\n const ctx = useZOIQContext()\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useProjectSettings must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n return {\n data: ctx.settings,\n loading: ctx.loading,\n error: ctx.error,\n refetch: ctx.refetch,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchSectionFlags } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseSectionFlagsResult {\n enabledIds: Set<string>\n disabledIds: Set<string>\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns which section IDs are enabled or disabled for the current project.\n * Must be used within ZOIQProvider. Uses the same apiBaseUrl as the provider.\n */\nexport function useSectionFlags(): UseSectionFlagsResult {\n const ctx = useZOIQContext()\n const [enabledIds, setEnabledIds] = useState<Set<string>>(new Set())\n const [disabledIds, setDisabledIds] = useState<Set<string>>(new Set())\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchSectionFlags(ctx.projectKey, ctx.apiBaseUrl)\n setEnabledIds(new Set(data.enabledIds ?? []))\n setDisabledIds(new Set(data.disabledIds ?? []))\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setEnabledIds(new Set())\n setDisabledIds(new Set())\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, ctx?.apiBaseUrl])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n enabledIds: new Set(),\n disabledIds: new Set(),\n loading: false,\n error: new Error('useSectionFlags must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { enabledIds, disabledIds, loading, error, refetch: fetch }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/components/atoms/ScrollButton.tsx","../src/components/atoms/Text.tsx","../src/components/atoms/Subtitle.tsx","../src/components/atoms/Title.tsx","../src/components/atoms/ToggleTheme.tsx","../src/components/layout/Footer.tsx","../src/components/layout/Header.tsx","../src/components/layout/Page.tsx","../src/components/layout/SecondarySidebar.tsx","../src/components/molecules/Section.tsx","../src/components/molecules/ToastContainer.tsx","../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useProjectSettings.ts","../src/hooks/useSectionFlags.ts","../src/hooks/useZOIQEntity.ts"],"names":["jsx","jsxs","apiBaseUrl","useState","useEffect","fetch","useCallback"],"mappings":"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","file":"client.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ScrollButtonProps {\n className?: string\n /** Scroll Y threshold above which the button is shown (default 200) */\n threshold?: number\n}\n\nexport const ScrollButton = ({ className, threshold = 200 }: ScrollButtonProps) => {\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const onScroll = () => setIsVisible(typeof window !== 'undefined' ? window.scrollY > threshold : false)\n window.addEventListener('scroll', onScroll, { passive: true })\n onScroll()\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold])\n\n return (\n <div className={cn('fixed bottom-10 right-10 z-50 hidden md:block', className)}>\n <button\n type=\"button\"\n className={cn(\n 'rounded-full p-2 cursor-pointer shadow-lg transition-all duration-300',\n 'bg-[var(--primary,hsl(220,70%,50%))] text-[var(--primary-foreground,#fff)]',\n isVisible ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}\n aria-label=\"Scroll to top\"\n >\n <span className=\"inline-block w-6 h-6\" aria-hidden>\n ↑\n </span>\n </button>\n </div>\n )\n}\n\nexport default ScrollButton\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TextProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n className?: string\n as?: 'span' | 'p' | 'div'\n}\n\nexport const Text = ({\n children,\n className,\n as: As = 'span',\n ...props\n}: TextProps) => {\n return (\n <As className={cn('text-[var(--text-primary,#111)]', className)} {...props}>\n {children}\n </As>\n )\n}\n\nexport default Text\n","'use client'\n\nimport React from 'react'\nimport { Text } from './Text'\nimport { cn } from '../../utils/cn'\n\nexport interface SubtitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Subtitle = ({ children, className }: SubtitleProps) => {\n return (\n <Text as=\"div\" className={cn('text-sm md:text-base text-[var(--text-secondary,#666)]', className)}>\n {children}\n </Text>\n )\n}\n\nexport default Subtitle\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface TitleProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Title = ({ children, className }: TitleProps) => {\n return (\n <h1\n className={cn(\n 'text-2xl md:text-3xl mb-0 font-semibold text-pretty text-[var(--text-primary,#111)]',\n className\n )}\n >\n {children}\n </h1>\n )\n}\n\nexport default Title\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface ToggleThemeProps {\n className?: string\n /** Callback when user requests theme toggle; host app controls actual theme state */\n onToggle?: () => void\n /** Optional current theme name for rendering (e.g. \"light\" | \"dark\") */\n theme?: string\n /** Content to show (e.g. icon). If not provided, shows \"Theme\" */\n children?: React.ReactNode\n}\n\nexport const ToggleTheme = ({ className, onToggle, theme, children }: ToggleThemeProps) => {\n return (\n <button type=\"button\" onClick={onToggle} className={cn(className)} aria-label={`Toggle theme (current: ${theme ?? 'unknown'})`}>\n {children ?? 'Theme'}\n </button>\n )\n}\n\nexport default ToggleTheme\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface FooterProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Footer = ({ children, className }: FooterProps) => {\n return (\n <footer className={cn('w-full border-t border-[var(--border,transparent)] py-6 px-4 md:px-8', className)}>\n {children}\n </footer>\n )\n}\n\nexport default Footer\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface HeaderProps {\n children?: React.ReactNode\n className?: string\n /** Optional left slot (e.g. logo, nav) */\n left?: React.ReactNode\n /** Optional right slot (e.g. user menu, theme toggle) */\n right?: React.ReactNode\n}\n\nexport const Header = ({ children, className, left, right }: HeaderProps) => {\n return (\n <header\n className={cn(\n 'w-full h-14 sticky top-0 z-50 border-b border-[var(--border,transparent)]',\n 'bg-[var(--sidebar,var(--background))]',\n className\n )}\n >\n <nav className=\"flex h-full w-full items-center justify-between gap-4 px-4 md:px-6\" aria-label=\"Main\">\n {left != null ? <div className=\"flex items-center gap-3\">{left}</div> : null}\n {children}\n {right != null ? <div className=\"flex items-center gap-3\">{right}</div> : null}\n </nav>\n </header>\n )\n}\n\nexport default Header\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface PageProps {\n children?: React.ReactNode\n className?: string\n /** Optional full-width layout (no horizontal padding) */\n fullWidth?: boolean\n}\n\nexport const Page = ({ children, className, fullWidth }: PageProps) => {\n return (\n <div className={cn('w-full flex-1 flex flex-col min-h-screen', className)}>\n <main className={cn('w-full flex-1 flex flex-col', fullWidth ? 'px-0' : 'px-4 md:px-8')}>\n {children}\n </main>\n </div>\n )\n}\n\nexport default Page\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SecondarySidebarItem {\n label: string\n href: string\n icon?: React.ReactNode\n}\n\nexport interface SecondarySidebarProps {\n items: SecondarySidebarItem[]\n className?: string\n /** Optional: return true if item is active (e.g. from pathname) */\n isActive?: (item: SecondarySidebarItem) => boolean\n /** Optional: custom link renderer (e.g. Next.js Link). Default: <a> */\n renderLink?: (item: SecondarySidebarItem, children: React.ReactNode) => React.ReactNode\n}\n\nexport const SecondarySidebar = ({ items, className, isActive, renderLink }: SecondarySidebarProps) => {\n return (\n <div className={cn('px-4', className)}>\n <ul className=\"flex p-1 rounded-lg bg-[var(--accent,#f4f4f5)] border border-[var(--border,#e4e4e7)] w-full justify-between gap-4\">\n {items.map((item) => {\n const active = isActive?.(item) ?? false\n const content = (\n <>\n {item.icon}\n <span>{item.label}</span>\n </>\n )\n const child = renderLink ? (\n renderLink(item, content)\n ) : (\n <a href={item.href} className={cn('flex items-center justify-center gap-2 text-center h-8 w-full rounded-md text-sm font-medium transition-colors', active ? 'bg-[var(--sidebar-accent,var(--accent))] text-[var(--foreground)]' : 'text-[var(--muted-foreground,#71717a)]')}>\n {content}\n </a>\n )\n return (\n <li key={item.href} className=\"w-full\">\n {child}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\nexport default SecondarySidebar\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\nexport interface SectionProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport const Section = ({ children, className }: SectionProps) => {\n return (\n <section className={cn('max-w-7xl mx-auto w-full px-8 md:px-0 pt-12 md:pt-24 pb-12 md:pb-24', className)}>\n {children}\n </section>\n )\n}\n\nexport default Section\n","'use client'\n\nimport React from 'react'\n\n/**\n * Placeholder for toast container. Host app should render Toaster from \"sonner\" (or similar)\n * inside the app; ZOIQ does not bundle a toast library.\n */\nexport const ToastContainer = () => {\n return null\n}\n\nexport default ToastContainer\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseProjectSettingsResult {\n data: import('../context/types').ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns the full project theme/settings for the current project key.\n * Must be used within ZOIQProvider. Data is the same that the provider used to apply theme.\n */\nexport function useProjectSettings(): UseProjectSettingsResult {\n const ctx = useZOIQContext()\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useProjectSettings must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n return {\n data: ctx.settings,\n loading: ctx.loading,\n error: ctx.error,\n refetch: ctx.refetch,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchSectionFlags } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseSectionFlagsResult {\n enabledIds: Set<string>\n disabledIds: Set<string>\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Returns which section IDs are enabled or disabled for the current project.\n * Must be used within ZOIQProvider. Uses the same apiBaseUrl as the provider.\n */\nexport function useSectionFlags(): UseSectionFlagsResult {\n const ctx = useZOIQContext()\n const [enabledIds, setEnabledIds] = useState<Set<string>>(new Set())\n const [disabledIds, setDisabledIds] = useState<Set<string>>(new Set())\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchSectionFlags(ctx.projectKey, ctx.apiBaseUrl)\n setEnabledIds(new Set(data.enabledIds ?? []))\n setDisabledIds(new Set(data.disabledIds ?? []))\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setEnabledIds(new Set())\n setDisabledIds(new Set())\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, ctx?.apiBaseUrl])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n enabledIds: new Set(),\n disabledIds: new Set(),\n loading: false,\n error: new Error('useSectionFlags must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { enabledIds, disabledIds, loading, error, refetch: fetch }\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n *\n * For entities with REFERENCE fields (e.g. events with a partner field pointing to partners),\n * the API expands the field value so the id is replaced with the full referenced record:\n * e.g. events → { id, partner: { id, name, ... }, ...other event values }.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n"]}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- export { Z as ZOIQProvider, b as useStyleGuide, c as useZOIQBranding, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-oTb7n2Cg.mjs';
1
+ export { Z as ZOIQProvider, b as useStyleGuide, c as useZOIQBranding, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-Cv9WBq8W.mjs';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
4
4
  import './types-DaSMeWe9.mjs';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { Z as ZOIQProvider, b as useStyleGuide, c as useZOIQBranding, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-CkkGzG6D.js';
1
+ export { Z as ZOIQProvider, b as useStyleGuide, c as useZOIQBranding, u as useZOIQContext, a as useZOIQEntity } from './useZOIQEntity-CfY8Ag40.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
4
4
  import './types-DaSMeWe9.js';
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
 
7
7
  // src/api/client.ts
8
8
  async function fetchProjectConfig(projectKey, apiBaseUrl2) {
9
- const base = apiBaseUrl2 ?? (typeof window !== "undefined" ? window.location.origin : "");
9
+ const base = apiBaseUrl2;
10
10
  const url = `${base.replace(/\/$/, "")}/api/zoiq/project/${encodeURIComponent(projectKey)}`;
11
11
  const res = await fetch(url, { credentials: "include" });
12
12
  if (!res.ok) {
@@ -143,7 +143,7 @@ function applyTheme(settings) {
143
143
  }
144
144
  }
145
145
  var ZOIQContext = react.createContext(null);
146
- var apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || "https://portal.zoiq.io";
146
+ var apiBaseUrl = "https://portal.zoiq.io";
147
147
  function ZOIQProvider({ projectKey, children }) {
148
148
  const [settings, setSettings] = react.useState(null);
149
149
  const [loading, setLoading] = react.useState(true);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useZOIQEntity.ts","../src/utils/test.ts"],"names":["apiBaseUrl","createContext","useState","useCallback","useEffect","jsx","useContext","fetch"],"mappings":";;;;;;AAMA,eAAsB,kBAAA,CAAmB,YAAoBA,WAAAA,EAAsD;AACjH,EAAA,MAAM,OAAOA,WAAAA,KAAe,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA,CAAA;AACrF,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AACzF,EAAA,MAAM,MAAM,MAAM,KAAA,CAAM,KAAK,EAAE,WAAA,EAAa,WAAW,CAAA;AACvD,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmC,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EACnF;AACA,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,EAAA,OAAO,IAAA;AACT;AAmBA,eAAsB,eAAA,CAAmB,UAAA,EAAoB,MAAA,EAAgB,OAAA,EAAkFA,WAAAA,EAAwC;AACrM,EAAA,MAAM,OAAOA,WAAAA,KAAe,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA,CAAA;AACrF,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,QAAQ,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,QAAQ,EAAE,CAAA;AAC3C,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAC,qBAAqB,kBAAA,CAAmB,UAAU,CAAC,CAAA,MAAA,EAAS,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAE,CAAA,CAAA;AACjJ,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,WAAW,IAAI,OAAA,CAAQ,MAAA;AACnD,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,MAAA,GAAS,OAAA,GAAU,QAAW,CAAA;AACnH,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAM,CAAA,EAAA,EAAK,IAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EACrF;AACA,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,EAAA,OAAO,IAAA;AACT;;;AC7CA,IAAM,sBAAA,GAAiD;AAAA,EACrD,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,WAAA;AAAA,EACT,SAAA,EAAW,aAAA;AAAA,EACX,IAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAgB,mBAAA;AAAA,EAChB,OAAA,EAAS,WAAA;AAAA,EACT,iBAAA,EAAmB,sBAAA;AAAA,EACnB,KAAA,EAAO,SAAA;AAAA,EACP,eAAA,EAAiB,oBAAA;AAAA,EACjB,MAAA,EAAQ,UAAA;AAAA,EACR,gBAAA,EAAkB,qBAAA;AAAA,EAClB,WAAA,EAAa,eAAA;AAAA,EACb,qBAAA,EAAuB,0BAAA;AAAA,EACvB,MAAA,EAAQ,UAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,iBAAA,EAAmB,sBAAA;AAAA,EACnB,cAAA,EAAgB,mBAAA;AAAA,EAChB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,aAAA,EAAe,kBAAA;AAAA,EACf,uBAAA,EAAyB,6BAAA;AAAA,EACzB,aAAA,EAAe,kBAAA;AAAA,EACf,WAAA,EAAa,gBAAA;AAAA,EACb,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,mBAAA,GAAsB,qBAAA;AAG5B,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAClC;AAOO,SAAS,WAAW,QAAA,EAAiC;AAC1D,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,IAAI,QAAA,CAAS,UAAA,IAAc,OAAO,QAAA,CAAS,eAAe,QAAA,EAAU;AAClE,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AAC9D,MAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AACnC,MAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,GAAG,CAAA,IAAK,KAAK,GAAG,CAAA,CAAA;AACtD,MAAA,MAAM,UAAA,GAAa,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAA,CAAkB,KAAK,KAAK,CAAA,GAAI,aAAA,CAAc,KAAK,CAAA,GAAK,KAAA;AACxG,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAC7C,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,eAAe,MAAA,EAAQ;AAClC,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,aAAA,EAAe;AAC1C,MAAA,IAAI,CAAC,KAAA,EAAO,IAAA,IAAQ,CAAC,OAAO,KAAA,EAAO;AACnC,MAAA,MAAM,OAAA,GAAU,WAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA;AACxE,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,aAAA,CAAc,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,CAAM,KAAA;AAC5F,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAC9C,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,OAAA,EAAS,UAAU,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,qBAAqB,MAAA,EAAQ;AACxC,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,mBAAA,EAAqB;AAC/C,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAc,KAAA;AAClC,MAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO;AACrB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA,CAAE,aAAa,CAAA,CAAA;AAC5D,MAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,GAAI,aAAA,CAAc,KAAK,CAAA,GAAI,KAAA;AAC1E,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAC9C,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,OAAA,EAAS,UAAU,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,GAAA,GAAM,CAAA;AAAA,EAAA,EAAc,YAAA,CAAa,IAAA,CAAK,MAAM,CAAC;AAAA;AAAA;AAAA,EAAA,EAAmB,YAAA,CAAa,IAAA,CAAK,MAAM,CAAC;AAAA;AAAA,CAAA;AAC/F,IAAA,IAAI,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,mBAAmB,CAAA;AACzD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,QAAA,CAAS,cAAc,OAAO,CAAA;AACxC,MAAA,OAAA,CAAQ,EAAA,GAAK,mBAAA;AACb,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IACnC;AACA,IAAA,OAAA,CAAQ,WAAA,GAAc,GAAA;AAAA,EACxB;AAEA,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAC1B,EAAA,IAAI,QAAA,EAAU,aAAa,IAAA,IAAQ,QAAA,EAAU,eAAe,IAAA,IAAQ,QAAA,EAAU,cAAc,IAAA,EAAM;AAChG,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,IAAI,QAAA,CAAS,aAAa,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA,6BAAA,EAAgC,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,IAAA,CAAM,CAAA;AAC9G,IAAA,IAAI,QAAA,CAAS,eAAe,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA,6BAAA,EAAgC,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,IAAA,CAAM,CAAA;AAClH,IAAA,IAAI,QAAA,CAAS,cAAc,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA,6BAAA,EAAgC,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,IAAA,CAAM,CAAA;AAChH,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,EAAA,GAAK,YAAA;AACX,MAAA,IAAI,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA;AACnC,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,EAAA,GAAK,QAAA,CAAS,cAAc,KAAK,CAAA;AACjC,QAAA,EAAA,CAAG,EAAA,GAAK,EAAA;AACR,QAAA,EAAA,CAAG,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAChC,QAAA,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,GAAG,EAAA,CAAG,QAAQ,CAAA;AACnC,QAAA,EAAA,CAAG,MAAA,EAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AChGA,IAAM,WAAA,GAAcC,oBAAuC,IAAI,CAAA;AAE/D,IAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,6BAAA,IAAiC,wBAAA;AAEzD,SAAS,YAAA,CAAa,EAAE,UAAA,EAAY,QAAA,EAAS,EAAsB;AACxE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,eAAiC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,aAAA,GAAgBC,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,UAAA,EAAY,UAAU,CAAA;AAC5D,MAAA,WAAA,CAAY,QAAQ,IAAI,CAAA;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,MAAA,KAAW,WAAA,EAAa;AAElD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,KAAM,MAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAE1C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,aAAA,EAAc;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAA6B;AACjD,MAAA,WAAA,CAAY,OAAO,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,MAAK,EAAG;AACrC,MAAA,aAAA,EAAc;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,WAAW,IAAA,EAAK;AAC5B,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,WAAA,EAAa,QAAQ,CAAA,CAC/B,KAAK,CAAA,GAAA,KAAO;AACX,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,cAAc,wBAAwB,CAAA;AACvE,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,IAAA,KAA0B;AAC/B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,aAAa,CAAC,CAAA;AAI9B,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,QAAA,EAAU,QAAA;AAAA,IACpB,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,uBAAOC,cAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAe,oCAAUA,cAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA,GAAS,QAAA,EAAS,CAAA;AACzF;AAEO,SAAS,cAAA,GAA0C;AACxD,EAAA,OAAOC,iBAAW,WAAW,CAAA;AAC/B;AAEO,SAAS,eAAA,GAAuD;AACrE,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,OAAO,KAAK,QAAA,IAAY,IAAA;AAC1B;AAEO,SAAS,aAAA,GAAsD;AACpE,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,OAAO,GAAA,EAAK,UAAU,UAAA,IAAe,IAAA;AACvC;AC/GO,SAAS,aAAA,CAA2B,MAAA,EAAgB,OAAA,GAAgC,EAAC,EAA2B;AACrH,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,eAAmB,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,MAAMK,MAAAA,GAAQJ,kBAAY,YAAY;AACpC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,eAAA;AAAA,QACnB,GAAA,CAAI,UAAA;AAAA,QACJ,MAAA;AAAA,QACA;AAAA,UACE,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,IAAU,KAAA;AAAA,SAClC;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AACA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAEvE,EAAAC,gBAAU,MAAM;AACd,IAAAG,MAAAA,EAAM;AAAA,EACR,CAAA,EAAG,CAACA,MAAK,CAAC,CAAA;AAEV,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,IAAI,KAAA,CAAM,gDAAgD,CAAA;AAAA,MACjE,SAAS,YAAY;AAAA,MAAC;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAASA,MAAAA,EAAM;AAChD;;;ACrEO,SAAS,IAAA,GAAO;AACrB,EAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACrB","file":"index.js","sourcesContent":["import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n","export function test() {\r\n console.log('test!')\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useZOIQEntity.ts","../src/utils/test.ts"],"names":["apiBaseUrl","createContext","useState","useCallback","useEffect","jsx","useContext","fetch"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n *\n * For entities with REFERENCE fields (e.g. events with a partner field pointing to partners),\n * the API expands the field value so the id is replaced with the full referenced record:\n * e.g. events → { id, partner: { id, name, ... }, ...other event values }.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n","export function test() {\r\n console.log('test!')\r\n}\r\n"]}
package/dist/index.mjs CHANGED
@@ -4,7 +4,7 @@ import { jsx } from 'react/jsx-runtime';
4
4
 
5
5
  // src/api/client.ts
6
6
  async function fetchProjectConfig(projectKey, apiBaseUrl2) {
7
- const base = apiBaseUrl2 ?? (typeof window !== "undefined" ? window.location.origin : "");
7
+ const base = apiBaseUrl2;
8
8
  const url = `${base.replace(/\/$/, "")}/api/zoiq/project/${encodeURIComponent(projectKey)}`;
9
9
  const res = await fetch(url, { credentials: "include" });
10
10
  if (!res.ok) {
@@ -141,7 +141,7 @@ function applyTheme(settings) {
141
141
  }
142
142
  }
143
143
  var ZOIQContext = createContext(null);
144
- var apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || "https://portal.zoiq.io";
144
+ var apiBaseUrl = "https://portal.zoiq.io";
145
145
  function ZOIQProvider({ projectKey, children }) {
146
146
  const [settings, setSettings] = useState(null);
147
147
  const [loading, setLoading] = useState(true);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useZOIQEntity.ts","../src/utils/test.ts"],"names":["apiBaseUrl","useState","fetch","useCallback","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = process.env.NEXT_PUBLIC_ZOIQ_API_BASE_URL || 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n","export function test() {\r\n console.log('test!')\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/api/client.ts","../src/theme/applyTheme.ts","../src/context/ZOIQProvider.tsx","../src/hooks/useZOIQEntity.ts","../src/utils/test.ts"],"names":["apiBaseUrl","useState","fetch","useCallback","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ProjectSettings } from '../context/types'\n\n/**\n * Default fetch for project config. Calls GET {apiBaseUrl}/project/{projectKey}\n * and expects JSON matching ProjectSettings.\n */\nexport async function fetchProjectConfig(projectKey: string, apiBaseUrl?: string): Promise<ProjectSettings | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch project config: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as ProjectSettings\n return data\n}\n\n/**\n * Fetch section flags for the project. Calls GET {apiBaseUrl}/project/{projectKey}/sections\n */\nexport async function fetchSectionFlags(projectKey: string, apiBaseUrl?: string): Promise<{ enabledIds: string[]; disabledIds: string[] }> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/sections`\n const res = await fetch(url, { credentials: 'include' })\n if (!res.ok) {\n throw new Error(`Failed to fetch section flags: ${res.status} ${res.statusText}`)\n }\n return res.json() as Promise<{ enabledIds: string[]; disabledIds: string[] }>\n}\n\n/**\n * Fetch entity data for the project. Calls GET {apiBaseUrl}/project/{projectKey}/data/{entity}?id=...\n * If apiKey is provided (e.g. from project settings), it is sent as x-api-key header for auth.\n */\nexport async function fetchEntityData<T>(projectKey: string, entity: string, options: { id?: string; query?: Record<string, string>; apiKey?: string | null }, apiBaseUrl?: string): Promise<T | null> {\n const base = apiBaseUrl ?? (typeof window !== 'undefined' ? window.location.origin : '')\n const params = new URLSearchParams()\n if (options.id) params.set('id', options.id)\n if (options.query) {\n Object.entries(options.query).forEach(([k, v]) => params.set(k, v))\n }\n const qs = params.toString()\n const url = `${base.replace(/\\/$/, '')}/api/zoiq/project/${encodeURIComponent(projectKey)}/data/${encodeURIComponent(entity)}${qs ? `?${qs}` : ''}`\n const headers: Record<string, string> = {}\n if (options.apiKey) headers['x-api-key'] = options.apiKey\n const res = await fetch(url, { credentials: 'include', headers: Object.keys(headers).length ? headers : undefined })\n if (!res.ok) {\n throw new Error(`Failed to fetch entity ${entity}: ${res.status} ${res.statusText}`)\n }\n const data = (await res.json()) as T\n return data\n}\n","import type { ProjectSettings } from '../context/types'\n\n/**\n * Maps styleGuide keys to CSS variable names (e.g. for :root or a wrapper).\n * Aligns with portal globals.css / Tailwind tokens.\n */\nconst STYLE_GUIDE_TO_CSS_VAR: Record<string, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n secondary: '--secondary',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n chart1: '--chart-1',\n chart2: '--chart-2',\n chart3: '--chart-3',\n chart4: '--chart-4',\n chart5: '--chart-5',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarPrimary: '--sidebar-primary',\n sidebarPrimaryForeground: '--sidebar-primary-foreground',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarRing: '--sidebar-ring',\n radius: '--radius',\n}\n\nconst ZOIQ_THEME_STYLE_ID = 'zoiq-theme-override'\n\n/** Normalize \"H, S%, L%\" (DB) to \"H S% L%\" for Tailwind hsl(var(--x)) */\nfunction toTailwindHsl(value: string): string {\n if (!value || typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.replace(/,/g, ' ')\n}\n\n/**\n * Injects theme from ProjectSettings into document so it overrides layout.css / globals.css.\n * Injects a <style id=\"zoiq-theme-override\"> with :root { ... } at the end of <head>,\n * so it wins in the cascade. Values from DB are \"H, S%, L%\"; we output \"H S% L%\" for Tailwind.\n */\nexport function applyTheme(settings: ProjectSettings): void {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n const declarations: string[] = []\n\n if (settings.styleGuide && typeof settings.styleGuide === 'object') {\n for (const [key, value] of Object.entries(settings.styleGuide)) {\n if (value == null || value === '') continue\n const cssVar = STYLE_GUIDE_TO_CSS_VAR[key] ?? `--${key}`\n const normalized = typeof value === 'string' && /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : (value as string)\n declarations.push(`${cssVar}: ${normalized};`)\n root.style.setProperty(cssVar, normalized)\n }\n }\n\n if (settings.definedColors?.length) {\n for (const color of settings.definedColors) {\n if (!color?.name || !color?.value) continue\n const varName = `--color-${color.name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(color.value) ? toTailwindHsl(color.value) : color.value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (settings.clientDefinedColors?.length) {\n for (const item of settings.clientDefinedColors) {\n const value = item?.definedColor?.value\n const name = item?.name\n if (!name || !value) continue\n const varName = `--${name.replace(/\\s+/g, '-').toLowerCase()}`\n const normalized = /^\\s*[\\d.-]+\\s*,/.test(value) ? toTailwindHsl(value) : value\n declarations.push(`${varName}: ${normalized};`)\n root.style.setProperty(varName, normalized)\n }\n }\n\n if (declarations.length > 0) {\n const css = `:root {\\n ${declarations.join('\\n ')}\\n}\\n.dark {\\n ${declarations.join('\\n ')}\\n}\\n`\n let styleEl = document.getElementById(ZOIQ_THEME_STYLE_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = ZOIQ_THEME_STYLE_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = css\n }\n\n const branding = settings.branding\n if (branding?.primaryFont?.link || branding?.secondaryFont?.link || branding?.tertiaryFont?.link) {\n const fontLinks: string[] = []\n if (branding.primaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.primaryFont.link}\" />`)\n if (branding.secondaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.secondaryFont.link}\" />`)\n if (branding.tertiaryFont?.link) fontLinks.push(`<link rel=\"stylesheet\" href=\"${branding.tertiaryFont.link}\" />`)\n if (fontLinks.length > 0) {\n const id = 'zoiq-fonts'\n let el = document.getElementById(id)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.innerHTML = fontLinks.join('')\n document.head.append(...el.children)\n el.remove()\n }\n }\n }\n}\n","'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react'\nimport { fetchProjectConfig } from '../api/client'\nimport { applyTheme } from '../theme/applyTheme'\nimport type { ProjectSettings } from './types'\n\nexport interface ZOIQProviderProps {\n /** Project key (e.g. project ID or public API key) to fetch theme and config */\n projectKey: string\n /** Base URL for the project config API (e.g. https://your-portal.com/api/zoiq) */\n /** Optional custom fetcher; if provided, apiBaseUrl is ignored for config fetch */\n children: React.ReactNode\n}\n\ninterface ZOIQContextValue {\n projectKey: string\n apiBaseUrl?: string\n settings: ProjectSettings | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n branding: ProjectSettings['branding'] | null\n}\n\nconst ZOIQContext = createContext<ZOIQContextValue | null>(null)\n\nconst apiBaseUrl = 'https://portal.zoiq.io'\n\nexport function ZOIQProvider({ projectKey, children }: ZOIQProviderProps) {\n const [settings, setSettings] = useState<ProjectSettings | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetchAndApply = useCallback(async () => {\n if (!projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const data = await fetchProjectConfig(projectKey, apiBaseUrl)\n setSettings(data ?? null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n } finally {\n setLoading(false)\n }\n }, [projectKey])\n\n // Preview mode: ?preview=true&previewUrl=... — load project settings by fetching the preview JSON URL directly (S3 public URL)\n useEffect(() => {\n if (!projectKey || typeof window === 'undefined') return\n\n const params = new URLSearchParams(window.location.search)\n const isPreview = params.get('preview') === 'true'\n const previewUrl = params.get('previewUrl')\n\n if (!isPreview) {\n fetchAndApply()\n return\n }\n\n const applyPayload = (payload: ProjectSettings) => {\n setSettings(payload)\n setError(null)\n setLoading(false)\n }\n\n if (!previewUrl || !previewUrl.trim()) {\n fetchAndApply()\n return\n }\n\n const url = previewUrl.trim()\n let cancelled = false\n fetch(url, { credentials: 'omit' })\n .then(res => {\n if (cancelled) return\n if (!res.ok) throw new Error(res.statusText || 'Failed to load preview')\n return res.json()\n })\n .then((data: ProjectSettings) => {\n if (cancelled) return\n applyPayload(data)\n })\n .catch(err => {\n if (cancelled) return\n setError(err instanceof Error ? err : new Error(String(err)))\n setSettings(null)\n setLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [projectKey, fetchAndApply])\n\n // Apply theme to document root whenever settings change so Tailwind in the client app\n // picks up CSS variables (e.g. --primary, --background) from :root\n useEffect(() => {\n if (settings) {\n applyTheme(settings)\n }\n }, [settings])\n\n const value: ZOIQContextValue = {\n projectKey,\n settings,\n loading,\n error,\n branding: settings?.branding,\n apiBaseUrl,\n refetch: fetchAndApply,\n }\n\n return <ZOIQContext.Provider value={value}>{loading ? <div>Loading...</div> : children}</ZOIQContext.Provider>\n}\n\nexport function useZOIQContext(): ZOIQContextValue | null {\n return useContext(ZOIQContext)\n}\n\nexport function useZOIQBranding(): ZOIQContextValue['branding'] | null {\n const ctx = useZOIQContext()\n return ctx?.branding ?? null\n}\n\nexport function useStyleGuide(): ProjectSettings['styleGuide'] | null {\n const ctx = useZOIQContext()\n return ctx?.settings?.styleGuide ?? (null as ProjectSettings['styleGuide'] | null)\n}\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { fetchEntityData } from '../api/client'\nimport { useZOIQContext } from '../context/ZOIQProvider'\n\nexport interface UseZOIQEntityOptions {\n id?: string\n query?: Record<string, string>\n}\n\nexport interface UseZOIQEntityResult<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\n/**\n * Fetches custom entity data for the current project.\n * Must be used within ZOIQProvider.\n *\n * For entities with REFERENCE fields (e.g. events with a partner field pointing to partners),\n * the API expands the field value so the id is replaced with the full referenced record:\n * e.g. events → { id, partner: { id, name, ... }, ...other event values }.\n */\nexport function useZOIQEntity<T = unknown>(entity: string, options: UseZOIQEntityOptions = {}): UseZOIQEntityResult<T> {\n const ctx = useZOIQContext()\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const fetch = useCallback(async () => {\n if (!ctx?.projectKey) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(null)\n try {\n const result = await fetchEntityData<T>(\n ctx.projectKey,\n entity,\n {\n id: options.id,\n query: options.query,\n apiKey: ctx.settings?.apiKey ?? undefined,\n },\n ctx.apiBaseUrl,\n )\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n setData(null)\n } finally {\n setLoading(false)\n }\n }, [ctx?.projectKey, entity, options.id, JSON.stringify(options.query)])\n\n useEffect(() => {\n fetch()\n }, [fetch])\n\n if (!ctx) {\n return {\n data: null,\n loading: false,\n error: new Error('useZOIQEntity must be used within ZOIQProvider'),\n refetch: async () => {},\n }\n }\n\n return { data, loading, error, refetch: fetch }\n}\n","export function test() {\r\n console.log('test!')\r\n}\r\n"]}
@@ -36,6 +36,10 @@ interface UseZOIQEntityResult<T> {
36
36
  /**
37
37
  * Fetches custom entity data for the current project.
38
38
  * Must be used within ZOIQProvider.
39
+ *
40
+ * For entities with REFERENCE fields (e.g. events with a partner field pointing to partners),
41
+ * the API expands the field value so the id is replaced with the full referenced record:
42
+ * e.g. events → { id, partner: { id, name, ... }, ...other event values }.
39
43
  */
40
44
  declare function useZOIQEntity<T = unknown>(entity: string, options?: UseZOIQEntityOptions): UseZOIQEntityResult<T>;
41
45
 
@@ -36,6 +36,10 @@ interface UseZOIQEntityResult<T> {
36
36
  /**
37
37
  * Fetches custom entity data for the current project.
38
38
  * Must be used within ZOIQProvider.
39
+ *
40
+ * For entities with REFERENCE fields (e.g. events with a partner field pointing to partners),
41
+ * the API expands the field value so the id is replaced with the full referenced record:
42
+ * e.g. events → { id, partner: { id, name, ... }, ...other event values }.
39
43
  */
40
44
  declare function useZOIQEntity<T = unknown>(entity: string, options?: UseZOIQEntityOptions): UseZOIQEntityResult<T>;
41
45
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zoiq.io/dev-kit",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "description": "ZOIQ - React component library and framework with project-key-driven theme, hooks, and UI primitives",
6
6
  "main": "./dist/index.js",