@syntrologie/adapt-feedback 2.8.0-canary.239
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 +47 -0
- package/dist/FeedbackWidget.d.ts.map +1 -0
- package/dist/FeedbackWidget.js +9 -0
- package/dist/FeedbackWidget.js.map +7 -0
- package/dist/cdn.d.ts +43 -0
- package/dist/cdn.d.ts.map +1 -0
- package/dist/chunk-3TUS6XVJ.js +880 -0
- package/dist/chunk-3TUS6XVJ.js.map +7 -0
- package/dist/editor-lit.d.ts +31 -0
- package/dist/editor-lit.d.ts.map +1 -0
- package/dist/editor-lit.js +249 -0
- package/dist/editor-lit.js.map +7 -0
- package/dist/engine/FlowEngine.d.ts +25 -0
- package/dist/engine/FlowEngine.d.ts.map +1 -0
- package/dist/rendering/ChoiceInput.d.ts +17 -0
- package/dist/rendering/ChoiceInput.d.ts.map +1 -0
- package/dist/rendering/EndScreen.d.ts +12 -0
- package/dist/rendering/EndScreen.d.ts.map +1 -0
- package/dist/rendering/NpsInput.d.ts +21 -0
- package/dist/rendering/NpsInput.d.ts.map +1 -0
- package/dist/rendering/RatingInput.d.ts +17 -0
- package/dist/rendering/RatingInput.d.ts.map +1 -0
- package/dist/rendering/TextInput.d.ts +24 -0
- package/dist/rendering/TextInput.d.ts.map +1 -0
- package/dist/rendering/ThumbsInput.d.ts +13 -0
- package/dist/rendering/ThumbsInput.d.ts.map +1 -0
- package/dist/runtime.d.ts +20 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +29 -0
- package/dist/runtime.js.map +7 -0
- package/dist/schema.d.ts +319 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +100 -0
- package/dist/schema.js.map +7 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +76 -0
|
@@ -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\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
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
type AppConfig = Record<string, unknown>;
|
|
3
|
+
export declare class FeedbackEditorLit extends LitElement {
|
|
4
|
+
static properties: {
|
|
5
|
+
config: {
|
|
6
|
+
attribute: boolean;
|
|
7
|
+
};
|
|
8
|
+
onChange: {
|
|
9
|
+
attribute: boolean;
|
|
10
|
+
};
|
|
11
|
+
_expandedStep: {
|
|
12
|
+
state: boolean;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
config: AppConfig | undefined;
|
|
16
|
+
onChange: ((updated: AppConfig) => void) | undefined;
|
|
17
|
+
private _emittedDirty;
|
|
18
|
+
private _expandedStep;
|
|
19
|
+
createRenderRoot(): this;
|
|
20
|
+
private get _cfg();
|
|
21
|
+
private get _steps();
|
|
22
|
+
private _emitChange;
|
|
23
|
+
private _updateStep;
|
|
24
|
+
private _addStep;
|
|
25
|
+
private _removeStep;
|
|
26
|
+
private _navigateHome;
|
|
27
|
+
private _renderStepCard;
|
|
28
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=editor-lit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-lit.d.ts","sourceRoot":"","sources":["../src/editor-lit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAW,MAAM,KAAK,CAAC;AAIhD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAezC,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,OAAgB,UAAU;;;;;;;;;;MAIxB;IAEF,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAErD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAoB;IAEhC,gBAAgB;IAIzB,OAAO,KAAK,IAAI,GAEf;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,QAAQ,CAUd;IAEF,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,eAAe;IAmJd,MAAM;CA6DhB"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// src/editor-lit.ts
|
|
2
|
+
import { html, LitElement, nothing } from "lit";
|
|
3
|
+
var STEP_TYPES = [
|
|
4
|
+
{ value: "thumbs", label: "Thumbs Up/Down" },
|
|
5
|
+
{ value: "rating", label: "Rating Scale" },
|
|
6
|
+
{ value: "nps", label: "NPS (0\u201310)" },
|
|
7
|
+
{ value: "choice", label: "Multiple Choice" },
|
|
8
|
+
{ value: "text", label: "Free Text" },
|
|
9
|
+
{ value: "end", label: "End Screen" }
|
|
10
|
+
];
|
|
11
|
+
function generateStepId(index) {
|
|
12
|
+
return `step-${index + 1}`;
|
|
13
|
+
}
|
|
14
|
+
var FeedbackEditorLit = class extends LitElement {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this._emittedDirty = false;
|
|
18
|
+
this._expandedStep = 0;
|
|
19
|
+
this._addStep = () => {
|
|
20
|
+
const steps = [...this._steps];
|
|
21
|
+
const newStep = {
|
|
22
|
+
id: generateStepId(steps.length),
|
|
23
|
+
type: "thumbs",
|
|
24
|
+
prompt: ""
|
|
25
|
+
};
|
|
26
|
+
steps.push(newStep);
|
|
27
|
+
this._expandedStep = steps.length - 1;
|
|
28
|
+
this._emitChange({ steps });
|
|
29
|
+
};
|
|
30
|
+
this._navigateHome = () => {
|
|
31
|
+
this.dispatchEvent(new CustomEvent("navigate-home", { bubbles: true, composed: true }));
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
createRenderRoot() {
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
get _cfg() {
|
|
38
|
+
return this.config ?? {};
|
|
39
|
+
}
|
|
40
|
+
get _steps() {
|
|
41
|
+
return this._cfg.steps ?? [];
|
|
42
|
+
}
|
|
43
|
+
_emitChange(next) {
|
|
44
|
+
this.onChange?.({ ...this._cfg, ...next });
|
|
45
|
+
if (!this._emittedDirty) {
|
|
46
|
+
this._emittedDirty = true;
|
|
47
|
+
this.dispatchEvent(
|
|
48
|
+
new CustomEvent("dirty-change", { detail: { dirty: true }, bubbles: true, composed: true })
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
_updateStep(index, patch) {
|
|
53
|
+
const steps = [...this._steps];
|
|
54
|
+
steps[index] = { ...steps[index], ...patch };
|
|
55
|
+
this._emitChange({ steps });
|
|
56
|
+
}
|
|
57
|
+
_removeStep(index) {
|
|
58
|
+
const steps = this._steps.filter((_, i) => i !== index);
|
|
59
|
+
this._expandedStep = null;
|
|
60
|
+
this._emitChange({ steps });
|
|
61
|
+
}
|
|
62
|
+
_renderStepCard(step, index) {
|
|
63
|
+
const expanded = this._expandedStep === index;
|
|
64
|
+
const stepIds = this._steps.map((s) => s.id).filter((id) => id !== step.id);
|
|
65
|
+
return html`
|
|
66
|
+
<div class="se-border se-border-input-field-border se-rounded-lg se-mb-2">
|
|
67
|
+
<div
|
|
68
|
+
class="se-flex se-items-center se-gap-2 se-px-3 se-py-2 se-cursor-pointer"
|
|
69
|
+
@click=${() => {
|
|
70
|
+
this._expandedStep = expanded ? null : index;
|
|
71
|
+
this.requestUpdate();
|
|
72
|
+
}}
|
|
73
|
+
>
|
|
74
|
+
<span class="se-text-xs se-text-text-secondary se-font-mono">${step.id}</span>
|
|
75
|
+
<span class="se-text-xs se-text-text-secondary">·</span>
|
|
76
|
+
<span class="se-text-sm se-text-text-primary se-flex-1 se-truncate">${step.prompt || "(no prompt)"}</span>
|
|
77
|
+
<span class="se-text-xs se-text-text-secondary">${expanded ? "\u25BE" : "\u25B8"}</span>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
${expanded ? html`
|
|
81
|
+
<div class="se-px-3 se-pb-3 se-border-t se-border-input-field-border">
|
|
82
|
+
<label class="se-block se-mt-2 se-mb-2">
|
|
83
|
+
<span class="se-block se-text-xs se-text-text-secondary se-mb-1">Step ID</span>
|
|
84
|
+
<input
|
|
85
|
+
type="text"
|
|
86
|
+
.value=${step.id}
|
|
87
|
+
class="se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm"
|
|
88
|
+
@input=${(e) => this._updateStep(index, { id: e.target.value })}
|
|
89
|
+
/>
|
|
90
|
+
</label>
|
|
91
|
+
|
|
92
|
+
<label class="se-block se-mb-2">
|
|
93
|
+
<span class="se-block se-text-xs se-text-text-secondary se-mb-1">Type</span>
|
|
94
|
+
<select
|
|
95
|
+
class="se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm"
|
|
96
|
+
@change=${(e) => this._updateStep(index, {
|
|
97
|
+
type: e.target.value
|
|
98
|
+
})}
|
|
99
|
+
>
|
|
100
|
+
${STEP_TYPES.map(
|
|
101
|
+
(t) => html`<option value=${t.value} ?selected=${step.type === t.value}>${t.label}</option>`
|
|
102
|
+
)}
|
|
103
|
+
</select>
|
|
104
|
+
</label>
|
|
105
|
+
|
|
106
|
+
<label class="se-block se-mb-2">
|
|
107
|
+
<span class="se-block se-text-xs se-text-text-secondary se-mb-1">
|
|
108
|
+
${step.type === "end" ? "Thank-you message" : "Prompt"}
|
|
109
|
+
</span>
|
|
110
|
+
<textarea
|
|
111
|
+
.value=${step.prompt}
|
|
112
|
+
rows="2"
|
|
113
|
+
class="se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-resize-none"
|
|
114
|
+
@input=${(e) => this._updateStep(index, { prompt: e.target.value })}
|
|
115
|
+
></textarea>
|
|
116
|
+
</label>
|
|
117
|
+
|
|
118
|
+
${step.type === "choice" ? html`
|
|
119
|
+
<label class="se-block se-mb-2">
|
|
120
|
+
<span class="se-block se-text-xs se-text-text-secondary se-mb-1">Options (one per line)</span>
|
|
121
|
+
<textarea
|
|
122
|
+
.value=${(step.options ?? []).join("\n")}
|
|
123
|
+
rows="3"
|
|
124
|
+
class="se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-resize-none"
|
|
125
|
+
@input=${(e) => this._updateStep(index, {
|
|
126
|
+
options: e.target.value.split("\n").filter(Boolean)
|
|
127
|
+
})}
|
|
128
|
+
></textarea>
|
|
129
|
+
</label>
|
|
130
|
+
` : nothing}
|
|
131
|
+
|
|
132
|
+
${step.type === "rating" ? html`
|
|
133
|
+
<label class="se-block se-mb-2">
|
|
134
|
+
<span class="se-block se-text-xs se-text-text-secondary se-mb-1">Scale max</span>
|
|
135
|
+
<select
|
|
136
|
+
class="se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm"
|
|
137
|
+
@change=${(e) => this._updateStep(index, {
|
|
138
|
+
ratingMax: Number(e.target.value)
|
|
139
|
+
})}
|
|
140
|
+
>
|
|
141
|
+
${[3, 5, 10].map(
|
|
142
|
+
(n) => html`<option value=${n} ?selected=${(step.ratingMax ?? 5) === n}>${n}</option>`
|
|
143
|
+
)}
|
|
144
|
+
</select>
|
|
145
|
+
</label>
|
|
146
|
+
` : nothing}
|
|
147
|
+
|
|
148
|
+
${step.type !== "end" ? html`
|
|
149
|
+
<label class="se-block se-mb-2">
|
|
150
|
+
<span class="se-block se-text-xs se-text-text-secondary se-mb-1">Next step</span>
|
|
151
|
+
<select
|
|
152
|
+
class="se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm"
|
|
153
|
+
@change=${(e) => {
|
|
154
|
+
const val = e.target.value;
|
|
155
|
+
this._updateStep(index, {
|
|
156
|
+
next: val === "__continue__" ? void 0 : val
|
|
157
|
+
});
|
|
158
|
+
}}
|
|
159
|
+
>
|
|
160
|
+
<option value="__continue__" ?selected=${!step.next}>Continue to next</option>
|
|
161
|
+
${stepIds.map(
|
|
162
|
+
(sid) => html`<option value=${sid} ?selected=${step.next === sid}>${sid}</option>`
|
|
163
|
+
)}
|
|
164
|
+
</select>
|
|
165
|
+
</label>
|
|
166
|
+
` : nothing}
|
|
167
|
+
|
|
168
|
+
<button
|
|
169
|
+
type="button"
|
|
170
|
+
class="se-mt-1 se-text-xs se-text-red-500 se-cursor-pointer se-bg-transparent se-border-none se-p-0"
|
|
171
|
+
@click=${() => this._removeStep(index)}
|
|
172
|
+
>Remove step</button>
|
|
173
|
+
</div>
|
|
174
|
+
` : nothing}
|
|
175
|
+
</div>
|
|
176
|
+
`;
|
|
177
|
+
}
|
|
178
|
+
render() {
|
|
179
|
+
return html`
|
|
180
|
+
<div class="se-flex se-flex-col se-h-full se-font-sans">
|
|
181
|
+
<div class="se-px-4 se-pt-3 se-pb-1 se-flex se-items-center se-gap-3">
|
|
182
|
+
<button
|
|
183
|
+
type="button"
|
|
184
|
+
@click=${this._navigateHome}
|
|
185
|
+
class="se-py-1.5 se-px-3 se-rounded-md se-border-none se-bg-card-bg se-text-text-primary se-text-sm se-cursor-pointer"
|
|
186
|
+
>← Back</button>
|
|
187
|
+
<div class="se-flex se-flex-col">
|
|
188
|
+
<h2 class="se-m-0 se-text-base se-font-semibold se-text-text-primary">Feedback Survey</h2>
|
|
189
|
+
<p class="se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary">Configure survey steps and branching</p>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<div class="se-flex-1 se-overflow-auto se-px-4 se-py-3">
|
|
194
|
+
<div class="se-mb-4">
|
|
195
|
+
<div class="se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3">Settings</div>
|
|
196
|
+
<label class="se-block se-mb-3">
|
|
197
|
+
<span class="se-block se-text-xs se-text-text-secondary se-mb-1">Survey Title</span>
|
|
198
|
+
<input
|
|
199
|
+
type="text"
|
|
200
|
+
.value=${this._cfg.title ?? ""}
|
|
201
|
+
placeholder="Quick Feedback"
|
|
202
|
+
class="se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm"
|
|
203
|
+
@input=${(e) => this._emitChange({ title: e.target.value })}
|
|
204
|
+
/>
|
|
205
|
+
</label>
|
|
206
|
+
<div class="se-flex se-gap-4 se-mb-3">
|
|
207
|
+
<label class="se-flex se-items-center se-gap-2 se-text-sm se-text-text-primary">
|
|
208
|
+
<input
|
|
209
|
+
type="checkbox"
|
|
210
|
+
.checked=${this._cfg.showProgress !== false}
|
|
211
|
+
@change=${(e) => this._emitChange({ showProgress: e.target.checked })}
|
|
212
|
+
/>
|
|
213
|
+
Show progress
|
|
214
|
+
</label>
|
|
215
|
+
<label class="se-flex se-items-center se-gap-2 se-text-sm se-text-text-primary">
|
|
216
|
+
<input
|
|
217
|
+
type="checkbox"
|
|
218
|
+
.checked=${this._cfg.allowBack === true}
|
|
219
|
+
@change=${(e) => this._emitChange({ allowBack: e.target.checked })}
|
|
220
|
+
/>
|
|
221
|
+
Allow back
|
|
222
|
+
</label>
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
<div class="se-mb-4">
|
|
227
|
+
<div class="se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3">Steps</div>
|
|
228
|
+
${this._steps.map((step, i) => this._renderStepCard(step, i))}
|
|
229
|
+
<button
|
|
230
|
+
type="button"
|
|
231
|
+
class="se-w-full se-py-2 se-rounded-md se-border se-border-dashed se-border-input-field-border se-bg-transparent se-text-text-secondary se-text-sm se-cursor-pointer"
|
|
232
|
+
@click=${this._addStep}
|
|
233
|
+
>+ Add step</button>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
`;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
FeedbackEditorLit.properties = {
|
|
241
|
+
config: { attribute: false },
|
|
242
|
+
onChange: { attribute: false },
|
|
243
|
+
_expandedStep: { state: true }
|
|
244
|
+
};
|
|
245
|
+
customElements.define("se-feedback-editor", FeedbackEditorLit);
|
|
246
|
+
export {
|
|
247
|
+
FeedbackEditorLit
|
|
248
|
+
};
|
|
249
|
+
//# sourceMappingURL=editor-lit.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/editor-lit.ts"],
|
|
4
|
+
"sourcesContent": ["import { html, LitElement, nothing } from 'lit';\n\nimport type { FeedbackConfig, StepType, SurveyStep } from './types.js';\n\ntype AppConfig = Record<string, unknown>;\n\nconst STEP_TYPES: { value: StepType; label: string }[] = [\n { value: 'thumbs', label: 'Thumbs Up/Down' },\n { value: 'rating', label: 'Rating Scale' },\n { value: 'nps', label: 'NPS (0\u201310)' },\n { value: 'choice', label: 'Multiple Choice' },\n { value: 'text', label: 'Free Text' },\n { value: 'end', label: 'End Screen' },\n];\n\nfunction generateStepId(index: number): string {\n return `step-${index + 1}`;\n}\n\nexport class FeedbackEditorLit extends LitElement {\n static override properties = {\n config: { attribute: false },\n onChange: { attribute: false },\n _expandedStep: { state: true },\n };\n\n config: AppConfig | undefined;\n onChange: ((updated: AppConfig) => void) | undefined;\n\n private _emittedDirty = false;\n private _expandedStep: number | null = 0;\n\n override createRenderRoot() {\n return this;\n }\n\n private get _cfg(): Partial<FeedbackConfig> {\n return (this.config ?? {}) as Partial<FeedbackConfig>;\n }\n\n private get _steps(): SurveyStep[] {\n return this._cfg.steps ?? [];\n }\n\n private _emitChange(next: Partial<FeedbackConfig>) {\n this.onChange?.({ ...this._cfg, ...next } as AppConfig);\n if (!this._emittedDirty) {\n this._emittedDirty = true;\n this.dispatchEvent(\n new CustomEvent('dirty-change', { detail: { dirty: true }, bubbles: true, composed: true })\n );\n }\n }\n\n private _updateStep(index: number, patch: Partial<SurveyStep>) {\n const steps = [...this._steps];\n steps[index] = { ...steps[index], ...patch };\n this._emitChange({ steps });\n }\n\n private _addStep = () => {\n const steps = [...this._steps];\n const newStep: SurveyStep = {\n id: generateStepId(steps.length),\n type: 'thumbs',\n prompt: '',\n };\n steps.push(newStep);\n this._expandedStep = steps.length - 1;\n this._emitChange({ steps });\n };\n\n private _removeStep(index: number) {\n const steps = this._steps.filter((_, i) => i !== index);\n this._expandedStep = null;\n this._emitChange({ steps });\n }\n\n private _navigateHome = () => {\n this.dispatchEvent(new CustomEvent('navigate-home', { bubbles: true, composed: true }));\n };\n\n private _renderStepCard(step: SurveyStep, index: number) {\n const expanded = this._expandedStep === index;\n const stepIds = this._steps.map((s) => s.id).filter((id) => id !== step.id);\n\n return html`\n <div class=\"se-border se-border-input-field-border se-rounded-lg se-mb-2\">\n <div\n class=\"se-flex se-items-center se-gap-2 se-px-3 se-py-2 se-cursor-pointer\"\n @click=${() => {\n this._expandedStep = expanded ? null : index;\n this.requestUpdate();\n }}\n >\n <span class=\"se-text-xs se-text-text-secondary se-font-mono\">${step.id}</span>\n <span class=\"se-text-xs se-text-text-secondary\">\u00B7</span>\n <span class=\"se-text-sm se-text-text-primary se-flex-1 se-truncate\">${step.prompt || '(no prompt)'}</span>\n <span class=\"se-text-xs se-text-text-secondary\">${expanded ? '\u25BE' : '\u25B8'}</span>\n </div>\n\n ${\n expanded\n ? html`\n <div class=\"se-px-3 se-pb-3 se-border-t se-border-input-field-border\">\n <label class=\"se-block se-mt-2 se-mb-2\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Step ID</span>\n <input\n type=\"text\"\n .value=${step.id}\n class=\"se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm\"\n @input=${(e: Event) =>\n this._updateStep(index, { id: (e.target as HTMLInputElement).value })}\n />\n </label>\n\n <label class=\"se-block se-mb-2\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Type</span>\n <select\n class=\"se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm\"\n @change=${(e: Event) =>\n this._updateStep(index, {\n type: (e.target as HTMLSelectElement).value as StepType,\n })}\n >\n ${STEP_TYPES.map(\n (t) =>\n html`<option value=${t.value} ?selected=${step.type === t.value}>${t.label}</option>`\n )}\n </select>\n </label>\n\n <label class=\"se-block se-mb-2\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">\n ${step.type === 'end' ? 'Thank-you message' : 'Prompt'}\n </span>\n <textarea\n .value=${step.prompt}\n rows=\"2\"\n class=\"se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-resize-none\"\n @input=${(e: Event) =>\n this._updateStep(index, { prompt: (e.target as HTMLTextAreaElement).value })}\n ></textarea>\n </label>\n\n ${\n step.type === 'choice'\n ? html`\n <label class=\"se-block se-mb-2\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Options (one per line)</span>\n <textarea\n .value=${(step.options ?? []).join('\\n')}\n rows=\"3\"\n class=\"se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-resize-none\"\n @input=${(e: Event) =>\n this._updateStep(index, {\n options: (e.target as HTMLTextAreaElement).value\n .split('\\n')\n .filter(Boolean),\n })}\n ></textarea>\n </label>\n `\n : nothing\n }\n\n ${\n step.type === 'rating'\n ? html`\n <label class=\"se-block se-mb-2\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Scale max</span>\n <select\n class=\"se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm\"\n @change=${(e: Event) =>\n this._updateStep(index, {\n ratingMax: Number((e.target as HTMLSelectElement).value) as\n | 3\n | 5\n | 10,\n })}\n >\n ${[3, 5, 10].map(\n (n) =>\n html`<option value=${n} ?selected=${(step.ratingMax ?? 5) === n}>${n}</option>`\n )}\n </select>\n </label>\n `\n : nothing\n }\n\n ${\n step.type !== 'end'\n ? html`\n <label class=\"se-block se-mb-2\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Next step</span>\n <select\n class=\"se-w-full se-py-1.5 se-px-2 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm\"\n @change=${(e: Event) => {\n const val = (e.target as HTMLSelectElement).value;\n this._updateStep(index, {\n next: val === '__continue__' ? undefined : val,\n });\n }}\n >\n <option value=\"__continue__\" ?selected=${!step.next}>Continue to next</option>\n ${stepIds.map(\n (sid) =>\n html`<option value=${sid} ?selected=${step.next === sid}>${sid}</option>`\n )}\n </select>\n </label>\n `\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"se-mt-1 se-text-xs se-text-red-500 se-cursor-pointer se-bg-transparent se-border-none se-p-0\"\n @click=${() => this._removeStep(index)}\n >Remove step</button>\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n override render() {\n return html`\n <div class=\"se-flex se-flex-col se-h-full se-font-sans\">\n <div class=\"se-px-4 se-pt-3 se-pb-1 se-flex se-items-center se-gap-3\">\n <button\n type=\"button\"\n @click=${this._navigateHome}\n class=\"se-py-1.5 se-px-3 se-rounded-md se-border-none se-bg-card-bg se-text-text-primary se-text-sm se-cursor-pointer\"\n >\u2190 Back</button>\n <div class=\"se-flex se-flex-col\">\n <h2 class=\"se-m-0 se-text-base se-font-semibold se-text-text-primary\">Feedback Survey</h2>\n <p class=\"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary\">Configure survey steps and branching</p>\n </div>\n </div>\n\n <div class=\"se-flex-1 se-overflow-auto se-px-4 se-py-3\">\n <div class=\"se-mb-4\">\n <div class=\"se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3\">Settings</div>\n <label class=\"se-block se-mb-3\">\n <span class=\"se-block se-text-xs se-text-text-secondary se-mb-1\">Survey Title</span>\n <input\n type=\"text\"\n .value=${this._cfg.title ?? ''}\n placeholder=\"Quick Feedback\"\n class=\"se-w-full se-py-2 se-px-3 se-rounded-md se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm\"\n @input=${(e: Event) => this._emitChange({ title: (e.target as HTMLInputElement).value })}\n />\n </label>\n <div class=\"se-flex se-gap-4 se-mb-3\">\n <label class=\"se-flex se-items-center se-gap-2 se-text-sm se-text-text-primary\">\n <input\n type=\"checkbox\"\n .checked=${this._cfg.showProgress !== false}\n @change=${(e: Event) => this._emitChange({ showProgress: (e.target as HTMLInputElement).checked })}\n />\n Show progress\n </label>\n <label class=\"se-flex se-items-center se-gap-2 se-text-sm se-text-text-primary\">\n <input\n type=\"checkbox\"\n .checked=${this._cfg.allowBack === true}\n @change=${(e: Event) => this._emitChange({ allowBack: (e.target as HTMLInputElement).checked })}\n />\n Allow back\n </label>\n </div>\n </div>\n\n <div class=\"se-mb-4\">\n <div class=\"se-text-xs se-font-semibold se-text-text-secondary se-uppercase se-tracking-wide se-mb-3\">Steps</div>\n ${this._steps.map((step, i) => this._renderStepCard(step, i))}\n <button\n type=\"button\"\n class=\"se-w-full se-py-2 se-rounded-md se-border se-border-dashed se-border-input-field-border se-bg-transparent se-text-text-secondary se-text-sm se-cursor-pointer\"\n @click=${this._addStep}\n >+ Add step</button>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ncustomElements.define('se-feedback-editor', FeedbackEditorLit);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SurveyStep } from '../types';
|
|
2
|
+
export declare class FlowEngineValidationError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class FlowEngine {
|
|
6
|
+
private _steps;
|
|
7
|
+
private _stepMap;
|
|
8
|
+
private _answers;
|
|
9
|
+
private _path;
|
|
10
|
+
constructor(steps: SurveyStep[]);
|
|
11
|
+
get currentStep(): SurveyStep;
|
|
12
|
+
get answers(): ReadonlyMap<string, string | number>;
|
|
13
|
+
get path(): readonly string[];
|
|
14
|
+
get isComplete(): boolean;
|
|
15
|
+
get stepsCompleted(): number;
|
|
16
|
+
get stepIndex(): number;
|
|
17
|
+
getStep(id: string): SurveyStep | undefined;
|
|
18
|
+
answer(value: string | number): void;
|
|
19
|
+
goBack(): void;
|
|
20
|
+
private _resolveNext;
|
|
21
|
+
private _nextInArray;
|
|
22
|
+
private _evaluateRule;
|
|
23
|
+
private _validate;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=FlowEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowEngine.d.ts","sourceRoot":"","sources":["../../src/engine/FlowEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,UAAU,CAAC;AAEvD,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,KAAK,CAAW;gBAEZ,KAAK,EAAE,UAAU,EAAE;IAO/B,IAAI,WAAW,IAAI,UAAU,CAG5B;IAED,IAAI,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAElD;IAED,IAAI,IAAI,IAAI,SAAS,MAAM,EAAE,CAE5B;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI3C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYpC,MAAM,IAAI,IAAI;IAKd,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,SAAS;CA2ClB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class ChoiceInput extends LitElement {
|
|
3
|
+
static properties: {
|
|
4
|
+
options: {
|
|
5
|
+
attribute: boolean;
|
|
6
|
+
};
|
|
7
|
+
value: {
|
|
8
|
+
type: StringConstructor;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
static styles: import("lit").CSSResult;
|
|
12
|
+
options: string[];
|
|
13
|
+
value: string | undefined;
|
|
14
|
+
private _select;
|
|
15
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ChoiceInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChoiceInput.d.ts","sourceRoot":"","sources":["../../src/rendering/ChoiceInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAE5C,qBAAa,WAAY,SAAQ,UAAU;IACzC,OAAgB,UAAU;;;;;;;MAGxB;IAEF,OAAgB,MAAM,0BAoDpB;IAEF,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1B,OAAO,CAAC,OAAO;IAWN,MAAM;CAmBhB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class EndScreen extends LitElement {
|
|
3
|
+
static properties: {
|
|
4
|
+
message: {
|
|
5
|
+
type: StringConstructor;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
static styles: import("lit").CSSResult;
|
|
9
|
+
message: string;
|
|
10
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=EndScreen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EndScreen.d.ts","sourceRoot":"","sources":["../../src/rendering/EndScreen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAE5C,qBAAa,SAAU,SAAQ,UAAU;IACvC,OAAgB,UAAU;;;;MAExB;IAEF,OAAgB,MAAM,0BA2BpB;IAEF,OAAO,EAAE,MAAM,CAAgB;IAEtB,MAAM;CAQhB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class NpsInput extends LitElement {
|
|
3
|
+
static properties: {
|
|
4
|
+
lowLabel: {
|
|
5
|
+
type: StringConstructor;
|
|
6
|
+
};
|
|
7
|
+
highLabel: {
|
|
8
|
+
type: StringConstructor;
|
|
9
|
+
};
|
|
10
|
+
value: {
|
|
11
|
+
type: NumberConstructor;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
static styles: import("lit").CSSResult;
|
|
15
|
+
lowLabel: string;
|
|
16
|
+
highLabel: string;
|
|
17
|
+
value: number | undefined;
|
|
18
|
+
private _select;
|
|
19
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=NpsInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpsInput.d.ts","sourceRoot":"","sources":["../../src/rendering/NpsInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAE5C,qBAAa,QAAS,SAAQ,UAAU;IACtC,OAAgB,UAAU;;;;;;;;;;MAIxB;IAEF,OAAgB,MAAM,0BAoCpB;IAEF,QAAQ,EAAE,MAAM,CAAgB;IAChC,SAAS,EAAE,MAAM,CAAiB;IAClC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1B,OAAO,CAAC,OAAO;IAWN,MAAM;CAuBhB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class RatingInput extends LitElement {
|
|
3
|
+
static properties: {
|
|
4
|
+
max: {
|
|
5
|
+
type: NumberConstructor;
|
|
6
|
+
};
|
|
7
|
+
value: {
|
|
8
|
+
type: NumberConstructor;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
static styles: import("lit").CSSResult;
|
|
12
|
+
max: number;
|
|
13
|
+
value: number | undefined;
|
|
14
|
+
private _select;
|
|
15
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=RatingInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RatingInput.d.ts","sourceRoot":"","sources":["../../src/rendering/RatingInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAE5C,qBAAa,WAAY,SAAQ,UAAU;IACzC,OAAgB,UAAU;;;;;;;MAGxB;IAEF,OAAgB,MAAM,0BA6BpB;IAEF,GAAG,EAAE,MAAM,CAAK;IAChB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1B,OAAO,CAAC,OAAO;IAWN,MAAM;CAmBhB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class TextInput extends LitElement {
|
|
3
|
+
static properties: {
|
|
4
|
+
placeholder: {
|
|
5
|
+
type: StringConstructor;
|
|
6
|
+
};
|
|
7
|
+
value: {
|
|
8
|
+
type: StringConstructor;
|
|
9
|
+
};
|
|
10
|
+
required: {
|
|
11
|
+
type: BooleanConstructor;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
static styles: import("lit").CSSResult;
|
|
15
|
+
placeholder: string;
|
|
16
|
+
value: string;
|
|
17
|
+
required: boolean;
|
|
18
|
+
private _currentText;
|
|
19
|
+
private _handleInput;
|
|
20
|
+
private _submit;
|
|
21
|
+
connectedCallback(): void;
|
|
22
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=TextInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../src/rendering/TextInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAE5C,qBAAa,SAAU,SAAQ,UAAU;IACvC,OAAgB,UAAU;;;;;;;;;;MAIxB;IAEF,OAAgB,MAAM,0BA+CpB;IAEF,WAAW,EAAE,MAAM,CAAM;IACzB,KAAK,EAAE,MAAM,CAAM;IACnB,QAAQ,EAAE,OAAO,CAAQ;IAEzB,OAAO,CAAC,YAAY,CAAM;IAE1B,OAAO,CAAC,YAAY,CAGlB;IAEF,OAAO,CAAC,OAAO,CASb;IAEO,iBAAiB;IAKjB,MAAM;CAiBhB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class ThumbsInput extends LitElement {
|
|
3
|
+
static properties: {
|
|
4
|
+
value: {
|
|
5
|
+
type: NumberConstructor;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
static styles: import("lit").CSSResult;
|
|
9
|
+
value: number | undefined;
|
|
10
|
+
private _select;
|
|
11
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ThumbsInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThumbsInput.d.ts","sourceRoot":"","sources":["../../src/rendering/ThumbsInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAE5C,qBAAa,WAAY,SAAQ,UAAU;IACzC,OAAgB,UAAU;;;;MAExB;IAEF,OAAgB,MAAM,0BA6BpB;IAEF,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1B,OAAO,CAAC,OAAO;IAWN,MAAM;CAkBhB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const runtime: {
|
|
2
|
+
id: string;
|
|
3
|
+
version: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
executors: never[];
|
|
7
|
+
widgets: {
|
|
8
|
+
id: string;
|
|
9
|
+
component: {
|
|
10
|
+
mount(container: HTMLElement, mountConfig?: Record<string, unknown>): () => void;
|
|
11
|
+
};
|
|
12
|
+
metadata: {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
icon: string;
|
|
16
|
+
};
|
|
17
|
+
}[];
|
|
18
|
+
};
|
|
19
|
+
export default runtime;
|
|
20
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;CAmBnB,CAAC;AAEF,eAAe,OAAO,CAAC"}
|