@geenius/feedback 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +16 -3
- package/packages/convex/dist/index.d.ts +192 -0
- package/packages/convex/dist/index.js +239 -0
- package/packages/convex/dist/index.js.map +1 -0
- package/packages/react/README.md +1 -1
- package/packages/react/dist/index.d.ts +146 -0
- package/packages/react/dist/index.js +545 -0
- package/packages/react/dist/index.js.map +1 -0
- package/packages/react-css/README.md +1 -1
- package/packages/react-css/dist/index.css +965 -0
- package/packages/react-css/dist/index.css.map +1 -0
- package/packages/react-css/dist/index.d.ts +49 -0
- package/packages/react-css/dist/index.js +228 -0
- package/packages/react-css/dist/index.js.map +1 -0
- package/packages/shared/README.md +1 -1
- package/packages/shared/dist/index.d.ts +115 -0
- package/packages/shared/dist/index.js +112 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/solidjs/README.md +1 -1
- package/packages/solidjs/dist/index.d.ts +128 -0
- package/packages/solidjs/dist/index.js +289 -0
- package/packages/solidjs/dist/index.js.map +1 -0
- package/packages/solidjs-css/README.md +1 -1
- package/packages/solidjs-css/dist/index.css +965 -0
- package/packages/solidjs-css/dist/index.css.map +1 -0
- package/packages/solidjs-css/dist/index.d.ts +2 -0
- package/packages/solidjs-css/dist/index.js +29 -0
- package/packages/solidjs-css/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.nvmrc +0 -1
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -16
- package/CONTRIBUTING.md +0 -26
- package/SECURITY.md +0 -15
- package/SUPPORT.md +0 -8
- package/packages/convex/package.json +0 -42
- package/packages/convex/src/index.ts +0 -3
- package/packages/convex/src/mutations.ts +0 -88
- package/packages/convex/src/queries.ts +0 -78
- package/packages/convex/src/schema.ts +0 -47
- package/packages/convex/tsconfig.json +0 -18
- package/packages/convex/tsup.config.ts +0 -17
- package/packages/react/package.json +0 -49
- package/packages/react/src/components/FeedbackCard.tsx +0 -51
- package/packages/react/src/components/FeedbackForm.tsx +0 -43
- package/packages/react/src/components/FeedbackWidget.tsx +0 -32
- package/packages/react/src/components/NPSSurvey.tsx +0 -62
- package/packages/react/src/components/index.ts +0 -4
- package/packages/react/src/hooks/index.ts +0 -5
- package/packages/react/src/hooks/useFeedback.ts +0 -23
- package/packages/react/src/hooks/useFeedbackAdmin.ts +0 -24
- package/packages/react/src/hooks/useFeedbackForm.ts +0 -35
- package/packages/react/src/hooks/useNPS.ts +0 -26
- package/packages/react/src/index.tsx +0 -13
- package/packages/react/src/pages/FeedbackAdminPage.tsx +0 -71
- package/packages/react/src/pages/FeedbackPublicPage.tsx +0 -42
- package/packages/react/src/pages/FeedbackWidgetPage.tsx +0 -25
- package/packages/react/src/pages/index.ts +0 -3
- package/packages/react/tsconfig.json +0 -19
- package/packages/react/tsup.config.ts +0 -12
- package/packages/react-css/package.json +0 -36
- package/packages/react-css/src/components/index.ts +0 -5
- package/packages/react-css/src/components/index.tsx +0 -107
- package/packages/react-css/src/hooks/index.ts +0 -2
- package/packages/react-css/src/index.tsx +0 -5
- package/packages/react-css/src/pages/FeedbackAdminPage.tsx +0 -112
- package/packages/react-css/src/pages/FeedbackPage.tsx +0 -76
- package/packages/react-css/src/styles.css +0 -281
- package/packages/react-css/tsconfig.json +0 -19
- package/packages/react-css/tsup.config.ts +0 -10
- package/packages/shared/package.json +0 -44
- package/packages/shared/src/__tests__/feedback.test.ts +0 -72
- package/packages/shared/src/config.ts +0 -49
- package/packages/shared/src/index.ts +0 -111
- package/packages/shared/src/types.ts +0 -59
- package/packages/shared/tsconfig.json +0 -18
- package/packages/shared/tsup.config.ts +0 -11
- package/packages/shared/vitest.config.ts +0 -4
- package/packages/solidjs/package.json +0 -45
- package/packages/solidjs/src/components.tsx +0 -72
- package/packages/solidjs/src/index.tsx +0 -3
- package/packages/solidjs/src/primitives.ts +0 -49
- package/packages/solidjs/tsconfig.json +0 -20
- package/packages/solidjs/tsup.config.ts +0 -12
- package/packages/solidjs-css/package.json +0 -32
- package/packages/solidjs-css/src/index.tsx +0 -4
- package/packages/solidjs-css/src/pages/FeedbackAdminPage.tsx +0 -78
- package/packages/solidjs-css/src/pages/FeedbackPage.tsx +0 -65
- package/packages/solidjs-css/src/primitives/index.ts +0 -1
- package/packages/solidjs-css/src/styles.css +0 -281
- package/packages/solidjs-css/tsconfig.json +0 -20
- package/packages/solidjs-css/tsup.config.ts +0 -10
- package/pnpm-workspace.yaml +0 -2
- package/tsconfig.json +0 -23
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* ─── Feedback Design Tokens (OKLCH) ──────────────────── */\n:root {\n --feedback-bg: oklch(0.12 0.01 250);\n --feedback-surface: oklch(0.16 0.01 250);\n --feedback-border: oklch(0.22 0.01 250);\n --feedback-text: oklch(0.95 0.01 250);\n --feedback-text-muted: oklch(0.58 0.02 250);\n --feedback-accent: oklch(0.65 0.20 265);\n --feedback-open: oklch(0.65 0.20 245);\n --feedback-review: oklch(0.72 0.18 60);\n --feedback-planned: oklch(0.70 0.22 280);\n --feedback-progress: oklch(0.65 0.20 265);\n --feedback-done: oklch(0.72 0.18 155);\n --feedback-declined: oklch(0.50 0.10 250);\n --feedback-bug: oklch(0.60 0.25 25);\n --feedback-feature: oklch(0.70 0.22 280);\n --feedback-suggestion: oklch(0.72 0.18 60);\n --feedback-general: oklch(0.65 0.20 245);\n --feedback-radius: 0.75rem;\n}\n\n/* ─── Feedback Card ──────────────────────────────────── */\n.feedback__card {\n display: flex;\n gap: 0.75rem;\n padding: 1rem;\n border: 1px solid var(--feedback-border);\n border-radius: var(--feedback-radius);\n background: oklch(1 0 0 / 0.02);\n transition: all 0.2s;\n cursor: pointer;\n}\n.feedback__card:hover { border-color: oklch(0.65 0.20 265 / 0.2); background: oklch(1 0 0 / 0.04); }\n.feedback__card-info { flex: 1; min-width: 0; }\n.feedback__card-badges { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 0.25rem; }\n.feedback__card-title { font-size: 0.875rem; font-weight: 600; color: oklch(1 0 0 / 0.9); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: 0.125rem; }\n.feedback__card-desc { font-size: 0.6875rem; color: oklch(1 0 0 / 0.4); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n.feedback__card-meta { display: flex; align-items: center; gap: 0.75rem; margin-top: 0.5rem; font-size: 0.625rem; color: oklch(1 0 0 / 0.25); }\n.feedback__card--bug { border-left: 3px solid var(--feedback-bug); }\n.feedback__card--feature { border-left: 3px solid var(--feedback-feature); }\n.feedback__card--suggestion { border-left: 3px solid var(--feedback-suggestion); }\n.feedback__card--general { border-left: 3px solid var(--feedback-general); }\n\n/* ─── Vote Button ────────────────────────────────────── */\n.feedback__vote-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.125rem;\n padding: 0.375rem 0.5rem;\n border-radius: calc(var(--feedback-radius) * 0.8);\n border: none;\n font-size: 0.6875rem;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.15s;\n font-variant-numeric: tabular-nums;\n}\n.feedback__vote-btn--inactive { background: oklch(1 0 0 / 0.05); color: oklch(1 0 0 / 0.3); }\n.feedback__vote-btn--inactive:hover { background: oklch(1 0 0 / 0.1); color: oklch(1 0 0 / 0.5); }\n.feedback__vote-btn--active { background: oklch(0.65 0.20 265 / 0.15); color: oklch(0.65 0.20 265); }\n.feedback__vote-btn-arrow { font-size: 0.875rem; }\n\n/* ─── Status Badge ───────────────────────────────────── */\n.feedback__status-badge { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.125rem 0.625rem; border-radius: 9999px; font-size: 0.625rem; font-weight: 500; }\n.feedback__status-badge--open { background: oklch(0.65 0.20 245 / 0.15); color: oklch(0.65 0.20 245); }\n.feedback__status-badge--under-review { background: oklch(0.72 0.18 60 / 0.15); color: oklch(0.72 0.18 60); }\n.feedback__status-badge--planned { background: oklch(0.70 0.22 280 / 0.15); color: oklch(0.70 0.22 280); }\n.feedback__status-badge--in-progress { background: oklch(0.65 0.20 265 / 0.15); color: oklch(0.65 0.20 265); }\n.feedback__status-badge--done { background: oklch(0.72 0.18 155 / 0.15); color: oklch(0.72 0.18 155); }\n.feedback__status-badge--declined { background: oklch(0.50 0.10 250 / 0.15); color: oklch(0.50 0.10 250); }\n\n/* ─── Priority Badge ─────────────────────────────────── */\n.feedback__priority-badge { padding: 0.125rem 0.5rem; border-radius: 9999px; font-size: 0.625rem; font-weight: 500; }\n.feedback__priority-badge--low { background: oklch(0.58 0.10 250 / 0.15); color: oklch(0.58 0.10 250); }\n.feedback__priority-badge--medium { background: oklch(0.72 0.18 60 / 0.15); color: oklch(0.72 0.18 60); }\n.feedback__priority-badge--high { background: oklch(0.68 0.22 35 / 0.15); color: oklch(0.68 0.22 35); }\n.feedback__priority-badge--critical { background: oklch(0.60 0.25 25 / 0.15); color: oklch(0.60 0.25 25); }\n\n/* ─── Type Badge ─────────────────────────────────────── */\n.feedback__type-badge { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.125rem 0.5rem; border-radius: 9999px; font-size: 0.625rem; font-weight: 500; }\n.feedback__type-badge--bug { background: oklch(0.60 0.25 25 / 0.15); color: oklch(0.60 0.25 25); }\n.feedback__type-badge--feature { background: oklch(0.70 0.22 280 / 0.15); color: oklch(0.70 0.22 280); }\n.feedback__type-badge--suggestion { background: oklch(0.72 0.18 60 / 0.15); color: oklch(0.72 0.18 60); }\n.feedback__type-badge--general { background: oklch(0.65 0.20 245 / 0.15); color: oklch(0.65 0.20 245); }\n\n/* ─── Widget ─────────────────────────────────────────── */\n.feedback__widget-trigger {\n position: fixed; top: 50%; right: 0; transform: translateY(-50%);\n z-index: 40; padding: 0.5rem 1rem; border-radius: var(--feedback-radius) 0 0 var(--feedback-radius);\n background: var(--feedback-accent); color: white; border: none; cursor: pointer;\n writing-mode: vertical-rl; font-size: 0.6875rem; font-weight: 500; letter-spacing: 0.05em;\n box-shadow: -2px 0 12px oklch(0.65 0.20 265 / 0.3);\n}\n.feedback__widget-trigger:hover { background: oklch(0.70 0.22 265); }\n.feedback__widget-overlay { position: fixed; inset: 0; z-index: 50; display: flex; justify-content: flex-end; }\n.feedback__widget-backdrop { position: absolute; inset: 0; background: oklch(0 0 0 / 0.5); backdrop-filter: blur(4px); }\n.feedback__widget-panel { position: relative; width: 100%; max-width: 28rem; background: oklch(0.06 0.01 250); border-left: 1px solid var(--feedback-border); padding: 1.5rem; overflow-y: auto; }\n.feedback__widget-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; }\n.feedback__widget-title { font-size: 1.125rem; font-weight: 700; color: var(--feedback-text); }\n\n/* ─── Form ───────────────────────────────────────────── */\n.feedback__form { display: flex; flex-direction: column; gap: 1rem; }\n.feedback__form-input { width: 100%; padding: 0.75rem 1rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.03); font-size: 0.875rem; color: var(--feedback-text); outline: none; }\n.feedback__form-input::placeholder { color: oklch(1 0 0 / 0.3); }\n.feedback__form-input:focus { border-color: oklch(0.65 0.20 265 / 0.4); }\n.feedback__form-textarea { resize: none; min-height: 6rem; }\n.feedback__form-error { font-size: 0.6875rem; color: oklch(0.60 0.25 25); }\n.feedback__form-actions { display: flex; justify-content: flex-end; gap: 0.5rem; }\n\n/* ─── Type Selector ──────────────────────────────────── */\n.feedback__type-selector { display: flex; gap: 0.375rem; }\n.feedback__type-tab { display: flex; align-items: center; gap: 0.375rem; padding: 0.5rem 0.75rem; border-radius: calc(var(--feedback-radius) * 0.8); border: none; font-size: 0.6875rem; font-weight: 500; cursor: pointer; transition: all 0.15s; }\n.feedback__type-tab--inactive { background: oklch(1 0 0 / 0.05); color: oklch(1 0 0 / 0.5); }\n.feedback__type-tab--inactive:hover { background: oklch(1 0 0 / 0.1); }\n\n/* ─── NPS ────────────────────────────────────────────── */\n.feedback__nps { position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 50; width: 24rem; border: 1px solid oklch(1 0 0 / 0.1); border-radius: calc(var(--feedback-radius) * 1.5); background: oklch(0.08 0.01 250); padding: 1.5rem; box-shadow: 0 8px 32px oklch(0 0 0 / 0.5); }\n.feedback__nps-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.25rem; }\n.feedback__nps-title { font-size: 0.875rem; font-weight: 600; color: oklch(1 0 0 / 0.9); }\n.feedback__nps-subtitle { font-size: 0.6875rem; color: oklch(1 0 0 / 0.4); margin-bottom: 1rem; }\n.feedback__nps-scores { display: flex; gap: 0.25rem; }\n.feedback__nps-score-btn { flex: 1; padding: 0.625rem 0; border: none; border-radius: calc(var(--feedback-radius) * 0.8); background: oklch(1 0 0 / 0.05); color: oklch(1 0 0 / 0.5); font-size: 0.6875rem; font-weight: 700; cursor: pointer; transition: all 0.15s; }\n.feedback__nps-score-btn:hover { background: oklch(1 0 0 / 0.1); }\n.feedback__nps-labels { display: flex; justify-content: space-between; margin-top: 0.5rem; font-size: 0.625rem; color: oklch(1 0 0 / 0.2); }\n.feedback__nps-results { padding: 1.25rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.02); }\n.feedback__nps-results-score { font-size: 1.875rem; font-weight: 900; font-variant-numeric: tabular-nums; }\n.feedback__nps-bar { display: flex; height: 1.25rem; overflow: hidden; border-radius: 9999px; margin: 1rem 0; }\n.feedback__nps-bar-detractors { background: oklch(0.60 0.25 25 / 0.7); }\n.feedback__nps-bar-passives { background: oklch(0.72 0.18 60 / 0.7); }\n.feedback__nps-bar-promoters { background: oklch(0.72 0.18 155 / 0.7); }\n.feedback__nps-breakdown { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.5rem; text-align: center; font-size: 0.6875rem; }\n\n/* ─── Board ──────────────────────────────────────────── */\n.feedback__board { display: flex; flex-direction: column; gap: 0.625rem; }\n\n/* ─── Admin Table ────────────────────────────────────── */\n.feedback__admin-table { width: 100%; font-size: 0.875rem; border-collapse: collapse; }\n.feedback__admin-table th { padding: 0.75rem 1rem; text-align: left; font-size: 0.625rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; color: oklch(1 0 0 / 0.4); border-bottom: 1px solid oklch(1 0 0 / 0.08); }\n.feedback__admin-table td { padding: 0.75rem 1rem; border-bottom: 1px solid oklch(1 0 0 / 0.05); }\n.feedback__admin-table tr:hover { background: oklch(1 0 0 / 0.02); }\n.feedback__admin-select { padding: 0.25rem 0.5rem; border: 1px solid var(--feedback-border); border-radius: calc(var(--feedback-radius) * 0.6); background: oklch(1 0 0 / 0.05); font-size: 0.6875rem; color: var(--feedback-text); outline: none; }\n\n/* ─── Stats Grid ─────────────────────────────────────── */\n.feedback__stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 1rem; margin-bottom: 2rem; }\n.feedback__stat-card { padding: 1rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.02); }\n.feedback__stat-icon { font-size: 1.125rem; }\n.feedback__stat-value { font-size: 1.5rem; font-weight: 700; font-variant-numeric: tabular-nums; color: oklch(1 0 0 / 0.9); }\n.feedback__stat-label { font-size: 0.6875rem; color: oklch(1 0 0 / 0.4); }\n\n/* ─── Search ─────────────────────────────────────────── */\n.feedback__search { width: 100%; max-width: 16rem; padding: 0.625rem 1rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.03); font-size: 0.875rem; color: var(--feedback-text); outline: none; }\n.feedback__search::placeholder { color: oklch(1 0 0 / 0.3); }\n.feedback__search:focus { border-color: oklch(0.65 0.20 265 / 0.4); }\n\n/* ─── Filter Tabs ────────────────────────────────────── */\n.feedback__filter-tabs { display: flex; flex-wrap: wrap; gap: 0.375rem; }\n.feedback__filter-tab { padding: 0.375rem 0.75rem; border: none; border-radius: calc(var(--feedback-radius) * 0.8); font-size: 0.6875rem; font-weight: 500; cursor: pointer; }\n.feedback__filter-tab--active { background: var(--feedback-accent); color: white; }\n.feedback__filter-tab--inactive { background: oklch(1 0 0 / 0.05); color: oklch(1 0 0 / 0.5); }\n.feedback__filter-tab--inactive:hover { background: oklch(1 0 0 / 0.1); }\n\n/* ─── Btn ────────────────────────────────────────────── */\n.feedback__btn { padding: 0.5rem 1rem; border-radius: calc(var(--feedback-radius) * 0.8); font-size: 0.6875rem; font-weight: 500; cursor: pointer; border: none; transition: all 0.15s; }\n.feedback__btn--primary { background: var(--feedback-accent); color: white; }\n.feedback__btn--primary:hover { background: oklch(0.70 0.22 265); }\n.feedback__btn--outline { border: 1px solid var(--feedback-border); background: transparent; color: oklch(1 0 0 / 0.6); }\n.feedback__btn--danger { background: oklch(0.60 0.25 25 / 0.2); color: oklch(0.60 0.25 25); }\n\n/* ─── Skeleton ───────────────────────────────────────── */\n.feedback__skeleton { background: oklch(1 0 0 / 0.05); border-radius: var(--feedback-radius); animation: feedback-pulse 1.5s ease-in-out infinite; }\n@keyframes feedback-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }\n\n/* ─── Empty ──────────────────────────────────────────── */\n.feedback__empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 4rem 1rem; text-align: center; }\n.feedback__empty-icon { font-size: 3rem; opacity: 0.2; margin-bottom: 0.75rem; }\n.feedback__empty-text { font-size: 0.875rem; color: oklch(1 0 0 / 0.4); }\n\n/* ─── Success ────────────────────────────────────────── */\n.feedback__success { display: flex; flex-direction: column; align-items: center; padding: 2rem; text-align: center; }\n.feedback__success-icon { font-size: 2.5rem; margin-bottom: 0.75rem; }\n.feedback__success-text { font-size: 1rem; font-weight: 600; color: oklch(1 0 0 / 0.9); margin-bottom: 0.25rem; }\n.feedback__success-sub { font-size: 0.875rem; color: oklch(1 0 0 / 0.5); }\n\n/* ─── Tag ────────────────────────────────────────────── */\n.feedback__tag { padding: 0.125rem 0.375rem; border-radius: 0.25rem; background: oklch(1 0 0 / 0.05); font-size: 0.625rem; color: oklch(1 0 0 / 0.3); }\n\n/* ─── Close Button ───────────────────────────────────── */\n.feedback__close-btn { padding: 0.375rem; border: none; background: transparent; color: oklch(1 0 0 / 0.3); cursor: pointer; border-radius: calc(var(--feedback-radius) * 0.6); }\n.feedback__close-btn:hover { color: oklch(1 0 0 / 0.5); background: oklch(1 0 0 / 0.05); }\n\n/* ─── Comment Thread ─────────────────────────────────── */\n.feedback__comment-thread { display: flex; flex-direction: column; gap: 1rem; padding: 1rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.01); }\n.feedback__comment { display: flex; gap: 0.75rem; }\n.feedback__comment-avatar { width: 2rem; height: 2rem; border-radius: 50%; background: oklch(0.65 0.20 265 / 0.2); display: flex; align-items: center; justify-content: center; font-size: 0.875rem; flex-shrink: 0; }\n.feedback__comment-body { flex: 1; }\n.feedback__comment-header { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.25rem; }\n.feedback__comment-author { font-size: 0.75rem; font-weight: 600; color: oklch(1 0 0 / 0.8); }\n.feedback__comment-time { font-size: 0.625rem; color: oklch(1 0 0 / 0.3); }\n.feedback__comment-text { font-size: 0.6875rem; color: oklch(1 0 0 / 0.7); line-height: 1.4; }\n.feedback__comment-reply-btn { margin-top: 0.5rem; padding: 0.25rem 0.5rem; font-size: 0.625rem; border: none; background: transparent; color: oklch(0.65 0.20 265); cursor: pointer; transition: all 0.1s; }\n.feedback__comment-reply-btn:hover { color: oklch(0.70 0.22 265); }\n\n/* ─── Rating Component ───────────────────────────────── */\n.feedback__rating { display: flex; gap: 0.25rem; }\n.feedback__rating-star { font-size: 1.5rem; cursor: pointer; opacity: 0.3; transition: all 0.15s; }\n.feedback__rating-star--filled { opacity: 1; color: oklch(0.72 0.18 60); }\n.feedback__rating-star:hover { opacity: 1; transform: scale(1.1); }\n\n/* ─── Sentiment Indicator ────────────────────────────── */\n.feedback__sentiment-card { padding: 1rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.02); text-align: center; }\n.feedback__sentiment-icon { font-size: 2rem; margin-bottom: 0.5rem; }\n.feedback__sentiment-label { font-size: 0.875rem; font-weight: 600; color: oklch(1 0 0 / 0.8); margin-bottom: 0.25rem; }\n.feedback__sentiment-count { font-size: 0.6875rem; color: oklch(1 0 0 / 0.4); }\n\n/* ─── Response Panel ─────────────────────────────────── */\n.feedback__response-panel { border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.02); padding: 1rem; }\n.feedback__response-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.75rem; }\n.feedback__response-title { font-size: 0.875rem; font-weight: 600; color: oklch(1 0 0 / 0.8); }\n.feedback__response-time { font-size: 0.625rem; color: oklch(1 0 0 / 0.3); }\n.feedback__response-body { font-size: 0.6875rem; color: oklch(1 0 0 / 0.7); line-height: 1.5; }\n.feedback__response-actions { display: flex; gap: 0.5rem; margin-top: 0.75rem; }\n.feedback__response-btn { padding: 0.25rem 0.5rem; font-size: 0.625rem; border: none; background: oklch(1 0 0 / 0.05); color: oklch(1 0 0 / 0.5); cursor: pointer; border-radius: calc(var(--feedback-radius) * 0.6); transition: all 0.1s; }\n.feedback__response-btn:hover { background: oklch(1 0 0 / 0.1); color: oklch(1 0 0 / 0.6); }\n\n/* ─── Analytics Chart ────────────────────────────────── */\n.feedback__analytics { border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.02); padding: 1rem; }\n.feedback__analytics-title { font-size: 0.875rem; font-weight: 600; color: oklch(1 0 0 / 0.8); margin-bottom: 1rem; }\n.feedback__analytics-chart { display: flex; align-items: flex-end; gap: 0.5rem; height: 10rem; }\n.feedback__analytics-bar { flex: 1; border-radius: 0.25rem 0.25rem 0 0; background: linear-gradient(to top, oklch(0.65 0.20 265), oklch(0.65 0.20 265 / 0.4)); transition: all 0.2s; position: relative; }\n.feedback__analytics-bar:hover { background: linear-gradient(to top, oklch(0.70 0.22 265), oklch(0.70 0.22 265)); }\n.feedback__analytics-label { position: absolute; bottom: -1.5rem; left: 50%; transform: translateX(-50%); font-size: 0.625rem; color: oklch(1 0 0 / 0.4); white-space: nowrap; }\n\n/* ─── Filter Control Panel ───────────────────────────── */\n.feedback__filter-panel { border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.02); padding: 1rem; }\n.feedback__filter-section { margin-bottom: 1rem; }\n.feedback__filter-section:last-child { margin-bottom: 0; }\n.feedback__filter-section-title { font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; color: oklch(1 0 0 / 0.4); margin-bottom: 0.5rem; letter-spacing: 0.05em; }\n.feedback__filter-options { display: flex; flex-direction: column; gap: 0.25rem; }\n.feedback__filter-option { display: flex; align-items: center; gap: 0.5rem; padding: 0.25rem 0; font-size: 0.6875rem; }\n.feedback__filter-option input { cursor: pointer; }\n.feedback__filter-option-label { color: oklch(1 0 0 / 0.7); cursor: pointer; }\n\n/* ─── Tag Selector ───────────────────────────────────── */\n.feedback__tag-selector { padding: 1rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.02); }\n.feedback__tag-selector-label { display: block; font-size: 0.6875rem; font-weight: 500; color: oklch(1 0 0 / 0.6); margin-bottom: 0.5rem; text-transform: uppercase; }\n.feedback__tag-list { display: flex; flex-wrap: wrap; gap: 0.5rem; }\n.feedback__tag-item { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.375rem 0.75rem; border-radius: 9999px; background: oklch(0.65 0.20 265 / 0.15); color: oklch(0.65 0.20 265); font-size: 0.6875rem; font-weight: 500; }\n.feedback__tag-remove { margin-left: 0.25rem; cursor: pointer; font-weight: 700; opacity: 0.6; transition: opacity 0.1s; }\n.feedback__tag-remove:hover { opacity: 1; }\n\n/* ─── Feedback Form Actions ──────────────────────────── */\n.feedback__form-footer { display: flex; justify-content: space-between; align-items: center; padding-top: 1rem; border-top: 1px solid var(--feedback-border); }\n.feedback__form-counter { font-size: 0.625rem; color: oklch(1 0 0 / 0.3); }\n.feedback__form-actions-group { display: flex; gap: 0.5rem; }\n\n/* ─── Feedback Status Indicator ──────────────────────── */\n.feedback__status-indicator { display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.375rem 0.75rem; border-radius: 9999px; font-size: 0.625rem; font-weight: 500; }\n.feedback__status-indicator--new { background: oklch(0.65 0.20 245 / 0.15); color: oklch(0.65 0.20 245); }\n.feedback__status-indicator--in-review { background: oklch(0.72 0.18 60 / 0.15); color: oklch(0.72 0.18 60); }\n.feedback__status-indicator--implemented { background: oklch(0.72 0.18 155 / 0.15); color: oklch(0.72 0.18 155); }\n\n/* ─── Detailed Stats Row ─────────────────────────────── */\n.feedback__detailed-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 0.5rem; }\n.feedback__detailed-stat-item { padding: 0.75rem; border: 1px solid var(--feedback-border); border-radius: var(--feedback-radius); background: oklch(1 0 0 / 0.01); text-align: center; }\n.feedback__detailed-stat-icon { font-size: 1.25rem; margin-bottom: 0.25rem; }\n.feedback__detailed-stat-value { font-size: 1rem; font-weight: 700; color: oklch(1 0 0 / 0.9); }\n.feedback__detailed-stat-label { font-size: 0.625rem; color: oklch(1 0 0 / 0.4); margin-top: 0.25rem; }\n\n/* ─── Breadcrumb Navigation ──────────────────────────── */\n.feedback__breadcrumb { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; margin-bottom: 1rem; }\n.feedback__breadcrumb-item { color: oklch(1 0 0 / 0.5); }\n.feedback__breadcrumb-item--active { color: oklch(1 0 0 / 0.8); font-weight: 500; }\n.feedback__breadcrumb-sep { color: oklch(1 0 0 / 0.2); margin: 0 0.25rem; }\n\n/* ─── Pagination Controls ────────────────────────────── */\n.feedback__pagination { display: flex; align-items: center; gap: 0.5rem; justify-content: center; padding: 1rem; }\n.feedback__pagination-btn { padding: 0.375rem 0.75rem; border: 1px solid var(--feedback-border); border-radius: calc(var(--feedback-radius) * 0.6); background: oklch(1 0 0 / 0.05); color: oklch(1 0 0 / 0.6); font-size: 0.6875rem; cursor: pointer; transition: all 0.1s; }\n.feedback__pagination-btn:hover:not(:disabled) { background: oklch(1 0 0 / 0.1); color: oklch(1 0 0 / 0.8); }\n.feedback__pagination-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n.feedback__pagination-info { font-size: 0.6875rem; color: oklch(1 0 0 / 0.5); }\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { FeedbackAdminPage, FeedbackCard, FeedbackForm, FeedbackList, FeedbackProvider, FeedbackPublicPage, FeedbackTypeSelector, FeedbackWidget, FeedbackWidgetPage, NPSResults, NPSSurvey, PriorityBadge, StatusBadge, TypeBadge, createFeedback, createFeedbackAdmin, createFeedbackForm, createNPS, useFeedbackConfig } from '@geenius/feedback-solidjs';
|
|
2
|
+
export { FeedbackConfig, FeedbackItem, FeedbackPriority, FeedbackStats, FeedbackStatus, FeedbackType, NPSResponse, NPSStats } from '@geenius/feedback-shared';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/index.tsx
|
|
2
|
+
import { FeedbackProvider, useFeedbackConfig } from "@geenius/feedback-solidjs";
|
|
3
|
+
import { createFeedback, createFeedbackForm, createNPS, createFeedbackAdmin } from "@geenius/feedback-solidjs";
|
|
4
|
+
import { StatusBadge, PriorityBadge, TypeBadge, FeedbackCard, FeedbackList, FeedbackWidget, FeedbackForm, FeedbackTypeSelector, NPSSurvey, NPSResults } from "@geenius/feedback-solidjs";
|
|
5
|
+
import { FeedbackPublicPage } from "@geenius/feedback-solidjs";
|
|
6
|
+
import { FeedbackAdminPage } from "@geenius/feedback-solidjs";
|
|
7
|
+
import { FeedbackWidgetPage } from "@geenius/feedback-solidjs";
|
|
8
|
+
export {
|
|
9
|
+
FeedbackAdminPage,
|
|
10
|
+
FeedbackCard,
|
|
11
|
+
FeedbackForm,
|
|
12
|
+
FeedbackList,
|
|
13
|
+
FeedbackProvider,
|
|
14
|
+
FeedbackPublicPage,
|
|
15
|
+
FeedbackTypeSelector,
|
|
16
|
+
FeedbackWidget,
|
|
17
|
+
FeedbackWidgetPage,
|
|
18
|
+
NPSResults,
|
|
19
|
+
NPSSurvey,
|
|
20
|
+
PriorityBadge,
|
|
21
|
+
StatusBadge,
|
|
22
|
+
TypeBadge,
|
|
23
|
+
createFeedback,
|
|
24
|
+
createFeedbackAdmin,
|
|
25
|
+
createFeedbackForm,
|
|
26
|
+
createNPS,
|
|
27
|
+
useFeedbackConfig
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx"],"sourcesContent":["export { FeedbackProvider, useFeedbackConfig } from '@geenius/feedback-solidjs'\nexport { createFeedback, createFeedbackForm, createNPS, createFeedbackAdmin } from '@geenius/feedback-solidjs'\nexport { StatusBadge, PriorityBadge, TypeBadge, FeedbackCard, FeedbackList, FeedbackWidget, FeedbackForm, FeedbackTypeSelector, NPSSurvey, NPSResults } from '@geenius/feedback-solidjs'\nexport { FeedbackPublicPage } from '@geenius/feedback-solidjs'\nexport { FeedbackAdminPage } from '@geenius/feedback-solidjs'\nexport { FeedbackWidgetPage } from '@geenius/feedback-solidjs'\nimport './styles.css'\nexport type { FeedbackItem, NPSResponse, FeedbackConfig, FeedbackStats, NPSStats, FeedbackType, FeedbackStatus, FeedbackPriority } from '@geenius/feedback-shared'\n"],"mappings":";AAAA,SAAS,kBAAkB,yBAAyB;AACpD,SAAS,gBAAgB,oBAAoB,WAAW,2BAA2B;AACnF,SAAS,aAAa,eAAe,WAAW,cAAc,cAAc,gBAAgB,cAAc,sBAAsB,WAAW,kBAAkB;AAC7J,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;","names":[]}
|
package/.changeset/config.json
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
|
|
3
|
-
"changelog": "@changesets/cli/changelog",
|
|
4
|
-
"commit": false,
|
|
5
|
-
"fixed": [],
|
|
6
|
-
"linked": [],
|
|
7
|
-
"access": "public",
|
|
8
|
-
"baseBranch": "main",
|
|
9
|
-
"updateInternalDependencies": "patch",
|
|
10
|
-
"ignore": []
|
|
11
|
-
}
|
package/.github/CODEOWNERS
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
* @mxn2020
|
package/.github/dependabot.yml
DELETED
package/.github/workflows/ci.yml
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
on:
|
|
3
|
-
pull_request:
|
|
4
|
-
branches: [main]
|
|
5
|
-
push:
|
|
6
|
-
branches: [main]
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
check:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
steps:
|
|
12
|
-
- uses: actions/checkout@v4
|
|
13
|
-
- uses: pnpm/action-setup@v4
|
|
14
|
-
with:
|
|
15
|
-
version: 10
|
|
16
|
-
- uses: actions/setup-node@v4
|
|
17
|
-
with:
|
|
18
|
-
node-version-file: '.nvmrc'
|
|
19
|
-
cache: 'pnpm'
|
|
20
|
-
- run: pnpm install --frozen-lockfile
|
|
21
|
-
- run: pnpm build
|
|
22
|
-
- run: pnpm lint
|
|
23
|
-
- run: pnpm test
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
on:
|
|
3
|
-
push:
|
|
4
|
-
branches: [main]
|
|
5
|
-
|
|
6
|
-
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
release:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
steps:
|
|
12
|
-
- uses: actions/checkout@v4
|
|
13
|
-
- uses: pnpm/action-setup@v4
|
|
14
|
-
with:
|
|
15
|
-
version: 10
|
|
16
|
-
- uses: actions/setup-node@v4
|
|
17
|
-
with:
|
|
18
|
-
node-version-file: '.nvmrc'
|
|
19
|
-
cache: 'pnpm'
|
|
20
|
-
registry-url: 'https://registry.npmjs.org'
|
|
21
|
-
- run: pnpm install --frozen-lockfile
|
|
22
|
-
- run: pnpm build
|
|
23
|
-
- uses: changesets/action@v1
|
|
24
|
-
with:
|
|
25
|
-
publish: pnpm changeset publish
|
|
26
|
-
version: pnpm changeset version
|
|
27
|
-
env:
|
|
28
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
29
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/.nvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
22
|
package/.project/ACCOUNT.yaml
DELETED
package/.project/IDEAS.yaml
DELETED
package/.project/PROJECT.yaml
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
name: geenius-feedback
|
|
2
|
-
description: "Geenius Feedback — User feedback collection for Convex apps (React + SolidJS)"
|
|
3
|
-
category: library
|
|
4
|
-
priority: high
|
|
5
|
-
tags:
|
|
6
|
-
- geenius
|
|
7
|
-
- npm-package
|
|
8
|
-
- react
|
|
9
|
-
- solidjs
|
|
10
|
-
deploy_url: null
|
|
11
|
-
npm_scope: "@geenius-feedback"
|
package/.project/ROADMAP.yaml
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
version: "0.1"
|
|
2
|
-
milestones:
|
|
3
|
-
- name: "v0.1.0 — Initial Release"
|
|
4
|
-
status: in-progress
|
|
5
|
-
items:
|
|
6
|
-
- "Core shared types and logic"
|
|
7
|
-
- "React hooks and components"
|
|
8
|
-
- "SolidJS primitives"
|
|
9
|
-
- "npm publishing via Changesets"
|
|
10
|
-
- name: "v0.2.0 — Stability"
|
|
11
|
-
status: planned
|
|
12
|
-
items:
|
|
13
|
-
- "Test coverage ≥ 50%"
|
|
14
|
-
- "API documentation"
|
|
15
|
-
- "Convex adapter"
|
package/CODE_OF_CONDUCT.md
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# Contributor Covenant Code of Conduct
|
|
2
|
-
|
|
3
|
-
## Our Pledge
|
|
4
|
-
|
|
5
|
-
We as members, contributors, and leaders pledge to make participation in our
|
|
6
|
-
community a harassment-free experience for everyone, regardless of age, body
|
|
7
|
-
size, disability, ethnicity, gender identity and expression, level of experience,
|
|
8
|
-
education, socio-economic status, nationality, personal appearance, race,
|
|
9
|
-
religion, or sexual identity and orientation.
|
|
10
|
-
|
|
11
|
-
## Enforcement
|
|
12
|
-
|
|
13
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
14
|
-
reported to the project team at conduct@geenius.app.
|
|
15
|
-
|
|
16
|
-
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
|
package/CONTRIBUTING.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Contributing to @geenius-feedback
|
|
2
|
-
|
|
3
|
-
Thank you for your interest in contributing!
|
|
4
|
-
|
|
5
|
-
## Development Setup
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
git clone https://github.com/mxn2020/geenius-feedback.git
|
|
9
|
-
cd geenius-feedback
|
|
10
|
-
pnpm install
|
|
11
|
-
pnpm build
|
|
12
|
-
pnpm test
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Pull Request Process
|
|
16
|
-
|
|
17
|
-
1. Fork the repo and create a feature branch from `main`
|
|
18
|
-
2. Add or update tests as appropriate
|
|
19
|
-
3. Run `pnpm changeset` to describe your changes for the changelog
|
|
20
|
-
4. Open a PR against `main`
|
|
21
|
-
|
|
22
|
-
## Code Style
|
|
23
|
-
|
|
24
|
-
- TypeScript strict mode
|
|
25
|
-
- ESLint + Prettier formatting
|
|
26
|
-
- Conventional commits preferred
|
package/SECURITY.md
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
## Supported Versions
|
|
4
|
-
|
|
5
|
-
| Version | Supported |
|
|
6
|
-
| ------- | --------- |
|
|
7
|
-
| 0.x.x | ✅ |
|
|
8
|
-
|
|
9
|
-
## Reporting a Vulnerability
|
|
10
|
-
|
|
11
|
-
Please report security vulnerabilities by emailing **security@geenius.app**.
|
|
12
|
-
|
|
13
|
-
Do **not** open a public GitHub issue for security vulnerabilities.
|
|
14
|
-
|
|
15
|
-
We will acknowledge receipt within 48 hours and provide a detailed response within 5 business days.
|
package/SUPPORT.md
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
# Support
|
|
2
|
-
|
|
3
|
-
## Getting Help
|
|
4
|
-
|
|
5
|
-
- 📖 [Documentation](https://docs.geenius.app)
|
|
6
|
-
- 🐛 [Bug Reports](https://github.com/mxn2020/geenius-feedback/issues/new?template=bug_report.md)
|
|
7
|
-
- 💡 [Feature Requests](https://github.com/mxn2020/geenius-feedback/issues/new?template=feature_request.md)
|
|
8
|
-
- 📧 Email: support@geenius.app
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@geenius-feedback/convex",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"private": false,
|
|
5
|
-
"type": "module",
|
|
6
|
-
"description": "Convex backend functions and schema for the Geenius Feedback system",
|
|
7
|
-
"author": "Antigravity HQ",
|
|
8
|
-
"license": "MIT",
|
|
9
|
-
"publishConfig": {
|
|
10
|
-
"access": "public"
|
|
11
|
-
},
|
|
12
|
-
"main": "./dist/index.js",
|
|
13
|
-
"module": "./dist/index.js",
|
|
14
|
-
"types": "./dist/index.d.ts",
|
|
15
|
-
"exports": {
|
|
16
|
-
".": {
|
|
17
|
-
"types": "./dist/index.d.ts",
|
|
18
|
-
"import": "./dist/index.js"
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
"files": [
|
|
22
|
-
"dist",
|
|
23
|
-
"src"
|
|
24
|
-
],
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "tsup",
|
|
27
|
-
"clean": "rm -rf dist",
|
|
28
|
-
"type-check": "tsc --noEmit",
|
|
29
|
-
"prepublishOnly": "pnpm clean && pnpm build"
|
|
30
|
-
},
|
|
31
|
-
"peerDependencies": {
|
|
32
|
-
"convex": "^1.34.0"
|
|
33
|
-
},
|
|
34
|
-
"devDependencies": {
|
|
35
|
-
"convex": "^1.34.0",
|
|
36
|
-
"tsup": "^8.5.1",
|
|
37
|
-
"typescript": "~6.0.2"
|
|
38
|
-
},
|
|
39
|
-
"engines": {
|
|
40
|
-
"node": ">=20.0.0"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { mutation } from './_generated/server'
|
|
2
|
-
import { v } from 'convex/values'
|
|
3
|
-
|
|
4
|
-
export const submitFeedback = mutation({
|
|
5
|
-
args: {
|
|
6
|
-
type: v.union(v.literal('bug'), v.literal('feature'), v.literal('general'), v.literal('suggestion')),
|
|
7
|
-
title: v.string(), description: v.string(),
|
|
8
|
-
url: v.optional(v.string()), userId: v.optional(v.string()), userEmail: v.optional(v.string()),
|
|
9
|
-
userName: v.optional(v.string()), browser: v.optional(v.string()), os: v.optional(v.string()),
|
|
10
|
-
tags: v.optional(v.array(v.string())),
|
|
11
|
-
},
|
|
12
|
-
handler: async (ctx, args) => {
|
|
13
|
-
const now = new Date().toISOString()
|
|
14
|
-
return ctx.db.insert('feedback_items', {
|
|
15
|
-
...args, tags: args.tags ?? [], status: 'open', priority: 'medium',
|
|
16
|
-
votes: 0, createdAt: now, updatedAt: now,
|
|
17
|
-
})
|
|
18
|
-
},
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
export const updateFeedbackStatus = mutation({
|
|
22
|
-
args: {
|
|
23
|
-
feedbackId: v.id('feedback_items'),
|
|
24
|
-
status: v.union(v.literal('open'), v.literal('under-review'), v.literal('planned'), v.literal('in-progress'), v.literal('done'), v.literal('declined')),
|
|
25
|
-
adminNote: v.optional(v.string()),
|
|
26
|
-
},
|
|
27
|
-
handler: async (ctx, args) => {
|
|
28
|
-
const updates: Record<string, unknown> = { status: args.status, updatedAt: new Date().toISOString() }
|
|
29
|
-
if (args.adminNote !== undefined) updates.adminNote = args.adminNote
|
|
30
|
-
await ctx.db.patch(args.feedbackId, updates)
|
|
31
|
-
},
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
export const updateFeedbackPriority = mutation({
|
|
35
|
-
args: {
|
|
36
|
-
feedbackId: v.id('feedback_items'),
|
|
37
|
-
priority: v.union(v.literal('low'), v.literal('medium'), v.literal('high'), v.literal('critical')),
|
|
38
|
-
},
|
|
39
|
-
handler: async (ctx, args) => {
|
|
40
|
-
await ctx.db.patch(args.feedbackId, { priority: args.priority, updatedAt: new Date().toISOString() })
|
|
41
|
-
},
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
export const deleteFeedback = mutation({
|
|
45
|
-
args: { feedbackId: v.id('feedback_items') },
|
|
46
|
-
handler: async (ctx, args) => {
|
|
47
|
-
const votes = await ctx.db.query('feedback_votes').withIndex('by_feedbackId', q => q.eq('feedbackId', args.feedbackId)).collect()
|
|
48
|
-
for (const v of votes) await ctx.db.delete(v._id)
|
|
49
|
-
await ctx.db.delete(args.feedbackId)
|
|
50
|
-
},
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
export const voteFeedback = mutation({
|
|
54
|
-
args: { feedbackId: v.id('feedback_items'), userId: v.string() },
|
|
55
|
-
handler: async (ctx, args) => {
|
|
56
|
-
const existing = await ctx.db.query('feedback_votes').withIndex('by_userId_feedbackId', q => q.eq('userId', args.userId).eq('feedbackId', args.feedbackId)).first()
|
|
57
|
-
if (existing) return
|
|
58
|
-
await ctx.db.insert('feedback_votes', { ...args, createdAt: new Date().toISOString() })
|
|
59
|
-
const item = await ctx.db.get(args.feedbackId)
|
|
60
|
-
if (item) await ctx.db.patch(args.feedbackId, { votes: item.votes + 1 })
|
|
61
|
-
},
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
export const unvoteFeedback = mutation({
|
|
65
|
-
args: { feedbackId: v.id('feedback_items'), userId: v.string() },
|
|
66
|
-
handler: async (ctx, args) => {
|
|
67
|
-
const existing = await ctx.db.query('feedback_votes').withIndex('by_userId_feedbackId', q => q.eq('userId', args.userId).eq('feedbackId', args.feedbackId)).first()
|
|
68
|
-
if (!existing) return
|
|
69
|
-
await ctx.db.delete(existing._id)
|
|
70
|
-
const item = await ctx.db.get(args.feedbackId)
|
|
71
|
-
if (item) await ctx.db.patch(args.feedbackId, { votes: Math.max(0, item.votes - 1) })
|
|
72
|
-
},
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
export const submitNPS = mutation({
|
|
76
|
-
args: { score: v.number(), comment: v.optional(v.string()), userId: v.optional(v.string()) },
|
|
77
|
-
handler: async (ctx, args) => ctx.db.insert('nps_responses', { ...args, submittedAt: new Date().toISOString() }),
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
export const addAttachment = mutation({
|
|
81
|
-
args: { feedbackId: v.id('feedback_items'), url: v.string(), name: v.string(), size: v.number() },
|
|
82
|
-
handler: async (ctx, args) => {
|
|
83
|
-
const item = await ctx.db.get(args.feedbackId)
|
|
84
|
-
if (!item) throw new Error('Feedback not found')
|
|
85
|
-
const attachments = [...(item.attachments ?? []), { url: args.url, name: args.name, size: args.size }]
|
|
86
|
-
await ctx.db.patch(args.feedbackId, { attachments, updatedAt: new Date().toISOString() })
|
|
87
|
-
},
|
|
88
|
-
})
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { query } from './_generated/server'
|
|
2
|
-
import { v } from 'convex/values'
|
|
3
|
-
|
|
4
|
-
export const listFeedback = query({
|
|
5
|
-
args: {
|
|
6
|
-
type: v.optional(v.union(v.literal('bug'), v.literal('feature'), v.literal('general'), v.literal('suggestion'))),
|
|
7
|
-
status: v.optional(v.union(v.literal('open'), v.literal('under-review'), v.literal('planned'), v.literal('in-progress'), v.literal('done'), v.literal('declined'))),
|
|
8
|
-
priority: v.optional(v.union(v.literal('low'), v.literal('medium'), v.literal('high'), v.literal('critical'))),
|
|
9
|
-
limit: v.optional(v.number()),
|
|
10
|
-
},
|
|
11
|
-
handler: async (ctx, args) => {
|
|
12
|
-
const limit = args.limit ?? 100
|
|
13
|
-
let items
|
|
14
|
-
if (args.type) items = await ctx.db.query('feedback_items').withIndex('by_type', q => q.eq('type', args.type!)).order('desc').take(limit)
|
|
15
|
-
else if (args.status) items = await ctx.db.query('feedback_items').withIndex('by_status', q => q.eq('status', args.status!)).order('desc').take(limit)
|
|
16
|
-
else if (args.priority) items = await ctx.db.query('feedback_items').withIndex('by_priority', q => q.eq('priority', args.priority!)).order('desc').take(limit)
|
|
17
|
-
else items = await ctx.db.query('feedback_items').order('desc').take(limit)
|
|
18
|
-
return items
|
|
19
|
-
},
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
export const getFeedback = query({
|
|
23
|
-
args: { id: v.id('feedback_items') },
|
|
24
|
-
handler: async (ctx, args) => ctx.db.get(args.id),
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
export const getFeedbackStats = query({
|
|
28
|
-
args: {},
|
|
29
|
-
handler: async (ctx) => {
|
|
30
|
-
const items = await ctx.db.query('feedback_items').collect()
|
|
31
|
-
const byType: Record<string, number> = { bug: 0, feature: 0, suggestion: 0, general: 0 }
|
|
32
|
-
const byStatus: Record<string, number> = { open: 0, 'under-review': 0, planned: 0, 'in-progress': 0, done: 0, declined: 0 }
|
|
33
|
-
for (const item of items) { byType[item.type]++; byStatus[item.status]++ }
|
|
34
|
-
return { total: items.length, byType, byStatus }
|
|
35
|
-
},
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
export const listNPS = query({
|
|
39
|
-
args: { limit: v.optional(v.number()) },
|
|
40
|
-
handler: async (ctx, args) => ctx.db.query('nps_responses').order('desc').take(args.limit ?? 100),
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
export const getNPSStats = query({
|
|
44
|
-
args: {},
|
|
45
|
-
handler: async (ctx) => {
|
|
46
|
-
const responses = await ctx.db.query('nps_responses').collect()
|
|
47
|
-
let promoters = 0, passives = 0, detractors = 0, totalScore = 0
|
|
48
|
-
for (const r of responses) {
|
|
49
|
-
totalScore += r.score
|
|
50
|
-
if (r.score >= 9) promoters++
|
|
51
|
-
else if (r.score >= 7) passives++
|
|
52
|
-
else detractors++
|
|
53
|
-
}
|
|
54
|
-
const total = responses.length
|
|
55
|
-
return {
|
|
56
|
-
averageScore: total > 0 ? Math.round((totalScore / total) * 10) / 10 : 0,
|
|
57
|
-
totalResponses: total, promoters, passives, detractors,
|
|
58
|
-
npsScore: total > 0 ? Math.round(((promoters - detractors) / total) * 100) : 0,
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
export const getUserVotes = query({
|
|
64
|
-
args: { userId: v.string() },
|
|
65
|
-
handler: async (ctx, args) => {
|
|
66
|
-
const votes = await ctx.db.query('feedback_votes').withIndex('by_userId_feedbackId', q => q.eq('userId', args.userId)).collect()
|
|
67
|
-
return votes.map(v => v.feedbackId)
|
|
68
|
-
},
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
export const searchFeedback = query({
|
|
72
|
-
args: { query: v.string() },
|
|
73
|
-
handler: async (ctx, args) => {
|
|
74
|
-
const items = await ctx.db.query('feedback_items').order('desc').collect()
|
|
75
|
-
const q = args.query.toLowerCase()
|
|
76
|
-
return items.filter(i => i.title.toLowerCase().includes(q) || i.description.toLowerCase().includes(q))
|
|
77
|
-
},
|
|
78
|
-
})
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { defineSchema, defineTable } from 'convex/server'
|
|
2
|
-
import { v } from 'convex/values'
|
|
3
|
-
|
|
4
|
-
export default defineSchema({
|
|
5
|
-
feedback_items: defineTable({
|
|
6
|
-
type: v.union(v.literal('bug'), v.literal('feature'), v.literal('general'), v.literal('suggestion')),
|
|
7
|
-
title: v.string(),
|
|
8
|
-
description: v.string(),
|
|
9
|
-
status: v.union(v.literal('open'), v.literal('under-review'), v.literal('planned'), v.literal('in-progress'), v.literal('done'), v.literal('declined')),
|
|
10
|
-
priority: v.union(v.literal('low'), v.literal('medium'), v.literal('high'), v.literal('critical')),
|
|
11
|
-
userId: v.optional(v.string()),
|
|
12
|
-
userEmail: v.optional(v.string()),
|
|
13
|
-
userName: v.optional(v.string()),
|
|
14
|
-
url: v.optional(v.string()),
|
|
15
|
-
browser: v.optional(v.string()),
|
|
16
|
-
os: v.optional(v.string()),
|
|
17
|
-
tags: v.array(v.string()),
|
|
18
|
-
votes: v.number(),
|
|
19
|
-
createdAt: v.string(),
|
|
20
|
-
updatedAt: v.string(),
|
|
21
|
-
attachments: v.optional(v.array(v.object({ url: v.string(), name: v.string(), size: v.number() }))),
|
|
22
|
-
adminNote: v.optional(v.string()),
|
|
23
|
-
})
|
|
24
|
-
.index('by_type', ['type'])
|
|
25
|
-
.index('by_status', ['status'])
|
|
26
|
-
.index('by_priority', ['priority'])
|
|
27
|
-
.index('by_userId', ['userId'])
|
|
28
|
-
.index('by_createdAt', ['createdAt']),
|
|
29
|
-
|
|
30
|
-
nps_responses: defineTable({
|
|
31
|
-
score: v.number(),
|
|
32
|
-
comment: v.optional(v.string()),
|
|
33
|
-
userId: v.optional(v.string()),
|
|
34
|
-
submittedAt: v.string(),
|
|
35
|
-
})
|
|
36
|
-
.index('by_userId', ['userId'])
|
|
37
|
-
.index('by_score', ['score'])
|
|
38
|
-
.index('by_submittedAt', ['submittedAt']),
|
|
39
|
-
|
|
40
|
-
feedback_votes: defineTable({
|
|
41
|
-
feedbackId: v.id('feedback_items'),
|
|
42
|
-
userId: v.string(),
|
|
43
|
-
createdAt: v.string(),
|
|
44
|
-
})
|
|
45
|
-
.index('by_feedbackId', ['feedbackId'])
|
|
46
|
-
.index('by_userId_feedbackId', ['userId', 'feedbackId']),
|
|
47
|
-
})
|