reviewkit 0.1.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 (85) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/CODE_OF_CONDUCT.md +123 -0
  4. data/CONTRIBUTING.md +44 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +335 -0
  7. data/Rakefile +7 -0
  8. data/SECURITY.md +18 -0
  9. data/app/assets/builds/reviewkit/application.css +2 -0
  10. data/app/assets/javascripts/reviewkit/application.js +12 -0
  11. data/app/assets/javascripts/reviewkit/controllers/file_nav_controller.js +24 -0
  12. data/app/assets/javascripts/reviewkit/controllers/review_index_controller.js +84 -0
  13. data/app/assets/tailwind/reviewkit/application.css +865 -0
  14. data/app/controllers/reviewkit/application_controller.rb +80 -0
  15. data/app/controllers/reviewkit/comments_controller.rb +147 -0
  16. data/app/controllers/reviewkit/review_threads_controller.rb +277 -0
  17. data/app/controllers/reviewkit/reviews_controller.rb +142 -0
  18. data/app/helpers/reviewkit/application_helper.rb +12 -0
  19. data/app/helpers/reviewkit/asset_helper.rb +39 -0
  20. data/app/helpers/reviewkit/diff_helper.rb +230 -0
  21. data/app/helpers/reviewkit/flash_helper.rb +36 -0
  22. data/app/helpers/reviewkit/frame_helper.rb +37 -0
  23. data/app/helpers/reviewkit/icon_helper.rb +107 -0
  24. data/app/helpers/reviewkit/review_thread_helper.rb +54 -0
  25. data/app/models/concerns/reviewkit/notifies_lifecycle_events.rb +39 -0
  26. data/app/models/reviewkit/application_record.rb +7 -0
  27. data/app/models/reviewkit/comment.rb +29 -0
  28. data/app/models/reviewkit/current.rb +7 -0
  29. data/app/models/reviewkit/document.rb +79 -0
  30. data/app/models/reviewkit/review.rb +66 -0
  31. data/app/models/reviewkit/review_thread.rb +75 -0
  32. data/app/services/reviewkit/diffs/intraline_budget.rb +40 -0
  33. data/app/services/reviewkit/diffs/intraline_diff.rb +220 -0
  34. data/app/services/reviewkit/diffs/split_diff.rb +112 -0
  35. data/app/services/reviewkit/reviews/create.rb +57 -0
  36. data/app/views/layouts/reviewkit/application.html.erb +15 -0
  37. data/app/views/reviewkit/comments/_comment.html.erb +53 -0
  38. data/app/views/reviewkit/comments/_edit_form.html.erb +26 -0
  39. data/app/views/reviewkit/comments/_form.html.erb +16 -0
  40. data/app/views/reviewkit/review_threads/_bucket.html.erb +53 -0
  41. data/app/views/reviewkit/review_threads/_bucket_frame.html.erb +13 -0
  42. data/app/views/reviewkit/review_threads/_bucket_row.html.erb +55 -0
  43. data/app/views/reviewkit/review_threads/_edit_form.html.erb +29 -0
  44. data/app/views/reviewkit/review_threads/_thread.html.erb +87 -0
  45. data/app/views/reviewkit/reviews/_document.html.erb +41 -0
  46. data/app/views/reviewkit/reviews/_document_split.html.erb +73 -0
  47. data/app/views/reviewkit/reviews/_document_unified.html.erb +57 -0
  48. data/app/views/reviewkit/reviews/_edit_form.html.erb +35 -0
  49. data/app/views/reviewkit/reviews/_index_content.html.erb +160 -0
  50. data/app/views/reviewkit/reviews/_review_sidebar.html.erb +70 -0
  51. data/app/views/reviewkit/reviews/_show_content.html.erb +164 -0
  52. data/app/views/reviewkit/reviews/index.html.erb +11 -0
  53. data/app/views/reviewkit/reviews/show.html.erb +11 -0
  54. data/app/views/reviewkit/shared/_flash.html.erb +10 -0
  55. data/bin/console +4 -0
  56. data/bin/lint +4 -0
  57. data/bin/rails +14 -0
  58. data/bin/setup +9 -0
  59. data/bin/test +4 -0
  60. data/config/importmap.rb +6 -0
  61. data/config/routes.rb +24 -0
  62. data/db/migrate/20260331181500_create_reviewkit_reviews.rb +19 -0
  63. data/db/migrate/20260331181600_create_reviewkit_documents.rb +23 -0
  64. data/db/migrate/20260331181700_create_reviewkit_review_threads.rb +23 -0
  65. data/db/migrate/20260331181800_create_reviewkit_comments.rb +15 -0
  66. data/db/migrate/20260401093000_add_description_to_reviewkit_reviews.rb +7 -0
  67. data/lib/generators/reviewkit/controllers/controllers_generator.rb +24 -0
  68. data/lib/generators/reviewkit/controllers/templates/comments_controller_extension.rb +13 -0
  69. data/lib/generators/reviewkit/controllers/templates/review_threads_controller_extension.rb +13 -0
  70. data/lib/generators/reviewkit/controllers/templates/reviews_controller_extension.rb +19 -0
  71. data/lib/generators/reviewkit/install/install_generator.rb +52 -0
  72. data/lib/generators/reviewkit/install/templates/importmap.rb +3 -0
  73. data/lib/generators/reviewkit/install/templates/reviewkit.rb +19 -0
  74. data/lib/generators/reviewkit/models/models_generator.rb +24 -0
  75. data/lib/generators/reviewkit/models/templates/comment_extension.rb +21 -0
  76. data/lib/generators/reviewkit/models/templates/review_extension.rb +22 -0
  77. data/lib/generators/reviewkit/models/templates/review_thread_extension.rb +21 -0
  78. data/lib/generators/reviewkit/views/views_generator.rb +15 -0
  79. data/lib/reviewkit/configuration.rb +33 -0
  80. data/lib/reviewkit/engine.rb +67 -0
  81. data/lib/reviewkit/version.rb +5 -0
  82. data/lib/reviewkit.rb +26 -0
  83. data/lib/tasks/reviewkit_tasks.rake +12 -0
  84. data/sig/reviewkit.rbs +129 -0
  85. metadata +238 -0
