@syntrologie/adapt-faq 2.16.0 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/editor.ts", "../src/summarize.ts", "../src/types.ts"],
4
+ "sourcesContent": ["/**\n * Adaptive FAQ - Editor Component\n *\n * Lit web component that displays FAQ question cards with inline editing,\n * detection, dismiss/restore, and rationale display.\n *\n * Custom events:\n * navigate-home \u2014 user clicked back\n * dirty-change \u2014 { dirty: boolean }\n */\n\nimport { html, LitElement, nothing } from 'lit';\n\nimport { summarizeFAQItem } from './summarize';\nimport { type FAQAnswer, type FAQConfig, type FAQQuestionAction, isOwnAction } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface FlatItem {\n key: string;\n index: number;\n summary: string;\n question: FAQQuestionAction;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst getAnswerText = (answer: FAQAnswer): string => {\n if (typeof answer === 'string') return answer;\n if (answer.type === 'rich') return answer.html;\n return answer.content;\n};\n\nconst flattenItems = (config: FAQConfig): FlatItem[] => {\n const actions = (config.actions || []).filter(isOwnAction);\n return actions.map((q, i) => ({\n key: String(i),\n index: i,\n summary: summarizeFAQItem(q),\n question: q,\n }));\n};\n\n// ============================================================================\n// Element\n// ============================================================================\n\nexport class FAQEditorLit extends LitElement {\n static override properties = {\n config: { attribute: false },\n onChange: { attribute: false },\n _editingKey: { state: true },\n };\n\n config: FAQConfig | null = null;\n onChange: ((updated: Record<string, unknown>) => void) | null = null;\n\n private _editingKey: string | null = null;\n\n override createRenderRoot() {\n return this;\n }\n\n // No auto-dirty on load \u2014 only dirty when user makes changes (matching React behavior).\n\n // ---- Actions ----\n\n private _handleBack = () => {\n if (this._editingKey !== null) {\n this._editingKey = null;\n } else {\n this.dispatchEvent(new CustomEvent('navigate-home', { bubbles: true }));\n }\n };\n\n private _handleItemClick = (key: string) => {\n this._editingKey = key;\n };\n\n private _handleFieldChange = (index: number, field: string, value: string) => {\n if (!this.config || !this.onChange) return;\n\n const ownActions = (this.config.actions || []).filter(isOwnAction).slice();\n const q = { ...ownActions[index], config: { ...ownActions[index].config } };\n (q.config as Record<string, unknown>)[field] = value;\n ownActions[index] = q;\n\n const otherActions = (this.config.actions || []).filter((a) => !isOwnAction(a));\n const updated = { ...this.config, actions: [...otherActions, ...ownActions] };\n this.onChange(updated as unknown as Record<string, unknown>);\n\n this.dispatchEvent(new CustomEvent('dirty-change', { detail: { dirty: true }, bubbles: true }));\n };\n\n // ---- Render ----\n\n private _renderEditMode = (item: FlatItem) => {\n const q = item.question;\n return html`\n <div class=\"se-py-1\">\n <div class=\"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-text-primary\">\n <span>\u2753</span>\n <span>${item.summary}</span>\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Question</label>\n <input\n type=\"text\"\n .value=${q.config.question}\n @input=${(e: Event) => this._handleFieldChange(item.index, 'question', (e.target as HTMLInputElement).value)}\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm\"\n />\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Answer</label>\n <textarea\n .value=${getAnswerText(q.config.answer)}\n @input=${(e: Event) => this._handleFieldChange(item.index, 'answer', (e.target as HTMLTextAreaElement).value)}\n rows=\"4\"\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm se-resize-none\"\n ></textarea>\n </div>\n\n <div class=\"se-mb-3\">\n <label class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">Category</label>\n <input\n type=\"text\"\n .value=${q.config.category || ''}\n placeholder=\"e.g., Billing, Account\"\n @input=${(e: Event) => this._handleFieldChange(item.index, 'category', (e.target as HTMLInputElement).value)}\n class=\"se-w-full se-p-2 se-rounded se-border se-border-border-primary se-bg-input-field-bg se-text-text-primary se-text-sm\"\n />\n </div>\n\n ${\n q.rationale\n ? html`\n <div>\n <span class=\"se-text-[11px] se-font-semibold se-text-text-secondary se-mb-1 se-block\">AI Rationale</span>\n <div class=\"se-p-2 se-rounded se-border se-border-dashed se-border-border-primary se-bg-card-bg se-text-text-secondary se-text-xs se-mb-2\">\n ${q.rationale.why}\n </div>\n </div>\n `\n : nothing\n }\n </div>\n `;\n };\n\n private _renderListMode = (items: FlatItem[]) => {\n if (items.length === 0) {\n return html`<div class=\"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm\">\n No FAQ questions configured.\n </div>`;\n }\n\n return html`\n <div class=\"se-text-[11px] se-font-semibold se-uppercase se-tracking-wider se-text-text-secondary se-mb-2 se-px-1\">\n FAQ <span class=\"se-text-text-tertiary se-font-normal\">${items.length}</span>\n </div>\n ${items.map(\n (item) => html`\n <div\n data-item-key=${item.key}\n data-card-body\n @click=${() => this._handleItemClick(item.key)}\n class=\"se-p-3 se-rounded-lg se-border se-border-border-primary se-bg-card-bg se-cursor-pointer se-mb-2 se-transition-all hover:se-border-pink-4/40 hover:se-bg-pink-4/5\"\n >\n <div class=\"se-flex se-items-center se-gap-2\">\n <span class=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-text-sm se-text-text-primary\">\n ${item.summary}\n </span>\n </div>\n ${\n item.question.rationale\n ? html`\n <div class=\"se-text-[10px] se-text-text-tertiary se-mt-1\">\n WHY: ${item.question.rationale.why}\n </div>\n `\n : nothing\n }\n </div>\n `\n )}\n `;\n };\n\n override render() {\n if (!this.config) {\n return html`<div class=\"se-p-8 se-text-center se-text-text-secondary se-text-sm\">Loading...</div>`;\n }\n\n const items = flattenItems(this.config);\n const editItem =\n this._editingKey !== null ? items.find((it) => it.key === this._editingKey) : null;\n\n return html`\n <div class=\"se-flex se-flex-col se-h-full\">\n <!-- Header (no Back button \u2014 panel provides that) -->\n <div class=\"se-px-4 se-pt-3 se-pb-1\">\n <h2 class=\"se-m-0 se-text-base se-font-semibold se-text-text-primary\">Review Questions</h2>\n <p class=\"se-m-0 se-mt-0.5 se-text-xs se-text-text-secondary\">\n ${items.length} question${items.length !== 1 ? 's' : ''}\n </p>\n </div>\n\n <div class=\"se-flex-1 se-overflow-auto se-p-4\">\n ${\n editItem\n ? html`\n <button type=\"button\" @click=${() => {\n this._editingKey = null;\n }}\n class=\"se-mb-3 se-py-1 se-px-2 se-rounded se-border-none se-bg-card-bg se-text-text-secondary se-text-xs se-cursor-pointer\"\n >\u2190 Back to list</button>\n ${this._renderEditMode(editItem)}\n `\n : this._renderListMode(items)\n }\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('se-faq-editor', FAQEditorLit);\n", "/**\n * Human-readable summary generation for FAQ items.\n * Pure functions \u2014 no DOM access, just string formatting.\n */\n\nimport type { DecisionStrategy, FAQAnswer, FAQQuestionAction, RuleStrategy } from './types';\n\nconst MAX_Q_LEN = 50;\nconst MAX_A_LEN = 40;\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max).trimEnd()}...`;\n}\n\nfunction stripHtml(html: string): string {\n return html.replace(/<[^>]*>/g, '').trim();\n}\n\nfunction getAnswerPreview(answer: FAQAnswer): string {\n if (typeof answer === 'string') return answer;\n if (answer.type === 'rich') return stripHtml(answer.html);\n return answer.content.replace(/[*_#`]/g, '').trim();\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\n/**\n * Parse a triggerWhen strategy into a human-readable trigger description.\n */\nexport function describeTrigger(triggerWhen?: DecisionStrategy<boolean> | null): string {\n if (!triggerWhen) return 'All pages';\n if (!isRuleStrategy(triggerWhen)) return 'All pages';\n\n const pages: string[] = [];\n const anchors: string[] = [];\n\n for (const rule of triggerWhen.rules) {\n for (const condition of rule.conditions) {\n if (condition.type === 'page_url' && typeof (condition as any).url === 'string') {\n pages.push((condition as any).url);\n }\n if (condition.type === 'anchor_visible' && typeof (condition as any).anchorId === 'string') {\n anchors.push((condition as any).anchorId);\n }\n }\n }\n\n const parts: string[] = [];\n if (pages.length > 0) parts.push(pages[0]);\n if (anchors.length > 0) parts.push(anchors[0]);\n\n return parts.length > 0 ? parts.join(' \\u00b7 ') : 'All pages';\n}\n\n/**\n * Generate a one-liner summary for an FAQ item.\n */\nexport function summarizeFAQItem(item: FAQQuestionAction): string {\n const q = truncate(item.config.question, MAX_Q_LEN);\n const a = truncate(getAnswerPreview(item.config.answer), MAX_A_LEN);\n return `Q: \"${q}\" \\u2014 ${a}`;\n}\n", "/**\n * Adaptive FAQ - Types\n *\n * Type definitions for the FAQ accordion adaptive.\n * Demonstrates compositional action pattern with per-item triggerWhen.\n */\n\n// ============================================================================\n// Decision Strategy Types (from runtime-sdk)\n// ============================================================================\n\n/**\n * Simplified DecisionStrategy type for this package.\n * Full definition is in @syntrologie/runtime-sdk.\n */\nexport type DecisionStrategy<T = unknown> =\n | RuleStrategy<T>\n | ScoreStrategy<T>\n | ModelStrategy<T>\n | ExternalStrategy<T>;\n\nexport interface RuleStrategy<T = unknown> {\n type: 'rules';\n rules: Array<{\n conditions: Array<Record<string, unknown>>;\n value: T;\n }>;\n default: T;\n}\n\nexport interface ScoreStrategy<T = unknown> {\n type: 'score';\n field: string;\n threshold: number;\n above: T;\n below: T;\n}\n\nexport interface ModelStrategy<T = unknown> {\n type: 'model';\n modelId: string;\n inputs: string[];\n outputMapping: Record<string, T>;\n default: T;\n}\n\nexport interface ExternalStrategy<T = unknown> {\n type: 'external';\n endpoint: string;\n method?: 'GET' | 'POST';\n default: T;\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Event Scope Types (from sdk-contracts)\n// ============================================================================\n\n// ============================================================================\n// Rich Answer Content Types\n// ============================================================================\n\nexport interface Asset {\n id: string;\n type: 'image' | 'video';\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n}\n\nexport interface RichHTMLAnswer {\n type: 'rich';\n html: string;\n}\n\nexport interface EnhancedMarkdownAnswer {\n type: 'markdown';\n content: string;\n assets?: Asset[];\n}\n\nexport type FAQAnswer = string | RichHTMLAnswer | EnhancedMarkdownAnswer;\n\n// ============================================================================\n// AI Answer Types\n// ============================================================================\n\nexport interface AnswerStrategy {\n endpoint: string;\n context?: string[];\n cache?: 'session' | 'none';\n fallback?: string;\n}\n\n// ============================================================================\n// Feedback Types\n// ============================================================================\n\nexport interface FeedbackConfig {\n style: 'thumbs' | 'rating';\n prompt?: string;\n}\n\nexport type FeedbackValue = 'up' | 'down' | number;\n\n// ============================================================================\n// Ordering Types\n// ============================================================================\n\nexport interface SegmentOrdering {\n type: 'segment';\n segmentWeights: Record<string, string[]>;\n}\n\nexport type OrderingStrategy = 'static' | 'priority' | SegmentOrdering;\n\n// ============================================================================\n// Injection Types\n// ============================================================================\n\nexport interface InjectionRule {\n trigger: DecisionStrategy<boolean>;\n items: FAQQuestionAction[];\n position?: 'prepend' | 'append';\n once?: boolean;\n}\n\n// ============================================================================\n// FAQ Question Action Types\n// ============================================================================\n\nexport interface FAQQuestionAction {\n kind: 'faq:question';\n config: {\n id: string;\n question: string;\n answer: FAQAnswer;\n category?: string;\n priority?: number;\n answerStrategy?: AnswerStrategy;\n };\n triggerWhen?: DecisionStrategy<boolean> | null;\n /** Toast config when triggerWhen transitions false \u2192 true. Required when triggerWhen is set (use null to opt out). */\n notify?: { title?: string; body?: string; icon?: string } | null;\n rationale?: {\n why: string;\n confidence?: number;\n };\n}\n\n// ============================================================================\n// FAQ Widget Configuration\n// ============================================================================\n\nexport type ExpandBehavior = 'single' | 'multiple';\n\nexport type FAQTheme = 'light' | 'dark' | 'auto';\n\nexport interface FAQConfig {\n expandBehavior: ExpandBehavior;\n searchable: boolean;\n theme: FAQTheme;\n actions: FAQQuestionAction[];\n feedback?: boolean | FeedbackConfig;\n ordering?: OrderingStrategy;\n injections?: InjectionRule[];\n}\n\n// ============================================================================\n// FAQ Action Types (for executor pattern)\n// ============================================================================\n\nexport interface ScrollToFaqAction {\n kind: 'faq:scroll_to';\n itemId?: string;\n itemQuestion?: string;\n expand?: boolean;\n behavior?: 'smooth' | 'instant' | 'auto';\n}\n\nexport interface ToggleFaqItemAction {\n kind: 'faq:toggle_item';\n itemId?: string;\n itemQuestion?: string;\n state?: 'open' | 'closed' | 'toggle';\n}\n\nexport interface UpdateFaqAction {\n kind: 'faq:update';\n operation: 'add' | 'remove' | 'reorder' | 'replace';\n items?: FAQQuestionAction[];\n itemId?: string;\n order?: string[];\n position?: 'prepend' | 'append' | 'before' | 'after';\n anchorId?: string;\n}\n\n// ============================================================================\n// Widget State Types\n// ============================================================================\n\nexport interface FAQWidgetState {\n expandedItems: Set<string>;\n items: FAQQuestionAction[];\n searchQuery: string;\n collapsedCategories: Set<string>;\n feedbackState: Map<string, FeedbackValue>;\n}\n\n// ============================================================================\n// Executor Types (from shared contracts)\n// ============================================================================\n\nexport type {\n ActionExecutor,\n ExecutorCleanup,\n ExecutorContext,\n ExecutorResult,\n ExecutorUpdate,\n} from '@syntrologie/sdk-contracts';\n\n// ============================================================================\n// Action Namespace\n// ============================================================================\n\nexport const ACTION_NAMESPACE = 'faq';\n\n/**\n * Returns true if the action belongs to this adaptive package.\n * Uses prefix matching so new kinds (e.g. faq:category) are automatically included.\n */\nexport function isOwnAction(action: { kind: string }): boolean {\n return action.kind.startsWith(`${ACTION_NAMESPACE}:`);\n}\n\n// ============================================================================\n// Editor Types (from sdk-contracts)\n// ============================================================================\n\nexport type { EditorPanelProps } from '@syntrologie/sdk-contracts';\n"],
5
+ "mappings": "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",
6
+ "names": ["html"]
7
+ }
package/dist/runtime.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * Adaptive FAQ - Runtime Module
3
3
  *
