feedbackkit-web 1.0.42 → 1.0.45

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.
@@ -38,6 +38,8 @@ export interface IngestPayload {
38
38
  reporter_id?: string;
39
39
  /** `FeedbackKit.setUser(...)`, camelCase JSONB like `environment`. */
40
40
  reporter?: FeedbackUser;
41
+ /** "Notify me when it's fixed"; always sent, false unless the reporter opted in. */
42
+ notify_reporter: boolean;
41
43
  }
42
44
  export declare function blobToBase64(blob: Blob): Promise<string>;
43
45
  export declare function encodePayload(report: FeedbackReport, projectKey: string, identity?: {
@@ -105,6 +105,13 @@ export interface FeedbackReport {
105
105
  products: FeedbackProduct[];
106
106
  /** Recent console output / errors / failed requests (web only). Empty if log capture is off. */
107
107
  logs: FeedbackLogEntry[];
108
+ /**
109
+ * The reporter asked to hear back ("Notify me when it's fixed" in the
110
+ * composer's menu; off by default). The hosted service only shows fix
111
+ * updates and questions for this report in their browser when it's true.
112
+ * Mirrors Swift's `FeedbackReport.notifyReporter`.
113
+ */
114
+ notifyReporter?: boolean;
108
115
  }
109
116
  /** Brand colors for the widget, as hex strings (`#RRGGBB`). Mirrors Swift's `FeedbackTheme`. */
110
117
  export interface FeedbackTheme {
@@ -3,4 +3,4 @@
3
3
  * styles nor ours leak across. `:host { all: initial }` also blocks inherited
4
4
  * properties (font, color, line-height) from the page.
5
5
  */
6
- export declare const styles = "\n:host {\n all: initial;\n --fk-primary: #007aff;\n --fk-secondary: #6b7280;\n --fk-bg: #ffffff;\n --fk-surface: #f5f5f7;\n --fk-border: rgba(0, 0, 0, 0.1);\n --fk-text: #111114;\n --fk-muted: #6b6b73;\n --fk-danger: #d92d20;\n --fk-backdrop: rgba(10, 10, 14, 0.55);\n --fk-shadow: 0 24px 64px rgba(0, 0, 0, 0.28), 0 2px 8px rgba(0, 0, 0, 0.12);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n color: var(--fk-text);\n}\n@media (prefers-color-scheme: dark) {\n :host(:not([data-color-scheme=\"light\"])) {\n --fk-bg: #1c1c1f;\n --fk-surface: #26262a;\n --fk-border: rgba(255, 255, 255, 0.12);\n --fk-text: #f2f2f5;\n --fk-muted: #a0a0a8;\n --fk-backdrop: rgba(0, 0, 0, 0.65);\n }\n}\n:host([data-color-scheme=\"dark\"]) {\n --fk-bg: #1c1c1f;\n --fk-surface: #26262a;\n --fk-border: rgba(255, 255, 255, 0.12);\n --fk-text: #f2f2f5;\n --fk-muted: #a0a0a8;\n --fk-backdrop: rgba(0, 0, 0, 0.65);\n}\n*, *::before, *::after { box-sizing: border-box; }\nbutton { font: inherit; color: inherit; cursor: pointer; }\nbutton:disabled { cursor: not-allowed; opacity: 0.45; }\n:focus-visible { outline: 2px solid var(--fk-primary); outline-offset: 2px; }\n\n/* ---------- floating trigger ---------- */\n.fk-trigger {\n position: fixed;\n z-index: 2147483000;\n bottom: 20px;\n right: 20px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 44px;\n padding: 0 16px 0 14px;\n border: 0;\n border-radius: 22px;\n background: var(--fk-primary);\n color: #fff;\n font-weight: 600;\n font-size: 14px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.22);\n transition: transform 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;\n}\n.fk-trigger[data-position=\"bottom-left\"] { right: auto; left: 20px; }\n.fk-trigger:hover { transform: translateY(-1px); box-shadow: 0 10px 26px rgba(0, 0, 0, 0.26); }\n.fk-trigger[data-compact=\"true\"] { width: 48px; height: 48px; padding: 0; justify-content: center; border-radius: 24px; }\n.fk-trigger[data-compact=\"true\"] .fk-trigger-label { display: none; }\n.fk-trigger[aria-busy=\"true\"] { opacity: 0.6; pointer-events: none; }\n\n/* ---------- overlay ---------- */\n.fk-overlay {\n position: fixed;\n inset: 0;\n z-index: 2147483001;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: var(--fk-backdrop);\n animation: fk-fade 0.16s ease-out;\n}\n@keyframes fk-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes fk-rise { from { opacity: 0; transform: translateY(8px) scale(0.99); } to { opacity: 1; transform: none; } }\n.fk-dialog {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 340px;\n width: min(1180px, 100%);\n height: min(780px, 100%);\n overflow: hidden;\n border-radius: 16px;\n background: var(--fk-bg);\n box-shadow: var(--fk-shadow);\n animation: fk-rise 0.2s ease-out;\n}\n.fk-stage {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n background: var(--fk-surface);\n border-right: 1px solid var(--fk-border);\n}\n.fk-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border-bottom: 1px solid var(--fk-border);\n}\n.fk-toolbar-sep { width: 1px; height: 22px; margin: 0 6px; background: var(--fk-border); }\n.fk-tool {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--fk-muted);\n}\n.fk-tool:hover:not(:disabled) { background: var(--fk-border); color: var(--fk-text); }\n.fk-tool[aria-pressed=\"true\"] { background: var(--fk-primary); color: #fff; }\n.fk-swatch {\n width: 22px;\n height: 22px;\n margin: 0 2px;\n padding: 0;\n border-radius: 11px;\n border: 2px solid var(--fk-bg);\n box-shadow: 0 0 0 1px var(--fk-border);\n}\n.fk-swatch[aria-pressed=\"true\"] { box-shadow: 0 0 0 2px var(--fk-text); }\n/* Shrinks (with an ellipsis) instead of wrapping onto its own line: hints\n differ in length per tool, and a toolbar that changed height on every tool\n switch would make the screenshot below jump mid-annotation. */\n.fk-hint { flex: 1 1 0; min-width: 0; margin-left: auto; text-align: right; font-size: 12px; color: var(--fk-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.fk-canvas-wrap {\n position: relative;\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n overflow: hidden;\n}\n.fk-canvas-box { position: relative; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.18); border-radius: 6px; overflow: hidden; }\n.fk-canvas-box canvas { display: block; }\n.fk-canvas-box .fk-ink { position: absolute; inset: 0; touch-action: none; }\n.fk-stage[data-screenshot=\"off\"] .fk-canvas-box { opacity: 0.25; filter: grayscale(1); }\n.fk-stage[data-screenshot=\"off\"] .fk-toolbar button { pointer-events: none; opacity: 0.35; }\n.fk-off-note {\n position: absolute;\n inset: 0;\n display: none;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n color: var(--fk-muted);\n pointer-events: none;\n}\n.fk-stage[data-screenshot=\"off\"] .fk-off-note { display: flex; }\n.fk-text-input {\n position: absolute;\n z-index: 2;\n min-width: 120px;\n padding: 6px 8px;\n border: 2px solid var(--fk-primary);\n border-radius: 8px;\n background: var(--fk-bg);\n color: var(--fk-text);\n font: bold 14px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n outline: none;\n}\n\n/* ---------- composer ---------- */\n.fk-composer { display: flex; flex-direction: column; min-height: 0; padding: 18px; gap: 14px; overflow-y: auto; }\n.fk-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; }\n.fk-title { margin: 0; font-size: 17px; font-weight: 650; letter-spacing: -0.01em; }\n.fk-close { display: inline-flex; width: 30px; height: 30px; align-items: center; justify-content: center; border: 0; border-radius: 15px; background: var(--fk-surface); color: var(--fk-muted); }\n.fk-close:hover { color: var(--fk-text); }\n.fk-label { display: block; margin-bottom: 6px; font-size: 12px; font-weight: 600; color: var(--fk-muted); text-transform: uppercase; letter-spacing: 0.04em; }\n.fk-textarea {\n width: 100%;\n min-height: 140px;\n resize: vertical;\n padding: 10px 12px;\n border: 1px solid var(--fk-border);\n border-radius: 10px;\n background: var(--fk-bg);\n color: var(--fk-text);\n font: inherit;\n line-height: 1.45;\n}\n.fk-textarea:focus { outline: none; border-color: var(--fk-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--fk-primary) 22%, transparent); }\n.fk-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.fk-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n height: 28px;\n padding: 0 11px;\n border: 1px solid var(--fk-border);\n border-radius: 14px;\n background: var(--fk-bg);\n font-size: 13px;\n}\n.fk-chip[aria-pressed=\"true\"] { border-color: var(--fk-primary); background: color-mix(in srgb, var(--fk-primary) 12%, transparent); color: var(--fk-primary); font-weight: 600; }\n.fk-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n.fk-switch { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer; user-select: none; }\n.fk-switch input { position: absolute; opacity: 0; width: 0; height: 0; }\n.fk-switch-track { position: relative; width: 36px; height: 22px; border-radius: 11px; background: var(--fk-border); transition: background 0.15s; }\n.fk-switch-track::after { content: \"\"; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 9px; background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); transition: transform 0.15s; }\n.fk-switch input:checked + .fk-switch-track { background: var(--fk-primary); }\n.fk-switch input:checked + .fk-switch-track::after { transform: translateX(14px); }\n.fk-switch input:focus-visible + .fk-switch-track { outline: 2px solid var(--fk-primary); outline-offset: 2px; }\n.fk-attach {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 32px;\n padding: 0 12px;\n border: 1px dashed var(--fk-secondary);\n border-radius: 8px;\n background: transparent;\n color: var(--fk-secondary);\n font-size: 13px;\n}\n.fk-file { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 4px 6px 4px 10px; border-radius: 8px; background: var(--fk-surface); font-size: 12px; }\n.fk-file span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fk-file button { display: inline-flex; border: 0; background: transparent; color: var(--fk-muted); padding: 2px; }\n.fk-meta { font-size: 12px; color: var(--fk-muted); }\n.fk-meta details summary { cursor: pointer; }\n.fk-meta pre { max-height: 140px; overflow: auto; margin: 6px 0 0; padding: 8px; border-radius: 8px; background: var(--fk-surface); font-size: 11px; white-space: pre-wrap; word-break: break-word; }\n.fk-spacer { flex: 1; }\n.fk-actions { display: flex; gap: 8px; }\n.fk-btn {\n display: inline-flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n gap: 7px;\n height: 40px;\n border-radius: 10px;\n font-weight: 600;\n}\n.fk-btn-secondary { border: 1px solid var(--fk-border); background: transparent; color: var(--fk-secondary); }\n.fk-btn-primary { border: 0; background: var(--fk-primary); color: #fff; }\n.fk-btn-primary:hover:not(:disabled) { filter: brightness(1.06); }\n.fk-error { margin: 0; padding: 8px 10px; border-radius: 8px; background: color-mix(in srgb, var(--fk-danger) 12%, transparent); color: var(--fk-danger); font-size: 13px; }\n.fk-spinner { width: 16px; height: 16px; border: 2px solid rgba(255, 255, 255, 0.45); border-top-color: #fff; border-radius: 50%; animation: fk-spin 0.7s linear infinite; }\n@keyframes fk-spin { to { transform: rotate(360deg); } }\n.fk-done { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; flex: 1; text-align: center; }\n.fk-done-icon { display: inline-flex; width: 48px; height: 48px; align-items: center; justify-content: center; border-radius: 24px; background: var(--fk-primary); color: #fff; }\n.fk-done-icon svg { width: 26px; height: 26px; }\n.fk-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n\n/* ---------- \"is it fixed?\" card (fixCard.ts) ---------- */\n.fk-fixcard {\n position: fixed;\n z-index: 2147483000;\n right: 20px;\n bottom: 76px;\n width: min(360px, calc(100vw - 32px));\n max-height: min(640px, calc(100vh - 96px));\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px;\n border: 1px solid var(--fk-border);\n border-radius: 16px;\n background: var(--fk-bg);\n box-shadow: var(--fk-shadow);\n animation: fk-rise 0.2s ease-out;\n}\n.fk-fixcard[data-position=\"bottom-left\"] { right: auto; left: 20px; }\n.fk-fixcard > *, .fk-fixcard-actions > * { flex-shrink: 0; }\n.fk-fixcard p { margin: 0; }\n.fk-fixcard-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }\n.fk-fixcard-shot { display: block; width: 100%; max-height: 220px; object-fit: contain; border-radius: 10px; background: var(--fk-surface); }\n.fk-fixcard-quote { font-size: 14px; }\n.fk-fixcard-summary { font-size: 13px; padding: 8px 10px; border-radius: 8px; background: var(--fk-surface); }\n.fk-fixcard-message p { font-size: 13px; }\n.fk-fixcard-question { font-weight: 600; }\n.fk-fixcard-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }\n.fk-fixcard-actions .fk-btn { flex: none; width: 100%; }\n.fk-fixcard-actions .fk-textarea { min-height: 64px; }\n@keyframes fk-rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }\n\n/* ---------- narrow screens: stack stage over composer ---------- */\n@media (max-width: 760px) {\n .fk-overlay { padding: 0; }\n .fk-dialog { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr) auto; width: 100%; height: 100%; border-radius: 0; }\n .fk-stage { border-right: 0; border-bottom: 1px solid var(--fk-border); }\n .fk-hint { display: none; }\n .fk-canvas-wrap { padding: 10px; }\n .fk-composer { max-height: 55vh; padding: 14px; gap: 10px; }\n .fk-textarea { min-height: 84px; }\n .fk-fixcard, .fk-fixcard[data-position] { right: 16px; left: 16px; width: auto; bottom: 16px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .fk-overlay, .fk-dialog, .fk-fixcard { animation: none; }\n}\n";
6
+ export declare const styles = "\n:host {\n all: initial;\n --fk-primary: #007aff;\n --fk-secondary: #6b7280;\n --fk-bg: #ffffff;\n --fk-surface: #f5f5f7;\n --fk-border: rgba(0, 0, 0, 0.1);\n --fk-text: #111114;\n --fk-muted: #6b6b73;\n --fk-danger: #d92d20;\n --fk-backdrop: rgba(10, 10, 14, 0.55);\n --fk-shadow: 0 24px 64px rgba(0, 0, 0, 0.28), 0 2px 8px rgba(0, 0, 0, 0.12);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n color: var(--fk-text);\n}\n@media (prefers-color-scheme: dark) {\n :host(:not([data-color-scheme=\"light\"])) {\n --fk-bg: #1c1c1f;\n --fk-surface: #26262a;\n --fk-border: rgba(255, 255, 255, 0.12);\n --fk-text: #f2f2f5;\n --fk-muted: #a0a0a8;\n --fk-backdrop: rgba(0, 0, 0, 0.65);\n }\n}\n:host([data-color-scheme=\"dark\"]) {\n --fk-bg: #1c1c1f;\n --fk-surface: #26262a;\n --fk-border: rgba(255, 255, 255, 0.12);\n --fk-text: #f2f2f5;\n --fk-muted: #a0a0a8;\n --fk-backdrop: rgba(0, 0, 0, 0.65);\n}\n*, *::before, *::after { box-sizing: border-box; }\nbutton { font: inherit; color: inherit; cursor: pointer; }\nbutton:disabled { cursor: not-allowed; opacity: 0.45; }\n:focus-visible { outline: 2px solid var(--fk-primary); outline-offset: 2px; }\n\n/* ---------- floating trigger ---------- */\n.fk-trigger {\n position: fixed;\n z-index: 2147483000;\n bottom: 20px;\n right: 20px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 44px;\n padding: 0 16px 0 14px;\n border: 0;\n border-radius: 22px;\n background: var(--fk-primary);\n color: #fff;\n font-weight: 600;\n font-size: 14px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.22);\n transition: transform 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;\n}\n.fk-trigger[data-position=\"bottom-left\"] { right: auto; left: 20px; }\n.fk-trigger:hover { transform: translateY(-1px); box-shadow: 0 10px 26px rgba(0, 0, 0, 0.26); }\n.fk-trigger[data-compact=\"true\"] { width: 48px; height: 48px; padding: 0; justify-content: center; border-radius: 24px; }\n.fk-trigger[data-compact=\"true\"] .fk-trigger-label { display: none; }\n.fk-trigger[aria-busy=\"true\"] { opacity: 0.6; pointer-events: none; }\n\n/* ---------- overlay ---------- */\n.fk-overlay {\n position: fixed;\n inset: 0;\n z-index: 2147483001;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: var(--fk-backdrop);\n animation: fk-fade 0.16s ease-out;\n}\n@keyframes fk-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes fk-rise { from { opacity: 0; transform: translateY(8px) scale(0.99); } to { opacity: 1; transform: none; } }\n.fk-dialog {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 340px;\n width: min(1180px, 100%);\n height: min(780px, 100%);\n overflow: hidden;\n border-radius: 16px;\n background: var(--fk-bg);\n box-shadow: var(--fk-shadow);\n animation: fk-rise 0.2s ease-out;\n}\n.fk-stage {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n background: var(--fk-surface);\n border-right: 1px solid var(--fk-border);\n}\n.fk-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border-bottom: 1px solid var(--fk-border);\n}\n.fk-toolbar-sep { width: 1px; height: 22px; margin: 0 6px; background: var(--fk-border); }\n.fk-tool {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--fk-muted);\n}\n.fk-tool:hover:not(:disabled) { background: var(--fk-border); color: var(--fk-text); }\n.fk-tool[aria-pressed=\"true\"] { background: var(--fk-primary); color: #fff; }\n.fk-swatch {\n width: 22px;\n height: 22px;\n margin: 0 2px;\n padding: 0;\n border-radius: 11px;\n border: 2px solid var(--fk-bg);\n box-shadow: 0 0 0 1px var(--fk-border);\n}\n.fk-swatch[aria-pressed=\"true\"] { box-shadow: 0 0 0 2px var(--fk-text); }\n/* Shrinks (with an ellipsis) instead of wrapping onto its own line: hints\n differ in length per tool, and a toolbar that changed height on every tool\n switch would make the screenshot below jump mid-annotation. */\n.fk-hint { flex: 1 1 0; min-width: 0; margin-left: auto; text-align: right; font-size: 12px; color: var(--fk-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.fk-canvas-wrap {\n position: relative;\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n overflow: hidden;\n}\n.fk-canvas-box { position: relative; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.18); border-radius: 6px; overflow: hidden; }\n.fk-canvas-box canvas { display: block; }\n.fk-canvas-box .fk-ink { position: absolute; inset: 0; touch-action: none; }\n.fk-stage[data-screenshot=\"off\"] .fk-canvas-box { opacity: 0.25; filter: grayscale(1); }\n.fk-stage[data-screenshot=\"off\"] .fk-toolbar button { pointer-events: none; opacity: 0.35; }\n.fk-off-note {\n position: absolute;\n inset: 0;\n display: none;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n color: var(--fk-muted);\n pointer-events: none;\n}\n.fk-stage[data-screenshot=\"off\"] .fk-off-note { display: flex; }\n.fk-text-input {\n position: absolute;\n z-index: 2;\n min-width: 120px;\n padding: 6px 8px;\n border: 2px solid var(--fk-primary);\n border-radius: 8px;\n background: var(--fk-bg);\n color: var(--fk-text);\n font: bold 14px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n outline: none;\n}\n\n/* ---------- composer ---------- */\n.fk-composer { display: flex; flex-direction: column; min-height: 0; padding: 18px; gap: 14px; overflow-y: auto; }\n.fk-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; }\n.fk-title { margin: 0; font-size: 17px; font-weight: 650; letter-spacing: -0.01em; }\n.fk-close { display: inline-flex; width: 30px; height: 30px; align-items: center; justify-content: center; border: 0; border-radius: 15px; background: var(--fk-surface); color: var(--fk-muted); }\n.fk-close:hover { color: var(--fk-text); }\n.fk-label { display: block; margin-bottom: 6px; font-size: 12px; font-weight: 600; color: var(--fk-muted); text-transform: uppercase; letter-spacing: 0.04em; }\n.fk-textarea {\n width: 100%;\n min-height: 140px;\n resize: vertical;\n padding: 10px 12px;\n border: 1px solid var(--fk-border);\n border-radius: 10px;\n background: var(--fk-bg);\n color: var(--fk-text);\n font: inherit;\n line-height: 1.45;\n}\n.fk-textarea:focus { outline: none; border-color: var(--fk-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--fk-primary) 22%, transparent); }\n.fk-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.fk-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n height: 28px;\n padding: 0 11px;\n border: 1px solid var(--fk-border);\n border-radius: 14px;\n background: var(--fk-bg);\n font-size: 13px;\n}\n.fk-chip[aria-pressed=\"true\"] { border-color: var(--fk-primary); background: color-mix(in srgb, var(--fk-primary) 12%, transparent); color: var(--fk-primary); font-weight: 600; }\n.fk-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n.fk-switch { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer; user-select: none; }\n.fk-switch input { position: absolute; opacity: 0; width: 0; height: 0; }\n.fk-switch-track { position: relative; width: 36px; height: 22px; border-radius: 11px; background: var(--fk-border); transition: background 0.15s; }\n.fk-switch-track::after { content: \"\"; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 9px; background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); transition: transform 0.15s; }\n.fk-switch input:checked + .fk-switch-track { background: var(--fk-primary); }\n.fk-switch input:checked + .fk-switch-track::after { transform: translateX(14px); }\n.fk-switch input:focus-visible + .fk-switch-track { outline: 2px solid var(--fk-primary); outline-offset: 2px; }\n.fk-attach {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 32px;\n padding: 0 12px;\n border: 1px dashed var(--fk-secondary);\n border-radius: 8px;\n background: transparent;\n color: var(--fk-secondary);\n font-size: 13px;\n}\n.fk-options-left { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.fk-menu-anchor { position: relative; display: inline-flex; }\n.fk-plus { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: 1px dashed var(--fk-secondary); border-radius: 8px; background: transparent; color: var(--fk-secondary); cursor: pointer; }\n.fk-options-summary { font-size: 12px; color: var(--fk-muted); white-space: nowrap; }\n.fk-menu { position: absolute; bottom: calc(100% + 6px); left: 0; z-index: 5; min-width: 230px; padding: 4px; border: 1px solid var(--fk-border); border-radius: 10px; background: var(--fk-bg); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18); }\n.fk-menu-item { display: flex; align-items: center; gap: 6px; width: 100%; padding: 7px 10px 7px 6px; border: 0; border-radius: 6px; background: transparent; color: var(--fk-text); font-size: 13px; text-align: left; cursor: pointer; }\n.fk-menu-item:hover, .fk-menu-item:focus-visible { background: var(--fk-surface); outline: none; }\n.fk-menu-check { display: inline-flex; width: 16px; height: 16px; color: var(--fk-primary); }\n.fk-menu-check svg { width: 16px; height: 16px; }\n.fk-menu-sep { margin: 4px 0; border: 0; border-top: 1px solid var(--fk-border); }\n.fk-file { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 4px 6px 4px 10px; border-radius: 8px; background: var(--fk-surface); font-size: 12px; }\n.fk-file span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fk-file button { display: inline-flex; border: 0; background: transparent; color: var(--fk-muted); padding: 2px; }\n.fk-meta { font-size: 12px; color: var(--fk-muted); }\n.fk-meta details summary { cursor: pointer; }\n.fk-meta pre { max-height: 140px; overflow: auto; margin: 6px 0 0; padding: 8px; border-radius: 8px; background: var(--fk-surface); font-size: 11px; white-space: pre-wrap; word-break: break-word; }\n.fk-spacer { flex: 1; }\n.fk-actions { display: flex; gap: 8px; }\n.fk-btn {\n display: inline-flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n gap: 7px;\n height: 40px;\n border-radius: 10px;\n font-weight: 600;\n}\n.fk-btn-secondary { border: 1px solid var(--fk-border); background: transparent; color: var(--fk-secondary); }\n.fk-btn-primary { border: 0; background: var(--fk-primary); color: #fff; }\n.fk-btn-primary:hover:not(:disabled) { filter: brightness(1.06); }\n.fk-error { margin: 0; padding: 8px 10px; border-radius: 8px; background: color-mix(in srgb, var(--fk-danger) 12%, transparent); color: var(--fk-danger); font-size: 13px; }\n.fk-spinner { width: 16px; height: 16px; border: 2px solid rgba(255, 255, 255, 0.45); border-top-color: #fff; border-radius: 50%; animation: fk-spin 0.7s linear infinite; }\n@keyframes fk-spin { to { transform: rotate(360deg); } }\n.fk-done { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; flex: 1; text-align: center; }\n.fk-done-icon { display: inline-flex; width: 48px; height: 48px; align-items: center; justify-content: center; border-radius: 24px; background: var(--fk-primary); color: #fff; }\n.fk-done-icon svg { width: 26px; height: 26px; }\n.fk-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n\n/* ---------- \"is it fixed?\" card (fixCard.ts) ---------- */\n.fk-fixcard {\n position: fixed;\n z-index: 2147483000;\n right: 20px;\n bottom: 76px;\n width: min(360px, calc(100vw - 32px));\n max-height: min(640px, calc(100vh - 96px));\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px;\n border: 1px solid var(--fk-border);\n border-radius: 16px;\n background: var(--fk-bg);\n box-shadow: var(--fk-shadow);\n animation: fk-rise 0.2s ease-out;\n}\n.fk-fixcard[data-position=\"bottom-left\"] { right: auto; left: 20px; }\n.fk-fixcard > *, .fk-fixcard-actions > * { flex-shrink: 0; }\n.fk-fixcard p { margin: 0; }\n.fk-fixcard-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }\n.fk-fixcard-shot { display: block; width: 100%; max-height: 220px; object-fit: contain; border-radius: 10px; background: var(--fk-surface); }\n.fk-fixcard-quote { font-size: 14px; }\n.fk-fixcard-summary { font-size: 13px; padding: 8px 10px; border-radius: 8px; background: var(--fk-surface); }\n.fk-fixcard-message p { font-size: 13px; }\n.fk-fixcard-question { font-weight: 600; }\n.fk-fixcard-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }\n.fk-fixcard-actions .fk-btn { flex: none; width: 100%; }\n.fk-fixcard-actions .fk-textarea { min-height: 64px; }\n@keyframes fk-rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }\n\n/* ---------- narrow screens: stack stage over composer ---------- */\n@media (max-width: 760px) {\n .fk-overlay { padding: 0; }\n .fk-dialog { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr) auto; width: 100%; height: 100%; border-radius: 0; }\n .fk-stage { border-right: 0; border-bottom: 1px solid var(--fk-border); }\n .fk-hint { display: none; }\n .fk-canvas-wrap { padding: 10px; }\n .fk-composer { max-height: 55vh; padding: 14px; gap: 10px; }\n .fk-textarea { min-height: 84px; }\n .fk-fixcard, .fk-fixcard[data-position] { right: 16px; left: 16px; width: auto; bottom: 16px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .fk-overlay, .fk-dialog, .fk-fixcard { animation: none; }\n}\n";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feedbackkit-web",
3
- "version": "1.0.42",
3
+ "version": "1.0.45",
4
4
  "description": "Drop-in in-app feedback for websites: capture a screenshot, annotate it, describe the problem, and get a structured FeedbackKit report.",
5
5
  "type": "module",
6
6
  "main": "./dist/feedbackkit.js",