@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 +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +2 -2
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +2 -2
- package/dist/client.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/{useZOIQEntity-CkkGzG6D.d.ts → useZOIQEntity-CfY8Ag40.d.ts} +4 -0
- package/dist/{useZOIQEntity-oTb7n2Cg.d.mts → useZOIQEntity-Cv9WBq8W.d.mts} +4 -0
- package/package.json +1 -1
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-
|
|
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-
|
|
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
|
|
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 =
|
|
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);
|
package/dist/client.js.map
CHANGED
|
@@ -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":"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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 = '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
|
|
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 =
|
|
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);
|
package/dist/client.mjs.map
CHANGED
|
@@ -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-
|
|
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-
|
|
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
|
|
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 =
|
|
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":"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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 = 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
|
|
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 =
|
|
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);
|
package/dist/index.mjs.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","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