4
4
  * Runtime manifest for the FAQ accordion adaptive.
5
+ * Mounts the Lit web component <syntro-faq-accordion>.
5
6
  * Provides action executors and widget registration.
6
7
  */
7
8
  import './FAQWidgetLit';
@@ -9,9 +10,6 @@ import type { FAQWidgetRuntime } from './faq-types';
9
10
  import type { FAQConfig } from './types';
10
11
  /**
11
12
  * Mountable widget interface for <syntro-faq-accordion> (Lit web component).
12
- *
13
- * Mirrors FAQMountableWidget but mounts the Lit element instead of a React
14
- * root — no React dependency required at mount time.
15
13
  */
16
14
  export declare const FAQWidgetLitMountable: {
17
15
  mount(container: HTMLElement, config?: FAQConfig & {
@@ -24,7 +22,7 @@ export declare const FAQWidgetLitMountable: {
24
22
  *
25
23
  * Provides:
26
24
  * - FAQ action executors (scroll_to, toggle_item, update)
27
- * - Widget-based accordion (compositional faq:question actions)
25
+ * - Widget-based accordion using the Lit web component
28
26
  */
29
27
  export declare const runtime: {
30
28
  id: string;
@@ -53,7 +51,7 @@ export declare const runtime: {
53
51
  mount(container: HTMLElement, config?: FAQConfig & {
54
52
  runtime?: FAQWidgetRuntime;
55
53
  instanceId?: string;
56
- }): (() => void) | undefined;
54
+ }): () => void;
57
55
  };
58
56
  metadata: {
59
57
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,SAAS,CAAC;AAM5D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;qBAEnB,WAAW,WACb,SAAS,GAAG;QAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;CA4B3E,CAAC;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;;;;;IAOlB;;OAEG;;;;;;;;;;;IAGH;;OAEG;;;;;uBAuCm5e,CAAC;0BAA8B,CAAC;;;;;;;;;;IAzBt7e;;;;OAIG;0BACmB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;CAiB9C,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,SAAS,CAAC;AAM5D;;GAEG;AACH,eAAO,MAAM,qBAAqB;qBAEnB,WAAW,WACb,SAAS,GAAG;QAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;CA4B3E,CAAC;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;;;;;IAOlB;;OAEG;;;;;;;;;;;IAGH;;OAEG;;;;6BAxDU,WAAW,WACb,SAAS,GAAG;gBAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;gBAAC,UAAU,CAAC,EAAE,MAAM,CAAA;aAAE;;;;;;;;;IAqE1E;;;;OAIG;0BACmB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;CAiB9C,CAAC;AAEF,eAAe,OAAO,CAAC"}