@@ -0,0 +1,865 @@
1
+ @import "tailwindcss";
2
+
3
+ @source "../../../views/**/*.erb";
4
+ @source "../../../helpers/**/*.rb";
5
+
6
+ @theme {
7
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
8
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
9
+ }
10
+
11
+ @layer base {
12
+ body {
13
+ @apply antialiased;
14
+ }
15
+ }
16
+
17
+ @layer components {
18
+ .reviewkit-page {
19
+ @apply mx-auto w-full max-w-[1800px] px-3 py-4 sm:px-4 lg:px-5;
20
+ --reviewkit-sticky-top: 0px;
21
+ }
22
+
23
+ .reviewkit-page--embedded {
24
+ @apply max-w-none;
25
+ }
26
+
27
+ .reviewkit-index-shell {
28
+ @apply flex min-h-[calc(100vh-2.5rem)] flex-col gap-4;
29
+ }
30
+
31
+ .reviewkit-index-heading {
32
+ @apply flex flex-col gap-3 md:flex-row md:items-end md:justify-between;
33
+ }
34
+
35
+ .reviewkit-index-heading__copy {
36
+ @apply space-y-2;
37
+ }
38
+
39
+ .reviewkit-page-header {
40
+ @apply rounded-lg border border-slate-200 bg-white px-4 py-3 shadow-sm;
41
+ }
42
+
43
+ .reviewkit-page-header--index {
44
+ @apply flex flex-col gap-3 md:flex-row md:items-end md:justify-between;
45
+ }
46
+
47
+ .reviewkit-page-header--compact {
48
+ @apply px-4 py-3;
49
+ }
50
+
51
+ .reviewkit-kicker {
52
+ @apply text-[10px] font-semibold uppercase tracking-[0.18em] text-slate-500;
53
+ }
54
+
55
+ .reviewkit-title {
56
+ @apply text-3xl font-semibold tracking-tight text-slate-950 sm:text-4xl;
57
+ }
58
+
59
+ .reviewkit-title--compact {
60
+ @apply text-2xl sm:text-3xl;
61
+ }
62
+
63
+ .reviewkit-subtitle {
64
+ @apply max-w-3xl text-sm leading-6 text-slate-600 sm:text-base;
65
+ }
66
+
67
+ .reviewkit-subtitle--compact {
68
+ @apply text-sm;
69
+ }
70
+
71
+ .reviewkit-summary-pill {
72
+ @apply inline-flex items-center gap-2 self-start rounded-md border border-slate-200 bg-slate-50 px-2.5 py-1.5 text-xs text-slate-600;
73
+ }
74
+
75
+ .reviewkit-summary-pill__value {
76
+ @apply font-semibold text-slate-950;
77
+ }
78
+
79
+ .reviewkit-card-stack {
80
+ @apply grid gap-3;
81
+ }
82
+
83
+ .reviewkit-index-table-shell {
84
+ @apply overflow-hidden rounded-lg border border-slate-200 bg-white shadow-sm;
85
+ }
86
+
87
+ .reviewkit-index-toolbar {
88
+ @apply flex flex-col gap-3 border-b border-slate-200 bg-slate-50 px-4 pt-3 pb-0;
89
+ }
90
+
91
+ .reviewkit-index-toolbar__search {
92
+ @apply min-w-0;
93
+ }
94
+
95
+ .reviewkit-index-search {
96
+ @apply block w-full;
97
+ }
98
+
99
+ .reviewkit-index-search input {
100
+ @apply w-full rounded-md border border-slate-300 bg-white px-3 py-1.5 text-[13px] text-slate-900 outline-none transition placeholder:text-slate-400 focus:border-slate-500 focus:ring-2 focus:ring-slate-200;
101
+ }
102
+
103
+ .reviewkit-index-tabs {
104
+ @apply min-w-0;
105
+ }
106
+
107
+ .reviewkit-index-tabs__select-wrap {
108
+ @apply grid grid-cols-1 sm:hidden;
109
+ }
110
+
111
+ .reviewkit-index-tabs__select {
112
+ @apply col-start-1 row-start-1 w-full appearance-none rounded-md border border-slate-300 bg-white py-1.5 pl-3 pr-8 text-[13px] text-slate-900 outline-none transition focus:border-slate-500 focus:ring-2 focus:ring-slate-200;
113
+ }
114
+
115
+ .reviewkit-index-tabs__select-icon {
116
+ @apply pointer-events-none col-start-1 row-start-1 mr-2 size-5 self-center justify-self-end text-slate-500;
117
+ }
118
+
119
+ .reviewkit-index-tabs__desktop {
120
+ @apply hidden sm:block;
121
+ }
122
+
123
+ .reviewkit-index-tabs__nav-wrap {
124
+ @apply border-b border-slate-200;
125
+ }
126
+
127
+ .reviewkit-index-tabs__nav {
128
+ @apply -mb-px flex flex-wrap gap-0;
129
+ }
130
+
131
+ .reviewkit-index-tab {
132
+ @apply inline-flex cursor-pointer items-center gap-1.5 border-b-2 border-transparent px-3 py-2.5 text-[13px] font-medium whitespace-nowrap text-slate-500 transition hover:border-slate-300 hover:text-slate-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-200;
133
+ }
134
+
135
+ .reviewkit-index-tab--active {
136
+ @apply border-slate-900 text-slate-950 hover:border-slate-900 hover:text-slate-950;
137
+ }
138
+
139
+ .reviewkit-index-tab__count {
140
+ @apply hidden rounded-full bg-slate-100 px-2 py-0.5 text-[11px] font-medium text-slate-700 md:inline-flex;
141
+ }
142
+
143
+ .reviewkit-index-tab__count--active {
144
+ @apply bg-slate-900 text-white;
145
+ }
146
+
147
+ .reviewkit-index-table-wrap {
148
+ @apply overflow-x-auto;
149
+ }
150
+
151
+ .reviewkit-index-table {
152
+ @apply min-w-full border-collapse;
153
+ }
154
+
155
+ .reviewkit-index-table thead th {
156
+ @apply border-b border-slate-200 bg-white px-4 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500;
157
+ }
158
+
159
+ .reviewkit-index-table tbody tr {
160
+ @apply border-b border-slate-200 last:border-b-0;
161
+ }
162
+
163
+ .reviewkit-index-table tbody tr:hover {
164
+ @apply bg-slate-50;
165
+ }
166
+
167
+ .reviewkit-index-table tbody tr[role="link"] {
168
+ @apply cursor-pointer;
169
+ }
170
+
171
+ .reviewkit-index-table tbody tr[role="link"]:focus-visible {
172
+ @apply bg-slate-100 outline-none ring-2 ring-inset ring-slate-300;
173
+ }
174
+
175
+ .reviewkit-index-table tbody td {
176
+ @apply align-top px-4 py-3 text-sm text-slate-700;
177
+ }
178
+
179
+ .reviewkit-index-row__primary {
180
+ @apply min-w-0 space-y-1.5;
181
+ }
182
+
183
+ .reviewkit-index-row__title-group {
184
+ @apply flex flex-wrap items-center gap-2;
185
+ }
186
+
187
+ .reviewkit-index-row__title {
188
+ @apply text-[15px] font-semibold text-slate-950 no-underline transition hover:text-slate-700;
189
+ }
190
+
191
+ .reviewkit-index-row__reference {
192
+ @apply inline-flex items-center rounded-md border border-slate-200 bg-slate-100 px-2 py-0.5 font-mono text-[11px] text-slate-600;
193
+ }
194
+
195
+ .reviewkit-index-row__description {
196
+ @apply max-w-3xl text-sm leading-6 text-slate-600;
197
+ }
198
+
199
+ .reviewkit-index-row__meta {
200
+ @apply flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-slate-500;
201
+ }
202
+
203
+ .reviewkit-index-row__status,
204
+ .reviewkit-index-row__threads,
205
+ .reviewkit-index-row__updated {
206
+ @apply whitespace-nowrap;
207
+ }
208
+
209
+ .reviewkit-index-row__threads {
210
+ @apply text-xs text-slate-500;
211
+ }
212
+
213
+ .reviewkit-index-row__thread-count {
214
+ @apply font-semibold text-slate-900;
215
+ }
216
+
217
+ .reviewkit-index-row__thread-label {
218
+ @apply ml-1;
219
+ }
220
+
221
+ .reviewkit-index-row__updated {
222
+ @apply text-xs text-slate-500;
223
+ }
224
+
225
+ .reviewkit-index-empty {
226
+ @apply border-t border-slate-200 px-4 py-5 text-sm text-slate-500;
227
+ }
228
+
229
+ .reviewkit-panel {
230
+ @apply rounded-lg border border-slate-200 bg-white shadow-sm;
231
+ }
232
+
233
+ .reviewkit-panel--interactive {
234
+ @apply p-4 transition hover:-translate-y-0.5 hover:shadow-md;
235
+ }
236
+
237
+ .reviewkit-empty-state {
238
+ @apply flex min-h-56 flex-col justify-center gap-3 px-5 py-8;
239
+ }
240
+
241
+ .reviewkit-review-layout {
242
+ @apply grid gap-4 xl:grid-cols-[18rem_minmax(0,1fr)] xl:items-start;
243
+ }
244
+
245
+ .reviewkit-review-sidebar {
246
+ @apply hidden xl:block xl:self-start;
247
+ }
248
+
249
+ .reviewkit-review-sidebar__rail {
250
+ @apply sticky top-0 grid min-h-0 grid-rows-[auto_auto_minmax(0,1fr)_auto] gap-3 border-r border-slate-200 pr-4 pt-4;
251
+ top: var(--reviewkit-sticky-top, 0px);
252
+ height: min(100%, calc(100dvh - var(--reviewkit-sticky-top, 0px)));
253
+ max-height: min(100%, calc(100dvh - var(--reviewkit-sticky-top, 0px)));
254
+ }
255
+
256
+ .reviewkit-review-main {
257
+ @apply min-w-0 space-y-3;
258
+ }
259
+
260
+ .reviewkit-review-header {
261
+ @apply space-y-3 border-b border-slate-200 pb-3;
262
+ }
263
+
264
+ .reviewkit-review-header__top {
265
+ @apply flex flex-col gap-3 xl:flex-row xl:items-start xl:justify-between;
266
+ }
267
+
268
+ .reviewkit-review-title {
269
+ @apply text-2xl font-semibold tracking-tight text-slate-950 sm:text-3xl;
270
+ }
271
+
272
+ .reviewkit-review-description {
273
+ @apply max-w-3xl text-sm leading-6 text-slate-600;
274
+ }
275
+
276
+ .reviewkit-review-meta {
277
+ @apply flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-slate-600;
278
+ }
279
+
280
+ .reviewkit-review-meta-item {
281
+ @apply inline-flex items-center gap-1 rounded-md border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs text-slate-600;
282
+ }
283
+
284
+ .reviewkit-review-mobile-summary {
285
+ @apply flex flex-wrap gap-x-3 gap-y-1 text-xs text-slate-500;
286
+ }
287
+
288
+ .reviewkit-review-actions {
289
+ @apply flex flex-wrap items-center gap-2;
290
+ }
291
+
292
+ .reviewkit-review-actions form {
293
+ @apply m-0;
294
+ }
295
+
296
+ .reviewkit-flash-shell {
297
+ @apply pb-3;
298
+ }
299
+
300
+ .reviewkit-flash-shell--page {
301
+ @apply mx-auto max-w-7xl px-6 pt-4;
302
+ }
303
+
304
+ .reviewkit-flash-shell--inline {
305
+ @apply pb-3;
306
+ }
307
+
308
+ .reviewkit-flash {
309
+ @apply flex items-start gap-2 rounded-[6px] border border-slate-200 bg-slate-50 px-3 py-2 text-sm text-slate-700;
310
+ }
311
+
312
+ .reviewkit-flash--notice {
313
+ @apply border-sky-200 bg-sky-50 text-sky-900;
314
+ }
315
+
316
+ .reviewkit-flash--alert {
317
+ @apply border-rose-200 bg-rose-50 text-rose-800;
318
+ }
319
+
320
+ .reviewkit-flash__label {
321
+ @apply shrink-0 font-semibold text-current;
322
+ }
323
+
324
+ .reviewkit-review-edit-form {
325
+ @apply min-w-0 flex-1 space-y-3 rounded-[6px] border border-slate-200 bg-slate-50 p-3;
326
+ }
327
+
328
+ .reviewkit-files-header {
329
+ @apply flex flex-wrap items-center justify-between gap-2 border-b border-slate-200 pb-2;
330
+ }
331
+
332
+ .reviewkit-files-header__controls {
333
+ @apply flex flex-wrap items-center justify-end gap-2;
334
+ }
335
+
336
+ .reviewkit-files-title {
337
+ @apply text-base font-semibold text-slate-950;
338
+ }
339
+
340
+ .reviewkit-files-count {
341
+ @apply inline-flex min-w-6 items-center justify-center rounded-full border border-slate-300 bg-slate-100 px-1.5 py-0.5 text-[11px] font-semibold text-slate-700;
342
+ }
343
+
344
+ .reviewkit-files-diffstat {
345
+ @apply flex items-center gap-3 text-[12px];
346
+ }
347
+
348
+ .reviewkit-view-toggle {
349
+ @apply inline-flex items-center rounded-[6px] border border-slate-300 bg-white p-0.5 shadow-sm;
350
+ }
351
+
352
+ .reviewkit-view-toggle__button {
353
+ @apply inline-flex min-w-18 items-center justify-center rounded-[5px] px-2.5 py-1 text-xs font-normal text-slate-700 no-underline transition hover:bg-slate-100 hover:text-slate-950;
354
+ }
355
+
356
+ a.reviewkit-view-toggle__button,
357
+ a.reviewkit-view-toggle__button:link,
358
+ a.reviewkit-view-toggle__button:visited {
359
+ color: var(--color-slate-700) !important;
360
+ text-decoration: none !important;
361
+ }
362
+
363
+ .reviewkit-view-toggle__button--active {
364
+ @apply bg-slate-900 text-white hover:bg-slate-900 hover:text-white;
365
+ }
366
+
367
+ a.reviewkit-view-toggle__button:hover,
368
+ a.reviewkit-view-toggle__button:focus-visible {
369
+ color: var(--color-slate-950) !important;
370
+ }
371
+
372
+ a.reviewkit-view-toggle__button--active,
373
+ a.reviewkit-view-toggle__button--active:link,
374
+ a.reviewkit-view-toggle__button--active:visited,
375
+ a.reviewkit-view-toggle__button--active:hover,
376
+ a.reviewkit-view-toggle__button--active:focus-visible {
377
+ color: var(--color-white) !important;
378
+ text-decoration: none !important;
379
+ }
380
+
381
+ .reviewkit-files-list {
382
+ @apply space-y-3;
383
+ }
384
+
385
+ .reviewkit-metric-grid {
386
+ @apply grid grid-cols-2 gap-2;
387
+ }
388
+
389
+ .reviewkit-metric-card {
390
+ @apply rounded-md bg-slate-100 px-2.5 py-2;
391
+ }
392
+
393
+ .reviewkit-metric-card__label {
394
+ @apply text-xs text-slate-500;
395
+ }
396
+
397
+ .reviewkit-metric-card__value {
398
+ @apply mt-0.5 text-sm font-semibold text-slate-900;
399
+ }
400
+
401
+ .reviewkit-code-panel {
402
+ @apply overflow-x-auto rounded-md border border-slate-300 bg-slate-950 p-2.5 text-[11px] leading-5 text-slate-100;
403
+ }
404
+
405
+ .reviewkit-document-search input {
406
+ @apply w-full rounded-[6px] border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none transition placeholder:text-slate-400 focus:border-slate-500 focus:ring-2 focus:ring-slate-200;
407
+ }
408
+
409
+ .reviewkit-document-nav-wrap {
410
+ @apply min-h-0 overflow-y-auto pr-1;
411
+ }
412
+
413
+ .reviewkit-document-nav {
414
+ @apply space-y-0.5;
415
+ }
416
+
417
+ .reviewkit-document-link {
418
+ @apply flex items-start justify-between gap-2 rounded-[6px] px-2.5 py-1.5 text-sm transition hover:bg-slate-100 focus-visible:bg-slate-100 focus-visible:outline-none;
419
+ }
420
+
421
+ .reviewkit-document-link:hover .reviewkit-file-icon,
422
+ .reviewkit-document-link:focus-visible .reviewkit-file-icon {
423
+ @apply text-slate-700;
424
+ }
425
+
426
+ .reviewkit-document-link:hover .reviewkit-document-link__path .text-slate-500,
427
+ .reviewkit-document-link:focus-visible .reviewkit-document-link__path .text-slate-500 {
428
+ @apply text-slate-600;
429
+ }
430
+
431
+ .reviewkit-document-link:hover .reviewkit-document-link__path .text-slate-900,
432
+ .reviewkit-document-link:focus-visible .reviewkit-document-link__path .text-slate-900 {
433
+ @apply text-slate-950;
434
+ }
435
+
436
+ .reviewkit-document-link__content {
437
+ @apply flex min-w-0 items-start gap-2;
438
+ }
439
+
440
+ .reviewkit-document-link__path {
441
+ @apply truncate font-mono text-[12px] leading-5;
442
+ }
443
+
444
+ .reviewkit-document-link__stats {
445
+ @apply ml-2 flex items-center gap-1.5 pt-0.5 text-[11px];
446
+ }
447
+
448
+ .reviewkit-document-link--active {
449
+ @apply bg-slate-100 text-slate-950 ring-1 ring-inset ring-slate-300;
450
+ }
451
+
452
+ .reviewkit-document-link--active:hover,
453
+ .reviewkit-document-link--active:focus-visible {
454
+ @apply bg-slate-100 text-slate-950 ring-slate-300;
455
+ }
456
+
457
+ .reviewkit-document-link--active:hover .reviewkit-file-icon,
458
+ .reviewkit-document-link--active:focus-visible .reviewkit-file-icon,
459
+ .reviewkit-document-link--active:hover .reviewkit-document-link__path,
460
+ .reviewkit-document-link--active:focus-visible .reviewkit-document-link__path,
461
+ .reviewkit-document-link--active:hover .reviewkit-document-link__path .text-slate-500,
462
+ .reviewkit-document-link--active:focus-visible .reviewkit-document-link__path .text-slate-500,
463
+ .reviewkit-document-link--active:hover .reviewkit-document-link__path .text-slate-900,
464
+ .reviewkit-document-link--active:focus-visible .reviewkit-document-link__path .text-slate-900 {
465
+ @apply text-slate-950;
466
+ }
467
+
468
+ .reviewkit-document-link--active .reviewkit-file-icon,
469
+ .reviewkit-document-link--active .reviewkit-document-link__path,
470
+ .reviewkit-document-link--active .reviewkit-document-link__path .text-slate-500,
471
+ .reviewkit-document-link--active .reviewkit-document-link__path .text-slate-900 {
472
+ @apply text-slate-950;
473
+ }
474
+
475
+ .reviewkit-document-link--active .reviewkit-file-icon,
476
+ .reviewkit-document-link--active:hover .reviewkit-file-icon,
477
+ .reviewkit-document-link--active:focus-visible .reviewkit-file-icon {
478
+ @apply text-slate-700;
479
+ }
480
+
481
+ .reviewkit-document-link--active .reviewkit-document-link__path .text-slate-500,
482
+ .reviewkit-document-link--active:hover .reviewkit-document-link__path .text-slate-500,
483
+ .reviewkit-document-link--active:focus-visible .reviewkit-document-link__path .text-slate-500 {
484
+ @apply text-slate-600;
485
+ }
486
+
487
+ .reviewkit-document-link--active .reviewkit-document-link__stats .text-emerald-700,
488
+ .reviewkit-document-link--active:hover .reviewkit-document-link__stats .text-emerald-700,
489
+ .reviewkit-document-link--active:focus-visible .reviewkit-document-link__stats .text-emerald-700 {
490
+ @apply text-emerald-800;
491
+ }
492
+
493
+ .reviewkit-document-link--active .reviewkit-document-link__stats .text-rose-700,
494
+ .reviewkit-document-link--active:hover .reviewkit-document-link__stats .text-rose-700,
495
+ .reviewkit-document-link--active:focus-visible .reviewkit-document-link__stats .text-rose-700 {
496
+ @apply text-rose-800;
497
+ }
498
+
499
+ .reviewkit-document-empty {
500
+ @apply px-2.5 py-2 text-sm text-slate-500;
501
+ }
502
+
503
+ .reviewkit-status-pill {
504
+ @apply inline-flex items-center rounded-md bg-amber-100 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-amber-900;
505
+ }
506
+
507
+ .reviewkit-status-pill--approved {
508
+ @apply bg-emerald-100 text-emerald-800;
509
+ }
510
+
511
+ .reviewkit-status-pill--rejected {
512
+ @apply bg-rose-100 text-rose-800;
513
+ }
514
+
515
+ .reviewkit-status-pill--closed {
516
+ @apply bg-slate-200 text-slate-700;
517
+ }
518
+
519
+ .reviewkit-status-pill--resolved {
520
+ @apply bg-emerald-100 text-emerald-800;
521
+ }
522
+
523
+ .reviewkit-status-pill--outdated {
524
+ @apply bg-slate-200 text-slate-700;
525
+ }
526
+
527
+ .reviewkit-status-pill--draft {
528
+ @apply bg-slate-100 text-slate-600;
529
+ }
530
+
531
+ .reviewkit-status-pill--dark {
532
+ @apply bg-slate-900 text-white;
533
+ }
534
+
535
+ .reviewkit-document-header {
536
+ @apply border-b border-slate-200 bg-slate-50 px-3 py-2.5;
537
+ }
538
+
539
+ .reviewkit-file {
540
+ @apply relative overflow-visible rounded-[6px] border border-slate-300 bg-white;
541
+ scroll-margin-top: calc(var(--reviewkit-sticky-top, 0px) + 0.75rem);
542
+ }
543
+
544
+ .reviewkit-file-header {
545
+ @apply sticky z-10 flex items-center justify-between gap-3 rounded-t-[5px] border-b border-slate-300 bg-slate-100/95 px-3 py-1.5 backdrop-blur;
546
+ top: var(--reviewkit-sticky-top, 0px);
547
+ }
548
+
549
+ .reviewkit-file-heading {
550
+ @apply flex min-w-0 items-center gap-2;
551
+ }
552
+
553
+ .reviewkit-file-icon {
554
+ @apply size-4 shrink-0 text-slate-500;
555
+ }
556
+
557
+ .reviewkit-file-icon--nav {
558
+ @apply mt-0.5 size-3.5;
559
+ }
560
+
561
+ .reviewkit-file-path {
562
+ @apply truncate font-mono text-[12px] leading-5;
563
+ }
564
+
565
+ .reviewkit-file-path__directory {
566
+ @apply text-slate-500;
567
+ }
568
+
569
+ .reviewkit-file-path__basename {
570
+ @apply font-semibold text-slate-900;
571
+ }
572
+
573
+ .reviewkit-file-meta {
574
+ @apply flex shrink-0 items-center gap-3 text-[11px] text-slate-500;
575
+ }
576
+
577
+ .reviewkit-file-table-wrap {
578
+ @apply overflow-hidden rounded-b-[6px];
579
+ }
580
+
581
+ .reviewkit-file-table-scroll {
582
+ @apply overflow-x-auto;
583
+ overflow-y: hidden;
584
+ }
585
+
586
+ .reviewkit-file--selected {
587
+ @apply border-sky-500 shadow-[0_0_0_1px_rgba(14,165,233,0.18)];
588
+ }
589
+
590
+ .reviewkit-file--selected .reviewkit-file-header {
591
+ @apply border-sky-200 bg-sky-50/90;
592
+ }
593
+
594
+ .reviewkit-sidebar-details {
595
+ @apply rounded-md border border-slate-200 bg-white;
596
+ }
597
+
598
+ .reviewkit-sidebar-details summary {
599
+ @apply cursor-pointer list-none px-3 py-2 text-xs font-semibold uppercase tracking-[0.14em] text-slate-500;
600
+ }
601
+
602
+ .reviewkit-sidebar-details summary::-webkit-details-marker {
603
+ display: none;
604
+ }
605
+
606
+ .reviewkit-diff-table {
607
+ @apply w-full min-w-[1040px] table-fixed border-collapse text-[12px];
608
+ }
609
+
610
+ .reviewkit-diff-table--unified {
611
+ @apply min-w-0;
612
+ }
613
+
614
+ .reviewkit-line {
615
+ @apply border-t border-slate-200 align-top font-mono text-[12px] leading-5 text-slate-900;
616
+ }
617
+
618
+ .reviewkit-diff-cell--line {
619
+ @apply w-px whitespace-nowrap select-none px-2 py-0.5 text-center text-[11px] text-slate-500;
620
+ }
621
+
622
+ .reviewkit-diff-cell--action {
623
+ @apply px-1 py-0.5 text-center;
624
+ }
625
+
626
+ .reviewkit-diff-cell--code {
627
+ @apply px-2.5 py-0.5;
628
+ }
629
+
630
+ .reviewkit-diff-cell--split-divider {
631
+ @apply border-r border-slate-300;
632
+ }
633
+
634
+ .reviewkit-line--added .reviewkit-diff-cell--new {
635
+ @apply bg-emerald-50;
636
+ }
637
+
638
+ .reviewkit-line--removed .reviewkit-diff-cell--old {
639
+ @apply bg-rose-50;
640
+ }
641
+
642
+ .reviewkit-line--changed .reviewkit-diff-cell--old {
643
+ @apply bg-rose-50;
644
+ }
645
+
646
+ .reviewkit-line--changed .reviewkit-diff-cell--new {
647
+ @apply bg-emerald-50;
648
+ }
649
+
650
+ .reviewkit-diff-table--unified .reviewkit-line--added .reviewkit-diff-cell {
651
+ @apply bg-emerald-50;
652
+ }
653
+
654
+ .reviewkit-diff-table--unified .reviewkit-line--removed .reviewkit-diff-cell,
655
+ .reviewkit-diff-table--unified .reviewkit-line--changed .reviewkit-diff-cell {
656
+ @apply bg-rose-50;
657
+ }
658
+
659
+ .reviewkit-diff-table--unified .reviewkit-line--context .reviewkit-diff-cell {
660
+ @apply bg-white;
661
+ }
662
+
663
+ .reviewkit-line-action {
664
+ @apply invisible inline-flex size-4 cursor-pointer items-center justify-center rounded border border-slate-300 bg-white text-[11px] font-semibold text-sky-700 opacity-0 transition hover:border-sky-300 hover:bg-sky-50 hover:text-sky-800 focus-visible:visible focus-visible:opacity-100;
665
+ }
666
+
667
+ .reviewkit-button {
668
+ @apply inline-flex items-center justify-center rounded-md px-3 py-1.5 text-sm font-semibold transition;
669
+ }
670
+
671
+ .reviewkit-button--primary {
672
+ @apply bg-slate-900 text-white hover:bg-slate-700;
673
+ }
674
+
675
+ .reviewkit-button--secondary {
676
+ @apply bg-white text-slate-900 ring-1 ring-slate-300 hover:bg-slate-100;
677
+ }
678
+
679
+ .reviewkit-button--success {
680
+ @apply border border-emerald-200 bg-emerald-50 text-emerald-800 hover:border-emerald-300 hover:bg-emerald-100;
681
+ }
682
+
683
+ .reviewkit-button--danger {
684
+ @apply border border-rose-200 bg-rose-50 text-rose-800 hover:border-rose-300 hover:bg-rose-100;
685
+ }
686
+
687
+ .reviewkit-button--ghost {
688
+ @apply border border-slate-300 bg-white text-slate-700 hover:border-slate-400 hover:text-slate-950;
689
+ }
690
+
691
+ .reviewkit-button--small {
692
+ @apply px-2.5 py-1 text-[11px];
693
+ }
694
+
695
+ .reviewkit-button:disabled {
696
+ @apply cursor-not-allowed border-slate-200 bg-slate-100 text-slate-400 shadow-none hover:border-slate-200 hover:bg-slate-100 hover:text-slate-400;
697
+ }
698
+
699
+ .reviewkit-textarea {
700
+ @apply w-full rounded-[6px] border border-slate-300 bg-white px-3 py-2 text-sm leading-5 text-slate-900 outline-none transition focus:border-slate-500 focus:ring-2 focus:ring-slate-200;
701
+ }
702
+
703
+ .reviewkit-inline-actions {
704
+ @apply flex items-center gap-1.5;
705
+ }
706
+
707
+ .reviewkit-inline-icon-button {
708
+ @apply inline-flex size-8 items-center justify-center rounded-md text-slate-500 transition hover:bg-slate-100 hover:text-slate-700 focus-visible:bg-slate-100 focus-visible:text-slate-700 focus-visible:outline-none;
709
+ }
710
+
711
+ .reviewkit-inline-icon-button--danger {
712
+ @apply text-rose-600 hover:bg-rose-50 hover:text-rose-700 focus-visible:bg-rose-50 focus-visible:text-rose-700;
713
+ }
714
+
715
+ .reviewkit-inline-icon {
716
+ @apply size-4;
717
+ }
718
+
719
+ .reviewkit-comment-card {
720
+ @apply bg-white px-3 py-2;
721
+ }
722
+
723
+ .reviewkit-comment-header {
724
+ @apply flex items-start justify-between gap-4;
725
+ }
726
+
727
+ .reviewkit-comment-meta {
728
+ @apply flex items-center gap-2;
729
+ }
730
+
731
+ .reviewkit-comment-edited {
732
+ @apply rounded bg-slate-100 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.12em] text-slate-500;
733
+ }
734
+
735
+ .reviewkit-comment-edit-form {
736
+ @apply space-y-2 border-t border-slate-200 bg-slate-50 px-3 py-2.5;
737
+ }
738
+
739
+ .reviewkit-comment-error {
740
+ @apply border border-rose-200 bg-rose-50 px-2.5 py-1.5 text-xs text-rose-700;
741
+ }
742
+
743
+ .reviewkit-inline-change {
744
+ border-radius: 2px;
745
+ box-decoration-break: clone;
746
+ -webkit-box-decoration-break: clone;
747
+ }
748
+
749
+ .reviewkit-inline-change--old {
750
+ background-color: rgba(254, 205, 211, 0.88);
751
+ box-shadow: inset 0 0 0 1px rgba(251, 113, 133, 0.32);
752
+ }
753
+
754
+ .reviewkit-inline-change--new {
755
+ background-color: rgba(187, 247, 208, 0.92);
756
+ box-shadow: inset 0 0 0 1px rgba(74, 222, 128, 0.34);
757
+ }
758
+
759
+ .highlight {
760
+ @apply bg-transparent;
761
+ }
762
+
763
+ .reviewkit-diff-table .highlight {
764
+ @apply block bg-transparent whitespace-pre-wrap break-words;
765
+ line-height: inherit;
766
+ }
767
+
768
+ .reviewkit-diff-table .highlight pre {
769
+ @apply m-0 bg-transparent p-0 whitespace-pre-wrap break-words;
770
+ font: inherit;
771
+ line-height: inherit;
772
+ }
773
+
774
+ .highlight .k,
775
+ .highlight .kd,
776
+ .highlight .kr {
777
+ @apply text-fuchsia-700;
778
+ }
779
+
780
+ .highlight .nx,
781
+ .highlight .nf {
782
+ @apply text-sky-700;
783
+ }
784
+
785
+ .highlight .s,
786
+ .highlight .s1,
787
+ .highlight .s2 {
788
+ @apply text-emerald-700;
789
+ }
790
+
791
+ .highlight .mi,
792
+ .highlight .mf {
793
+ @apply text-amber-700;
794
+ }
795
+
796
+ .highlight .c,
797
+ .highlight .c1 {
798
+ @apply text-slate-400;
799
+ }
800
+
801
+ .reviewkit-comment-body p {
802
+ @apply m-0;
803
+ }
804
+
805
+ .reviewkit-line-group:hover .reviewkit-line-action,
806
+ .reviewkit-line-action:focus-visible {
807
+ @apply visible opacity-100;
808
+ }
809
+
810
+ .reviewkit-thread-bucket-cell {
811
+ @apply p-0 align-top;
812
+ }
813
+
814
+ .reviewkit-thread-bucket-cell--split {
815
+ @apply w-1/2;
816
+ }
817
+
818
+ .reviewkit-thread-bucket-cell--old {
819
+ @apply border-r border-slate-300;
820
+ }
821
+
822
+ .reviewkit-thread-stack {
823
+ @apply space-y-2 px-2 py-2;
824
+ }
825
+
826
+ .reviewkit-thread-composer {
827
+ @apply rounded-[6px] border border-slate-200 bg-white px-3 py-3;
828
+ }
829
+
830
+ .reviewkit-thread-accordion {
831
+ @apply overflow-hidden rounded-[6px] border border-slate-300 bg-white;
832
+ }
833
+
834
+ .reviewkit-thread-accordion__summary {
835
+ @apply flex cursor-pointer list-none items-start justify-between gap-3 bg-slate-50 px-3 py-2 text-left transition hover:bg-slate-100;
836
+ }
837
+
838
+ .reviewkit-thread-accordion__summary::-webkit-details-marker {
839
+ display: none;
840
+ }
841
+
842
+ .reviewkit-thread-accordion__summary-main {
843
+ @apply min-w-0 flex-1 space-y-1;
844
+ }
845
+
846
+ .reviewkit-thread-accordion__preview {
847
+ @apply truncate text-[12px] text-slate-600;
848
+ }
849
+
850
+ .reviewkit-thread-accordion__chevron {
851
+ @apply mt-0.5 shrink-0 text-slate-400 transition;
852
+ }
853
+
854
+ .reviewkit-thread-accordion[open] .reviewkit-thread-accordion__chevron {
855
+ @apply rotate-90 text-slate-600;
856
+ }
857
+
858
+ .reviewkit-thread-card {
859
+ @apply border-t border-slate-200 bg-white;
860
+ }
861
+
862
+ .reviewkit-thread-card__header {
863
+ @apply flex flex-wrap items-center justify-between gap-2 border-b border-slate-200 bg-white px-3 py-2;
864
+ }
865
+ }