@syntrologie/adapt-feedback 2.8.0-canary.241 → 2.8.0-canary.243
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FeedbackWidget.d.ts +0 -5
- package/dist/FeedbackWidget.d.ts.map +1 -1
- package/dist/FeedbackWidget.js +1 -1
- package/dist/{chunk-3TUS6XVJ.js → chunk-AC7XHGF6.js} +12 -11
- package/dist/chunk-AC7XHGF6.js.map +7 -0
- package/dist/runtime.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-3TUS6XVJ.js.map +0 -7
package/dist/FeedbackWidget.d.ts
CHANGED
|
@@ -36,11 +36,6 @@ export declare class SyntroFeedbackElement extends LitElement {
|
|
|
36
36
|
private _renderStepInput;
|
|
37
37
|
render(): import("lit-html").TemplateResult<1>;
|
|
38
38
|
}
|
|
39
|
-
export interface FeedbackMountConfig {
|
|
40
|
-
config: FeedbackConfig;
|
|
41
|
-
runtime?: FeedbackWidgetRuntime;
|
|
42
|
-
tileId?: string;
|
|
43
|
-
}
|
|
44
39
|
export declare const FeedbackWidgetLitMountable: {
|
|
45
40
|
mount(container: HTMLElement, mountConfig?: Record<string, unknown>): () => void;
|
|
46
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidget.d.ts","sourceRoot":"","sources":["../src/FeedbackWidget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAGrD,OAAO,4BAA4B,CAAC;AACpC,OAAO,0BAA0B,CAAC;AAClC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,0BAA0B,CAAC;AAClC,OAAO,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAc,MAAM,YAAY,CAAC;AAEpF,qBAAa,qBAAsB,SAAQ,UAAU;IACnD,OAAgB,UAAU;;;;;;;;;;;;;;;;MAMxB;IAEF,OAAgB,MAAM,0BAwFpB;IAEF,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAqB;IAEnC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAiC;IAE1C,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAUjD,OAAO,CAAC,SAAS,CA4Bf;IAEF,OAAO,CAAC,OAAO,CAQb;IAEF,OAAO,CAAC,gBAAgB;IAgDf,MAAM;CAuDhB;
|
|
1
|
+
{"version":3,"file":"FeedbackWidget.d.ts","sourceRoot":"","sources":["../src/FeedbackWidget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAGrD,OAAO,4BAA4B,CAAC;AACpC,OAAO,0BAA0B,CAAC;AAClC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,0BAA0B,CAAC;AAClC,OAAO,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAc,MAAM,YAAY,CAAC;AAEpF,qBAAa,qBAAsB,SAAQ,UAAU;IACnD,OAAgB,UAAU;;;;;;;;;;;;;;;;MAMxB;IAEF,OAAgB,MAAM,0BAwFpB;IAEF,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAqB;IAEnC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAiC;IAE1C,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAUjD,OAAO,CAAC,SAAS,CA4Bf;IAEF,OAAO,CAAC,OAAO,CAQb;IAEF,OAAO,CAAC,gBAAgB;IAgDf,MAAM;CAuDhB;AAiBD,eAAO,MAAM,0BAA0B;qBACpB,WAAW,gBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAuDpE,CAAC"}
|
package/dist/FeedbackWidget.js
CHANGED
|
@@ -827,12 +827,13 @@ SyntroFeedbackElement.styles = css7`
|
|
|
827
827
|
customElements.define("syntro-feedback", SyntroFeedbackElement);
|
|
828
828
|
var FeedbackWidgetLitMountable = {
|
|
829
829
|
mount(container, mountConfig) {
|
|
830
|
-
const {
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
}
|
|
835
|
-
|
|
830
|
+
const incoming = mountConfig ?? {};
|
|
831
|
+
const { runtime, instanceId, tileId, config: nestedConfig, ...flat } = incoming;
|
|
832
|
+
const feedbackConfig = nestedConfig ?? {
|
|
833
|
+
...flat
|
|
834
|
+
};
|
|
835
|
+
const resolvedTileId = tileId ?? instanceId ?? "feedback-widget";
|
|
836
|
+
if (!feedbackConfig?.steps?.length) {
|
|
836
837
|
container.innerHTML = '<div style="padding:16px;color:var(--sc-content-text-secondary-color,#87919f)">Feedback widget requires config.</div>';
|
|
837
838
|
return () => {
|
|
838
839
|
container.innerHTML = "";
|
|
@@ -840,13 +841,13 @@ var FeedbackWidgetLitMountable = {
|
|
|
840
841
|
}
|
|
841
842
|
let tracker;
|
|
842
843
|
try {
|
|
843
|
-
tracker = new FlowEngine(
|
|
844
|
+
tracker = new FlowEngine(feedbackConfig.steps);
|
|
844
845
|
} catch {
|
|
845
846
|
}
|
|
846
847
|
const el = document.createElement("syntro-feedback");
|
|
847
|
-
el.config =
|
|
848
|
+
el.config = feedbackConfig;
|
|
848
849
|
el.runtime = runtime;
|
|
849
|
-
el.tileId =
|
|
850
|
+
el.tileId = resolvedTileId;
|
|
850
851
|
el.style.cssText = "display:flex;flex-direction:column;height:100%;width:100%;";
|
|
851
852
|
container.appendChild(el);
|
|
852
853
|
let completed = false;
|
|
@@ -862,7 +863,7 @@ var FeedbackWidgetLitMountable = {
|
|
|
862
863
|
el.removeEventListener("step-answer", onAnswer);
|
|
863
864
|
if (!completed && runtime && tracker) {
|
|
864
865
|
runtime.events.publish("feedback:abandoned", {
|
|
865
|
-
surveyId:
|
|
866
|
+
surveyId: resolvedTileId,
|
|
866
867
|
lastStepId: tracker.currentStep.id,
|
|
867
868
|
stepsCompleted: tracker.stepsCompleted,
|
|
868
869
|
abandoned: true
|
|
@@ -877,4 +878,4 @@ export {
|
|
|
877
878
|
SyntroFeedbackElement,
|
|
878
879
|
FeedbackWidgetLitMountable
|
|
879
880
|
};
|
|
880
|
-
//# sourceMappingURL=chunk-
|
|
881
|
+
//# sourceMappingURL=chunk-AC7XHGF6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/FeedbackWidget.ts", "../src/engine/FlowEngine.ts", "../src/rendering/ChoiceInput.ts", "../src/rendering/EndScreen.ts", "../src/rendering/NpsInput.ts", "../src/rendering/RatingInput.ts", "../src/rendering/TextInput.ts", "../src/rendering/ThumbsInput.ts"],
|
|
4
|
+
"sourcesContent": ["import { css, html, LitElement, nothing } from 'lit';\n\nimport { FlowEngine } from './engine/FlowEngine.js';\nimport './rendering/ChoiceInput.js';\nimport './rendering/EndScreen.js';\nimport './rendering/NpsInput.js';\nimport './rendering/RatingInput.js';\nimport './rendering/TextInput.js';\nimport './rendering/ThumbsInput.js';\nimport type { FeedbackConfig, FeedbackWidgetRuntime, SurveyStep } from './types.js';\n\nexport class SyntroFeedbackElement extends LitElement {\n static override properties = {\n config: { attribute: false },\n runtime: { attribute: false },\n tileId: { type: String },\n _engine: { state: true },\n _direction: { state: true },\n };\n\n static override styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: var(--sc-font-family, system-ui, -apple-system, sans-serif);\n color: var(--sc-content-text-color, #111827);\n }\n .header {\n padding: 12px 16px 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--sc-content-text-color, #111827);\n }\n .progress-bar {\n height: 3px;\n background: var(--sc-content-border-color, #e5e7eb);\n margin: 0 16px;\n border-radius: 2px;\n overflow: hidden;\n }\n .progress-fill {\n height: 100%;\n background: var(--sc-color-primary, #4f46e5);\n border-radius: 2px;\n transition: width 0.3s ease;\n }\n .step-container {\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n .step-content {\n padding: 16px;\n animation-duration: 0.25s;\n animation-fill-mode: both;\n animation-timing-function: ease-out;\n }\n .step-content.slide-in-right {\n animation-name: slideInRight;\n }\n .step-content.slide-in-left {\n animation-name: slideInLeft;\n }\n @keyframes slideInRight {\n from { transform: translateX(30px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n @keyframes slideInLeft {\n from { transform: translateX(-30px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n .prompt {\n font-size: 15px;\n font-weight: 500;\n line-height: 1.4;\n margin-bottom: 4px;\n }\n .description {\n font-size: 13px;\n color: var(--sc-content-text-secondary-color, #6b7280);\n margin-bottom: 8px;\n line-height: 1.4;\n }\n .footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px 12px;\n gap: 8px;\n }\n .back-btn {\n padding: 6px 14px;\n border-radius: 6px;\n border: 1px solid var(--sc-content-border-color, #e5e7eb);\n background: transparent;\n color: var(--sc-content-text-secondary-color, #6b7280);\n font-size: 13px;\n cursor: pointer;\n transition: border-color 0.15s;\n }\n .back-btn:hover {\n border-color: var(--sc-content-text-color, #111827);\n }\n .step-count {\n font-size: 12px;\n color: var(--sc-content-text-secondary-color, #9ca3af);\n }\n `;\n\n config: FeedbackConfig | undefined;\n runtime: FeedbackWidgetRuntime | undefined;\n tileId: string = 'feedback-widget';\n\n private _engine: FlowEngine | undefined;\n private _direction: 'forward' | 'back' = 'forward';\n\n override willUpdate(changed: Map<string, unknown>) {\n if (changed.has('config') && this.config?.steps?.length) {\n try {\n this._engine = new FlowEngine(this.config.steps);\n } catch {\n this._engine = undefined;\n }\n }\n }\n\n private _onAnswer = (e: CustomEvent<{ value: string | number }>) => {\n if (!this._engine || !this.config) return;\n const step = this._engine.currentStep;\n const { value } = e.detail;\n\n this.runtime?.events.publish('feedback:response', {\n surveyId: this.tileId,\n stepId: step.id,\n stepType: step.type,\n value,\n stepIndex: this._engine.stepIndex,\n });\n\n this._direction = 'forward';\n this._engine.answer(value);\n const updated: FlowEngine = Object.create(\n Object.getPrototypeOf(this._engine),\n Object.getOwnPropertyDescriptors(this._engine)\n );\n this._engine = updated;\n\n if (updated.isComplete) {\n this.runtime?.events.publish('feedback:completed', {\n surveyId: this.tileId,\n stepsCompleted: updated.stepsCompleted,\n abandoned: false,\n });\n }\n };\n\n private _goBack = () => {\n if (!this._engine) return;\n this._direction = 'back';\n this._engine.goBack();\n this._engine = Object.create(\n Object.getPrototypeOf(this._engine),\n Object.getOwnPropertyDescriptors(this._engine)\n );\n };\n\n private _renderStepInput(step: SurveyStep) {\n const prevAnswer = this._engine?.answers.get(step.id);\n\n switch (step.type) {\n case 'thumbs':\n return html`<sf-thumbs-input\n .value=${prevAnswer as number | undefined}\n @step-answer=${this._onAnswer}\n ></sf-thumbs-input>`;\n\n case 'rating':\n return html`<sf-rating-input\n .max=${step.ratingMax ?? 5}\n .value=${prevAnswer as number | undefined}\n @step-answer=${this._onAnswer}\n ></sf-rating-input>`;\n\n case 'nps':\n return html`<sf-nps-input\n .lowLabel=${step.npsLowLabel ?? 'Not likely'}\n .highLabel=${step.npsHighLabel ?? 'Very likely'}\n .value=${prevAnswer as number | undefined}\n @step-answer=${this._onAnswer}\n ></sf-nps-input>`;\n\n case 'choice':\n return html`<sf-choice-input\n .options=${step.options ?? []}\n .value=${prevAnswer as string | undefined}\n @step-answer=${this._onAnswer}\n ></sf-choice-input>`;\n\n case 'text':\n return html`<sf-text-input\n .placeholder=${step.placeholder ?? ''}\n .value=${(prevAnswer as string) ?? ''}\n .required=${step.required !== false}\n @step-answer=${this._onAnswer}\n ></sf-text-input>`;\n\n case 'end':\n return html`<sf-end-screen .message=${step.prompt}></sf-end-screen>`;\n\n default:\n return nothing;\n }\n }\n\n override render() {\n if (!this._engine || !this.config) {\n return html`<div style=\"padding:16px;color:var(--sc-content-text-secondary-color,#87919f)\">\n Survey widget requires config.\n </div>`;\n }\n\n const step = this._engine.currentStep;\n const showProgress = this.config.showProgress !== false;\n const allowBack = this.config.allowBack === true;\n const canGoBack = allowBack && this._engine.path.length > 1 && step.type !== 'end';\n const totalSteps = this.config.steps.filter((s) => s.type !== 'end').length;\n const progressPct = totalSteps > 0 ? (this._engine.stepsCompleted / totalSteps) * 100 : 0;\n const animClass = this._direction === 'forward' ? 'slide-in-right' : 'slide-in-left';\n\n return html`\n ${this.config.title ? html`<div class=\"header\">${this.config.title}</div>` : nothing}\n ${\n showProgress && step.type !== 'end'\n ? html`<div class=\"progress-bar\">\n <div class=\"progress-fill\" style=\"width:${progressPct}%\"></div>\n </div>`\n : nothing\n }\n <div class=\"step-container\">\n <div class=\"step-content ${animClass}\" key=${step.id}>\n ${\n step.type !== 'end'\n ? html`\n <div class=\"prompt\">${step.prompt}</div>\n ${step.description ? html`<div class=\"description\">${step.description}</div>` : nothing}\n `\n : nothing\n }\n ${this._renderStepInput(step)}\n </div>\n </div>\n ${\n canGoBack || (step.type !== 'end' && showProgress)\n ? html`<div class=\"footer\">\n ${\n canGoBack\n ? html`<button type=\"button\" class=\"back-btn\" @click=${this._goBack}>\u2190 Back</button>`\n : html`<span></span>`\n }\n ${\n step.type !== 'end'\n ? html`<span class=\"step-count\">${this._engine.stepsCompleted + 1} of ${totalSteps}</span>`\n : nothing\n }\n </div>`\n : nothing\n }\n `;\n }\n}\n\ncustomElements.define('syntro-feedback', SyntroFeedbackElement);\n\n// The runtime SDK (SyntroTileCard + WidgetRegistry) delivers tile.props spread\n// flat into mountConfig, alongside `instanceId` and `runtime`. Mountables must\n// destructure flat \u2014 there is no nested `config` field. The legacy `config`\n// and `tileId` keys are accepted for direct callers (e.g. unit tests or\n// imperative mounts that opt into the nested shape).\ntype FlatMountConfig = FeedbackConfig & {\n runtime?: FeedbackWidgetRuntime;\n instanceId?: string;\n tileId?: string;\n /** Legacy nested-config escape hatch for direct callers. */\n config?: FeedbackConfig;\n};\n\nexport const FeedbackWidgetLitMountable = {\n mount(container: HTMLElement, mountConfig?: Record<string, unknown>) {\n const incoming = (mountConfig ?? {}) as Partial<FlatMountConfig>;\n const { runtime, instanceId, tileId, config: nestedConfig, ...flat } = incoming;\n\n const feedbackConfig: FeedbackConfig | undefined = nestedConfig ?? {\n ...(flat as FeedbackConfig),\n };\n const resolvedTileId = tileId ?? instanceId ?? 'feedback-widget';\n\n if (!feedbackConfig?.steps?.length) {\n container.innerHTML =\n '<div style=\"padding:16px;color:var(--sc-content-text-secondary-color,#87919f)\">Feedback widget requires config.</div>';\n return () => {\n container.innerHTML = '';\n };\n }\n\n let tracker: FlowEngine | undefined;\n try {\n tracker = new FlowEngine(feedbackConfig.steps);\n } catch {\n // invalid config \u2014 element will show its own error\n }\n\n const el = document.createElement('syntro-feedback') as SyntroFeedbackElement;\n el.config = feedbackConfig;\n el.runtime = runtime;\n el.tileId = resolvedTileId;\n el.style.cssText = 'display:flex;flex-direction:column;height:100%;width:100%;';\n\n container.appendChild(el);\n\n let completed = false;\n const onAnswer = (e: Event) => {\n const detail = (e as CustomEvent<{ value: string | number }>).detail;\n if (tracker && !tracker.isComplete) {\n tracker.answer(detail.value);\n if (tracker.isComplete) completed = true;\n }\n };\n el.addEventListener('step-answer', onAnswer);\n\n return () => {\n el.removeEventListener('step-answer', onAnswer);\n if (!completed && runtime && tracker) {\n runtime.events.publish('feedback:abandoned', {\n surveyId: resolvedTileId,\n lastStepId: tracker.currentStep.id,\n stepsCompleted: tracker.stepsCompleted,\n abandoned: true,\n });\n }\n el.remove();\n };\n },\n};\n", "import type { BranchRule, SurveyStep } from '../types';\n\nexport class FlowEngineValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FlowEngineValidationError';\n }\n}\n\nexport class FlowEngine {\n private _steps: SurveyStep[];\n private _stepMap: Map<string, SurveyStep>;\n private _answers: Map<string, string | number> = new Map();\n private _path: string[];\n\n constructor(steps: SurveyStep[]) {\n this._validate(steps);\n this._steps = steps;\n this._stepMap = new Map(steps.map((s) => [s.id, s]));\n this._path = [steps[0].id];\n }\n\n get currentStep(): SurveyStep {\n const id = this._path[this._path.length - 1];\n return this._stepMap.get(id)!;\n }\n\n get answers(): ReadonlyMap<string, string | number> {\n return this._answers;\n }\n\n get path(): readonly string[] {\n return this._path;\n }\n\n get isComplete(): boolean {\n return this.currentStep.type === 'end';\n }\n\n get stepsCompleted(): number {\n return this._path.filter((id) => this._answers.has(id)).length;\n }\n\n get stepIndex(): number {\n return this._path.length - 1;\n }\n\n getStep(id: string): SurveyStep | undefined {\n return this._stepMap.get(id);\n }\n\n answer(value: string | number): void {\n const step = this.currentStep;\n if (step.type === 'end') return;\n\n this._answers.set(step.id, value);\n const nextId = this._resolveNext(step, value);\n\n const currentIdx = this._path.length - 1;\n this._path = this._path.slice(0, currentIdx + 1);\n this._path.push(nextId);\n }\n\n goBack(): void {\n if (this._path.length <= 1) return;\n this._path = this._path.slice(0, -1);\n }\n\n private _resolveNext(step: SurveyStep, value: string | number): string {\n if (step.next === undefined) {\n return this._nextInArray(step.id);\n }\n\n if (typeof step.next === 'string') {\n return step.next;\n }\n\n for (const rule of step.next) {\n if (this._evaluateRule(rule, value)) {\n return rule.goto;\n }\n }\n\n return this._nextInArray(step.id);\n }\n\n private _nextInArray(currentId: string): string {\n const idx = this._steps.findIndex((s) => s.id === currentId);\n return this._steps[idx + 1].id;\n }\n\n private _evaluateRule(rule: BranchRule, value: string | number): boolean {\n const { op, value: ruleValue } = rule.if;\n\n switch (op) {\n case 'eq':\n return value === ruleValue;\n case 'neq':\n return value !== ruleValue;\n case 'lt':\n return Number(value) < Number(ruleValue);\n case 'lte':\n return Number(value) <= Number(ruleValue);\n case 'gt':\n return Number(value) > Number(ruleValue);\n case 'gte':\n return Number(value) >= Number(ruleValue);\n case 'in':\n return Array.isArray(ruleValue) && ruleValue.includes(String(value));\n default:\n return false;\n }\n }\n\n private _validate(steps: SurveyStep[]): void {\n if (steps.length === 0) {\n throw new FlowEngineValidationError('Steps array must not be empty');\n }\n\n const ids = new Set<string>();\n for (const step of steps) {\n if (ids.has(step.id)) {\n throw new FlowEngineValidationError(`Duplicate step ID: \"${step.id}\"`);\n }\n ids.add(step.id);\n }\n\n const hasEnd = steps.some((s) => s.type === 'end');\n if (!hasEnd) {\n throw new FlowEngineValidationError('At least one step must have type \"end\"');\n }\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n if (typeof step.next === 'string') {\n if (!ids.has(step.next)) {\n throw new FlowEngineValidationError(\n `Step \"${step.id}\" has next target \"${step.next}\" which does not exist`\n );\n }\n } else if (Array.isArray(step.next)) {\n for (const rule of step.next) {\n if (!ids.has(rule.goto)) {\n throw new FlowEngineValidationError(\n `Step \"${step.id}\" has branch rule targeting \"${rule.goto}\" which does not exist`\n );\n }\n }\n }\n\n if (step.type !== 'end' && step.next === undefined && i === steps.length - 1) {\n throw new FlowEngineValidationError(\n `Step \"${step.id}\" is last in the array with no explicit \"next\" and is not an end step`\n );\n }\n }\n }\n}\n", "import { css, html, LitElement } from 'lit';\n\nexport class ChoiceInput extends LitElement {\n static override properties = {\n options: { attribute: false },\n value: { type: String },\n };\n\n static override styles = css`\n :host { display: block; }\n .choices {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px 0;\n }\n button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 14px;\n border-radius: 8px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n button:hover {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"] {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary-light, #eef2ff);\n }\n .radio {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n button[aria-pressed=\"true\"] .radio {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n .radio-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: transparent;\n }\n button[aria-pressed=\"true\"] .radio-dot {\n background: var(--sc-color-primary, #4f46e5);\n }\n `;\n\n options: string[] = [];\n value: string | undefined;\n\n private _select(opt: string) {\n this.value = opt;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: opt },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n return html`\n <div class=\"choices\" role=\"radiogroup\">\n ${(this.options ?? []).map(\n (opt) => html`\n <button\n type=\"button\"\n role=\"radio\"\n aria-pressed=${this.value === opt ? 'true' : 'false'}\n @click=${() => this._select(opt)}\n >\n <span class=\"radio\"><span class=\"radio-dot\"></span></span>\n ${opt}\n </button>\n `\n )}\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-choice-input', ChoiceInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class EndScreen extends LitElement {\n static override properties = {\n message: { type: String },\n };\n\n static override styles = css`\n :host { display: block; }\n .end-wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 24px 16px;\n text-align: center;\n gap: 12px;\n }\n .checkmark {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: var(--sc-color-primary-light, #eef2ff);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n }\n .message {\n color: var(--sc-content-text-color, #111827);\n font-size: 16px;\n font-weight: 500;\n line-height: 1.5;\n }\n `;\n\n message: string = 'Thank you!';\n\n override render() {\n return html`\n <div class=\"end-wrap\">\n <div class=\"checkmark\">\u2713</div>\n <div class=\"message\">${this.message}</div>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-end-screen', EndScreen);\n", "import { css, html, LitElement } from 'lit';\n\nexport class NpsInput extends LitElement {\n static override properties = {\n lowLabel: { type: String },\n highLabel: { type: String },\n value: { type: Number },\n };\n\n static override styles = css`\n :host { display: block; }\n .nps-scale {\n display: flex;\n gap: 4px;\n justify-content: center;\n padding: 12px 0 4px;\n }\n button {\n min-width: 32px;\n height: 36px;\n border-radius: 6px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n padding: 0 4px;\n }\n button:hover {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"] {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary, #4f46e5);\n color: #fff;\n }\n .labels {\n display: flex;\n justify-content: space-between;\n padding: 4px 2px 0;\n font-size: 12px;\n color: var(--sc-content-text-secondary-color, #6b7280);\n }\n `;\n\n lowLabel: string = 'Not likely';\n highLabel: string = 'Very likely';\n value: number | undefined;\n\n private _select(val: number) {\n this.value = val;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n const items = Array.from({ length: 11 }, (_, i) => i);\n return html`\n <div>\n <div class=\"nps-scale\">\n ${items.map(\n (n) => html`\n <button\n type=\"button\"\n aria-label=\"Score ${n}\"\n aria-pressed=${this.value === n ? 'true' : 'false'}\n @click=${() => this._select(n)}\n >${n}</button>\n `\n )}\n </div>\n <div class=\"labels\">\n <span>${this.lowLabel}</span>\n <span>${this.highLabel}</span>\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-nps-input', NpsInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class RatingInput extends LitElement {\n static override properties = {\n max: { type: Number },\n value: { type: Number },\n };\n\n static override styles = css`\n :host { display: block; }\n .rating-row {\n display: flex;\n gap: 8px;\n justify-content: center;\n padding: 12px 0;\n }\n button {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: transform 0.1s, border-color 0.15s, background 0.15s;\n }\n button:hover {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"],\n button.selected {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary, #4f46e5);\n color: #fff;\n }\n `;\n\n max: number = 5;\n value: number | undefined;\n\n private _select(val: number) {\n this.value = val;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n const count = this.max || 5;\n const items = Array.from({ length: count }, (_, i) => i + 1);\n return html`\n <div class=\"rating-row\">\n ${items.map(\n (n) => html`\n <button\n type=\"button\"\n aria-label=\"Rate ${n} of ${count}\"\n aria-pressed=${this.value === n ? 'true' : 'false'}\n class=${this.value === n ? 'selected' : ''}\n @click=${() => this._select(n)}\n >${n}</button>\n `\n )}\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-rating-input', RatingInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class TextInput extends LitElement {\n static override properties = {\n placeholder: { type: String },\n value: { type: String },\n required: { type: Boolean },\n };\n\n static override styles = css`\n :host { display: block; }\n .text-wrap {\n padding: 8px 0;\n }\n textarea {\n width: 100%;\n min-height: 80px;\n padding: 10px 12px;\n border-radius: 8px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n box-sizing: border-box;\n transition: border-color 0.15s;\n }\n textarea:focus {\n outline: none;\n border-color: var(--sc-color-primary, #4f46e5);\n }\n textarea::placeholder {\n color: var(--sc-content-text-secondary-color, #9ca3af);\n }\n .submit-row {\n display: flex;\n justify-content: flex-end;\n padding-top: 8px;\n }\n button {\n padding: 8px 20px;\n border-radius: 8px;\n border: none;\n background: var(--sc-color-primary, #4f46e5);\n color: #fff;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.15s;\n }\n button:hover { opacity: 0.9; }\n button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n `;\n\n placeholder: string = '';\n value: string = '';\n required: boolean = true;\n\n private _currentText = '';\n\n private _handleInput = (e: Event) => {\n this._currentText = (e.target as HTMLTextAreaElement).value;\n this.requestUpdate();\n };\n\n private _submit = () => {\n if (this.required && !this._currentText.trim()) return;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: this._currentText },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n override connectedCallback() {\n super.connectedCallback();\n this._currentText = this.value || '';\n }\n\n override render() {\n const canSubmit = !this.required || this._currentText.trim().length > 0;\n return html`\n <div class=\"text-wrap\">\n <textarea\n .value=${this._currentText}\n placeholder=${this.placeholder || 'Type your answer...'}\n @input=${this._handleInput}\n ></textarea>\n <div class=\"submit-row\">\n <button type=\"button\" ?disabled=${!canSubmit} @click=${this._submit}>\n Submit\n </button>\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-text-input', TextInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class ThumbsInput extends LitElement {\n static override properties = {\n value: { type: Number },\n };\n\n static override styles = css`\n :host { display: block; }\n .thumbs-row {\n display: flex;\n gap: 16px;\n justify-content: center;\n padding: 12px 0;\n }\n button {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n font-size: 28px;\n cursor: pointer;\n transition: transform 0.15s, border-color 0.15s, background 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n button:hover {\n transform: scale(1.1);\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"] {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary-light, #eef2ff);\n }\n `;\n\n value: number | undefined;\n\n private _select(val: number) {\n this.value = val;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n return html`\n <div class=\"thumbs-row\">\n <button\n type=\"button\"\n aria-label=\"Thumbs up\"\n aria-pressed=${this.value === 1 ? 'true' : 'false'}\n @click=${() => this._select(1)}\n >\\u{1F44D}</button>\n <button\n type=\"button\"\n aria-label=\"Thumbs down\"\n aria-pressed=${this.value === 0 ? 'true' : 'false'}\n @click=${() => this._select(0)}\n >\\u{1F44E}</button>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-thumbs-input', ThumbsInput);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "LitElement", "html", "css"]
|
|
7
|
+
}
|
package/dist/runtime.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/FeedbackWidget.ts", "../src/engine/FlowEngine.ts", "../src/rendering/ChoiceInput.ts", "../src/rendering/EndScreen.ts", "../src/rendering/NpsInput.ts", "../src/rendering/RatingInput.ts", "../src/rendering/TextInput.ts", "../src/rendering/ThumbsInput.ts"],
|
|
4
|
-
"sourcesContent": ["import { css, html, LitElement, nothing } from 'lit';\n\nimport { FlowEngine } from './engine/FlowEngine.js';\nimport './rendering/ChoiceInput.js';\nimport './rendering/EndScreen.js';\nimport './rendering/NpsInput.js';\nimport './rendering/RatingInput.js';\nimport './rendering/TextInput.js';\nimport './rendering/ThumbsInput.js';\nimport type { FeedbackConfig, FeedbackWidgetRuntime, SurveyStep } from './types.js';\n\nexport class SyntroFeedbackElement extends LitElement {\n static override properties = {\n config: { attribute: false },\n runtime: { attribute: false },\n tileId: { type: String },\n _engine: { state: true },\n _direction: { state: true },\n };\n\n static override styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: var(--sc-font-family, system-ui, -apple-system, sans-serif);\n color: var(--sc-content-text-color, #111827);\n }\n .header {\n padding: 12px 16px 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--sc-content-text-color, #111827);\n }\n .progress-bar {\n height: 3px;\n background: var(--sc-content-border-color, #e5e7eb);\n margin: 0 16px;\n border-radius: 2px;\n overflow: hidden;\n }\n .progress-fill {\n height: 100%;\n background: var(--sc-color-primary, #4f46e5);\n border-radius: 2px;\n transition: width 0.3s ease;\n }\n .step-container {\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n .step-content {\n padding: 16px;\n animation-duration: 0.25s;\n animation-fill-mode: both;\n animation-timing-function: ease-out;\n }\n .step-content.slide-in-right {\n animation-name: slideInRight;\n }\n .step-content.slide-in-left {\n animation-name: slideInLeft;\n }\n @keyframes slideInRight {\n from { transform: translateX(30px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n @keyframes slideInLeft {\n from { transform: translateX(-30px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n .prompt {\n font-size: 15px;\n font-weight: 500;\n line-height: 1.4;\n margin-bottom: 4px;\n }\n .description {\n font-size: 13px;\n color: var(--sc-content-text-secondary-color, #6b7280);\n margin-bottom: 8px;\n line-height: 1.4;\n }\n .footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px 12px;\n gap: 8px;\n }\n .back-btn {\n padding: 6px 14px;\n border-radius: 6px;\n border: 1px solid var(--sc-content-border-color, #e5e7eb);\n background: transparent;\n color: var(--sc-content-text-secondary-color, #6b7280);\n font-size: 13px;\n cursor: pointer;\n transition: border-color 0.15s;\n }\n .back-btn:hover {\n border-color: var(--sc-content-text-color, #111827);\n }\n .step-count {\n font-size: 12px;\n color: var(--sc-content-text-secondary-color, #9ca3af);\n }\n `;\n\n config: FeedbackConfig | undefined;\n runtime: FeedbackWidgetRuntime | undefined;\n tileId: string = 'feedback-widget';\n\n private _engine: FlowEngine | undefined;\n private _direction: 'forward' | 'back' = 'forward';\n\n override willUpdate(changed: Map<string, unknown>) {\n if (changed.has('config') && this.config?.steps?.length) {\n try {\n this._engine = new FlowEngine(this.config.steps);\n } catch {\n this._engine = undefined;\n }\n }\n }\n\n private _onAnswer = (e: CustomEvent<{ value: string | number }>) => {\n if (!this._engine || !this.config) return;\n const step = this._engine.currentStep;\n const { value } = e.detail;\n\n this.runtime?.events.publish('feedback:response', {\n surveyId: this.tileId,\n stepId: step.id,\n stepType: step.type,\n value,\n stepIndex: this._engine.stepIndex,\n });\n\n this._direction = 'forward';\n this._engine.answer(value);\n const updated: FlowEngine = Object.create(\n Object.getPrototypeOf(this._engine),\n Object.getOwnPropertyDescriptors(this._engine)\n );\n this._engine = updated;\n\n if (updated.isComplete) {\n this.runtime?.events.publish('feedback:completed', {\n surveyId: this.tileId,\n stepsCompleted: updated.stepsCompleted,\n abandoned: false,\n });\n }\n };\n\n private _goBack = () => {\n if (!this._engine) return;\n this._direction = 'back';\n this._engine.goBack();\n this._engine = Object.create(\n Object.getPrototypeOf(this._engine),\n Object.getOwnPropertyDescriptors(this._engine)\n );\n };\n\n private _renderStepInput(step: SurveyStep) {\n const prevAnswer = this._engine?.answers.get(step.id);\n\n switch (step.type) {\n case 'thumbs':\n return html`<sf-thumbs-input\n .value=${prevAnswer as number | undefined}\n @step-answer=${this._onAnswer}\n ></sf-thumbs-input>`;\n\n case 'rating':\n return html`<sf-rating-input\n .max=${step.ratingMax ?? 5}\n .value=${prevAnswer as number | undefined}\n @step-answer=${this._onAnswer}\n ></sf-rating-input>`;\n\n case 'nps':\n return html`<sf-nps-input\n .lowLabel=${step.npsLowLabel ?? 'Not likely'}\n .highLabel=${step.npsHighLabel ?? 'Very likely'}\n .value=${prevAnswer as number | undefined}\n @step-answer=${this._onAnswer}\n ></sf-nps-input>`;\n\n case 'choice':\n return html`<sf-choice-input\n .options=${step.options ?? []}\n .value=${prevAnswer as string | undefined}\n @step-answer=${this._onAnswer}\n ></sf-choice-input>`;\n\n case 'text':\n return html`<sf-text-input\n .placeholder=${step.placeholder ?? ''}\n .value=${(prevAnswer as string) ?? ''}\n .required=${step.required !== false}\n @step-answer=${this._onAnswer}\n ></sf-text-input>`;\n\n case 'end':\n return html`<sf-end-screen .message=${step.prompt}></sf-end-screen>`;\n\n default:\n return nothing;\n }\n }\n\n override render() {\n if (!this._engine || !this.config) {\n return html`<div style=\"padding:16px;color:var(--sc-content-text-secondary-color,#87919f)\">\n Survey widget requires config.\n </div>`;\n }\n\n const step = this._engine.currentStep;\n const showProgress = this.config.showProgress !== false;\n const allowBack = this.config.allowBack === true;\n const canGoBack = allowBack && this._engine.path.length > 1 && step.type !== 'end';\n const totalSteps = this.config.steps.filter((s) => s.type !== 'end').length;\n const progressPct = totalSteps > 0 ? (this._engine.stepsCompleted / totalSteps) * 100 : 0;\n const animClass = this._direction === 'forward' ? 'slide-in-right' : 'slide-in-left';\n\n return html`\n ${this.config.title ? html`<div class=\"header\">${this.config.title}</div>` : nothing}\n ${\n showProgress && step.type !== 'end'\n ? html`<div class=\"progress-bar\">\n <div class=\"progress-fill\" style=\"width:${progressPct}%\"></div>\n </div>`\n : nothing\n }\n <div class=\"step-container\">\n <div class=\"step-content ${animClass}\" key=${step.id}>\n ${\n step.type !== 'end'\n ? html`\n <div class=\"prompt\">${step.prompt}</div>\n ${step.description ? html`<div class=\"description\">${step.description}</div>` : nothing}\n `\n : nothing\n }\n ${this._renderStepInput(step)}\n </div>\n </div>\n ${\n canGoBack || (step.type !== 'end' && showProgress)\n ? html`<div class=\"footer\">\n ${\n canGoBack\n ? html`<button type=\"button\" class=\"back-btn\" @click=${this._goBack}>\u2190 Back</button>`\n : html`<span></span>`\n }\n ${\n step.type !== 'end'\n ? html`<span class=\"step-count\">${this._engine.stepsCompleted + 1} of ${totalSteps}</span>`\n : nothing\n }\n </div>`\n : nothing\n }\n `;\n }\n}\n\ncustomElements.define('syntro-feedback', SyntroFeedbackElement);\n\nexport interface FeedbackMountConfig {\n config: FeedbackConfig;\n runtime?: FeedbackWidgetRuntime;\n tileId?: string;\n}\n\nexport const FeedbackWidgetLitMountable = {\n mount(container: HTMLElement, mountConfig?: Record<string, unknown>) {\n const {\n config,\n runtime,\n tileId = 'feedback-widget',\n } = (mountConfig ?? {}) as Partial<FeedbackMountConfig>;\n\n if (!config) {\n container.innerHTML =\n '<div style=\"padding:16px;color:var(--sc-content-text-secondary-color,#87919f)\">Feedback widget requires config.</div>';\n return () => {\n container.innerHTML = '';\n };\n }\n\n let tracker: FlowEngine | undefined;\n try {\n tracker = new FlowEngine(config.steps);\n } catch {\n // invalid config \u2014 element will show its own error\n }\n\n const el = document.createElement('syntro-feedback') as SyntroFeedbackElement;\n el.config = config;\n el.runtime = runtime;\n el.tileId = tileId;\n el.style.cssText = 'display:flex;flex-direction:column;height:100%;width:100%;';\n\n container.appendChild(el);\n\n let completed = false;\n const onAnswer = (e: Event) => {\n const detail = (e as CustomEvent<{ value: string | number }>).detail;\n if (tracker && !tracker.isComplete) {\n tracker.answer(detail.value);\n if (tracker.isComplete) completed = true;\n }\n };\n el.addEventListener('step-answer', onAnswer);\n\n return () => {\n el.removeEventListener('step-answer', onAnswer);\n if (!completed && runtime && tracker) {\n runtime.events.publish('feedback:abandoned', {\n surveyId: tileId,\n lastStepId: tracker.currentStep.id,\n stepsCompleted: tracker.stepsCompleted,\n abandoned: true,\n });\n }\n el.remove();\n };\n },\n};\n", "import type { BranchRule, SurveyStep } from '../types';\n\nexport class FlowEngineValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FlowEngineValidationError';\n }\n}\n\nexport class FlowEngine {\n private _steps: SurveyStep[];\n private _stepMap: Map<string, SurveyStep>;\n private _answers: Map<string, string | number> = new Map();\n private _path: string[];\n\n constructor(steps: SurveyStep[]) {\n this._validate(steps);\n this._steps = steps;\n this._stepMap = new Map(steps.map((s) => [s.id, s]));\n this._path = [steps[0].id];\n }\n\n get currentStep(): SurveyStep {\n const id = this._path[this._path.length - 1];\n return this._stepMap.get(id)!;\n }\n\n get answers(): ReadonlyMap<string, string | number> {\n return this._answers;\n }\n\n get path(): readonly string[] {\n return this._path;\n }\n\n get isComplete(): boolean {\n return this.currentStep.type === 'end';\n }\n\n get stepsCompleted(): number {\n return this._path.filter((id) => this._answers.has(id)).length;\n }\n\n get stepIndex(): number {\n return this._path.length - 1;\n }\n\n getStep(id: string): SurveyStep | undefined {\n return this._stepMap.get(id);\n }\n\n answer(value: string | number): void {\n const step = this.currentStep;\n if (step.type === 'end') return;\n\n this._answers.set(step.id, value);\n const nextId = this._resolveNext(step, value);\n\n const currentIdx = this._path.length - 1;\n this._path = this._path.slice(0, currentIdx + 1);\n this._path.push(nextId);\n }\n\n goBack(): void {\n if (this._path.length <= 1) return;\n this._path = this._path.slice(0, -1);\n }\n\n private _resolveNext(step: SurveyStep, value: string | number): string {\n if (step.next === undefined) {\n return this._nextInArray(step.id);\n }\n\n if (typeof step.next === 'string') {\n return step.next;\n }\n\n for (const rule of step.next) {\n if (this._evaluateRule(rule, value)) {\n return rule.goto;\n }\n }\n\n return this._nextInArray(step.id);\n }\n\n private _nextInArray(currentId: string): string {\n const idx = this._steps.findIndex((s) => s.id === currentId);\n return this._steps[idx + 1].id;\n }\n\n private _evaluateRule(rule: BranchRule, value: string | number): boolean {\n const { op, value: ruleValue } = rule.if;\n\n switch (op) {\n case 'eq':\n return value === ruleValue;\n case 'neq':\n return value !== ruleValue;\n case 'lt':\n return Number(value) < Number(ruleValue);\n case 'lte':\n return Number(value) <= Number(ruleValue);\n case 'gt':\n return Number(value) > Number(ruleValue);\n case 'gte':\n return Number(value) >= Number(ruleValue);\n case 'in':\n return Array.isArray(ruleValue) && ruleValue.includes(String(value));\n default:\n return false;\n }\n }\n\n private _validate(steps: SurveyStep[]): void {\n if (steps.length === 0) {\n throw new FlowEngineValidationError('Steps array must not be empty');\n }\n\n const ids = new Set<string>();\n for (const step of steps) {\n if (ids.has(step.id)) {\n throw new FlowEngineValidationError(`Duplicate step ID: \"${step.id}\"`);\n }\n ids.add(step.id);\n }\n\n const hasEnd = steps.some((s) => s.type === 'end');\n if (!hasEnd) {\n throw new FlowEngineValidationError('At least one step must have type \"end\"');\n }\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n if (typeof step.next === 'string') {\n if (!ids.has(step.next)) {\n throw new FlowEngineValidationError(\n `Step \"${step.id}\" has next target \"${step.next}\" which does not exist`\n );\n }\n } else if (Array.isArray(step.next)) {\n for (const rule of step.next) {\n if (!ids.has(rule.goto)) {\n throw new FlowEngineValidationError(\n `Step \"${step.id}\" has branch rule targeting \"${rule.goto}\" which does not exist`\n );\n }\n }\n }\n\n if (step.type !== 'end' && step.next === undefined && i === steps.length - 1) {\n throw new FlowEngineValidationError(\n `Step \"${step.id}\" is last in the array with no explicit \"next\" and is not an end step`\n );\n }\n }\n }\n}\n", "import { css, html, LitElement } from 'lit';\n\nexport class ChoiceInput extends LitElement {\n static override properties = {\n options: { attribute: false },\n value: { type: String },\n };\n\n static override styles = css`\n :host { display: block; }\n .choices {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px 0;\n }\n button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 14px;\n border-radius: 8px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n button:hover {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"] {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary-light, #eef2ff);\n }\n .radio {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n button[aria-pressed=\"true\"] .radio {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n .radio-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: transparent;\n }\n button[aria-pressed=\"true\"] .radio-dot {\n background: var(--sc-color-primary, #4f46e5);\n }\n `;\n\n options: string[] = [];\n value: string | undefined;\n\n private _select(opt: string) {\n this.value = opt;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: opt },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n return html`\n <div class=\"choices\" role=\"radiogroup\">\n ${(this.options ?? []).map(\n (opt) => html`\n <button\n type=\"button\"\n role=\"radio\"\n aria-pressed=${this.value === opt ? 'true' : 'false'}\n @click=${() => this._select(opt)}\n >\n <span class=\"radio\"><span class=\"radio-dot\"></span></span>\n ${opt}\n </button>\n `\n )}\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-choice-input', ChoiceInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class EndScreen extends LitElement {\n static override properties = {\n message: { type: String },\n };\n\n static override styles = css`\n :host { display: block; }\n .end-wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 24px 16px;\n text-align: center;\n gap: 12px;\n }\n .checkmark {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: var(--sc-color-primary-light, #eef2ff);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n }\n .message {\n color: var(--sc-content-text-color, #111827);\n font-size: 16px;\n font-weight: 500;\n line-height: 1.5;\n }\n `;\n\n message: string = 'Thank you!';\n\n override render() {\n return html`\n <div class=\"end-wrap\">\n <div class=\"checkmark\">\u2713</div>\n <div class=\"message\">${this.message}</div>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-end-screen', EndScreen);\n", "import { css, html, LitElement } from 'lit';\n\nexport class NpsInput extends LitElement {\n static override properties = {\n lowLabel: { type: String },\n highLabel: { type: String },\n value: { type: Number },\n };\n\n static override styles = css`\n :host { display: block; }\n .nps-scale {\n display: flex;\n gap: 4px;\n justify-content: center;\n padding: 12px 0 4px;\n }\n button {\n min-width: 32px;\n height: 36px;\n border-radius: 6px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n padding: 0 4px;\n }\n button:hover {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"] {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary, #4f46e5);\n color: #fff;\n }\n .labels {\n display: flex;\n justify-content: space-between;\n padding: 4px 2px 0;\n font-size: 12px;\n color: var(--sc-content-text-secondary-color, #6b7280);\n }\n `;\n\n lowLabel: string = 'Not likely';\n highLabel: string = 'Very likely';\n value: number | undefined;\n\n private _select(val: number) {\n this.value = val;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n const items = Array.from({ length: 11 }, (_, i) => i);\n return html`\n <div>\n <div class=\"nps-scale\">\n ${items.map(\n (n) => html`\n <button\n type=\"button\"\n aria-label=\"Score ${n}\"\n aria-pressed=${this.value === n ? 'true' : 'false'}\n @click=${() => this._select(n)}\n >${n}</button>\n `\n )}\n </div>\n <div class=\"labels\">\n <span>${this.lowLabel}</span>\n <span>${this.highLabel}</span>\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-nps-input', NpsInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class RatingInput extends LitElement {\n static override properties = {\n max: { type: Number },\n value: { type: Number },\n };\n\n static override styles = css`\n :host { display: block; }\n .rating-row {\n display: flex;\n gap: 8px;\n justify-content: center;\n padding: 12px 0;\n }\n button {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: transform 0.1s, border-color 0.15s, background 0.15s;\n }\n button:hover {\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"],\n button.selected {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary, #4f46e5);\n color: #fff;\n }\n `;\n\n max: number = 5;\n value: number | undefined;\n\n private _select(val: number) {\n this.value = val;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n const count = this.max || 5;\n const items = Array.from({ length: count }, (_, i) => i + 1);\n return html`\n <div class=\"rating-row\">\n ${items.map(\n (n) => html`\n <button\n type=\"button\"\n aria-label=\"Rate ${n} of ${count}\"\n aria-pressed=${this.value === n ? 'true' : 'false'}\n class=${this.value === n ? 'selected' : ''}\n @click=${() => this._select(n)}\n >${n}</button>\n `\n )}\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-rating-input', RatingInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class TextInput extends LitElement {\n static override properties = {\n placeholder: { type: String },\n value: { type: String },\n required: { type: Boolean },\n };\n\n static override styles = css`\n :host { display: block; }\n .text-wrap {\n padding: 8px 0;\n }\n textarea {\n width: 100%;\n min-height: 80px;\n padding: 10px 12px;\n border-radius: 8px;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n color: var(--sc-content-text-color, #111827);\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n box-sizing: border-box;\n transition: border-color 0.15s;\n }\n textarea:focus {\n outline: none;\n border-color: var(--sc-color-primary, #4f46e5);\n }\n textarea::placeholder {\n color: var(--sc-content-text-secondary-color, #9ca3af);\n }\n .submit-row {\n display: flex;\n justify-content: flex-end;\n padding-top: 8px;\n }\n button {\n padding: 8px 20px;\n border-radius: 8px;\n border: none;\n background: var(--sc-color-primary, #4f46e5);\n color: #fff;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.15s;\n }\n button:hover { opacity: 0.9; }\n button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n `;\n\n placeholder: string = '';\n value: string = '';\n required: boolean = true;\n\n private _currentText = '';\n\n private _handleInput = (e: Event) => {\n this._currentText = (e.target as HTMLTextAreaElement).value;\n this.requestUpdate();\n };\n\n private _submit = () => {\n if (this.required && !this._currentText.trim()) return;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: this._currentText },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n override connectedCallback() {\n super.connectedCallback();\n this._currentText = this.value || '';\n }\n\n override render() {\n const canSubmit = !this.required || this._currentText.trim().length > 0;\n return html`\n <div class=\"text-wrap\">\n <textarea\n .value=${this._currentText}\n placeholder=${this.placeholder || 'Type your answer...'}\n @input=${this._handleInput}\n ></textarea>\n <div class=\"submit-row\">\n <button type=\"button\" ?disabled=${!canSubmit} @click=${this._submit}>\n Submit\n </button>\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-text-input', TextInput);\n", "import { css, html, LitElement } from 'lit';\n\nexport class ThumbsInput extends LitElement {\n static override properties = {\n value: { type: Number },\n };\n\n static override styles = css`\n :host { display: block; }\n .thumbs-row {\n display: flex;\n gap: 16px;\n justify-content: center;\n padding: 12px 0;\n }\n button {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n border: 2px solid var(--sc-content-border-color, #e5e7eb);\n background: var(--sc-content-bg-color, #fff);\n font-size: 28px;\n cursor: pointer;\n transition: transform 0.15s, border-color 0.15s, background 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n button:hover {\n transform: scale(1.1);\n border-color: var(--sc-color-primary, #4f46e5);\n }\n button[aria-pressed=\"true\"] {\n border-color: var(--sc-color-primary, #4f46e5);\n background: var(--sc-color-primary-light, #eef2ff);\n }\n `;\n\n value: number | undefined;\n\n private _select(val: number) {\n this.value = val;\n this.dispatchEvent(\n new CustomEvent('step-answer', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n return html`\n <div class=\"thumbs-row\">\n <button\n type=\"button\"\n aria-label=\"Thumbs up\"\n aria-pressed=${this.value === 1 ? 'true' : 'false'}\n @click=${() => this._select(1)}\n >\\u{1F44D}</button>\n <button\n type=\"button\"\n aria-label=\"Thumbs down\"\n aria-pressed=${this.value === 0 ? 'true' : 'false'}\n @click=${() => this._select(0)}\n >\\u{1F44E}</button>\n </div>\n `;\n }\n}\n\ncustomElements.define('sf-thumbs-input', ThumbsInput);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "css", "html", "LitElement", "LitElement", "html", "css"]
|
|
7
|
-
}
|