@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.
Files changed (104) hide show
  1. package/package.json +16 -3
  2. package/packages/convex/dist/index.d.ts +192 -0
  3. package/packages/convex/dist/index.js +239 -0
  4. package/packages/convex/dist/index.js.map +1 -0
  5. package/packages/react/README.md +1 -1
  6. package/packages/react/dist/index.d.ts +146 -0
  7. package/packages/react/dist/index.js +545 -0
  8. package/packages/react/dist/index.js.map +1 -0
  9. package/packages/react-css/README.md +1 -1
  10. package/packages/react-css/dist/index.css +965 -0
  11. package/packages/react-css/dist/index.css.map +1 -0
  12. package/packages/react-css/dist/index.d.ts +49 -0
  13. package/packages/react-css/dist/index.js +228 -0
  14. package/packages/react-css/dist/index.js.map +1 -0
  15. package/packages/shared/README.md +1 -1
  16. package/packages/shared/dist/index.d.ts +115 -0
  17. package/packages/shared/dist/index.js +112 -0
  18. package/packages/shared/dist/index.js.map +1 -0
  19. package/packages/solidjs/README.md +1 -1
  20. package/packages/solidjs/dist/index.d.ts +128 -0
  21. package/packages/solidjs/dist/index.js +289 -0
  22. package/packages/solidjs/dist/index.js.map +1 -0
  23. package/packages/solidjs-css/README.md +1 -1
  24. package/packages/solidjs-css/dist/index.css +965 -0
  25. package/packages/solidjs-css/dist/index.css.map +1 -0
  26. package/packages/solidjs-css/dist/index.d.ts +2 -0
  27. package/packages/solidjs-css/dist/index.js +29 -0
  28. package/packages/solidjs-css/dist/index.js.map +1 -0
  29. package/.changeset/config.json +0 -11
  30. package/.github/CODEOWNERS +0 -1
  31. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
  32. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
  33. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  34. package/.github/dependabot.yml +0 -11
  35. package/.github/workflows/ci.yml +0 -23
  36. package/.github/workflows/release.yml +0 -29
  37. package/.nvmrc +0 -1
  38. package/.project/ACCOUNT.yaml +0 -4
  39. package/.project/IDEAS.yaml +0 -7
  40. package/.project/PROJECT.yaml +0 -11
  41. package/.project/ROADMAP.yaml +0 -15
  42. package/CODE_OF_CONDUCT.md +0 -16
  43. package/CONTRIBUTING.md +0 -26
  44. package/SECURITY.md +0 -15
  45. package/SUPPORT.md +0 -8
  46. package/packages/convex/package.json +0 -42
  47. package/packages/convex/src/index.ts +0 -3
  48. package/packages/convex/src/mutations.ts +0 -88
  49. package/packages/convex/src/queries.ts +0 -78
  50. package/packages/convex/src/schema.ts +0 -47
  51. package/packages/convex/tsconfig.json +0 -18
  52. package/packages/convex/tsup.config.ts +0 -17
  53. package/packages/react/package.json +0 -49
  54. package/packages/react/src/components/FeedbackCard.tsx +0 -51
  55. package/packages/react/src/components/FeedbackForm.tsx +0 -43
  56. package/packages/react/src/components/FeedbackWidget.tsx +0 -32
  57. package/packages/react/src/components/NPSSurvey.tsx +0 -62
  58. package/packages/react/src/components/index.ts +0 -4
  59. package/packages/react/src/hooks/index.ts +0 -5
  60. package/packages/react/src/hooks/useFeedback.ts +0 -23
  61. package/packages/react/src/hooks/useFeedbackAdmin.ts +0 -24
  62. package/packages/react/src/hooks/useFeedbackForm.ts +0 -35
  63. package/packages/react/src/hooks/useNPS.ts +0 -26
  64. package/packages/react/src/index.tsx +0 -13
  65. package/packages/react/src/pages/FeedbackAdminPage.tsx +0 -71
  66. package/packages/react/src/pages/FeedbackPublicPage.tsx +0 -42
  67. package/packages/react/src/pages/FeedbackWidgetPage.tsx +0 -25
  68. package/packages/react/src/pages/index.ts +0 -3
  69. package/packages/react/tsconfig.json +0 -19
  70. package/packages/react/tsup.config.ts +0 -12
  71. package/packages/react-css/package.json +0 -36
  72. package/packages/react-css/src/components/index.ts +0 -5
  73. package/packages/react-css/src/components/index.tsx +0 -107
  74. package/packages/react-css/src/hooks/index.ts +0 -2
  75. package/packages/react-css/src/index.tsx +0 -5
  76. package/packages/react-css/src/pages/FeedbackAdminPage.tsx +0 -112
  77. package/packages/react-css/src/pages/FeedbackPage.tsx +0 -76
  78. package/packages/react-css/src/styles.css +0 -281
  79. package/packages/react-css/tsconfig.json +0 -19
  80. package/packages/react-css/tsup.config.ts +0 -10
  81. package/packages/shared/package.json +0 -44
  82. package/packages/shared/src/__tests__/feedback.test.ts +0 -72
  83. package/packages/shared/src/config.ts +0 -49
  84. package/packages/shared/src/index.ts +0 -111
  85. package/packages/shared/src/types.ts +0 -59
  86. package/packages/shared/tsconfig.json +0 -18
  87. package/packages/shared/tsup.config.ts +0 -11
  88. package/packages/shared/vitest.config.ts +0 -4
  89. package/packages/solidjs/package.json +0 -45
  90. package/packages/solidjs/src/components.tsx +0 -72
  91. package/packages/solidjs/src/index.tsx +0 -3
  92. package/packages/solidjs/src/primitives.ts +0 -49
  93. package/packages/solidjs/tsconfig.json +0 -20
  94. package/packages/solidjs/tsup.config.ts +0 -12
  95. package/packages/solidjs-css/package.json +0 -32
  96. package/packages/solidjs-css/src/index.tsx +0 -4
  97. package/packages/solidjs-css/src/pages/FeedbackAdminPage.tsx +0 -78
  98. package/packages/solidjs-css/src/pages/FeedbackPage.tsx +0 -65
  99. package/packages/solidjs-css/src/primitives/index.ts +0 -1
  100. package/packages/solidjs-css/src/styles.css +0 -281
  101. package/packages/solidjs-css/tsconfig.json +0 -20
  102. package/packages/solidjs-css/tsup.config.ts +0 -10
  103. package/pnpm-workspace.yaml +0 -2
  104. 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":";AACA;AACE,iBAAe,MAAM,KAAK,KAAK;AAC/B,sBAAoB,MAAM,KAAK,KAAK;AACpC,qBAAmB,MAAM,KAAK,KAAK;AACnC,mBAAiB,MAAM,KAAK,KAAK;AACjC,yBAAuB,MAAM,KAAK,KAAK;AACvC,qBAAmB,MAAM,KAAK,KAAK;AACnC,mBAAiB,MAAM,KAAK,KAAK;AACjC,qBAAmB,MAAM,KAAK,KAAK;AACnC,sBAAoB,MAAM,KAAK,KAAK;AACpC,uBAAqB,MAAM,KAAK,KAAK;AACrC,mBAAiB,MAAM,KAAK,KAAK;AACjC,uBAAqB,MAAM,KAAK,KAAK;AACrC,kBAAgB,MAAM,KAAK,KAAK;AAChC,sBAAoB,MAAM,KAAK,KAAK;AACpC,yBAAuB,MAAM,KAAK,KAAK;AACvC,sBAAoB,MAAM,KAAK,KAAK;AACpC,qBAAmB;AACrB;AAGA,CAAC;AACC,WAAS;AACT,OAAK;AACL,WAAS;AACT,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe,IAAI;AACnB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAC1B,cAAY,IAAI;AAChB,UAAQ;AACV;AACA,CAVC,cAUc;AAAS,gBAAc,MAAM,KAAK,KAAK,IAAI,EAAE;AAAM,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AACnG,CAAC;AAAsB,QAAM;AAAG,aAAW;AAAG;AAC9C,CAAC;AAAwB,WAAS;AAAM,eAAa;AAAQ,OAAK;AAAQ,aAAW;AAAM,iBAAe;AAAS;AACnH,CAAC;AAAuB,aAAW;AAAU,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,YAAU;AAAQ,iBAAe;AAAU,eAAa;AAAQ,iBAAe;AAAU;AACnL,CAAC;AAAsB,aAAW;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,WAAS;AAAa,sBAAoB;AAAG,sBAAoB;AAAU,YAAU;AAAQ;AACrK,CAAC;AAAsB,WAAS;AAAM,eAAa;AAAQ,OAAK;AAAS,cAAY;AAAQ,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AAC9I,CAAC;AAAsB,eAAa,IAAI,MAAM,IAAI;AAAiB;AACnE,CAAC;AAA0B,eAAa,IAAI,MAAM,IAAI;AAAqB;AAC3E,CAAC;AAA6B,eAAa,IAAI,MAAM,IAAI;AAAwB;AACjF,CAAC;AAA0B,eAAa,IAAI,MAAM,IAAI;AAAqB;AAG3E,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,eAAa;AACb,OAAK;AACL,WAAS,SAAS;AAClB,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAC7C,UAAQ;AACR,aAAW;AACX,eAAa;AACb,UAAQ;AACR,cAAY,IAAI;AAChB,wBAAsB;AACxB;AACA,CAAC;AAA+B,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC5F,CADC,4BAC4B;AAAS,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AACjG,CAAC;AAA6B,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AACpG,CAAC;AAA2B,aAAW;AAAU;AAGjD,CAAC;AAAyB,WAAS;AAAa,eAAa;AAAQ,OAAK;AAAS,WAAS,SAAS;AAAU,iBAAe;AAAQ,aAAW;AAAU,eAAa;AAAK;AAC7K,CAAC;AAA+B,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AACtG,CAAC;AAAuC,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAK;AAC5G,CAAC;AAAkC,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AACzG,CAAC;AAAsC,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AAC7G,CAAC;AAA+B,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AACtG,CAAC;AAAmC,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AAG1G,CAAC;AAA2B,WAAS,SAAS;AAAQ,iBAAe;AAAQ,aAAW;AAAU,eAAa;AAAK;AACpH,CAAC;AAAgC,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AACvG,CAAC;AAAmC,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAK;AACxG,CAAC;AAAiC,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAK;AACtG,CAAC;AAAqC,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAK;AAG1G,CAAC;AAAuB,WAAS;AAAa,eAAa;AAAQ,OAAK;AAAS,WAAS,SAAS;AAAQ,iBAAe;AAAQ,aAAW;AAAU,eAAa;AAAK;AACzK,CAAC;AAA4B,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAK;AACjG,CAAC;AAAgC,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AACvG,CAAC;AAAmC,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAK;AACxG,CAAC;AAAgC,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AAGvG,CAAC;AACC,YAAU;AAAO,OAAK;AAAK,SAAO;AAAG,aAAW,WAAW;AAC3D,WAAS;AAAI,WAAS,OAAO;AAAM,iBAAe,IAAI,mBAAmB,EAAE,EAAE,IAAI;AACjF,cAAY,IAAI;AAAoB,SAAO;AAAO,UAAQ;AAAM,UAAQ;AACxE,gBAAc;AAAa,aAAW;AAAW,eAAa;AAAK,kBAAgB;AACnF,cAAY,KAAK,EAAE,KAAK,MAAM,KAAK,KAAK,IAAI,EAAE;AAChD;AACA,CAPC,wBAOwB;AAAS,cAAY,MAAM,KAAK,KAAK;AAAM;AACpE,CAAC;AAA2B,YAAU;AAAO,SAAO;AAAG,WAAS;AAAI,WAAS;AAAM,mBAAiB;AAAU;AAC9G,CAAC;AAA4B,YAAU;AAAU,SAAO;AAAG,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,mBAAiB,KAAK;AAAM;AACvH,CAAC;AAAyB,YAAU;AAAU,SAAO;AAAM,aAAW;AAAO,cAAY,MAAM,KAAK,KAAK;AAAM,eAAa,IAAI,MAAM,IAAI;AAAoB,WAAS;AAAQ,cAAY;AAAM;AACjM,CAAC;AAA0B,WAAS;AAAM,eAAa;AAAQ,mBAAiB;AAAe,iBAAe;AAAQ;AACtH,CAAC;AAAyB,aAAW;AAAU,eAAa;AAAK,SAAO,IAAI;AAAkB;AAG9F,CAAC;AAAiB,WAAS;AAAM,kBAAgB;AAAQ,OAAK;AAAM;AACpE,CAAC;AAAuB,SAAO;AAAM,WAAS,QAAQ;AAAM,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,aAAW;AAAU,SAAO,IAAI;AAAkB,WAAS;AAAM;AAC/O,CADC,oBACoB;AAAgB,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAChE,CAFC,oBAEoB;AAAS,gBAAc,MAAM,KAAK,KAAK,IAAI,EAAE;AAAM;AACxE,CAAC;AAA0B,UAAQ;AAAM,cAAY;AAAM;AAC3D,CAAC;AAAuB,aAAW;AAAW,SAAO,MAAM,KAAK,KAAK;AAAK;AAC1E,CAAC;AAAyB,WAAS;AAAM,mBAAiB;AAAU,OAAK;AAAQ;AAGjF,CAAC;AAA0B,WAAS;AAAM,OAAK;AAAU;AACzD,CAAC;AAAqB,WAAS;AAAM,eAAa;AAAQ,OAAK;AAAU,WAAS,OAAO;AAAS,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,UAAQ;AAAM,aAAW;AAAW,eAAa;AAAK,UAAQ;AAAS,cAAY,IAAI;AAAO;AACnP,CAAC;AAA+B,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC5F,CADC,4BAC4B;AAAS,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAGtE,CAAC;AAAgB,YAAU;AAAO,UAAQ;AAAQ,SAAO;AAAQ,WAAS;AAAI,SAAO;AAAO,UAAQ,IAAI,MAAM,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,cAAY,MAAM,KAAK,KAAK;AAAM,WAAS;AAAQ,cAAY,EAAE,IAAI,KAAK,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AACnR,CAAC;AAAuB,WAAS;AAAM,eAAa;AAAQ,mBAAiB;AAAe,iBAAe;AAAS;AACpH,CAAC;AAAsB,aAAW;AAAU,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AACzF,CAAC;AAAyB,aAAW;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe;AAAM;AAChG,CAAC;AAAuB,WAAS;AAAM,OAAK;AAAS;AACrD,CAAC;AAA0B,QAAM;AAAG,WAAS,SAAS;AAAG,UAAQ;AAAM,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,aAAW;AAAW,eAAa;AAAK,UAAQ;AAAS,cAAY,IAAI;AAAO;AACtQ,CADC,uBACuB;AAAS,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AACjE,CAAC;AAAuB,WAAS;AAAM,mBAAiB;AAAe,cAAY;AAAQ,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC3I,CAAC;AAAwB,WAAS;AAAS,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AAC7J,CAAC;AAA8B,aAAW;AAAU,eAAa;AAAK,wBAAsB;AAAc;AAC1G,CAAC;AAAoB,WAAS;AAAM,UAAQ;AAAS,YAAU;AAAQ,iBAAe;AAAQ,UAAQ,KAAK;AAAG;AAC9G,CAAC;AAA+B,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAM;AACvE,CAAC;AAA6B,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAM;AACrE,CAAC;AAA8B,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAM;AACvE,CAAC;AAA0B,WAAS;AAAM,yBAAuB,OAAO,CAAC,EAAE;AAAM,OAAK;AAAQ,cAAY;AAAQ,aAAW;AAAW;AAGxI,CAAC;AAAkB,WAAS;AAAM,kBAAgB;AAAQ,OAAK;AAAU;AAGzE,CAAC;AAAwB,SAAO;AAAM,aAAW;AAAU,mBAAiB;AAAU;AACtF,CADC,sBACsB;AAAK,WAAS,QAAQ;AAAM,cAAY;AAAM,aAAW;AAAU,eAAa;AAAK,kBAAgB;AAAW,kBAAgB;AAAQ,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe,IAAI,MAAM,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AACxO,CAFC,sBAEsB;AAAK,WAAS,QAAQ;AAAM,iBAAe,IAAI,MAAM,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AACjG,CAHC,sBAGsB,EAAE;AAAS,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AACnE,CAAC;AAAyB,WAAS,QAAQ;AAAQ,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,aAAW;AAAW,SAAO,IAAI;AAAkB,WAAS;AAAM;AAGnP,CAAC;AAAuB,WAAS;AAAM,yBAAuB,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE;AAAO,OAAK;AAAM,iBAAe;AAAM;AACpI,CAAC;AAAsB,WAAS;AAAM,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AACxJ,CAAC;AAAsB,aAAW;AAAU;AAC5C,CAAC;AAAuB,aAAW;AAAQ,eAAa;AAAK,wBAAsB;AAAc,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC5H,CAAC;AAAuB,aAAW;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAGzE,CAAC;AAAmB,SAAO;AAAM,aAAW;AAAO,WAAS,SAAS;AAAM,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,aAAW;AAAU,SAAO,IAAI;AAAkB,WAAS;AAAM;AAC9P,CADC,gBACgB;AAAgB,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC5D,CAFC,gBAEgB;AAAS,gBAAc,MAAM,KAAK,KAAK,IAAI,EAAE;AAAM;AAGpE,CAAC;AAAwB,WAAS;AAAM,aAAW;AAAM,OAAK;AAAU;AACxE,CAAC;AAAuB,WAAS,SAAS;AAAS,UAAQ;AAAM,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,aAAW;AAAW,eAAa;AAAK,UAAQ;AAAS;AAC7K,CAAC;AAA+B,cAAY,IAAI;AAAoB,SAAO;AAAO;AAClF,CAAC;AAAiC,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC9F,CADC,8BAC8B;AAAS,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAGxE,CAAC;AAAgB,WAAS,OAAO;AAAM,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,aAAW;AAAW,eAAa;AAAK,UAAQ;AAAS,UAAQ;AAAM,cAAY,IAAI;AAAO;AACxL,CAAC;AAAyB,cAAY,IAAI;AAAoB,SAAO;AAAO;AAC5E,CADC,sBACsB;AAAS,cAAY,MAAM,KAAK,KAAK;AAAM;AAClE,CAAC;AAAyB,UAAQ,IAAI,MAAM,IAAI;AAAoB,cAAY;AAAa,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AACxH,CAAC;AAAwB,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAM,SAAO,MAAM,KAAK,KAAK;AAAK;AAG5F,CAAC;AAAqB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,iBAAe,IAAI;AAAoB,aAAW,eAAe,KAAK,YAAY;AAAU;AACnJ,WADyG;AAC7E;AAAW,aAAS;AAAG;AAAE;AAAM,aAAS;AAAK;AAAE;AAG3E,CAAC;AAAkB,WAAS;AAAM,kBAAgB;AAAQ,eAAa;AAAQ,mBAAiB;AAAQ,WAAS,KAAK;AAAM,cAAY;AAAQ;AAChJ,CAAC;AAAuB,aAAW;AAAM,WAAS;AAAK,iBAAe;AAAS;AAC/E,CAAC;AAAuB,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAGxE,CAAC;AAAoB,WAAS;AAAM,kBAAgB;AAAQ,eAAa;AAAQ,WAAS;AAAM,cAAY;AAAQ;AACpH,CAAC;AAAyB,aAAW;AAAQ,iBAAe;AAAS;AACrE,CAAC;AAAyB,aAAW;AAAM,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe;AAAS;AAChH,CAAC;AAAwB,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAGzE,CAAC;AAAgB,WAAS,SAAS;AAAU,iBAAe;AAAS,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAGtJ,CAAC;AAAsB,WAAS;AAAU,UAAQ;AAAM,cAAY;AAAa,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,UAAQ;AAAS,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM;AAChL,CADC,mBACmB;AAAS,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AAGzF,CAAC;AAA2B,WAAS;AAAM,kBAAgB;AAAQ,OAAK;AAAM,WAAS;AAAM,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AAC/M,CAAC;AAAoB,WAAS;AAAM,OAAK;AAAS;AAClD,CAAC;AAA2B,SAAO;AAAM,UAAQ;AAAM,iBAAe;AAAK,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAM,WAAS;AAAM,eAAa;AAAQ,mBAAiB;AAAQ,aAAW;AAAU,eAAa;AAAG;AACrN,CAAC;AAAyB,QAAM;AAAG;AACnC,CAAC;AAA2B,WAAS;AAAM,eAAa;AAAQ,OAAK;AAAQ,iBAAe;AAAS;AACrG,CAAC;AAA2B,aAAW;AAAS,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC7F,CAAC;AAAyB,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC1E,CAAC;AAAyB,aAAW;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,eAAa;AAAK;AAC7F,CAAC;AAA8B,cAAY;AAAQ,WAAS,QAAQ;AAAQ,aAAW;AAAU,UAAQ;AAAM,cAAY;AAAa,SAAO,MAAM,KAAK,KAAK;AAAM,UAAQ;AAAS,cAAY,IAAI;AAAM;AAC5M,CADC,2BAC2B;AAAS,SAAO,MAAM,KAAK,KAAK;AAAM;AAGlE,CAAC;AAAmB,WAAS;AAAM,OAAK;AAAS;AACjD,CAAC;AAAwB,aAAW;AAAQ,UAAQ;AAAS,WAAS;AAAK,cAAY,IAAI;AAAO;AAClG,CAAC;AAAgC,WAAS;AAAG,SAAO,MAAM,KAAK,KAAK;AAAK;AACzE,CAFC,qBAEqB;AAAS,WAAS;AAAG,aAAW,MAAM;AAAM;AAGlE,CAAC;AAA2B,WAAS;AAAM,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,cAAY;AAAQ;AACjL,CAAC;AAA2B,aAAW;AAAM,iBAAe;AAAQ;AACpE,CAAC;AAA4B,aAAW;AAAU,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe;AAAS;AACvH,CAAC;AAA4B,aAAW;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAG9E,CAAC;AAA2B,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,WAAS;AAAM;AAC7J,CAAC;AAA4B,WAAS;AAAM,eAAa;AAAQ,mBAAiB;AAAe,iBAAe;AAAS;AACzH,CAAC;AAA2B,aAAW;AAAU,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC9F,CAAC;AAA0B,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC3E,CAAC;AAA0B,aAAW;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,eAAa;AAAK;AAC9F,CAAC;AAA6B,WAAS;AAAM,OAAK;AAAQ,cAAY;AAAS;AAC/E,CAAC;AAAyB,WAAS,QAAQ;AAAQ,aAAW;AAAU,UAAQ;AAAM,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,UAAQ;AAAS,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,cAAY,IAAI;AAAM;AAC5O,CADC,sBACsB;AAAS,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAG3F,CAAC;AAAsB,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,WAAS;AAAM;AACxJ,CAAC;AAA4B,aAAW;AAAU,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe;AAAM;AACpH,CAAC;AAA4B,WAAS;AAAM,eAAa;AAAU,OAAK;AAAQ,UAAQ;AAAO;AAC/F,CAAC;AAA0B,QAAM;AAAG,iBAAe,QAAQ,QAAQ,EAAE;AAAG;AAAA,IAAY;AAAA,MAAgB,GAAG,GAAnB;AAAA,MAAwB,MAAM,KAAK,KAAK,IAAxC;AAAA,MAA8C,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,cAAY,IAAI;AAAM,YAAU;AAAU;AACzM,CADC,uBACuB;AAAS;AAAA,IAAY;AAAA,MAAgB,GAAG,GAAnB;AAAA,MAAwB,MAAM,KAAK,KAAK,IAAxC;AAAA,MAA8C,MAAM,KAAK,KAAK;AAAO;AAClH,CAAC;AAA4B,YAAU;AAAU,UAAQ;AAAS,QAAM;AAAK,aAAW,WAAW;AAAO,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,eAAa;AAAQ;AAG/K,CAAC;AAAyB,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,WAAS;AAAM;AAC3J,CAAC;AAA2B,iBAAe;AAAM;AACjD,CADC,wBACwB;AAAc,iBAAe;AAAG;AACzD,CAAC;AAAiC,aAAW;AAAW,eAAa;AAAK,kBAAgB;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe;AAAQ,kBAAgB;AAAQ;AAC/K,CAAC;AAA2B,WAAS;AAAM,kBAAgB;AAAQ,OAAK;AAAS;AACjF,CAAC;AAA0B,WAAS;AAAM,eAAa;AAAQ,OAAK;AAAQ,WAAS,QAAQ;AAAG,aAAW;AAAW;AACtH,CADC,wBACwB;AAAQ,UAAQ;AAAS;AAClD,CAAC;AAAgC,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,UAAQ;AAAS;AAG7E,CAAC;AAAyB,WAAS;AAAM,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO;AAC3J,CAAC;AAA+B,WAAS;AAAO,aAAW;AAAW,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,iBAAe;AAAQ,kBAAgB;AAAW;AACrK,CAAC;AAAqB,WAAS;AAAM,aAAW;AAAM,OAAK;AAAQ;AACnE,CAAC;AAAqB,WAAS;AAAa,eAAa;AAAQ,OAAK;AAAS,WAAS,SAAS;AAAS,iBAAe;AAAQ,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM,aAAW;AAAW,eAAa;AAAK;AAC/O,CAAC;AAAuB,eAAa;AAAS,UAAQ;AAAS,eAAa;AAAK,WAAS;AAAK,cAAY,QAAQ;AAAM;AACzH,CADC,oBACoB;AAAS,WAAS;AAAG;AAG1C,CAAC;AAAwB,WAAS;AAAM,mBAAiB;AAAe,eAAa;AAAQ,eAAa;AAAM,cAAY,IAAI,MAAM,IAAI;AAAoB;AAC9J,CAAC;AAAyB,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC1E,CAAC;AAA+B,WAAS;AAAM,OAAK;AAAQ;AAG5D,CAAC;AAA6B,WAAS;AAAa,eAAa;AAAQ,OAAK;AAAU,WAAS,SAAS;AAAS,iBAAe;AAAQ,aAAW;AAAU,eAAa;AAAK;AACjL,CAAC;AAAkC,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AACzG,CAAC;AAAwC,cAAY,MAAM,KAAK,KAAK,GAAG,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAK;AAC7G,CAAC;AAA0C,cAAY,MAAM,KAAK,KAAK,IAAI,EAAE;AAAO,SAAO,MAAM,KAAK,KAAK;AAAM;AAGjH,CAAC;AAA2B,WAAS;AAAM,yBAAuB,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE;AAAO,OAAK;AAAQ;AACrH,CAAC;AAA+B,WAAS;AAAS,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,IAAI;AAAoB,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,cAAY;AAAQ;AACxL,CAAC;AAA+B,aAAW;AAAS,iBAAe;AAAS;AAC5E,CAAC;AAAgC,aAAW;AAAM,eAAa;AAAK,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC/F,CAAC;AAAgC,aAAW;AAAU,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,cAAY;AAAS;AAGtG,CAAC;AAAuB,WAAS;AAAM,eAAa;AAAQ,OAAK;AAAQ,aAAW;AAAU,iBAAe;AAAM;AACnH,CAAC;AAA4B,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AACxD,CAAC;AAAoC,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,eAAa;AAAK;AAClF,CAAC;AAA2B,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,UAAQ,EAAE;AAAS;AAG1E,CAAC;AAAuB,WAAS;AAAM,eAAa;AAAQ,OAAK;AAAQ,mBAAiB;AAAQ,WAAS;AAAM;AACjH,CAAC;AAA2B,WAAS,SAAS;AAAS,UAAQ,IAAI,MAAM,IAAI;AAAoB,iBAAe,KAAK,IAAI,mBAAmB,EAAE;AAAM,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAO,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,aAAW;AAAW,UAAQ;AAAS,cAAY,IAAI;AAAM;AAC7Q,CADC,wBACwB,MAAM,KAAK;AAAa,cAAY,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;AAC5G,CAFC,wBAEwB;AAAY,WAAS;AAAK,UAAQ;AAAa;AACxE,CAAC;AAA4B,aAAW;AAAW,SAAO,MAAM,EAAE,EAAE,EAAE,EAAE;AAAM;","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":[]}
