@flonix/ig-embed 0.1.0 → 0.1.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/global.ts","../src/logo-data.ts","../src/branding.ts","../src/client.ts","../src/dom.ts","../src/components.ts","../src/screens/connect.ts","../src/screens/posts.ts","../src/prefill.ts","../src/screens/automate-dialog.ts","../src/theme.ts","../src/styles.ts","../src/widget.ts","../src/mock.ts","../src/index.ts"],"sourcesContent":["// IIFE entry. tsup wraps these exports as `window.FlonixIG`, so script-tag\n// consumers get `FlonixIG.mount(...)`, `FlonixIG.createMockTransport(...)`, etc.\n\nexport { mount, version, FlonixIG, createMockTransport, createHttpTransport, DEFAULT_TOKENS } from \"./index\"\n","// Flonix delta logo (white mark) embedded as a data URI so the widget is fully\n// self-contained (no network/CORS dependency). Source: apps/main/public/wacrm-logo.png\nexport const FLONIX_LOGO_PNG =\n \"data:image/png;base64,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\"\n","// Flonix branding + inline icons. The logo is the real Flonix delta mark\n// (a white glyph) embedded as a data URI. Following the app's own treatment,\n// it sits inside a primary-colored chip in light mode and shows directly in\n// dark mode (handled in styles.ts via `:host(.flxig-dark)`).\n\nimport { FLONIX_LOGO_PNG } from \"./logo-data\"\nimport type { PartnerBranding } from \"./types\"\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (c) =>\n c === \"&\" ? \"&amp;\" : c === \"<\" ? \"&lt;\" : c === \">\" ? \"&gt;\" : c === '\"' ? \"&quot;\" : \"&#39;\"\n )\n}\n\n// Pinned brand font for the wordmark. Deliberately NOT `var(--flxig-font)` —\n// the logo text must stay in the Flonix brand face even when a host overrides\n// the widget's font. `textLength` locks the visual width so the mark renders\n// identically regardless of which fallback font is available.\nconst WORDMARK_FONT =\n \"Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\"\n\n/** Flonix logo: delta mark (chip in light / bare in dark) + SVG \"flonix\" wordmark. */\nexport function flonixLogo(size = 20): string {\n return `<span class=\"flxig-brand\" style=\"--flxig-logo-size:${size}px\" role=\"img\" aria-label=\"Flonix\">\n <span class=\"flxig-brand__chip\">\n <img class=\"flxig-brand__img\" src=\"${FLONIX_LOGO_PNG}\" alt=\"\" draggable=\"false\" />\n </span>\n <svg class=\"flxig-brand__wordmark\" viewBox=\"0 0 55 22\" fill=\"currentColor\" aria-hidden=\"true\">\n <text x=\"0\" y=\"19\" font-size=\"22\" font-weight=\"700\" letter-spacing=\"-0.4\" font-family=\"${WORDMARK_FONT}\" textLength=\"55\" lengthAdjust=\"spacingAndGlyphs\">flonix</text>\n </svg>\n </span>`\n}\n\n/** \"<partner logo> × flonix\" co-brand lockup. */\nexport function cobrandLockup(partner: PartnerBranding): string {\n const name = escapeHtml(partner.name)\n const light = escapeHtml(partner.logo)\n const dark = partner.logoDark ? escapeHtml(partner.logoDark) : \"\"\n\n const partnerImgs = dark\n ? `<img class=\"flxig-partner__img flxig-partner__img--light\" src=\"${light}\" alt=\"${name}\" draggable=\"false\" />\n <img class=\"flxig-partner__img flxig-partner__img--dark\" src=\"${dark}\" alt=\"${name}\" draggable=\"false\" />`\n : `<img class=\"flxig-partner__img\" src=\"${light}\" alt=\"${name}\" draggable=\"false\" />`\n\n return `<span class=\"flxig-cobrand\">\n <span class=\"flxig-partner\" data-has-dark=\"${dark ? \"true\" : \"false\"}\">${partnerImgs}</span>\n <span class=\"flxig-cobrand__x\">×</span>\n ${flonixLogo(18)}\n </span>`\n}\n\nexport const icons = {\n instagram: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" ry=\"5\"/>\n <path d=\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\"/>\n <line x1=\"17.5\" y1=\"6.5\" x2=\"17.51\" y2=\"6.5\"/>\n </svg>`,\n comment: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"/>\n </svg>`,\n dm: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n </svg>`,\n check: (size = 16) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>`,\n close: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>`,\n plus: (size = 16) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>`,\n link: (size = 15) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\n </svg>`,\n bolt: (size = 16) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M13 2 4.5 13.5H11L10 22l8.5-11.5H12L13 2Z\"/>\n </svg>`,\n spinner: (size = 18) =>\n `<svg class=\"flxig-spin\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>\n </svg>`,\n video: (size = 14) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 5v14l11-7L8 5Z\"/>\n </svg>`,\n layers: (size = 14) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\"/>\n <polyline points=\"2 17 12 22 22 17\"/>\n <polyline points=\"2 12 12 17 22 12\"/>\n </svg>`,\n}\n","// The real transport — talks to the Flonix `/api/embed/*` endpoints.\n\nimport type { Transport } from \"./types\"\n\nfunction authHeaders(token: string): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n }\n}\n\nexport function createHttpTransport(baseUrl: string): Transport {\n const base = baseUrl.replace(/\\/+$/, \"\")\n\n async function call<T>(path: string, init: RequestInit): Promise<T> {\n let res: Response\n try {\n res = await fetch(`${base}${path}`, init)\n } catch {\n throw new Error(\"Network error — please try again.\")\n }\n const json = (await res.json().catch(() => null)) as\n | (T & { error?: string })\n | null\n if (!res.ok) {\n throw new Error(json?.error || `Request failed (${res.status})`)\n }\n return json as T\n }\n\n return {\n session: ({ apiKey, user }) =>\n call(\"/api/embed/session\", {\n method: \"POST\",\n headers: authHeaders(apiKey),\n body: JSON.stringify({ user }),\n }),\n\n connectStart: ({ token, returnUrl }) =>\n call(\"/api/embed/connect/start\", {\n method: \"POST\",\n headers: authHeaders(token),\n body: JSON.stringify({ returnUrl }),\n }),\n\n posts: ({ token, cursor }) =>\n call(\n `/api/embed/posts${cursor ? `?cursor=${encodeURIComponent(cursor)}` : \"\"}`,\n { method: \"GET\", headers: authHeaders(token) }\n ),\n\n createAutomation: ({ token, data }) =>\n call(\"/api/embed/automations\", {\n method: \"POST\",\n headers: authHeaders(token),\n body: JSON.stringify(data),\n }),\n }\n}\n","// Tiny, dependency-free hyperscript helpers. This is the ONLY place that\n// touches the raw DOM API so screens stay declarative and testable.\n\nexport type Child = Node | string | number | null | undefined | false\n\ntype EventMap = {\n [K in keyof HTMLElementEventMap]?: (ev: HTMLElementEventMap[K]) => void\n}\n\nexport interface ElAttrs {\n class?: string\n text?: string\n html?: string\n style?: string\n dataset?: Record<string, string>\n attrs?: Record<string, string | number | boolean | null | undefined>\n on?: EventMap\n}\n\n/** Create an element with attributes + children. */\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: ElAttrs = {},\n ...children: Child[]\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag)\n\n if (attrs.class) node.className = attrs.class\n if (attrs.text != null) node.textContent = attrs.text\n if (attrs.html != null) node.innerHTML = attrs.html\n if (attrs.style) node.setAttribute(\"style\", attrs.style)\n\n if (attrs.dataset) {\n for (const [key, value] of Object.entries(attrs.dataset)) {\n node.dataset[key] = value\n }\n }\n\n if (attrs.attrs) {\n for (const [key, value] of Object.entries(attrs.attrs)) {\n if (value == null || value === false) continue\n node.setAttribute(key, value === true ? \"\" : String(value))\n }\n }\n\n if (attrs.on) {\n for (const [event, handler] of Object.entries(attrs.on)) {\n node.addEventListener(event, handler as EventListener)\n }\n }\n\n append(node, children)\n return node\n}\n\n/** Append a flat/nested list of children, ignoring nullish/false values. */\nexport function append(parent: Node, children: Child[]): void {\n for (const child of children) {\n if (child == null || child === false) continue\n parent.appendChild(\n child instanceof Node ? child : document.createTextNode(String(child))\n )\n }\n}\n\n/** Remove all children from a node. */\nexport function clear(node: Node): void {\n while (node.firstChild) node.removeChild(node.firstChild)\n}\n\n/** Build an element from an SVG/HTML markup string (used for icons/logos). */\nexport function fromMarkup(markup: string): HTMLElement {\n const wrapper = document.createElement(\"div\")\n wrapper.innerHTML = markup.trim()\n return (wrapper.firstElementChild as HTMLElement) ?? wrapper\n}\n","// Small reusable UI controls built on the dom.ts primitives. Each returns a\n// plain element (and, where it owns state, a typed handle to read it back).\n\nimport { append, el, fromMarkup } from \"./dom\"\nimport { icons } from \"./branding\"\n\nexport function button(opts: {\n label: string\n variant?: \"primary\" | \"secondary\" | \"ghost\"\n block?: boolean\n large?: boolean\n icon?: string\n disabled?: boolean\n onClick?: () => void\n}): HTMLButtonElement {\n const classes = [\n \"flxig-btn\",\n `flxig-btn--${opts.variant ?? \"primary\"}`,\n opts.block ? \"flxig-btn--block\" : \"\",\n opts.large ? \"flxig-btn--lg\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")\n\n const btn = el(\"button\", {\n class: classes,\n attrs: { type: \"button\", disabled: opts.disabled },\n on: opts.onClick ? { click: opts.onClick } : undefined,\n })\n if (opts.icon) btn.appendChild(fromMarkup(opts.icon))\n append(btn, [el(\"span\", { text: opts.label })])\n return btn\n}\n\nexport function field(\n label: string,\n control: HTMLElement,\n hint?: string\n): HTMLElement {\n // Intentionally a <div>, not a <label>: composite controls (keyword chips,\n // link buttons) contain multiple labelable elements, and a wrapping <label>\n // would forward clicks to its first control — e.g. clicking one chip's\n // remove button would also trigger the first chip's, deleting two at once.\n return el(\n \"div\",\n { class: \"flxig-field\" },\n el(\"span\", { class: \"flxig-label\", text: label }),\n control,\n hint ? el(\"span\", { class: \"flxig-hint\", text: hint }) : null\n )\n}\n\nexport function textInput(opts: {\n value?: string\n placeholder?: string\n}): HTMLInputElement {\n return el(\"input\", {\n class: \"flxig-input\",\n attrs: { type: \"text\", value: opts.value ?? \"\", placeholder: opts.placeholder ?? \"\" },\n })\n}\n\nexport function textArea(opts: {\n value?: string\n placeholder?: string\n rows?: number\n}): HTMLTextAreaElement {\n const ta = el(\"textarea\", {\n class: \"flxig-textarea\",\n attrs: { placeholder: opts.placeholder ?? \"\", rows: opts.rows ?? 3 },\n })\n ta.value = opts.value ?? \"\"\n return ta\n}\n\n/** A toggle switch. Read state via the returned `input.checked`. */\nexport function switchToggle(opts: {\n checked: boolean\n onChange?: (checked: boolean) => void\n}): { element: HTMLElement; input: HTMLInputElement } {\n const input = el(\"input\", { attrs: { type: \"checkbox\" } })\n input.checked = opts.checked\n if (opts.onChange) {\n input.addEventListener(\"change\", () => opts.onChange!(input.checked))\n }\n const element = el(\n \"span\",\n { class: \"flxig-switch\" },\n input,\n el(\"span\", { class: \"flxig-switch__track\" }),\n el(\"span\", { class: \"flxig-switch__thumb\" })\n )\n return { element, input }\n}\n\n/** A keyword chips input. Returns a live getter for the current values. */\nexport function chipsInput(opts: {\n values: string[]\n placeholder?: string\n}): { element: HTMLElement; getValues: () => string[] } {\n let values = [...opts.values]\n const list = el(\"span\", { class: \"flxig-chips\" })\n const input = el(\"input\", {\n attrs: { type: \"text\", placeholder: opts.placeholder ?? \"Add keyword…\" },\n })\n\n const render = () => {\n while (list.firstChild && list.firstChild !== input) {\n list.removeChild(list.firstChild)\n }\n const chips = values.map((value, index) =>\n el(\n \"span\",\n { class: \"flxig-chip\" },\n el(\"span\", { text: value }),\n el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": `Remove ${value}` },\n html: icons.close(12),\n on: {\n click: () => {\n values.splice(index, 1)\n render()\n },\n },\n })\n )\n )\n list.prepend(...chips)\n }\n\n const commit = () => {\n const raw = input.value.trim().replace(/,$/, \"\").trim()\n if (raw && !values.includes(raw)) {\n values.push(raw)\n render()\n }\n input.value = \"\"\n }\n\n input.addEventListener(\"keydown\", (ev) => {\n if (ev.key === \"Enter\" || ev.key === \",\") {\n ev.preventDefault()\n commit()\n } else if (ev.key === \"Backspace\" && !input.value && values.length) {\n values.pop()\n render()\n }\n })\n input.addEventListener(\"blur\", commit)\n\n list.appendChild(input)\n render()\n\n return { element: list, getValues: () => [...values] }\n}\n\n/** Repeatable list of link buttons (label + URL), capped at `max`. */\nexport function linkButtonsEditor(opts: {\n values: { label: string; url: string }[]\n max: number\n}): { element: HTMLElement; getValues: () => { label: string; url: string }[] } {\n const rows = el(\"div\", { class: \"flxig-links\" })\n const addBtn = button({\n label: \"Add link\",\n variant: \"ghost\",\n icon: icons.plus(15),\n onClick: () => {\n if (rows.querySelectorAll(\".flxig-link\").length >= opts.max) return\n addRow({ label: \"\", url: \"\" })\n syncAdd()\n },\n })\n addBtn.classList.add(\"flxig-links__add\")\n\n function syncAdd() {\n addBtn.disabled = rows.querySelectorAll(\".flxig-link\").length >= opts.max\n }\n\n function addRow(value: { label: string; url: string }) {\n const label = textInput({ value: value.label, placeholder: \"Button label\" })\n label.classList.add(\"flxig-link__label\")\n const url = el(\"input\", {\n class: \"flxig-input flxig-link__url\",\n attrs: { type: \"url\", value: value.url, placeholder: \"https://…\", inputmode: \"url\" },\n })\n const row = el(\n \"div\",\n { class: \"flxig-link\" },\n fromMarkup(`<span class=\"flxig-link__ic\">${icons.link(15)}</span>`),\n el(\"div\", { class: \"flxig-link__inputs\" }, label, url),\n el(\"button\", {\n class: \"flxig-iconbtn\",\n attrs: { type: \"button\", \"aria-label\": \"Remove link\" },\n html: icons.close(16),\n on: {\n click: () => {\n row.remove()\n syncAdd()\n },\n },\n })\n )\n rows.appendChild(row)\n }\n\n const seed = opts.values.length ? opts.values : [{ label: \"\", url: \"\" }]\n seed.slice(0, opts.max).forEach(addRow)\n syncAdd()\n\n const element = el(\"div\", { class: \"flxig-links__wrap\" }, rows, addBtn)\n\n return {\n element,\n getValues: () =>\n [...rows.querySelectorAll(\".flxig-link\")]\n .map((row) => ({\n label: (row.querySelector(\".flxig-link__label\") as HTMLInputElement).value.trim(),\n url: (row.querySelector(\".flxig-link__url\") as HTMLInputElement).value.trim(),\n }))\n .filter((b) => b.label || b.url),\n }\n}\n\nexport function stateBlock(opts: {\n icon?: string\n title: string\n detail?: string\n action?: HTMLElement\n}): HTMLElement {\n return el(\n \"div\",\n { class: \"flxig-state\" },\n opts.icon ? fromMarkup(opts.icon) : null,\n el(\"p\", { class: \"flxig-h2\", text: opts.title }),\n opts.detail ? el(\"p\", { class: \"flxig-muted\", text: opts.detail }) : null,\n opts.action ?? null\n )\n}\n","// Screen 1 — the empty \"connect your Instagram with Flonix\" state.\n// Clean top (heading + CTA); the small \"<partner> × flonix\" lockup sits at\n// the bottom.\n\nimport { cobrandLockup, icons } from \"../branding\"\nimport { button } from \"../components\"\nimport { el, fromMarkup } from \"../dom\"\nimport type { PartnerBranding } from \"../types\"\n\nexport function renderConnect(opts: {\n connecting: boolean\n partner: PartnerBranding\n onConnect: () => void\n}): HTMLElement {\n const cta = button({\n label: opts.connecting ? \"Redirecting…\" : \"Connect Instagram\",\n variant: \"primary\",\n large: true,\n block: true,\n disabled: opts.connecting,\n icon: opts.connecting ? icons.spinner() : icons.instagram(),\n onClick: opts.onConnect,\n })\n\n return el(\n \"div\",\n { class: \"flxig-connect\" },\n el(\n \"div\",\n { class: \"flxig-connect__copy\" },\n el(\"h1\", { class: \"flxig-h1\", text: \"Connect your Instagram with Flonix\" }),\n el(\"p\", {\n class: \"flxig-muted\",\n text: \"Link your Instagram account to set up comment and DM automations on your posts — directly from here.\",\n })\n ),\n el(\"div\", { class: \"flxig-connect__cta\" }, cta),\n fromMarkup(`<div class=\"flxig-connect__foot\">${cobrandLockup(opts.partner)}</div>`)\n )\n}\n","// Screen 2 — the connected account's posts, loaded incrementally.\n// The view owns its grid + an IntersectionObserver sentinel; the widget\n// feeds it pages via `appendPosts` and toggles loading/hasMore flags.\n\nimport { flonixLogo, icons } from \"../branding\"\nimport { button, stateBlock } from \"../components\"\nimport { append, clear, el, fromMarkup } from \"../dom\"\nimport type { InstagramAccount, InstagramPost, MediaType } from \"../types\"\n\nexport interface PostsView {\n element: HTMLElement\n appendPosts(posts: InstagramPost[]): void\n setLoadingMore(loading: boolean): void\n setHasMore(hasMore: boolean): void\n showEmpty(): void\n destroy(): void\n}\n\nconst TYPE_META: Record<MediaType, { label: string; icon: string }> = {\n IMAGE: { label: \"Image\", icon: icons.instagram(12) },\n VIDEO: { label: \"Video\", icon: icons.video() },\n REELS: { label: \"Reel\", icon: icons.video() },\n CAROUSEL: { label: \"Album\", icon: icons.layers() },\n}\n\nfunction postTile(\n post: InstagramPost,\n onAutomate: (post: InstagramPost) => void\n): HTMLElement {\n const meta = TYPE_META[post.mediaType] ?? TYPE_META.IMAGE\n\n const media = el(\"div\", { class: \"flxig-tile__media\" })\n if (post.media) {\n append(media, [\n el(\"img\", {\n attrs: { src: post.media, alt: post.caption ?? \"Instagram post\", loading: \"lazy\" },\n }),\n ])\n } else {\n append(media, [fromMarkup(`<div class=\"flxig-tile__ph\">${icons.instagram(28)}</div>`)])\n }\n append(media, [\n fromMarkup(\n `<span class=\"flxig-tile__type\">${meta.icon}<span>${meta.label}</span></span>`\n ),\n ])\n\n return el(\n \"div\",\n { class: \"flxig-tile\" },\n media,\n el(\n \"div\",\n { class: \"flxig-tile__body\" },\n el(\"p\", {\n class: \"flxig-tile__cap\",\n text: post.caption?.trim() || \"No caption\",\n }),\n button({\n label: \"Automate\",\n variant: \"secondary\",\n block: true,\n icon: icons.bolt(),\n onClick: () => onAutomate(post),\n })\n )\n )\n}\n\nexport function renderPosts(opts: {\n account: InstagramAccount | null\n onAutomate: (post: InstagramPost) => void\n onLoadMore: () => void\n}): PostsView {\n const username = opts.account?.username\n const grid = el(\"div\", { class: \"flxig-grid\" })\n const sentinel = el(\"div\", { class: \"flxig-sentinel\" })\n const loadMore = el(\"div\", { class: \"flxig-loadmore\" })\n\n const header = el(\n \"div\",\n { class: \"flxig-header\" },\n el(\n \"div\",\n { class: \"flxig-header__id\" },\n fromMarkup(`<span class=\"flxig-avatar\">${icons.instagram(18)}</span>`),\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-h2\", text: username ? `@${username}` : \"Instagram\" }),\n el(\"div\", { class: \"flxig-muted\", text: \"Pick a post to automate\" })\n )\n ),\n fromMarkup(\n `<span class=\"flxig-badge\">${icons.check(13)}<span>Connected</span></span>`\n )\n )\n\n const attribution = fromMarkup(\n `<div class=\"flxig-attrib\"><span>Automations by</span>${flonixLogo(15)}</div>`\n )\n\n const root = el(\n \"div\",\n {},\n header,\n grid,\n loadMore,\n sentinel,\n attribution\n )\n\n let hasMore = true\n let loading = false\n let empty = false\n\n // Observe the sentinel to trigger incremental loads as it scrolls into view.\n const observer =\n typeof IntersectionObserver !== \"undefined\"\n ? new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting) && hasMore && !loading && !empty) {\n opts.onLoadMore()\n }\n },\n { rootMargin: \"240px\" }\n )\n : null\n observer?.observe(sentinel)\n\n const renderLoadMore = () => {\n clear(loadMore)\n if (loading) {\n append(loadMore, [fromMarkup(icons.spinner(20))])\n } else if (hasMore && !observer) {\n // Fallback when IntersectionObserver is unavailable.\n append(loadMore, [\n button({ label: \"Load more\", variant: \"ghost\", onClick: opts.onLoadMore }),\n ])\n }\n }\n\n return {\n element: root,\n appendPosts(posts) {\n empty = false\n append(\n grid,\n posts.map((post) => postTile(post, opts.onAutomate))\n )\n },\n setLoadingMore(value) {\n loading = value\n renderLoadMore()\n },\n setHasMore(value) {\n hasMore = value\n renderLoadMore()\n if (!value) observer?.disconnect()\n },\n showEmpty() {\n empty = true\n hasMore = false\n observer?.disconnect()\n clear(grid)\n grid.replaceWith(\n stateBlock({\n icon: icons.instagram(30),\n title: \"No posts yet\",\n detail: \"Publish a post on Instagram, then come back to automate it.\",\n })\n )\n },\n destroy() {\n observer?.disconnect()\n },\n }\n}\n","// Business rules for the \"fully prefilled\" automate dialog. Isolated here so\n// the defaults can evolve without touching the view code in screens/.\n\nimport type {\n AutomationType,\n CreateAutomationInput,\n InstagramAccount,\n InstagramPost,\n} from \"./types\"\n\nfunction profileUrl(account: InstagramAccount | null): string {\n if (account?.username) return `https://instagram.com/${account.username}`\n return \"https://instagram.com/\"\n}\n\n/** A fully prefilled automation draft for a given post + type. */\nexport function buildPrefill(\n post: InstagramPost,\n account: InstagramAccount | null,\n type: AutomationType\n): CreateAutomationInput {\n const handle = account?.username ? `@${account.username}` : \"us\"\n\n const common = {\n postId: post.id,\n type,\n entryButtonLabel: \"Send me the link\",\n deliveryMessage:\n \"Thanks for reaching out! 🙌 Here's the link you asked for 👇\",\n // One link button prefilled; the merchant fills in their own URL.\n linkButtons: [{ label: \"Shop now\", url: \"\" }],\n // Follow-gate is ON and prefilled by default, per product spec.\n followGate: {\n enabled: true,\n followProfileUrl: profileUrl(account),\n followButtonLabel: `Follow ${handle}`,\n followConfirmButtonLabel: \"I'm following ✅\",\n followUpMessage:\n \"Awesome — thanks for following! 💙 Here's your link 👇\",\n },\n }\n\n if (type === \"COMMENT\") {\n return {\n ...common,\n name: \"Comment → DM automation\",\n keywords: [\"link\", \"price\", \"info\"],\n commentReply: \"Just sent you a DM! 📩\",\n }\n }\n\n return {\n ...common,\n name: \"DM keyword automation\",\n keywords: [\"link\", \"info\"],\n commentReply: null,\n }\n}\n","// Screen 3 — the \"Automate\" dialog. Offers Comment vs DM automation, with\n// every field (including the follow-gate) prefilled from prefill.ts. The\n// dialog is self-contained: it owns its form state and reports a finished\n// CreateAutomationInput back through `onSubmit`.\n\nimport { icons } from \"../branding\"\nimport {\n button,\n chipsInput,\n field,\n linkButtonsEditor,\n switchToggle,\n textArea,\n textInput,\n} from \"../components\"\nimport { append, el, fromMarkup } from \"../dom\"\nimport { buildPrefill } from \"../prefill\"\nimport {\n MAX_LINK_BUTTONS,\n type AutomationType,\n type CreateAutomationInput,\n type InstagramAccount,\n type InstagramPost,\n} from \"../types\"\n\ninterface DialogHandle {\n close: () => void\n}\n\nconst TYPE_OPTIONS: {\n type: AutomationType\n title: string\n detail: string\n icon: string\n}[] = [\n {\n type: \"COMMENT\",\n title: \"Comment automation\",\n detail: \"Reply + DM when someone comments a keyword\",\n icon: icons.comment(20),\n },\n {\n type: \"DM\",\n title: \"DM automation\",\n detail: \"Auto-reply when someone DMs a keyword\",\n icon: icons.dm(20),\n },\n]\n\nexport function openAutomateDialog(opts: {\n mount: ShadowRoot | HTMLElement\n post: InstagramPost\n account: InstagramAccount | null\n onSubmit: (data: CreateAutomationInput) => Promise<void>\n onToast: (message: string) => void\n}): DialogHandle {\n let type: AutomationType = \"COMMENT\"\n let draft = buildPrefill(opts.post, opts.account, type)\n let submitting = false\n\n const body = el(\"div\", { class: \"flxig-dialog__body\" })\n const overlay = el(\"div\", { class: \"flxig-overlay\" })\n\n const close = () => {\n document.removeEventListener(\"keydown\", onKey)\n overlay.remove()\n }\n const onKey = (ev: KeyboardEvent) => {\n if (ev.key === \"Escape\" && !submitting) close()\n }\n document.addEventListener(\"keydown\", onKey)\n overlay.addEventListener(\"click\", (ev) => {\n if (ev.target === overlay && !submitting) close()\n })\n\n // --- type picker (segmented control) ---\n const picker = el(\"div\", { class: \"flxig-seg\" })\n const renderPicker = () => {\n picker.replaceChildren(\n ...TYPE_OPTIONS.map((opt) =>\n el(\n \"div\",\n {\n class: \"flxig-seg__opt\",\n dataset: { active: String(opt.type === type) },\n attrs: { role: \"button\", tabindex: \"0\" },\n on: {\n click: () => {\n if (opt.type === type) return\n type = opt.type\n draft = buildPrefill(opts.post, opts.account, type)\n renderPicker()\n renderForm()\n },\n },\n },\n fromMarkup(`<span class=\"flxig-seg__ic\">${opt.icon}</span>`),\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-seg__t\", text: opt.title }),\n el(\"div\", { class: \"flxig-seg__d\", text: opt.detail })\n )\n )\n )\n )\n }\n\n // --- form (re-rendered when the type changes) ---\n let readForm: () => CreateAutomationInput = () => draft\n\n const renderForm = () => {\n const keywords = chipsInput({\n values: draft.keywords,\n placeholder: \"Add keyword…\",\n })\n const commentReply = textInput({ value: draft.commentReply ?? \"\" })\n const deliveryMessage = textArea({ value: draft.deliveryMessage, rows: 3 })\n const entryButtonLabel = textInput({ value: draft.entryButtonLabel })\n const links = linkButtonsEditor({\n values: draft.linkButtons,\n max: MAX_LINK_BUTTONS,\n })\n\n const followUpMessage = textArea({ value: draft.followGate.followUpMessage, rows: 2 })\n const followButtonLabel = textInput({ value: draft.followGate.followButtonLabel })\n const followProfileUrl = textInput({ value: draft.followGate.followProfileUrl })\n const followConfirmLabel = textInput({ value: draft.followGate.followConfirmButtonLabel })\n\n const gateFields = el(\n \"div\",\n { class: \"flxig-gate__fields\", dataset: { off: String(!draft.followGate.enabled) } },\n field(\"Follow profile URL\", followProfileUrl),\n field(\"Follow button label\", followButtonLabel),\n field(\"Confirm button label\", followConfirmLabel),\n field(\"Message after they follow\", followUpMessage)\n )\n\n const gateSwitch = switchToggle({\n checked: draft.followGate.enabled,\n onChange: (checked) => {\n gateFields.dataset.off = String(!checked)\n },\n })\n\n const gate = el(\n \"div\",\n { class: \"flxig-gate\" },\n el(\n \"div\",\n { class: \"flxig-gate__top\" },\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-label\", text: \"Follow gate\" }),\n el(\"div\", {\n class: \"flxig-hint\",\n text: \"Require users to follow before they get the link.\",\n })\n ),\n gateSwitch.element\n ),\n gateFields\n )\n\n const fields: HTMLElement[] = [\n field(\n type === \"COMMENT\" ? \"Trigger keywords (in comments)\" : \"Trigger keywords (in DMs)\",\n keywords.element,\n \"Press Enter or comma to add. The automation fires on these words.\"\n ),\n ]\n if (type === \"COMMENT\") {\n fields.push(field(\"Public comment reply\", commentReply, \"Posted under the comment.\"))\n }\n fields.push(\n field(\"DM message\", deliveryMessage, \"The direct message delivered to the user.\"),\n field(\n \"Link buttons\",\n links.element,\n `Where they enter the link(s). Up to ${MAX_LINK_BUTTONS} — each has a label and a URL.`\n ),\n field(\"Opt-in button label\", entryButtonLabel, \"Button users tap in the first DM.\"),\n gate\n )\n\n body.replaceChildren(...fields)\n\n readForm = () => ({\n postId: opts.post.id,\n type,\n name: draft.name,\n keywords: keywords.getValues(),\n commentReply: type === \"COMMENT\" ? commentReply.value.trim() || null : null,\n entryButtonLabel: entryButtonLabel.value.trim(),\n deliveryMessage: deliveryMessage.value.trim(),\n linkButtons: links.getValues(),\n followGate: {\n enabled: gateSwitch.input.checked,\n followProfileUrl: followProfileUrl.value.trim(),\n followButtonLabel: followButtonLabel.value.trim(),\n followConfirmButtonLabel: followConfirmLabel.value.trim(),\n followUpMessage: followUpMessage.value.trim(),\n },\n })\n\n body.prepend(\n el(\"div\", { class: \"flxig-field\" }, el(\"span\", { class: \"flxig-label\", text: \"Automation type\" }), picker)\n )\n }\n\n // --- footer actions ---\n const saveBtn = button({\n label: \"Create automation\",\n variant: \"primary\",\n icon: icons.bolt(),\n onClick: async () => {\n if (submitting) return\n const data = readForm()\n if (!data.keywords.length) {\n opts.onToast(\"Add at least one keyword\")\n return\n }\n if (!data.deliveryMessage) {\n opts.onToast(\"Add a DM message\")\n return\n }\n submitting = true\n saveBtn.disabled = true\n saveBtn.replaceChildren(fromMarkup(icons.spinner()), el(\"span\", { text: \"Creating…\" }))\n try {\n await opts.onSubmit(data)\n close()\n } catch (error) {\n opts.onToast(error instanceof Error ? error.message : \"Something went wrong\")\n submitting = false\n saveBtn.disabled = false\n saveBtn.replaceChildren(fromMarkup(icons.bolt()), el(\"span\", { text: \"Create automation\" }))\n }\n },\n })\n\n const dialog = el(\n \"div\",\n { class: \"flxig-dialog\", attrs: { role: \"dialog\", \"aria-modal\": \"true\" } },\n el(\n \"div\",\n { class: \"flxig-dialog__head\" },\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-h2\", text: \"Automate this post\" }),\n el(\"div\", {\n class: \"flxig-muted\",\n text: opts.post.caption?.trim()\n ? truncate(opts.post.caption.trim(), 70)\n : \"Set up comment & DM replies\",\n })\n ),\n el(\"button\", {\n class: \"flxig-iconbtn\",\n attrs: { type: \"button\", \"aria-label\": \"Close\" },\n html: icons.close(),\n on: { click: () => !submitting && close() },\n })\n ),\n body,\n el(\n \"div\",\n { class: \"flxig-dialog__foot\" },\n button({ label: \"Cancel\", variant: \"ghost\", onClick: () => !submitting && close() }),\n saveBtn\n )\n )\n\n renderPicker()\n renderForm()\n append(overlay, [dialog])\n opts.mount.appendChild(overlay)\n\n return { close }\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? `${value.slice(0, max - 1)}…` : value\n}\n","import type { ThemeConfig, ThemeTokens } from \"./types\"\n\n/** Flonix default font stack. Overridable via `theme.fontFamily`. */\nexport const DEFAULT_FONT_FAMILY =\n '\"Inter\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n\nexport const DEFAULT_RADIUS = \"12px\"\n\n/** Flonix brand defaults for both color schemes. Hosts override any subset. */\nexport const DEFAULT_TOKENS: { light: ThemeTokens; dark: ThemeTokens } = {\n light: {\n background: \"#ffffff\",\n foreground: \"#0a0a0b\",\n card: \"#ffffff\",\n cardForeground: \"#0a0a0b\",\n popover: \"#ffffff\",\n popoverForeground: \"#0a0a0b\",\n primary: \"#2563eb\",\n primaryForeground: \"#ffffff\",\n secondary: \"#f4f4f5\",\n secondaryForeground: \"#18181b\",\n muted: \"#f4f4f5\",\n mutedForeground: \"#71717a\",\n accent: \"#eef2ff\",\n accentForeground: \"#1e3a8a\",\n destructive: \"#ef4444\",\n destructiveForeground: \"#ffffff\",\n border: \"#e4e4e7\",\n input: \"#e4e4e7\",\n ring: \"#2563eb\",\n },\n dark: {\n background: \"#0a0a0b\",\n foreground: \"#fafafa\",\n card: \"#131316\",\n cardForeground: \"#fafafa\",\n popover: \"#131316\",\n popoverForeground: \"#fafafa\",\n primary: \"#3b82f6\",\n primaryForeground: \"#ffffff\",\n secondary: \"#27272a\",\n secondaryForeground: \"#fafafa\",\n muted: \"#1b1b1f\",\n mutedForeground: \"#a1a1aa\",\n accent: \"#1e293b\",\n accentForeground: \"#bfdbfe\",\n destructive: \"#f87171\",\n destructiveForeground: \"#0a0a0b\",\n border: \"#27272a\",\n input: \"#2a2a2e\",\n ring: \"#3b82f6\",\n },\n}\n\nexport interface ResolvedTheme {\n mode: \"light\" | \"dark\" | \"auto\"\n fontFamily: string\n radius: string\n light: ThemeTokens\n dark: ThemeTokens\n}\n\nexport function resolveTheme(config: ThemeConfig = {}): ResolvedTheme {\n return {\n mode: config.mode ?? \"auto\",\n fontFamily: config.fontFamily ?? DEFAULT_FONT_FAMILY,\n radius: config.radius ?? DEFAULT_RADIUS,\n light: { ...DEFAULT_TOKENS.light, ...(config.tokens?.light ?? {}) },\n dark: { ...DEFAULT_TOKENS.dark, ...(config.tokens?.dark ?? {}) },\n }\n}\n\nconst camelToKebab = (key: string) =>\n key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)\n\nfunction tokensToVars(tokens: ThemeTokens): string {\n return (Object.keys(tokens) as (keyof ThemeTokens)[])\n .map((key) => ` --flxig-${camelToKebab(key)}: ${tokens[key]};`)\n .join(\"\\n\")\n}\n\n/**\n * Build the CSS custom-property blocks for the Shadow root.\n * Light tokens live on `:host`; dark tokens on `:host(.flxig-dark)`.\n * The widget toggles the `flxig-dark` class on its root based on `mode`\n * (and, for `auto`, the host's prefers-color-scheme).\n */\nexport function buildThemeVars(theme: ResolvedTheme): string {\n return `:host {\n${tokensToVars(theme.light)}\n --flxig-radius: ${theme.radius};\n --flxig-font: ${theme.fontFamily};\n}\n:host(.flxig-dark) {\n${tokensToVars(theme.dark)}\n}`\n}\n\n/** Resolve whether dark should be active right now, given the configured mode. */\nexport function isDarkActive(mode: ResolvedTheme[\"mode\"]): boolean {\n if (mode === \"dark\") return true\n if (mode === \"light\") return false\n return (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n )\n}\n","// The widget stylesheet. Lives inside the Shadow root, so selectors are\n// local and cannot leak into (or be clobbered by) the host page. Every\n// visual value resolves from a `--flxig-*` token defined in theme.ts.\n\nexport const STYLES = `\n*, *::before, *::after { box-sizing: border-box; }\n\n.flxig-root {\n font-family: var(--flxig-font);\n color: var(--flxig-foreground);\n background: var(--flxig-background);\n border: 1px solid var(--flxig-border);\n border-radius: var(--flxig-radius);\n padding: clamp(20px, 4vw, 36px);\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n container-type: inline-size;\n}\n\n/* ---- typography ---- */\n.flxig-h1 { font-size: 1.35rem; font-weight: 700; letter-spacing: -0.015em; margin: 0; }\n.flxig-h2 { font-size: 1.05rem; font-weight: 650; letter-spacing: -0.01em; margin: 0; }\n.flxig-muted { color: var(--flxig-muted-foreground); font-size: 0.9rem; margin: 0; }\n.flxig-label { display: block; font-size: 0.8rem; font-weight: 600; margin-bottom: 6px; }\n.flxig-hint { font-size: 0.75rem; color: var(--flxig-muted-foreground); margin-top: 4px; }\n\n/* ---- buttons ---- */\n.flxig-btn {\n appearance: none; border: 1px solid transparent; cursor: pointer;\n font-family: inherit; font-size: 0.9rem; font-weight: 600;\n border-radius: calc(var(--flxig-radius) - 4px);\n padding: 10px 16px; display: inline-flex; align-items: center; justify-content: center;\n gap: 8px; transition: filter .15s ease, background .15s ease, border-color .15s ease, opacity .15s ease;\n text-decoration: none; white-space: nowrap;\n}\n.flxig-btn:disabled { opacity: .55; cursor: not-allowed; }\n.flxig-btn--primary { background: var(--flxig-primary); color: var(--flxig-primary-foreground); }\n.flxig-btn--primary:hover:not(:disabled) { filter: brightness(1.07); }\n.flxig-btn--secondary { background: var(--flxig-secondary); color: var(--flxig-secondary-foreground); border-color: var(--flxig-border); }\n.flxig-btn--secondary:hover:not(:disabled) { background: var(--flxig-muted); }\n.flxig-btn--ghost { background: transparent; color: var(--flxig-foreground); }\n.flxig-btn--ghost:hover:not(:disabled) { background: var(--flxig-muted); }\n.flxig-btn--block { width: 100%; }\n.flxig-btn--lg { padding: 13px 20px; font-size: 0.98rem; }\n\n/* ---- brand logo: delta chip (light) / bare delta (dark) + wordmark ---- */\n.flxig-brand { display: inline-flex; align-items: center; gap: 7px; color: var(--flxig-foreground); }\n.flxig-brand__chip { display: inline-flex; align-items: center; justify-content: center; background: var(--flxig-primary); border-radius: 6px; padding: 3px; }\n.flxig-brand__img { display: block; width: var(--flxig-logo-size, 18px); height: var(--flxig-logo-size, 18px); object-fit: contain; }\n.flxig-brand__wordmark { display: block; height: var(--flxig-logo-size, 18px); width: auto; }\n:host(.flxig-dark) .flxig-brand__chip { background: transparent; padding: 0; }\n\n/* ---- co-brand lockup: \"<partner logo> × flonix\" ---- */\n.flxig-cobrand { display: inline-flex; align-items: center; gap: 9px; font-size: 0.9rem; }\n.flxig-cobrand__x { color: var(--flxig-muted-foreground); font-weight: 400; }\n.flxig-partner { display: inline-flex; align-items: center; }\n.flxig-partner__img { display: block; height: 18px; width: auto; max-width: 120px; object-fit: contain; }\n.flxig-partner[data-has-dark=\"true\"] .flxig-partner__img--dark { display: none; }\n:host(.flxig-dark) .flxig-partner[data-has-dark=\"true\"] .flxig-partner__img--light { display: none; }\n:host(.flxig-dark) .flxig-partner[data-has-dark=\"true\"] .flxig-partner__img--dark { display: block; }\n\n/* ---- connect screen ---- */\n.flxig-connect { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 18px; padding: clamp(20px, 6cqw, 52px) 8px; }\n.flxig-connect__copy { display: flex; flex-direction: column; gap: 8px; max-width: 420px; }\n.flxig-connect__cta { width: 100%; max-width: 340px; margin-top: 4px; }\n.flxig-connect__foot { margin-top: 6px; }\n\n/* ---- posts header ---- */\n.flxig-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; }\n.flxig-header__id { display: flex; align-items: center; gap: 10px; min-width: 0; }\n.flxig-avatar { width: 38px; height: 38px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; background: var(--flxig-accent); color: var(--flxig-accent-foreground); flex: none; }\n.flxig-badge { display: inline-flex; align-items: center; gap: 5px; font-size: 0.72rem; font-weight: 600; padding: 3px 9px; border-radius: 999px; background: var(--flxig-accent); color: var(--flxig-accent-foreground); }\n\n/* ---- posts grid ---- */\n.flxig-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }\n@container (min-width: 520px) { .flxig-grid { grid-template-columns: repeat(3, 1fr); } }\n@container (min-width: 760px) { .flxig-grid { grid-template-columns: repeat(4, 1fr); } }\n\n.flxig-tile { border: 1px solid var(--flxig-border); border-radius: var(--flxig-radius); overflow: hidden; background: var(--flxig-card); display: flex; flex-direction: column; }\n.flxig-tile__media { position: relative; aspect-ratio: 1 / 1; background: var(--flxig-muted); overflow: hidden; }\n.flxig-tile__media img { width: 100%; height: 100%; object-fit: cover; display: block; }\n.flxig-tile__ph { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; color: var(--flxig-muted-foreground); }\n.flxig-tile__type { position: absolute; top: 8px; right: 8px; display: inline-flex; align-items: center; gap: 4px; font-size: 0.68rem; font-weight: 600; padding: 3px 7px; border-radius: 999px; background: color-mix(in srgb, #000 55%, transparent); color: #fff; backdrop-filter: blur(4px); }\n.flxig-tile__body { padding: 10px; display: flex; flex-direction: column; gap: 8px; flex: 1; }\n.flxig-tile__cap { font-size: 0.78rem; color: var(--flxig-muted-foreground); margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-height: 2.1em; }\n\n.flxig-sentinel { height: 1px; }\n.flxig-loadmore { display: flex; justify-content: center; padding: 18px 0 2px; color: var(--flxig-muted-foreground); }\n\n/* ---- empty / error / loading ---- */\n.flxig-state { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; text-align: center; padding: 48px 16px; color: var(--flxig-muted-foreground); }\n\n/* ---- dialog ---- */\n.flxig-overlay { position: fixed; inset: 0; background: color-mix(in srgb, #000 55%, transparent); display: flex; align-items: center; justify-content: center; padding: 16px; z-index: 2147483000; animation: flxig-fade .15s ease; }\n.flxig-dialog { background: var(--flxig-popover); color: var(--flxig-popover-foreground); border: 1px solid var(--flxig-border); border-radius: var(--flxig-radius); width: min(560px, 100%); max-height: min(88vh, 760px); display: flex; flex-direction: column; overflow: hidden; box-shadow: 0 24px 60px -20px rgba(0,0,0,.5); animation: flxig-pop .18s cubic-bezier(.2,.8,.2,1); }\n.flxig-dialog__head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 18px 20px; border-bottom: 1px solid var(--flxig-border); }\n.flxig-dialog__body { padding: 18px 20px; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; }\n.flxig-dialog__foot { padding: 14px 20px; border-top: 1px solid var(--flxig-border); display: flex; gap: 10px; justify-content: flex-end; }\n.flxig-iconbtn { appearance: none; background: transparent; border: none; color: var(--flxig-muted-foreground); cursor: pointer; padding: 4px; border-radius: 8px; display: inline-flex; }\n.flxig-iconbtn:hover { background: var(--flxig-muted); color: var(--flxig-foreground); }\n\n/* ---- type picker (segmented) ---- */\n.flxig-seg { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n.flxig-seg__opt { border: 1px solid var(--flxig-border); border-radius: calc(var(--flxig-radius) - 2px); padding: 12px; cursor: pointer; display: flex; gap: 10px; align-items: flex-start; background: var(--flxig-card); transition: border-color .15s, background .15s; }\n.flxig-seg__opt:hover { border-color: var(--flxig-ring); }\n.flxig-seg__opt[data-active=\"true\"] { border-color: var(--flxig-primary); background: var(--flxig-accent); }\n.flxig-seg__ic { color: var(--flxig-primary); margin-top: 2px; }\n.flxig-seg__t { font-weight: 650; font-size: 0.88rem; }\n.flxig-seg__d { font-size: 0.74rem; color: var(--flxig-muted-foreground); margin-top: 2px; }\n\n/* ---- form fields ---- */\n.flxig-field { display: block; }\n.flxig-input, .flxig-textarea {\n width: 100%; font-family: inherit; font-size: 0.88rem; color: var(--flxig-foreground);\n background: var(--flxig-background); border: 1px solid var(--flxig-input);\n border-radius: calc(var(--flxig-radius) - 4px); padding: 9px 11px; transition: border-color .15s, box-shadow .15s;\n}\n.flxig-input:focus, .flxig-textarea:focus { outline: none; border-color: var(--flxig-ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--flxig-ring) 25%, transparent); }\n.flxig-textarea { resize: vertical; min-height: 72px; }\n\n/* ---- follow-gate card + switch ---- */\n.flxig-gate { border: 1px solid var(--flxig-border); border-radius: calc(var(--flxig-radius) - 2px); padding: 14px; display: flex; flex-direction: column; gap: 12px; background: var(--flxig-card); }\n.flxig-gate__top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.flxig-gate__fields { display: flex; flex-direction: column; gap: 12px; }\n.flxig-gate__fields[data-off=\"true\"] { opacity: .5; pointer-events: none; }\n\n.flxig-switch { position: relative; width: 40px; height: 23px; flex: none; }\n.flxig-switch input { position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; }\n.flxig-switch__track { position: absolute; inset: 0; background: var(--flxig-input); border-radius: 999px; transition: background .15s; }\n.flxig-switch__thumb { position: absolute; top: 2px; left: 2px; width: 19px; height: 19px; border-radius: 999px; background: #fff; transition: transform .15s; box-shadow: 0 1px 3px rgba(0,0,0,.3); }\n.flxig-switch input:checked ~ .flxig-switch__track { background: var(--flxig-primary); }\n.flxig-switch input:checked ~ .flxig-switch__thumb { transform: translateX(17px); }\n\n/* ---- chips (keywords) ---- */\n.flxig-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px; border: 1px solid var(--flxig-input); border-radius: calc(var(--flxig-radius) - 4px); background: var(--flxig-background); }\n.flxig-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--flxig-secondary); color: var(--flxig-secondary-foreground); font-size: 0.78rem; font-weight: 600; padding: 4px 8px; border-radius: 999px; }\n.flxig-chip button { appearance: none; border: none; background: transparent; color: inherit; cursor: pointer; opacity: .6; padding: 0; display: inline-flex; }\n.flxig-chip button:hover { opacity: 1; }\n.flxig-chips input { flex: 1; min-width: 80px; border: none; outline: none; background: transparent; color: var(--flxig-foreground); font-family: inherit; font-size: 0.82rem; padding: 4px; }\n\n/* ---- link buttons editor ---- */\n.flxig-links__wrap { display: flex; flex-direction: column; gap: 10px; }\n.flxig-links { display: flex; flex-direction: column; gap: 10px; }\n.flxig-link { display: flex; align-items: center; gap: 8px; }\n.flxig-link__ic { color: var(--flxig-muted-foreground); flex: none; display: inline-flex; }\n.flxig-link__inputs { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr); gap: 8px; flex: 1; min-width: 0; }\n.flxig-links__add { align-self: flex-start; padding-left: 8px; padding-right: 12px; }\n@container (max-width: 440px) { .flxig-link__inputs { grid-template-columns: 1fr; } }\n\n/* ---- toast ---- */\n.flxig-toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background: var(--flxig-foreground); color: var(--flxig-background); font-size: 0.85rem; font-weight: 600; padding: 10px 16px; border-radius: 999px; display: inline-flex; align-items: center; gap: 8px; z-index: 2147483001; box-shadow: 0 10px 30px -10px rgba(0,0,0,.5); animation: flxig-pop .2s ease; }\n\n/* ---- footer attribution ---- */\n.flxig-attrib { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--flxig-border); display: flex; align-items: center; justify-content: center; gap: 6px; font-size: 0.72rem; color: var(--flxig-muted-foreground); }\n\n/* ---- animations ---- */\n.flxig-spin { animation: flxig-rotate .8s linear infinite; }\n@keyframes flxig-rotate { to { transform: rotate(360deg); } }\n@keyframes flxig-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes flxig-pop { from { opacity: 0; transform: scale(.97); } to { opacity: 1; transform: scale(1); } }\n@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; } }\n`\n","// The orchestrator. Owns the Shadow root, theme application, the session/\n// posts state machine, and wiring between the transport and the screens.\n// Screens stay pure; all side effects and flow control live here.\n\nimport { icons } from \"./branding\"\nimport { createHttpTransport } from \"./client\"\nimport { clear, el, fromMarkup } from \"./dom\"\nimport { stateBlock } from \"./components\"\nimport { renderConnect } from \"./screens/connect\"\nimport { renderPosts, type PostsView } from \"./screens/posts\"\nimport { openAutomateDialog } from \"./screens/automate-dialog\"\nimport { buildThemeVars, isDarkActive, resolveTheme } from \"./theme\"\nimport { STYLES } from \"./styles\"\nimport type {\n CreateAutomationInput,\n FlonixIGConfig,\n FlonixIGInstance,\n InstagramAccount,\n InstagramPost,\n Transport,\n} from \"./types\"\n\nconst RETURN_FLAG = \"flxig_connected\"\nconst DEFAULT_BASE_URL = \"https://flonix.pro\"\n\nexport class Widget implements FlonixIGInstance {\n private readonly config: FlonixIGConfig\n private readonly transport: Transport\n private readonly host: HTMLElement\n private readonly shadow: ShadowRoot\n private readonly root: HTMLElement\n private readonly content: HTMLElement\n private readonly mediaQuery: MediaQueryList | null = null\n\n private token: string | null = null\n private account: InstagramAccount | null = null\n private postsView: PostsView | null = null\n private cursor: string | null = null\n private connecting = false\n private destroyed = false\n\n constructor(target: HTMLElement, config: FlonixIGConfig) {\n this.config = config\n this.transport =\n config.transport ?? createHttpTransport(config.baseUrl ?? DEFAULT_BASE_URL)\n\n // Own host element inside the target so teardown is clean and we never\n // clobber a shadow root the host may already have.\n this.host = document.createElement(\"div\")\n this.host.setAttribute(\"data-flonix-ig\", \"\")\n target.appendChild(this.host)\n this.shadow = this.host.attachShadow({ mode: \"open\" })\n\n const theme = resolveTheme(config.theme)\n this.shadow.appendChild(\n el(\"style\", { text: `${buildThemeVars(theme)}\\n${STYLES}` })\n )\n\n this.root = el(\"div\", { class: \"flxig-root\" })\n this.content = el(\"div\", { class: \"flxig-content\" })\n this.root.appendChild(this.content)\n this.shadow.appendChild(this.root)\n\n this.applyMode(isDarkActive(theme.mode))\n if (theme.mode === \"auto\" && typeof window.matchMedia === \"function\") {\n this.mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\")\n this.mediaQuery.addEventListener(\"change\", this.onSchemeChange)\n }\n\n void this.init()\n }\n\n // ---- lifecycle ----\n\n private onSchemeChange = (ev: MediaQueryListEvent) => this.applyMode(ev.matches)\n\n private applyMode(dark: boolean) {\n // The dark token block is `:host(.flxig-dark)`, so the class must live on\n // the shadow host element — not on an element inside the shadow tree.\n this.host.classList.toggle(\"flxig-dark\", dark)\n }\n\n refresh(): void {\n this.cursor = null\n void this.init()\n }\n\n unmount(): void {\n this.destroyed = true\n this.postsView?.destroy()\n this.mediaQuery?.removeEventListener(\"change\", this.onSchemeChange)\n this.host.remove()\n }\n\n private fail(error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.config.onError?.(err)\n return err\n }\n\n // ---- flow ----\n\n private async init() {\n this.renderLoading()\n try {\n const session = await this.transport.session({\n apiKey: this.config.apiKey,\n user: this.config.user,\n })\n if (this.destroyed) return\n this.token = session.token\n this.account = session.account\n\n if (session.connected) {\n this.clearReturnFlag()\n this.config.onConnected?.(session.account ?? { instagramId: null, username: null })\n await this.renderPosts()\n } else {\n this.renderConnect()\n }\n } catch (error) {\n this.renderError(this.fail(error).message)\n }\n }\n\n private async startConnect() {\n if (!this.token || this.connecting) return\n this.connecting = true\n this.renderConnect()\n try {\n const { authorizeUrl } = await this.transport.connectStart({\n token: this.token,\n returnUrl: this.resolveReturnUrl(),\n })\n // Hand off to Flonix auth → Instagram OAuth → back to returnUrl.\n window.location.href = authorizeUrl\n } catch (error) {\n this.connecting = false\n this.renderConnect()\n this.toast(this.fail(error).message)\n }\n }\n\n private async renderPosts() {\n const view = renderPosts({\n account: this.account,\n onAutomate: (post) => this.openDialog(post),\n onLoadMore: () => void this.loadMore(),\n })\n this.postsView = view\n this.swap(view.element)\n await this.loadMore(true)\n }\n\n private async loadMore(initial = false) {\n const view = this.postsView\n if (!view || !this.token) return\n view.setLoadingMore(true)\n try {\n const { posts, nextCursor } = await this.transport.posts({\n token: this.token,\n cursor: this.cursor,\n })\n if (this.destroyed) return\n if (initial && posts.length === 0) {\n view.showEmpty()\n return\n }\n view.appendPosts(posts)\n this.cursor = nextCursor\n view.setHasMore(Boolean(nextCursor))\n } catch (error) {\n this.toast(this.fail(error).message)\n } finally {\n view.setLoadingMore(false)\n }\n }\n\n private openDialog(post: InstagramPost) {\n if (!this.token) return\n openAutomateDialog({\n mount: this.shadow,\n post,\n account: this.account,\n onToast: (message) => this.toast(message),\n onSubmit: (data) => this.createAutomation(data),\n })\n }\n\n private async createAutomation(data: CreateAutomationInput) {\n if (!this.token) throw new Error(\"Not connected\")\n const result = await this.transport.createAutomation({ token: this.token, data })\n this.config.onAutomationCreated?.(result)\n this.toast(\"Automation created ✓\")\n }\n\n // ---- rendering helpers ----\n\n private swap(node: HTMLElement) {\n clear(this.content)\n this.content.appendChild(node)\n }\n\n private renderConnect() {\n this.swap(\n renderConnect({\n connecting: this.connecting,\n partner: this.config.partner,\n onConnect: () => void this.startConnect(),\n })\n )\n }\n\n private renderLoading() {\n this.swap(stateBlock({ icon: icons.spinner(26), title: \"Loading…\" }))\n }\n\n private renderError(message: string) {\n this.swap(\n stateBlock({\n icon: icons.close(26),\n title: \"Couldn't load\",\n detail: message,\n })\n )\n }\n\n private toast(message: string) {\n const toast = fromMarkup(\n `<div class=\"flxig-toast\">${icons.bolt(14)}<span></span></div>`\n )\n toast.querySelector(\"span\")!.textContent = message\n this.shadow.appendChild(toast)\n setTimeout(() => toast.remove(), 2600)\n }\n\n // ---- return-from-OAuth handling ----\n\n private resolveReturnUrl(): string {\n if (this.config.returnUrl) return this.config.returnUrl\n if (typeof window === \"undefined\") return \"\"\n return window.location.href\n }\n\n private clearReturnFlag() {\n if (typeof window === \"undefined\" || !window.history?.replaceState) return\n const url = new URL(window.location.href)\n if (url.searchParams.has(RETURN_FLAG)) {\n url.searchParams.delete(RETURN_FLAG)\n window.history.replaceState({}, \"\", url.toString())\n }\n }\n}\n","// An in-memory mock transport for local development and the demo harness.\n// It faithfully simulates the redirect-and-return connect flow by persisting\n// the \"connected\" state to localStorage and bouncing through the return URL.\n\nimport type {\n InstagramPost,\n MediaType,\n Transport,\n} from \"./types\"\n\nconst delay = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\nconst TYPES: MediaType[] = [\"IMAGE\", \"CAROUSEL\", \"REELS\", \"VIDEO\", \"IMAGE\"]\nconst CAPTIONS = [\n \"New drop is live 🔥 comment LINK for the shop\",\n \"Behind the scenes of today's shoot\",\n \"Our bestseller is back in stock ✨\",\n \"How to style this 3 ways 👇\",\n \"Limited edition — only 50 made\",\n \"Weekend sale starts now 🛍️\",\n null,\n \"Tag a friend who needs this 💙\",\n]\n\nfunction makePage(page: number, perPage: number): InstagramPost[] {\n return Array.from({ length: perPage }, (_, i) => {\n const n = page * perPage + i\n return {\n id: `mock_${n}`,\n caption: CAPTIONS[n % CAPTIONS.length] ?? null,\n media: `https://picsum.photos/seed/flonix${n}/600/600`,\n mediaType: TYPES[n % TYPES.length] ?? \"IMAGE\",\n permalink: null,\n timestamp: new Date(Date.now() - n * 86400000).toISOString(),\n }\n })\n}\n\nexport interface MockOptions {\n /** Pages of posts to serve before stopping. Default 3. */\n totalPages?: number\n /** Posts per page. Default 8. */\n perPage?: number\n /** localStorage key suffix so multiple demos don't collide. */\n namespace?: string\n}\n\nexport function createMockTransport(options: MockOptions = {}): Transport {\n const totalPages = options.totalPages ?? 3\n const perPage = options.perPage ?? 8\n const storageKey = `flxig.mock.connected.${options.namespace ?? \"default\"}`\n\n const isConnected = () => {\n try {\n return localStorage.getItem(storageKey) === \"1\"\n } catch {\n return false\n }\n }\n\n return {\n async session() {\n await delay(400)\n const connected = isConnected()\n return {\n connected,\n token: \"mock-session-token\",\n account: connected ? { instagramId: \"17890000000\", username: \"your_brand\" } : null,\n }\n },\n\n async connectStart({ returnUrl }) {\n await delay(500)\n // Simulate a successful OAuth round-trip: mark connected, then send the\n // widget back to the return URL with the standard return flag.\n try {\n localStorage.setItem(storageKey, \"1\")\n } catch {\n /* ignore */\n }\n const url = new URL(returnUrl, window.location.href)\n url.searchParams.set(\"flxig_connected\", \"1\")\n return { authorizeUrl: url.toString() }\n },\n\n async posts({ cursor }) {\n await delay(500)\n const page = cursor ? Number(cursor) : 0\n const posts = makePage(page, perPage)\n const next = page + 1\n return { posts, nextCursor: next < totalPages ? String(next) : null }\n },\n\n async createAutomation() {\n await delay(700)\n return { id: `mock_automation_${Date.now()}` }\n },\n }\n}\n","// Public entry point. Framework-agnostic: works via `import` in any bundler\n// or via the IIFE global build (`window.FlonixIG`).\n\nimport { Widget } from \"./widget\"\nimport type { FlonixIGConfig, FlonixIGInstance } from \"./types\"\n\nexport const version = \"0.1.0\"\n\n/**\n * Mount the Flonix Instagram automation widget into a container.\n *\n * @example\n * FlonixIG.mount(\"#flonix\", {\n * apiKey: \"flxig.…\",\n * user: { id: \"merchant_42\", email: \"me@shop.com\" },\n * })\n */\nexport function mount(\n target: string | HTMLElement,\n config: FlonixIGConfig\n): FlonixIGInstance {\n const element =\n typeof target === \"string\" ? document.querySelector(target) : target\n if (!element) {\n throw new Error(`FlonixIG.mount: target not found: ${String(target)}`)\n }\n if (!config?.apiKey) {\n throw new Error(\"FlonixIG.mount: config.apiKey is required\")\n }\n if (!config?.user?.id) {\n throw new Error(\"FlonixIG.mount: config.user.id is required\")\n }\n if (!config?.partner?.logo || !config?.partner?.name) {\n throw new Error(\n \"FlonixIG.mount: config.partner.name and config.partner.logo are required\"\n )\n }\n return new Widget(element as HTMLElement, config)\n}\n\nexport const FlonixIG = { mount, version }\n\nexport { createMockTransport } from \"./mock\"\nexport { createHttpTransport } from \"./client\"\nexport { DEFAULT_TOKENS } from \"./theme\"\nexport type * from \"./types\"\n"],"mappings":"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","names":["global_exports","__export","DEFAULT_TOKENS","FlonixIG","createHttpTransport","createMockTransport","mount","version","FLONIX_LOGO_PNG","escapeHtml","value","c","WORDMARK_FONT","flonixLogo","size","FLONIX_LOGO_PNG","cobrandLockup","partner","name","light","dark","partnerImgs","icons","authHeaders","token","createHttpTransport","baseUrl","base","call","path","init","res","json","apiKey","user","returnUrl","cursor","data","el","tag","attrs","children","node","key","value","event","handler","append","parent","child","clear","fromMarkup","markup","_a","wrapper","button","opts","_a","classes","btn","el","fromMarkup","append","field","label","control","hint","textInput","_b","textArea","_c","ta","switchToggle","input","chipsInput","values","list","render","chips","value","index","icons","commit","raw","ev","linkButtonsEditor","rows","addBtn","addRow","syncAdd","url","row","b","stateBlock","renderConnect","opts","cta","button","icons","el","fromMarkup","cobrandLockup","TYPE_META","icons","postTile","post","onAutomate","_a","_b","_c","meta","media","el","append","fromMarkup","button","renderPosts","opts","username","grid","sentinel","loadMore","header","attribution","flonixLogo","root","hasMore","loading","empty","observer","entries","e","renderLoadMore","clear","posts","value","stateBlock","profileUrl","account","buildPrefill","post","type","handle","common","TYPE_OPTIONS","icons","openAutomateDialog","opts","_a","type","draft","buildPrefill","submitting","body","el","overlay","close","onKey","ev","picker","renderPicker","opt","renderForm","fromMarkup","readForm","keywords","chipsInput","commentReply","textInput","deliveryMessage","textArea","entryButtonLabel","links","linkButtonsEditor","followUpMessage","followButtonLabel","followProfileUrl","followConfirmLabel","gateFields","field","gateSwitch","switchToggle","checked","gate","fields","saveBtn","button","data","error","dialog","truncate","append","value","max","DEFAULT_FONT_FAMILY","DEFAULT_RADIUS","DEFAULT_TOKENS","resolveTheme","config","_a","_b","_c","_d","_e","_f","_g","camelToKebab","key","m","tokensToVars","tokens","buildThemeVars","theme","isDarkActive","mode","STYLES","RETURN_FLAG","DEFAULT_BASE_URL","Widget","target","config","ev","_a","_b","createHttpTransport","theme","resolveTheme","el","buildThemeVars","STYLES","isDarkActive","dark","error","err","_c","session","authorizeUrl","view","renderPosts","post","initial","posts","nextCursor","openAutomateDialog","message","data","result","node","clear","renderConnect","stateBlock","icons","toast","fromMarkup","url","delay","ms","r","TYPES","CAPTIONS","makePage","page","perPage","_","_a","_b","n","createMockTransport","options","_c","totalPages","storageKey","isConnected","connected","returnUrl","url","cursor","posts","next","version","mount","target","config","_a","_b","_c","element","Widget","FlonixIG"]}
1
+ {"version":3,"sources":["../src/global.ts","../src/logo-data.ts","../src/branding.ts","../src/client.ts","../src/dom.ts","../src/components.ts","../src/screens/connect.ts","../src/screens/posts.ts","../src/prefill.ts","../src/screens/automate-dialog.ts","../src/theme.ts","../src/styles.ts","../src/widget.ts","../src/mock.ts","../src/index.ts"],"sourcesContent":["// IIFE entry. tsup wraps these exports as `window.FlonixIG`, so script-tag\n// consumers get `FlonixIG.mount(...)`, `FlonixIG.createMockTransport(...)`, etc.\n\nexport { mount, version, FlonixIG, createMockTransport, createHttpTransport, DEFAULT_TOKENS } from \"./index\"\n","// Flonix delta logo (white mark) embedded as a data URI so the widget is fully\n// self-contained (no network/CORS dependency). Source: apps/main/public/wacrm-logo.png\nexport const FLONIX_LOGO_PNG =\n \"data:image/png;base64,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\"\n","// Flonix branding + inline icons. The logo is the real Flonix delta mark\n// (a white glyph) embedded as a data URI. Following the app's own treatment,\n// it sits inside a primary-colored chip in light mode and shows directly in\n// dark mode (handled in styles.ts via `:host(.flxig-dark)`).\n\nimport { FLONIX_LOGO_PNG } from \"./logo-data\"\nimport type { PartnerBranding } from \"./types\"\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (c) =>\n c === \"&\" ? \"&amp;\" : c === \"<\" ? \"&lt;\" : c === \">\" ? \"&gt;\" : c === '\"' ? \"&quot;\" : \"&#39;\"\n )\n}\n\n// Pinned brand font for the wordmark. Deliberately NOT `var(--flxig-font)` —\n// the logo text must stay in the Flonix brand face even when a host overrides\n// the widget's font. `textLength` locks the visual width so the mark renders\n// identically regardless of which fallback font is available.\nconst WORDMARK_FONT =\n \"Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\"\n\n/** Flonix logo: delta mark (chip in light / bare in dark) + SVG \"flonix\" wordmark. */\nexport function flonixLogo(size = 20): string {\n return `<span class=\"flxig-brand\" style=\"--flxig-logo-size:${size}px\" role=\"img\" aria-label=\"Flonix\">\n <span class=\"flxig-brand__chip\">\n <img class=\"flxig-brand__img\" src=\"${FLONIX_LOGO_PNG}\" alt=\"\" draggable=\"false\" />\n </span>\n <svg class=\"flxig-brand__wordmark\" viewBox=\"0 0 55 22\" fill=\"currentColor\" aria-hidden=\"true\">\n <text x=\"0\" y=\"19\" font-size=\"22\" font-weight=\"700\" letter-spacing=\"-0.4\" font-family=\"${WORDMARK_FONT}\" textLength=\"55\" lengthAdjust=\"spacingAndGlyphs\">flonix</text>\n </svg>\n </span>`\n}\n\n/** \"<partner logo> × flonix\" co-brand lockup. */\nexport function cobrandLockup(partner: PartnerBranding): string {\n const name = escapeHtml(partner.name)\n const light = escapeHtml(partner.logo)\n const dark = partner.logoDark ? escapeHtml(partner.logoDark) : \"\"\n\n const partnerImgs = dark\n ? `<img class=\"flxig-partner__img flxig-partner__img--light\" src=\"${light}\" alt=\"${name}\" draggable=\"false\" />\n <img class=\"flxig-partner__img flxig-partner__img--dark\" src=\"${dark}\" alt=\"${name}\" draggable=\"false\" />`\n : `<img class=\"flxig-partner__img\" src=\"${light}\" alt=\"${name}\" draggable=\"false\" />`\n\n return `<span class=\"flxig-cobrand\">\n <span class=\"flxig-partner\" data-has-dark=\"${dark ? \"true\" : \"false\"}\">${partnerImgs}</span>\n <span class=\"flxig-cobrand__x\">×</span>\n ${flonixLogo(18)}\n </span>`\n}\n\nexport const icons = {\n instagram: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" ry=\"5\"/>\n <path d=\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\"/>\n <line x1=\"17.5\" y1=\"6.5\" x2=\"17.51\" y2=\"6.5\"/>\n </svg>`,\n comment: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"/>\n </svg>`,\n dm: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n </svg>`,\n check: (size = 16) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>`,\n close: (size = 18) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>`,\n plus: (size = 16) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>`,\n link: (size = 15) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\n </svg>`,\n bolt: (size = 16) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M13 2 4.5 13.5H11L10 22l8.5-11.5H12L13 2Z\"/>\n </svg>`,\n spinner: (size = 18) =>\n `<svg class=\"flxig-spin\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>\n </svg>`,\n video: (size = 14) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 5v14l11-7L8 5Z\"/>\n </svg>`,\n layers: (size = 14) =>\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\"/>\n <polyline points=\"2 17 12 22 22 17\"/>\n <polyline points=\"2 12 12 17 22 12\"/>\n </svg>`,\n}\n","// The real transport — talks to the Flonix `/api/embed/*` endpoints.\n\nimport type { Transport } from \"./types\"\n\nfunction authHeaders(token: string): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n }\n}\n\nexport function createHttpTransport(baseUrl: string): Transport {\n const base = baseUrl.replace(/\\/+$/, \"\")\n\n async function call<T>(path: string, init: RequestInit): Promise<T> {\n let res: Response\n try {\n res = await fetch(`${base}${path}`, init)\n } catch {\n throw new Error(\"Network error — please try again.\")\n }\n const json = (await res.json().catch(() => null)) as\n | (T & { error?: string })\n | null\n if (!res.ok) {\n throw new Error(json?.error || `Request failed (${res.status})`)\n }\n return json as T\n }\n\n return {\n session: ({ apiKey, user }) =>\n call(\"/api/embed/session\", {\n method: \"POST\",\n headers: authHeaders(apiKey),\n body: JSON.stringify({ user }),\n }),\n\n connectStart: ({ token, returnUrl }) =>\n call(\"/api/embed/connect/start\", {\n method: \"POST\",\n headers: authHeaders(token),\n body: JSON.stringify({ returnUrl }),\n }),\n\n posts: ({ token, cursor }) =>\n call(\n `/api/embed/posts${cursor ? `?cursor=${encodeURIComponent(cursor)}` : \"\"}`,\n { method: \"GET\", headers: authHeaders(token) }\n ),\n\n createAutomation: ({ token, data }) =>\n call(\"/api/embed/automations\", {\n method: \"POST\",\n headers: authHeaders(token),\n body: JSON.stringify(data),\n }),\n }\n}\n","// Tiny, dependency-free hyperscript helpers. This is the ONLY place that\n// touches the raw DOM API so screens stay declarative and testable.\n\nexport type Child = Node | string | number | null | undefined | false\n\ntype EventMap = {\n [K in keyof HTMLElementEventMap]?: (ev: HTMLElementEventMap[K]) => void\n}\n\nexport interface ElAttrs {\n class?: string\n text?: string\n html?: string\n style?: string\n dataset?: Record<string, string>\n attrs?: Record<string, string | number | boolean | null | undefined>\n on?: EventMap\n}\n\n/** Create an element with attributes + children. */\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: ElAttrs = {},\n ...children: Child[]\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag)\n\n if (attrs.class) node.className = attrs.class\n if (attrs.text != null) node.textContent = attrs.text\n if (attrs.html != null) node.innerHTML = attrs.html\n if (attrs.style) node.setAttribute(\"style\", attrs.style)\n\n if (attrs.dataset) {\n for (const [key, value] of Object.entries(attrs.dataset)) {\n node.dataset[key] = value\n }\n }\n\n if (attrs.attrs) {\n for (const [key, value] of Object.entries(attrs.attrs)) {\n if (value == null || value === false) continue\n node.setAttribute(key, value === true ? \"\" : String(value))\n }\n }\n\n if (attrs.on) {\n for (const [event, handler] of Object.entries(attrs.on)) {\n node.addEventListener(event, handler as EventListener)\n }\n }\n\n append(node, children)\n return node\n}\n\n/** Append a flat/nested list of children, ignoring nullish/false values. */\nexport function append(parent: Node, children: Child[]): void {\n for (const child of children) {\n if (child == null || child === false) continue\n parent.appendChild(\n child instanceof Node ? child : document.createTextNode(String(child))\n )\n }\n}\n\n/** Remove all children from a node. */\nexport function clear(node: Node): void {\n while (node.firstChild) node.removeChild(node.firstChild)\n}\n\n/** Build an element from an SVG/HTML markup string (used for icons/logos). */\nexport function fromMarkup(markup: string): HTMLElement {\n const wrapper = document.createElement(\"div\")\n wrapper.innerHTML = markup.trim()\n return (wrapper.firstElementChild as HTMLElement) ?? wrapper\n}\n","// Small reusable UI controls built on the dom.ts primitives. Each returns a\n// plain element (and, where it owns state, a typed handle to read it back).\n\nimport { append, el, fromMarkup } from \"./dom\"\nimport { icons } from \"./branding\"\n\nexport function button(opts: {\n label: string\n variant?: \"primary\" | \"secondary\" | \"ghost\"\n block?: boolean\n large?: boolean\n icon?: string\n disabled?: boolean\n onClick?: () => void\n}): HTMLButtonElement {\n const classes = [\n \"flxig-btn\",\n `flxig-btn--${opts.variant ?? \"primary\"}`,\n opts.block ? \"flxig-btn--block\" : \"\",\n opts.large ? \"flxig-btn--lg\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")\n\n const btn = el(\"button\", {\n class: classes,\n attrs: { type: \"button\", disabled: opts.disabled },\n on: opts.onClick ? { click: opts.onClick } : undefined,\n })\n if (opts.icon) btn.appendChild(fromMarkup(opts.icon))\n append(btn, [el(\"span\", { text: opts.label })])\n return btn\n}\n\nexport function field(\n label: string,\n control: HTMLElement,\n hint?: string\n): HTMLElement {\n // Intentionally a <div>, not a <label>: composite controls (keyword chips,\n // link buttons) contain multiple labelable elements, and a wrapping <label>\n // would forward clicks to its first control — e.g. clicking one chip's\n // remove button would also trigger the first chip's, deleting two at once.\n return el(\n \"div\",\n { class: \"flxig-field\" },\n el(\"span\", { class: \"flxig-label\", text: label }),\n control,\n hint ? el(\"span\", { class: \"flxig-hint\", text: hint }) : null\n )\n}\n\nexport function textInput(opts: {\n value?: string\n placeholder?: string\n}): HTMLInputElement {\n return el(\"input\", {\n class: \"flxig-input\",\n attrs: { type: \"text\", value: opts.value ?? \"\", placeholder: opts.placeholder ?? \"\" },\n })\n}\n\nexport function textArea(opts: {\n value?: string\n placeholder?: string\n rows?: number\n}): HTMLTextAreaElement {\n const ta = el(\"textarea\", {\n class: \"flxig-textarea\",\n attrs: { placeholder: opts.placeholder ?? \"\", rows: opts.rows ?? 3 },\n })\n ta.value = opts.value ?? \"\"\n return ta\n}\n\n/** A toggle switch. Read state via the returned `input.checked`. */\nexport function switchToggle(opts: {\n checked: boolean\n onChange?: (checked: boolean) => void\n}): { element: HTMLElement; input: HTMLInputElement } {\n const input = el(\"input\", { attrs: { type: \"checkbox\" } })\n input.checked = opts.checked\n if (opts.onChange) {\n input.addEventListener(\"change\", () => opts.onChange!(input.checked))\n }\n const element = el(\n \"span\",\n { class: \"flxig-switch\" },\n input,\n el(\"span\", { class: \"flxig-switch__track\" }),\n el(\"span\", { class: \"flxig-switch__thumb\" })\n )\n return { element, input }\n}\n\n/** A keyword chips input. Returns a live getter for the current values. */\nexport function chipsInput(opts: {\n values: string[]\n placeholder?: string\n}): { element: HTMLElement; getValues: () => string[] } {\n let values = [...opts.values]\n const list = el(\"span\", { class: \"flxig-chips\" })\n const input = el(\"input\", {\n attrs: { type: \"text\", placeholder: opts.placeholder ?? \"Add keyword…\" },\n })\n\n const render = () => {\n while (list.firstChild && list.firstChild !== input) {\n list.removeChild(list.firstChild)\n }\n const chips = values.map((value, index) =>\n el(\n \"span\",\n { class: \"flxig-chip\" },\n el(\"span\", { text: value }),\n el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": `Remove ${value}` },\n html: icons.close(12),\n on: {\n click: () => {\n values.splice(index, 1)\n render()\n },\n },\n })\n )\n )\n list.prepend(...chips)\n }\n\n const commit = () => {\n const raw = input.value.trim().replace(/,$/, \"\").trim()\n if (raw && !values.includes(raw)) {\n values.push(raw)\n render()\n }\n input.value = \"\"\n }\n\n input.addEventListener(\"keydown\", (ev) => {\n if (ev.key === \"Enter\" || ev.key === \",\") {\n ev.preventDefault()\n commit()\n } else if (ev.key === \"Backspace\" && !input.value && values.length) {\n values.pop()\n render()\n }\n })\n input.addEventListener(\"blur\", commit)\n\n list.appendChild(input)\n render()\n\n return { element: list, getValues: () => [...values] }\n}\n\n/** Repeatable list of link buttons (label + URL), capped at `max`. */\nexport function linkButtonsEditor(opts: {\n values: { label: string; url: string }[]\n max: number\n}): { element: HTMLElement; getValues: () => { label: string; url: string }[] } {\n const rows = el(\"div\", { class: \"flxig-links\" })\n const addBtn = button({\n label: \"Add link\",\n variant: \"ghost\",\n icon: icons.plus(15),\n onClick: () => {\n if (rows.querySelectorAll(\".flxig-link\").length >= opts.max) return\n addRow({ label: \"\", url: \"\" })\n syncAdd()\n },\n })\n addBtn.classList.add(\"flxig-links__add\")\n\n function syncAdd() {\n addBtn.disabled = rows.querySelectorAll(\".flxig-link\").length >= opts.max\n }\n\n function addRow(value: { label: string; url: string }) {\n const label = textInput({ value: value.label, placeholder: \"Button label\" })\n label.classList.add(\"flxig-link__label\")\n const url = el(\"input\", {\n class: \"flxig-input flxig-link__url\",\n attrs: { type: \"url\", value: value.url, placeholder: \"https://…\", inputmode: \"url\" },\n })\n const row = el(\n \"div\",\n { class: \"flxig-link\" },\n fromMarkup(`<span class=\"flxig-link__ic\">${icons.link(15)}</span>`),\n el(\"div\", { class: \"flxig-link__inputs\" }, label, url),\n el(\"button\", {\n class: \"flxig-iconbtn\",\n attrs: { type: \"button\", \"aria-label\": \"Remove link\" },\n html: icons.close(16),\n on: {\n click: () => {\n row.remove()\n syncAdd()\n },\n },\n })\n )\n rows.appendChild(row)\n }\n\n const seed = opts.values.length ? opts.values : [{ label: \"\", url: \"\" }]\n seed.slice(0, opts.max).forEach(addRow)\n syncAdd()\n\n const element = el(\"div\", { class: \"flxig-links__wrap\" }, rows, addBtn)\n\n return {\n element,\n getValues: () =>\n [...rows.querySelectorAll(\".flxig-link\")]\n .map((row) => ({\n label: (row.querySelector(\".flxig-link__label\") as HTMLInputElement).value.trim(),\n url: (row.querySelector(\".flxig-link__url\") as HTMLInputElement).value.trim(),\n }))\n .filter((b) => b.label || b.url),\n }\n}\n\nexport function stateBlock(opts: {\n icon?: string\n title: string\n detail?: string\n action?: HTMLElement\n}): HTMLElement {\n return el(\n \"div\",\n { class: \"flxig-state\" },\n opts.icon ? fromMarkup(opts.icon) : null,\n el(\"p\", { class: \"flxig-h2\", text: opts.title }),\n opts.detail ? el(\"p\", { class: \"flxig-muted\", text: opts.detail }) : null,\n opts.action ?? null\n )\n}\n","// Screen 1 — the empty \"connect your Instagram with Flonix\" state.\n// Clean top (heading + CTA); the small \"<partner> × flonix\" lockup sits at\n// the bottom.\n\nimport { cobrandLockup, icons } from \"../branding\"\nimport { button } from \"../components\"\nimport { el, fromMarkup } from \"../dom\"\nimport type { PartnerBranding } from \"../types\"\n\nexport function renderConnect(opts: {\n connecting: boolean\n partner: PartnerBranding\n onConnect: () => void\n}): HTMLElement {\n const cta = button({\n label: opts.connecting ? \"Redirecting…\" : \"Connect Instagram\",\n variant: \"primary\",\n large: true,\n block: true,\n disabled: opts.connecting,\n icon: opts.connecting ? icons.spinner() : icons.instagram(),\n onClick: opts.onConnect,\n })\n\n return el(\n \"div\",\n { class: \"flxig-connect\" },\n el(\n \"div\",\n { class: \"flxig-connect__copy\" },\n el(\"h1\", { class: \"flxig-h1\", text: \"Connect your Instagram with Flonix\" }),\n el(\"p\", {\n class: \"flxig-muted\",\n text: \"Link your Instagram account to set up comment and DM automations on your posts — directly from here.\",\n })\n ),\n el(\"div\", { class: \"flxig-connect__cta\" }, cta),\n fromMarkup(`<div class=\"flxig-connect__foot\">${cobrandLockup(opts.partner)}</div>`)\n )\n}\n","// Screen 2 — the connected account's posts, loaded incrementally.\n// The view owns its grid + an IntersectionObserver sentinel; the widget\n// feeds it pages via `appendPosts` and toggles loading/hasMore flags.\n\nimport { flonixLogo, icons } from \"../branding\"\nimport { button, stateBlock } from \"../components\"\nimport { append, clear, el, fromMarkup } from \"../dom\"\nimport type { InstagramAccount, InstagramPost, MediaType } from \"../types\"\n\nexport interface PostsView {\n element: HTMLElement\n appendPosts(posts: InstagramPost[]): void\n setLoadingMore(loading: boolean): void\n setHasMore(hasMore: boolean): void\n showEmpty(): void\n destroy(): void\n}\n\nconst TYPE_META: Record<MediaType, { label: string; icon: string }> = {\n IMAGE: { label: \"Image\", icon: icons.instagram(12) },\n VIDEO: { label: \"Video\", icon: icons.video() },\n REELS: { label: \"Reel\", icon: icons.video() },\n CAROUSEL: { label: \"Album\", icon: icons.layers() },\n}\n\nfunction postTile(\n post: InstagramPost,\n onAutomate: (post: InstagramPost) => void\n): HTMLElement {\n const meta = TYPE_META[post.mediaType] ?? TYPE_META.IMAGE\n\n const media = el(\"div\", { class: \"flxig-tile__media\" })\n if (post.media) {\n append(media, [\n el(\"img\", {\n attrs: { src: post.media, alt: post.caption ?? \"Instagram post\", loading: \"lazy\" },\n }),\n ])\n } else {\n append(media, [fromMarkup(`<div class=\"flxig-tile__ph\">${icons.instagram(28)}</div>`)])\n }\n append(media, [\n fromMarkup(\n `<span class=\"flxig-tile__type\">${meta.icon}<span>${meta.label}</span></span>`\n ),\n ])\n\n return el(\n \"div\",\n { class: \"flxig-tile\" },\n media,\n el(\n \"div\",\n { class: \"flxig-tile__body\" },\n el(\"p\", {\n class: \"flxig-tile__cap\",\n text: post.caption?.trim() || \"No caption\",\n }),\n button({\n label: \"Automate\",\n variant: \"secondary\",\n block: true,\n icon: icons.bolt(),\n onClick: () => onAutomate(post),\n })\n )\n )\n}\n\nexport function renderPosts(opts: {\n account: InstagramAccount | null\n onAutomate: (post: InstagramPost) => void\n onLoadMore: () => void\n}): PostsView {\n const username = opts.account?.username\n const grid = el(\"div\", { class: \"flxig-grid\" })\n const sentinel = el(\"div\", { class: \"flxig-sentinel\" })\n const loadMore = el(\"div\", { class: \"flxig-loadmore\" })\n\n const header = el(\n \"div\",\n { class: \"flxig-header\" },\n el(\n \"div\",\n { class: \"flxig-header__id\" },\n fromMarkup(`<span class=\"flxig-avatar\">${icons.instagram(18)}</span>`),\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-h2\", text: username ? `@${username}` : \"Instagram\" }),\n el(\"div\", { class: \"flxig-muted\", text: \"Pick a post to automate\" })\n )\n ),\n fromMarkup(\n `<span class=\"flxig-badge\">${icons.check(13)}<span>Connected</span></span>`\n )\n )\n\n const attribution = fromMarkup(\n `<div class=\"flxig-attrib\"><span>Automations by</span>${flonixLogo(15)}</div>`\n )\n\n const root = el(\n \"div\",\n {},\n header,\n grid,\n loadMore,\n sentinel,\n attribution\n )\n\n let hasMore = true\n let loading = false\n let empty = false\n\n // Observe the sentinel to trigger incremental loads as it scrolls into view.\n const observer =\n typeof IntersectionObserver !== \"undefined\"\n ? new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting) && hasMore && !loading && !empty) {\n opts.onLoadMore()\n }\n },\n { rootMargin: \"240px\" }\n )\n : null\n observer?.observe(sentinel)\n\n const renderLoadMore = () => {\n clear(loadMore)\n if (loading) {\n append(loadMore, [fromMarkup(icons.spinner(20))])\n } else if (hasMore && !observer) {\n // Fallback when IntersectionObserver is unavailable.\n append(loadMore, [\n button({ label: \"Load more\", variant: \"ghost\", onClick: opts.onLoadMore }),\n ])\n }\n }\n\n return {\n element: root,\n appendPosts(posts) {\n empty = false\n append(\n grid,\n posts.map((post) => postTile(post, opts.onAutomate))\n )\n },\n setLoadingMore(value) {\n loading = value\n renderLoadMore()\n },\n setHasMore(value) {\n hasMore = value\n renderLoadMore()\n if (!value) observer?.disconnect()\n },\n showEmpty() {\n empty = true\n hasMore = false\n observer?.disconnect()\n clear(grid)\n grid.replaceWith(\n stateBlock({\n icon: icons.instagram(30),\n title: \"No posts yet\",\n detail: \"Publish a post on Instagram, then come back to automate it.\",\n })\n )\n },\n destroy() {\n observer?.disconnect()\n },\n }\n}\n","// Business rules for the \"fully prefilled\" automate dialog. Isolated here so\n// the defaults can evolve without touching the view code in screens/.\n\nimport type {\n AutomationType,\n CreateAutomationInput,\n InstagramAccount,\n InstagramPost,\n} from \"./types\"\n\nfunction profileUrl(account: InstagramAccount | null): string {\n if (account?.username) return `https://instagram.com/${account.username}`\n return \"https://instagram.com/\"\n}\n\n/** A fully prefilled automation draft for a given post + type. */\nexport function buildPrefill(\n post: InstagramPost,\n account: InstagramAccount | null,\n type: AutomationType\n): CreateAutomationInput {\n const handle = account?.username ? `@${account.username}` : \"us\"\n\n const common = {\n postId: post.id,\n type,\n entryButtonLabel: \"Send me the link\",\n deliveryMessage:\n \"Thanks for reaching out! 🙌 Here's the link you asked for 👇\",\n // One link button prefilled; the merchant fills in their own URL.\n linkButtons: [{ label: \"Shop now\", url: \"\" }],\n // Follow-gate is ON and prefilled by default, per product spec.\n followGate: {\n enabled: true,\n followProfileUrl: profileUrl(account),\n followButtonLabel: `Follow ${handle}`,\n followConfirmButtonLabel: \"I'm following ✅\",\n followUpMessage:\n \"Awesome — thanks for following! 💙 Here's your link 👇\",\n },\n }\n\n if (type === \"COMMENT\") {\n return {\n ...common,\n name: \"Comment → DM automation\",\n keywords: [\"link\", \"price\", \"info\"],\n commentReply: \"Just sent you a DM! 📩\",\n }\n }\n\n return {\n ...common,\n name: \"DM keyword automation\",\n keywords: [\"link\", \"info\"],\n commentReply: null,\n }\n}\n","// Screen 3 — the \"Automate\" dialog. Offers Comment vs DM automation, with\n// every field (including the follow-gate) prefilled from prefill.ts. The\n// dialog is self-contained: it owns its form state and reports a finished\n// CreateAutomationInput back through `onSubmit`.\n\nimport { icons } from \"../branding\"\nimport {\n button,\n chipsInput,\n field,\n linkButtonsEditor,\n switchToggle,\n textArea,\n textInput,\n} from \"../components\"\nimport { append, el, fromMarkup } from \"../dom\"\nimport { buildPrefill } from \"../prefill\"\nimport {\n MAX_LINK_BUTTONS,\n type AutomationType,\n type CreateAutomationInput,\n type InstagramAccount,\n type InstagramPost,\n} from \"../types\"\n\ninterface DialogHandle {\n close: () => void\n}\n\nconst TYPE_OPTIONS: {\n type: AutomationType\n title: string\n detail: string\n icon: string\n}[] = [\n {\n type: \"COMMENT\",\n title: \"Comment automation\",\n detail: \"Reply + DM when someone comments a keyword\",\n icon: icons.comment(20),\n },\n {\n type: \"DM\",\n title: \"DM automation\",\n detail: \"Auto-reply when someone DMs a keyword\",\n icon: icons.dm(20),\n },\n]\n\nexport function openAutomateDialog(opts: {\n mount: ShadowRoot | HTMLElement\n post: InstagramPost\n account: InstagramAccount | null\n onSubmit: (data: CreateAutomationInput) => Promise<void>\n onToast: (message: string) => void\n}): DialogHandle {\n let type: AutomationType = \"COMMENT\"\n let draft = buildPrefill(opts.post, opts.account, type)\n let submitting = false\n\n const body = el(\"div\", { class: \"flxig-dialog__body\" })\n const overlay = el(\"div\", { class: \"flxig-overlay\" })\n\n const close = () => {\n document.removeEventListener(\"keydown\", onKey)\n overlay.remove()\n }\n const onKey = (ev: KeyboardEvent) => {\n if (ev.key === \"Escape\" && !submitting) close()\n }\n document.addEventListener(\"keydown\", onKey)\n overlay.addEventListener(\"click\", (ev) => {\n if (ev.target === overlay && !submitting) close()\n })\n\n // --- type picker (segmented control) ---\n const picker = el(\"div\", { class: \"flxig-seg\" })\n const renderPicker = () => {\n picker.replaceChildren(\n ...TYPE_OPTIONS.map((opt) =>\n el(\n \"div\",\n {\n class: \"flxig-seg__opt\",\n dataset: { active: String(opt.type === type) },\n attrs: { role: \"button\", tabindex: \"0\" },\n on: {\n click: () => {\n if (opt.type === type) return\n type = opt.type\n draft = buildPrefill(opts.post, opts.account, type)\n renderPicker()\n renderForm()\n },\n },\n },\n fromMarkup(`<span class=\"flxig-seg__ic\">${opt.icon}</span>`),\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-seg__t\", text: opt.title }),\n el(\"div\", { class: \"flxig-seg__d\", text: opt.detail })\n )\n )\n )\n )\n }\n\n // --- form (re-rendered when the type changes) ---\n let readForm: () => CreateAutomationInput = () => draft\n\n const renderForm = () => {\n const keywords = chipsInput({\n values: draft.keywords,\n placeholder: \"Add keyword…\",\n })\n const commentReply = textInput({ value: draft.commentReply ?? \"\" })\n const deliveryMessage = textArea({ value: draft.deliveryMessage, rows: 3 })\n const entryButtonLabel = textInput({ value: draft.entryButtonLabel })\n const links = linkButtonsEditor({\n values: draft.linkButtons,\n max: MAX_LINK_BUTTONS,\n })\n\n const followUpMessage = textArea({ value: draft.followGate.followUpMessage, rows: 2 })\n const followButtonLabel = textInput({ value: draft.followGate.followButtonLabel })\n const followProfileUrl = textInput({ value: draft.followGate.followProfileUrl })\n const followConfirmLabel = textInput({ value: draft.followGate.followConfirmButtonLabel })\n\n const gateFields = el(\n \"div\",\n { class: \"flxig-gate__fields\", dataset: { off: String(!draft.followGate.enabled) } },\n field(\"Follow profile URL\", followProfileUrl),\n field(\"Follow button label\", followButtonLabel),\n field(\"Confirm button label\", followConfirmLabel),\n field(\"Message after they follow\", followUpMessage)\n )\n\n const gateSwitch = switchToggle({\n checked: draft.followGate.enabled,\n onChange: (checked) => {\n gateFields.dataset.off = String(!checked)\n },\n })\n\n const gate = el(\n \"div\",\n { class: \"flxig-gate\" },\n el(\n \"div\",\n { class: \"flxig-gate__top\" },\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-label\", text: \"Follow gate\" }),\n el(\"div\", {\n class: \"flxig-hint\",\n text: \"Require users to follow before they get the link.\",\n })\n ),\n gateSwitch.element\n ),\n gateFields\n )\n\n const fields: HTMLElement[] = [\n field(\n type === \"COMMENT\" ? \"Trigger keywords (in comments)\" : \"Trigger keywords (in DMs)\",\n keywords.element,\n \"Press Enter or comma to add. The automation fires on these words.\"\n ),\n ]\n if (type === \"COMMENT\") {\n fields.push(field(\"Public comment reply\", commentReply, \"Posted under the comment.\"))\n }\n fields.push(\n field(\"DM message\", deliveryMessage, \"The direct message delivered to the user.\"),\n field(\n \"Link buttons\",\n links.element,\n `Where they enter the link(s). Up to ${MAX_LINK_BUTTONS} — each has a label and a URL.`\n ),\n field(\"Opt-in button label\", entryButtonLabel, \"Button users tap in the first DM.\"),\n gate\n )\n\n body.replaceChildren(...fields)\n\n readForm = () => ({\n postId: opts.post.id,\n type,\n name: draft.name,\n keywords: keywords.getValues(),\n commentReply: type === \"COMMENT\" ? commentReply.value.trim() || null : null,\n entryButtonLabel: entryButtonLabel.value.trim(),\n deliveryMessage: deliveryMessage.value.trim(),\n linkButtons: links.getValues(),\n followGate: {\n enabled: gateSwitch.input.checked,\n followProfileUrl: followProfileUrl.value.trim(),\n followButtonLabel: followButtonLabel.value.trim(),\n followConfirmButtonLabel: followConfirmLabel.value.trim(),\n followUpMessage: followUpMessage.value.trim(),\n },\n })\n\n body.prepend(\n el(\"div\", { class: \"flxig-field\" }, el(\"span\", { class: \"flxig-label\", text: \"Automation type\" }), picker)\n )\n }\n\n // --- footer actions ---\n const saveBtn = button({\n label: \"Create automation\",\n variant: \"primary\",\n icon: icons.bolt(),\n onClick: async () => {\n if (submitting) return\n const data = readForm()\n if (!data.keywords.length) {\n opts.onToast(\"Add at least one keyword\")\n return\n }\n if (!data.deliveryMessage) {\n opts.onToast(\"Add a DM message\")\n return\n }\n submitting = true\n saveBtn.disabled = true\n saveBtn.replaceChildren(fromMarkup(icons.spinner()), el(\"span\", { text: \"Creating…\" }))\n try {\n await opts.onSubmit(data)\n close()\n } catch (error) {\n opts.onToast(error instanceof Error ? error.message : \"Something went wrong\")\n submitting = false\n saveBtn.disabled = false\n saveBtn.replaceChildren(fromMarkup(icons.bolt()), el(\"span\", { text: \"Create automation\" }))\n }\n },\n })\n\n const dialog = el(\n \"div\",\n { class: \"flxig-dialog\", attrs: { role: \"dialog\", \"aria-modal\": \"true\" } },\n el(\n \"div\",\n { class: \"flxig-dialog__head\" },\n el(\n \"div\",\n {},\n el(\"div\", { class: \"flxig-h2\", text: \"Automate this post\" }),\n el(\"div\", {\n class: \"flxig-muted\",\n text: opts.post.caption?.trim()\n ? truncate(opts.post.caption.trim(), 70)\n : \"Set up comment & DM replies\",\n })\n ),\n el(\"button\", {\n class: \"flxig-iconbtn\",\n attrs: { type: \"button\", \"aria-label\": \"Close\" },\n html: icons.close(),\n on: { click: () => !submitting && close() },\n })\n ),\n body,\n el(\n \"div\",\n { class: \"flxig-dialog__foot\" },\n button({ label: \"Cancel\", variant: \"ghost\", onClick: () => !submitting && close() }),\n saveBtn\n )\n )\n\n renderPicker()\n renderForm()\n append(overlay, [dialog])\n opts.mount.appendChild(overlay)\n\n return { close }\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? `${value.slice(0, max - 1)}…` : value\n}\n","import type { ThemeConfig, ThemeTokens } from \"./types\"\n\n/** Flonix default font stack. Overridable via `theme.fontFamily`. */\nexport const DEFAULT_FONT_FAMILY =\n '\"Inter\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n\nexport const DEFAULT_RADIUS = \"12px\"\n\n/** Flonix brand defaults for both color schemes. Hosts override any subset. */\nexport const DEFAULT_TOKENS: { light: ThemeTokens; dark: ThemeTokens } = {\n light: {\n background: \"#ffffff\",\n foreground: \"#0a0a0b\",\n card: \"#ffffff\",\n cardForeground: \"#0a0a0b\",\n popover: \"#ffffff\",\n popoverForeground: \"#0a0a0b\",\n primary: \"#2563eb\",\n primaryForeground: \"#ffffff\",\n secondary: \"#f4f4f5\",\n secondaryForeground: \"#18181b\",\n muted: \"#f4f4f5\",\n mutedForeground: \"#71717a\",\n accent: \"#eef2ff\",\n accentForeground: \"#1e3a8a\",\n destructive: \"#ef4444\",\n destructiveForeground: \"#ffffff\",\n border: \"#e4e4e7\",\n input: \"#e4e4e7\",\n ring: \"#2563eb\",\n },\n dark: {\n background: \"#0a0a0b\",\n foreground: \"#fafafa\",\n card: \"#131316\",\n cardForeground: \"#fafafa\",\n popover: \"#131316\",\n popoverForeground: \"#fafafa\",\n primary: \"#3b82f6\",\n primaryForeground: \"#ffffff\",\n secondary: \"#27272a\",\n secondaryForeground: \"#fafafa\",\n muted: \"#1b1b1f\",\n mutedForeground: \"#a1a1aa\",\n accent: \"#1e293b\",\n accentForeground: \"#bfdbfe\",\n destructive: \"#f87171\",\n destructiveForeground: \"#0a0a0b\",\n border: \"#27272a\",\n input: \"#2a2a2e\",\n ring: \"#3b82f6\",\n },\n}\n\nexport interface ResolvedTheme {\n mode: \"light\" | \"dark\" | \"auto\"\n fontFamily: string\n radius: string\n light: ThemeTokens\n dark: ThemeTokens\n}\n\nexport function resolveTheme(config: ThemeConfig = {}): ResolvedTheme {\n return {\n mode: config.mode ?? \"auto\",\n fontFamily: config.fontFamily ?? DEFAULT_FONT_FAMILY,\n radius: config.radius ?? DEFAULT_RADIUS,\n light: { ...DEFAULT_TOKENS.light, ...(config.tokens?.light ?? {}) },\n dark: { ...DEFAULT_TOKENS.dark, ...(config.tokens?.dark ?? {}) },\n }\n}\n\nconst camelToKebab = (key: string) =>\n key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)\n\nfunction tokensToVars(tokens: ThemeTokens): string {\n return (Object.keys(tokens) as (keyof ThemeTokens)[])\n .map((key) => ` --flxig-${camelToKebab(key)}: ${tokens[key]};`)\n .join(\"\\n\")\n}\n\n/**\n * Build the CSS custom-property blocks for the Shadow root.\n * Light tokens live on `:host`; dark tokens on `:host(.flxig-dark)`.\n * The widget toggles the `flxig-dark` class on its root based on `mode`\n * (and, for `auto`, the host's prefers-color-scheme).\n */\nexport function buildThemeVars(theme: ResolvedTheme): string {\n return `:host {\n${tokensToVars(theme.light)}\n --flxig-radius: ${theme.radius};\n --flxig-font: ${theme.fontFamily};\n}\n:host(.flxig-dark) {\n${tokensToVars(theme.dark)}\n}`\n}\n\n/** Resolve whether dark should be active right now, given the configured mode. */\nexport function isDarkActive(mode: ResolvedTheme[\"mode\"]): boolean {\n if (mode === \"dark\") return true\n if (mode === \"light\") return false\n return (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n )\n}\n","// The widget stylesheet. Lives inside the Shadow root, so selectors are\n// local and cannot leak into (or be clobbered by) the host page. Every\n// visual value resolves from a `--flxig-*` token defined in theme.ts.\n\nexport const STYLES = `\n*, *::before, *::after { box-sizing: border-box; }\n\n.flxig-root {\n font-family: var(--flxig-font);\n color: var(--flxig-foreground);\n background: var(--flxig-background);\n border: 1px solid var(--flxig-border);\n border-radius: var(--flxig-radius);\n padding: clamp(20px, 4vw, 36px);\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n container-type: inline-size;\n}\n\n/* Borderless / full-bleed: blends into the host page and fills its container.\n Only the OUTER chrome is removed — internal borders (tiles, inputs) stay. */\n.flxig-root.flxig-plain {\n border: none;\n border-radius: 0;\n padding: 0;\n background: transparent;\n}\n\n/* ---- typography ---- */\n.flxig-h1 { font-size: 1.35rem; font-weight: 700; letter-spacing: -0.015em; margin: 0; }\n.flxig-h2 { font-size: 1.05rem; font-weight: 650; letter-spacing: -0.01em; margin: 0; }\n.flxig-muted { color: var(--flxig-muted-foreground); font-size: 0.9rem; margin: 0; }\n.flxig-label { display: block; font-size: 0.8rem; font-weight: 600; margin-bottom: 6px; }\n.flxig-hint { font-size: 0.75rem; color: var(--flxig-muted-foreground); margin-top: 4px; }\n\n/* ---- buttons ---- */\n.flxig-btn {\n appearance: none; border: 1px solid transparent; cursor: pointer;\n font-family: inherit; font-size: 0.9rem; font-weight: 600;\n border-radius: calc(var(--flxig-radius) - 4px);\n padding: 10px 16px; display: inline-flex; align-items: center; justify-content: center;\n gap: 8px; transition: filter .15s ease, background .15s ease, border-color .15s ease, opacity .15s ease;\n text-decoration: none; white-space: nowrap;\n}\n.flxig-btn:disabled { opacity: .55; cursor: not-allowed; }\n.flxig-btn--primary { background: var(--flxig-primary); color: var(--flxig-primary-foreground); }\n.flxig-btn--primary:hover:not(:disabled) { filter: brightness(1.07); }\n.flxig-btn--secondary { background: var(--flxig-secondary); color: var(--flxig-secondary-foreground); border-color: var(--flxig-border); }\n.flxig-btn--secondary:hover:not(:disabled) { background: var(--flxig-muted); }\n.flxig-btn--ghost { background: transparent; color: var(--flxig-foreground); }\n.flxig-btn--ghost:hover:not(:disabled) { background: var(--flxig-muted); }\n.flxig-btn--block { width: 100%; }\n.flxig-btn--lg { padding: 13px 20px; font-size: 0.98rem; }\n\n/* ---- brand logo: delta chip (light) / bare delta (dark) + wordmark ---- */\n.flxig-brand { display: inline-flex; align-items: center; gap: 7px; color: var(--flxig-foreground); }\n.flxig-brand__chip { display: inline-flex; align-items: center; justify-content: center; background: var(--flxig-primary); border-radius: 6px; padding: 3px; }\n.flxig-brand__img { display: block; width: var(--flxig-logo-size, 18px); height: var(--flxig-logo-size, 18px); object-fit: contain; }\n.flxig-brand__wordmark { display: block; height: var(--flxig-logo-size, 18px); width: auto; }\n:host(.flxig-dark) .flxig-brand__chip { background: transparent; padding: 0; }\n\n/* ---- co-brand lockup: \"<partner logo> × flonix\" ---- */\n.flxig-cobrand { display: inline-flex; align-items: center; gap: 9px; font-size: 0.9rem; }\n.flxig-cobrand__x { color: var(--flxig-muted-foreground); font-weight: 400; }\n.flxig-partner { display: inline-flex; align-items: center; }\n.flxig-partner__img { display: block; height: 18px; width: auto; max-width: 120px; object-fit: contain; }\n.flxig-partner[data-has-dark=\"true\"] .flxig-partner__img--dark { display: none; }\n:host(.flxig-dark) .flxig-partner[data-has-dark=\"true\"] .flxig-partner__img--light { display: none; }\n:host(.flxig-dark) .flxig-partner[data-has-dark=\"true\"] .flxig-partner__img--dark { display: block; }\n\n/* ---- connect screen ---- */\n.flxig-connect { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 18px; padding: clamp(20px, 6cqw, 52px) 8px; }\n.flxig-connect__copy { display: flex; flex-direction: column; gap: 8px; max-width: 420px; }\n.flxig-connect__cta { width: 100%; max-width: 340px; margin-top: 4px; }\n.flxig-connect__foot { margin-top: 6px; }\n\n/* ---- posts header ---- */\n.flxig-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; }\n.flxig-header__id { display: flex; align-items: center; gap: 10px; min-width: 0; }\n.flxig-avatar { width: 38px; height: 38px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; background: var(--flxig-accent); color: var(--flxig-accent-foreground); flex: none; }\n.flxig-badge { display: inline-flex; align-items: center; gap: 5px; font-size: 0.72rem; font-weight: 600; padding: 3px 9px; border-radius: 999px; background: var(--flxig-accent); color: var(--flxig-accent-foreground); }\n\n/* ---- posts grid ---- */\n.flxig-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }\n@container (min-width: 520px) { .flxig-grid { grid-template-columns: repeat(3, 1fr); } }\n@container (min-width: 760px) { .flxig-grid { grid-template-columns: repeat(4, 1fr); } }\n\n.flxig-tile { border: 1px solid var(--flxig-border); border-radius: var(--flxig-radius); overflow: hidden; background: var(--flxig-card); display: flex; flex-direction: column; }\n.flxig-tile__media { position: relative; aspect-ratio: 1 / 1; background: var(--flxig-muted); overflow: hidden; }\n.flxig-tile__media img { width: 100%; height: 100%; object-fit: cover; display: block; }\n.flxig-tile__ph { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; color: var(--flxig-muted-foreground); }\n.flxig-tile__type { position: absolute; top: 8px; right: 8px; display: inline-flex; align-items: center; gap: 4px; font-size: 0.68rem; font-weight: 600; padding: 3px 7px; border-radius: 999px; background: color-mix(in srgb, #000 55%, transparent); color: #fff; backdrop-filter: blur(4px); }\n.flxig-tile__body { padding: 10px; display: flex; flex-direction: column; gap: 8px; flex: 1; }\n.flxig-tile__cap { font-size: 0.78rem; color: var(--flxig-muted-foreground); margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-height: 2.1em; }\n\n.flxig-sentinel { height: 1px; }\n.flxig-loadmore { display: flex; justify-content: center; padding: 18px 0 2px; color: var(--flxig-muted-foreground); }\n\n/* ---- empty / error / loading ---- */\n.flxig-state { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; text-align: center; padding: 48px 16px; color: var(--flxig-muted-foreground); }\n\n/* ---- dialog ---- */\n.flxig-overlay { position: fixed; inset: 0; background: color-mix(in srgb, #000 55%, transparent); display: flex; align-items: center; justify-content: center; padding: 16px; z-index: 2147483000; animation: flxig-fade .15s ease; }\n.flxig-dialog { background: var(--flxig-popover); color: var(--flxig-popover-foreground); border: 1px solid var(--flxig-border); border-radius: var(--flxig-radius); width: min(560px, 100%); max-height: min(88vh, 760px); display: flex; flex-direction: column; overflow: hidden; box-shadow: 0 24px 60px -20px rgba(0,0,0,.5); animation: flxig-pop .18s cubic-bezier(.2,.8,.2,1); }\n.flxig-dialog__head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 18px 20px; border-bottom: 1px solid var(--flxig-border); }\n.flxig-dialog__body { padding: 18px 20px; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; }\n.flxig-dialog__foot { padding: 14px 20px; border-top: 1px solid var(--flxig-border); display: flex; gap: 10px; justify-content: flex-end; }\n.flxig-iconbtn { appearance: none; background: transparent; border: none; color: var(--flxig-muted-foreground); cursor: pointer; padding: 4px; border-radius: 8px; display: inline-flex; }\n.flxig-iconbtn:hover { background: var(--flxig-muted); color: var(--flxig-foreground); }\n\n/* ---- type picker (segmented) ---- */\n.flxig-seg { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n.flxig-seg__opt { border: 1px solid var(--flxig-border); border-radius: calc(var(--flxig-radius) - 2px); padding: 12px; cursor: pointer; display: flex; gap: 10px; align-items: flex-start; background: var(--flxig-card); transition: border-color .15s, background .15s; }\n.flxig-seg__opt:hover { border-color: var(--flxig-ring); }\n.flxig-seg__opt[data-active=\"true\"] { border-color: var(--flxig-primary); background: var(--flxig-accent); }\n.flxig-seg__ic { color: var(--flxig-primary); margin-top: 2px; }\n.flxig-seg__t { font-weight: 650; font-size: 0.88rem; }\n.flxig-seg__d { font-size: 0.74rem; color: var(--flxig-muted-foreground); margin-top: 2px; }\n\n/* ---- form fields ---- */\n.flxig-field { display: block; }\n.flxig-input, .flxig-textarea {\n width: 100%; font-family: inherit; font-size: 0.88rem; color: var(--flxig-foreground);\n background: var(--flxig-background); border: 1px solid var(--flxig-input);\n border-radius: calc(var(--flxig-radius) - 4px); padding: 9px 11px; transition: border-color .15s, box-shadow .15s;\n}\n.flxig-input:focus, .flxig-textarea:focus { outline: none; border-color: var(--flxig-ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--flxig-ring) 25%, transparent); }\n.flxig-textarea { resize: vertical; min-height: 72px; }\n\n/* ---- follow-gate card + switch ---- */\n.flxig-gate { border: 1px solid var(--flxig-border); border-radius: calc(var(--flxig-radius) - 2px); padding: 14px; display: flex; flex-direction: column; gap: 12px; background: var(--flxig-card); }\n.flxig-gate__top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.flxig-gate__fields { display: flex; flex-direction: column; gap: 12px; }\n.flxig-gate__fields[data-off=\"true\"] { opacity: .5; pointer-events: none; }\n\n.flxig-switch { position: relative; width: 40px; height: 23px; flex: none; }\n.flxig-switch input { position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; }\n.flxig-switch__track { position: absolute; inset: 0; background: var(--flxig-input); border-radius: 999px; transition: background .15s; }\n.flxig-switch__thumb { position: absolute; top: 2px; left: 2px; width: 19px; height: 19px; border-radius: 999px; background: #fff; transition: transform .15s; box-shadow: 0 1px 3px rgba(0,0,0,.3); }\n.flxig-switch input:checked ~ .flxig-switch__track { background: var(--flxig-primary); }\n.flxig-switch input:checked ~ .flxig-switch__thumb { transform: translateX(17px); }\n\n/* ---- chips (keywords) ---- */\n.flxig-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px; border: 1px solid var(--flxig-input); border-radius: calc(var(--flxig-radius) - 4px); background: var(--flxig-background); }\n.flxig-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--flxig-secondary); color: var(--flxig-secondary-foreground); font-size: 0.78rem; font-weight: 600; padding: 4px 8px; border-radius: 999px; }\n.flxig-chip button { appearance: none; border: none; background: transparent; color: inherit; cursor: pointer; opacity: .6; padding: 0; display: inline-flex; }\n.flxig-chip button:hover { opacity: 1; }\n.flxig-chips input { flex: 1; min-width: 80px; border: none; outline: none; background: transparent; color: var(--flxig-foreground); font-family: inherit; font-size: 0.82rem; padding: 4px; }\n\n/* ---- link buttons editor ---- */\n.flxig-links__wrap { display: flex; flex-direction: column; gap: 10px; }\n.flxig-links { display: flex; flex-direction: column; gap: 10px; }\n.flxig-link { display: flex; align-items: center; gap: 8px; }\n.flxig-link__ic { color: var(--flxig-muted-foreground); flex: none; display: inline-flex; }\n.flxig-link__inputs { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr); gap: 8px; flex: 1; min-width: 0; }\n.flxig-links__add { align-self: flex-start; padding-left: 8px; padding-right: 12px; }\n@container (max-width: 440px) { .flxig-link__inputs { grid-template-columns: 1fr; } }\n\n/* ---- toast ---- */\n.flxig-toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background: var(--flxig-foreground); color: var(--flxig-background); font-size: 0.85rem; font-weight: 600; padding: 10px 16px; border-radius: 999px; display: inline-flex; align-items: center; gap: 8px; z-index: 2147483001; box-shadow: 0 10px 30px -10px rgba(0,0,0,.5); animation: flxig-pop .2s ease; }\n\n/* ---- footer attribution ---- */\n.flxig-attrib { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--flxig-border); display: flex; align-items: center; justify-content: center; gap: 6px; font-size: 0.72rem; color: var(--flxig-muted-foreground); }\n\n/* ---- animations ---- */\n.flxig-spin { animation: flxig-rotate .8s linear infinite; }\n@keyframes flxig-rotate { to { transform: rotate(360deg); } }\n@keyframes flxig-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes flxig-pop { from { opacity: 0; transform: scale(.97); } to { opacity: 1; transform: scale(1); } }\n@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; } }\n`\n","// The orchestrator. Owns the Shadow root, theme application, the session/\n// posts state machine, and wiring between the transport and the screens.\n// Screens stay pure; all side effects and flow control live here.\n\nimport { icons } from \"./branding\"\nimport { createHttpTransport } from \"./client\"\nimport { clear, el, fromMarkup } from \"./dom\"\nimport { stateBlock } from \"./components\"\nimport { renderConnect } from \"./screens/connect\"\nimport { renderPosts, type PostsView } from \"./screens/posts\"\nimport { openAutomateDialog } from \"./screens/automate-dialog\"\nimport { buildThemeVars, isDarkActive, resolveTheme } from \"./theme\"\nimport { STYLES } from \"./styles\"\nimport type {\n CreateAutomationInput,\n FlonixIGConfig,\n FlonixIGInstance,\n InstagramAccount,\n InstagramPost,\n Transport,\n} from \"./types\"\n\nconst RETURN_FLAG = \"flxig_connected\"\nconst DEFAULT_BASE_URL = \"https://flonix.pro\"\n\nexport class Widget implements FlonixIGInstance {\n private readonly config: FlonixIGConfig\n private readonly transport: Transport\n private readonly host: HTMLElement\n private readonly shadow: ShadowRoot\n private readonly root: HTMLElement\n private readonly content: HTMLElement\n private readonly mediaQuery: MediaQueryList | null = null\n\n private token: string | null = null\n private account: InstagramAccount | null = null\n private postsView: PostsView | null = null\n private cursor: string | null = null\n private connecting = false\n private destroyed = false\n\n constructor(target: HTMLElement, config: FlonixIGConfig) {\n this.config = config\n this.transport =\n config.transport ?? createHttpTransport(config.baseUrl ?? DEFAULT_BASE_URL)\n\n // Own host element inside the target so teardown is clean and we never\n // clobber a shadow root the host may already have.\n this.host = document.createElement(\"div\")\n this.host.setAttribute(\"data-flonix-ig\", \"\")\n target.appendChild(this.host)\n this.shadow = this.host.attachShadow({ mode: \"open\" })\n\n const theme = resolveTheme(config.theme)\n this.shadow.appendChild(\n el(\"style\", { text: `${buildThemeVars(theme)}\\n${STYLES}` })\n )\n\n this.root = el(\"div\", {\n class: config.appearance === \"plain\" ? \"flxig-root flxig-plain\" : \"flxig-root\",\n })\n this.content = el(\"div\", { class: \"flxig-content\" })\n this.root.appendChild(this.content)\n this.shadow.appendChild(this.root)\n\n this.applyMode(isDarkActive(theme.mode))\n if (theme.mode === \"auto\" && typeof window.matchMedia === \"function\") {\n this.mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\")\n this.mediaQuery.addEventListener(\"change\", this.onSchemeChange)\n }\n\n void this.init()\n }\n\n // ---- lifecycle ----\n\n private onSchemeChange = (ev: MediaQueryListEvent) => this.applyMode(ev.matches)\n\n private applyMode(dark: boolean) {\n // The dark token block is `:host(.flxig-dark)`, so the class must live on\n // the shadow host element — not on an element inside the shadow tree.\n this.host.classList.toggle(\"flxig-dark\", dark)\n }\n\n refresh(): void {\n this.cursor = null\n void this.init()\n }\n\n unmount(): void {\n this.destroyed = true\n this.postsView?.destroy()\n this.mediaQuery?.removeEventListener(\"change\", this.onSchemeChange)\n this.host.remove()\n }\n\n private fail(error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.config.onError?.(err)\n return err\n }\n\n // ---- flow ----\n\n private async init() {\n this.renderLoading()\n try {\n const session = await this.transport.session({\n apiKey: this.config.apiKey,\n user: this.config.user,\n })\n if (this.destroyed) return\n this.token = session.token\n this.account = session.account\n\n if (session.connected) {\n this.clearReturnFlag()\n this.config.onConnected?.(session.account ?? { instagramId: null, username: null })\n await this.renderPosts()\n } else {\n this.renderConnect()\n }\n } catch (error) {\n this.renderError(this.fail(error).message)\n }\n }\n\n private async startConnect() {\n if (!this.token || this.connecting) return\n this.connecting = true\n this.renderConnect()\n try {\n const { authorizeUrl } = await this.transport.connectStart({\n token: this.token,\n returnUrl: this.resolveReturnUrl(),\n })\n // Hand off to Flonix auth → Instagram OAuth → back to returnUrl.\n window.location.href = authorizeUrl\n } catch (error) {\n this.connecting = false\n this.renderConnect()\n this.toast(this.fail(error).message)\n }\n }\n\n private async renderPosts() {\n const view = renderPosts({\n account: this.account,\n onAutomate: (post) => this.openDialog(post),\n onLoadMore: () => void this.loadMore(),\n })\n this.postsView = view\n this.swap(view.element)\n await this.loadMore(true)\n }\n\n private async loadMore(initial = false) {\n const view = this.postsView\n if (!view || !this.token) return\n view.setLoadingMore(true)\n try {\n const { posts, nextCursor } = await this.transport.posts({\n token: this.token,\n cursor: this.cursor,\n })\n if (this.destroyed) return\n if (initial && posts.length === 0) {\n view.showEmpty()\n return\n }\n view.appendPosts(posts)\n this.cursor = nextCursor\n view.setHasMore(Boolean(nextCursor))\n } catch (error) {\n this.toast(this.fail(error).message)\n } finally {\n view.setLoadingMore(false)\n }\n }\n\n private openDialog(post: InstagramPost) {\n if (!this.token) return\n openAutomateDialog({\n mount: this.shadow,\n post,\n account: this.account,\n onToast: (message) => this.toast(message),\n onSubmit: (data) => this.createAutomation(data),\n })\n }\n\n private async createAutomation(data: CreateAutomationInput) {\n if (!this.token) throw new Error(\"Not connected\")\n const result = await this.transport.createAutomation({ token: this.token, data })\n this.config.onAutomationCreated?.(result)\n this.toast(\"Automation created ✓\")\n }\n\n // ---- rendering helpers ----\n\n private swap(node: HTMLElement) {\n clear(this.content)\n this.content.appendChild(node)\n }\n\n private renderConnect() {\n this.swap(\n renderConnect({\n connecting: this.connecting,\n partner: this.config.partner,\n onConnect: () => void this.startConnect(),\n })\n )\n }\n\n private renderLoading() {\n this.swap(stateBlock({ icon: icons.spinner(26), title: \"Loading…\" }))\n }\n\n private renderError(message: string) {\n this.swap(\n stateBlock({\n icon: icons.close(26),\n title: \"Couldn't load\",\n detail: message,\n })\n )\n }\n\n private toast(message: string) {\n const toast = fromMarkup(\n `<div class=\"flxig-toast\">${icons.bolt(14)}<span></span></div>`\n )\n toast.querySelector(\"span\")!.textContent = message\n this.shadow.appendChild(toast)\n setTimeout(() => toast.remove(), 2600)\n }\n\n // ---- return-from-OAuth handling ----\n\n private resolveReturnUrl(): string {\n if (this.config.returnUrl) return this.config.returnUrl\n if (typeof window === \"undefined\") return \"\"\n return window.location.href\n }\n\n private clearReturnFlag() {\n if (typeof window === \"undefined\" || !window.history?.replaceState) return\n const url = new URL(window.location.href)\n if (url.searchParams.has(RETURN_FLAG)) {\n url.searchParams.delete(RETURN_FLAG)\n window.history.replaceState({}, \"\", url.toString())\n }\n }\n}\n","// An in-memory mock transport for local development and the demo harness.\n// It faithfully simulates the redirect-and-return connect flow by persisting\n// the \"connected\" state to localStorage and bouncing through the return URL.\n\nimport type {\n InstagramPost,\n MediaType,\n Transport,\n} from \"./types\"\n\nconst delay = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\nconst TYPES: MediaType[] = [\"IMAGE\", \"CAROUSEL\", \"REELS\", \"VIDEO\", \"IMAGE\"]\nconst CAPTIONS = [\n \"New drop is live 🔥 comment LINK for the shop\",\n \"Behind the scenes of today's shoot\",\n \"Our bestseller is back in stock ✨\",\n \"How to style this 3 ways 👇\",\n \"Limited edition — only 50 made\",\n \"Weekend sale starts now 🛍️\",\n null,\n \"Tag a friend who needs this 💙\",\n]\n\nfunction makePage(page: number, perPage: number): InstagramPost[] {\n return Array.from({ length: perPage }, (_, i) => {\n const n = page * perPage + i\n return {\n id: `mock_${n}`,\n caption: CAPTIONS[n % CAPTIONS.length] ?? null,\n media: `https://picsum.photos/seed/flonix${n}/600/600`,\n mediaType: TYPES[n % TYPES.length] ?? \"IMAGE\",\n permalink: null,\n timestamp: new Date(Date.now() - n * 86400000).toISOString(),\n }\n })\n}\n\nexport interface MockOptions {\n /** Pages of posts to serve before stopping. Default 3. */\n totalPages?: number\n /** Posts per page. Default 8. */\n perPage?: number\n /** localStorage key suffix so multiple demos don't collide. */\n namespace?: string\n}\n\nexport function createMockTransport(options: MockOptions = {}): Transport {\n const totalPages = options.totalPages ?? 3\n const perPage = options.perPage ?? 8\n const storageKey = `flxig.mock.connected.${options.namespace ?? \"default\"}`\n\n const isConnected = () => {\n try {\n return localStorage.getItem(storageKey) === \"1\"\n } catch {\n return false\n }\n }\n\n return {\n async session() {\n await delay(400)\n const connected = isConnected()\n return {\n connected,\n token: \"mock-session-token\",\n account: connected ? { instagramId: \"17890000000\", username: \"your_brand\" } : null,\n }\n },\n\n async connectStart({ returnUrl }) {\n await delay(500)\n // Simulate a successful OAuth round-trip: mark connected, then send the\n // widget back to the return URL with the standard return flag.\n try {\n localStorage.setItem(storageKey, \"1\")\n } catch {\n /* ignore */\n }\n const url = new URL(returnUrl, window.location.href)\n url.searchParams.set(\"flxig_connected\", \"1\")\n return { authorizeUrl: url.toString() }\n },\n\n async posts({ cursor }) {\n await delay(500)\n const page = cursor ? Number(cursor) : 0\n const posts = makePage(page, perPage)\n const next = page + 1\n return { posts, nextCursor: next < totalPages ? String(next) : null }\n },\n\n async createAutomation() {\n await delay(700)\n return { id: `mock_automation_${Date.now()}` }\n },\n }\n}\n","// Public entry point. Framework-agnostic: works via `import` in any bundler\n// or via the IIFE global build (`window.FlonixIG`).\n\nimport { Widget } from \"./widget\"\nimport type { FlonixIGConfig, FlonixIGInstance } from \"./types\"\n\nexport const version = \"0.1.1\"\n\n/**\n * Mount the Flonix Instagram automation widget into a container.\n *\n * @example\n * FlonixIG.mount(\"#flonix\", {\n * apiKey: \"flxig.…\",\n * user: { id: \"merchant_42\", email: \"me@shop.com\" },\n * })\n */\nexport function mount(\n target: string | HTMLElement,\n config: FlonixIGConfig\n): FlonixIGInstance {\n const element =\n typeof target === \"string\" ? document.querySelector(target) : target\n if (!element) {\n throw new Error(`FlonixIG.mount: target not found: ${String(target)}`)\n }\n if (!config?.apiKey) {\n throw new Error(\"FlonixIG.mount: config.apiKey is required\")\n }\n if (!config?.user?.id) {\n throw new Error(\"FlonixIG.mount: config.user.id is required\")\n }\n if (!config?.partner?.logo || !config?.partner?.name) {\n throw new Error(\n \"FlonixIG.mount: config.partner.name and config.partner.logo are required\"\n )\n }\n return new Widget(element as HTMLElement, config)\n}\n\nexport const FlonixIG = { mount, version }\n\nexport { createMockTransport } from \"./mock\"\nexport { createHttpTransport } from \"./client\"\nexport { DEFAULT_TOKENS } from \"./theme\"\nexport type * from \"./types\"\n"],"mappings":"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","names":["global_exports","__export","DEFAULT_TOKENS","FlonixIG","createHttpTransport","createMockTransport","mount","version","FLONIX_LOGO_PNG","escapeHtml","value","c","WORDMARK_FONT","flonixLogo","size","FLONIX_LOGO_PNG","cobrandLockup","partner","name","light","dark","partnerImgs","icons","authHeaders","token","createHttpTransport","baseUrl","base","call","path","init","res","json","apiKey","user","returnUrl","cursor","data","el","tag","attrs","children","node","key","value","event","handler","append","parent","child","clear","fromMarkup","markup","_a","wrapper","button","opts","_a","classes","btn","el","fromMarkup","append","field","label","control","hint","textInput","_b","textArea","_c","ta","switchToggle","input","chipsInput","values","list","render","chips","value","index","icons","commit","raw","ev","linkButtonsEditor","rows","addBtn","addRow","syncAdd","url","row","b","stateBlock","renderConnect","opts","cta","button","icons","el","fromMarkup","cobrandLockup","TYPE_META","icons","postTile","post","onAutomate","_a","_b","_c","meta","media","el","append","fromMarkup","button","renderPosts","opts","username","grid","sentinel","loadMore","header","attribution","flonixLogo","root","hasMore","loading","empty","observer","entries","e","renderLoadMore","clear","posts","value","stateBlock","profileUrl","account","buildPrefill","post","type","handle","common","TYPE_OPTIONS","icons","openAutomateDialog","opts","_a","type","draft","buildPrefill","submitting","body","el","overlay","close","onKey","ev","picker","renderPicker","opt","renderForm","fromMarkup","readForm","keywords","chipsInput","commentReply","textInput","deliveryMessage","textArea","entryButtonLabel","links","linkButtonsEditor","followUpMessage","followButtonLabel","followProfileUrl","followConfirmLabel","gateFields","field","gateSwitch","switchToggle","checked","gate","fields","saveBtn","button","data","error","dialog","truncate","append","value","max","DEFAULT_FONT_FAMILY","DEFAULT_RADIUS","DEFAULT_TOKENS","resolveTheme","config","_a","_b","_c","_d","_e","_f","_g","camelToKebab","key","m","tokensToVars","tokens","buildThemeVars","theme","isDarkActive","mode","STYLES","RETURN_FLAG","DEFAULT_BASE_URL","Widget","target","config","ev","_a","_b","createHttpTransport","theme","resolveTheme","el","buildThemeVars","STYLES","isDarkActive","dark","error","err","_c","session","authorizeUrl","view","renderPosts","post","initial","posts","nextCursor","openAutomateDialog","message","data","result","node","clear","renderConnect","stateBlock","icons","toast","fromMarkup","url","delay","ms","r","TYPES","CAPTIONS","makePage","page","perPage","_","_a","_b","n","createMockTransport","options","_c","totalPages","storageKey","isConnected","connected","returnUrl","url","cursor","posts","next","version","mount","target","config","_a","_b","_c","element","Widget","FlonixIG"]}
package/dist/index.d.mts CHANGED
@@ -147,6 +147,12 @@ interface FlonixIGConfig {
147
147
  baseUrl?: string;
148
148
  /** Where Instagram OAuth returns to. Default: current page URL. */
149
149
  returnUrl?: string;
150
+ /**
151
+ * Visual chrome. `"card"` (default) draws a bordered, rounded, padded
152
+ * surface. `"plain"` is borderless/transparent with no outer padding, so the
153
+ * widget blends into the host page and fills its container's width.
154
+ */
155
+ appearance?: "card" | "plain";
150
156
  /** Theme + branding customization. */
151
157
  theme?: ThemeConfig;
152
158
  onConnected?: (account: InstagramAccount) => void;
@@ -180,7 +186,7 @@ declare const DEFAULT_TOKENS: {
180
186
  dark: ThemeTokens;
181
187
  };
182
188
 
183
- declare const version = "0.1.0";
189
+ declare const version = "0.1.1";
184
190
  /**
185
191
  * Mount the Flonix Instagram automation widget into a container.
186
192
  *
package/dist/index.d.ts CHANGED
@@ -147,6 +147,12 @@ interface FlonixIGConfig {
147
147
  baseUrl?: string;
148
148
  /** Where Instagram OAuth returns to. Default: current page URL. */
149
149
  returnUrl?: string;
150
+ /**
151
+ * Visual chrome. `"card"` (default) draws a bordered, rounded, padded
152
+ * surface. `"plain"` is borderless/transparent with no outer padding, so the
153
+ * widget blends into the host page and fills its container's width.
154
+ */
155
+ appearance?: "card" | "plain";
150
156
  /** Theme + branding customization. */
151
157
  theme?: ThemeConfig;
152
158
  onConnected?: (account: InstagramAccount) => void;
@@ -180,7 +186,7 @@ declare const DEFAULT_TOKENS: {
180
186
  dark: ThemeTokens;
181
187
  };
182
188
 
183
- declare const version = "0.1.0";
189
+ declare const version = "0.1.1";
184
190
  /**
185
191
  * Mount the Flonix Instagram automation widget into a container.
186
192
  *