@@ -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
- }
@@ -1 +0,0 @@
1
- * @mxn2020
@@ -1,16 +0,0 @@
1
- ---
2
- name: Bug Report
3
- about: Report a bug
4
- labels: bug
5
- ---
6
-
7
- ## Describe the bug
8
-
9
- ## Steps to reproduce
10
-
11
- ## Expected behavior
12
-
13
- ## Environment
14
- - Package version:
15
- - Node version:
16
- - OS:
@@ -1,11 +0,0 @@
1
- ---
2
- name: Feature Request
3
- about: Suggest a new feature
4
- labels: enhancement
5
- ---
6
-
7
- ## Problem
8
-
9
- ## Proposed solution
10
-
11
- ## Alternatives considered
@@ -1,10 +0,0 @@
1
- ## What
2
-
3
- ## Why
4
-
5
- ## How
6
-
7
- ## Checklist
8
- - [ ] Tests added/updated
9
- - [ ] `pnpm changeset` run (if applicable)
10
- - [ ] Documentation updated
@@ -1,11 +0,0 @@
1
- version: 2
2
- updates:
3
- - package-ecosystem: "npm"
4
- directory: "/"
5
- schedule:
6
- interval: "weekly"
7
- open-pull-requests-limit: 10
8
- - package-ecosystem: "github-actions"
9
- directory: "/"
10
- schedule:
11
- interval: "weekly"
@@ -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
@@ -1,4 +0,0 @@
1
- owner: Mehdi Nabhani
2
- email: mehdi@geenius.app
3
- github: mxn2020
4
- organization: geenius
@@ -1,7 +0,0 @@
1
- ideas:
2
- - title: "CLI scaffolding"
3
- description: "Add a create command to geenius-cli for this package"
4
- priority: medium
5
- - title: "Vue adapter"
6
- description: "Add Vue 3 support alongside React and SolidJS"
7
- priority: low
@@ -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"
@@ -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"
@@ -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,3 +0,0 @@
1
- export { default as schema } from './schema'
2
- export * as queries from './queries'
3
- export * as mutations from './mutations'
@@ -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
- })