@mostrom/app-shell 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 (142) hide show
  1. package/.claude/ralph-loop.local.md +9 -0
  2. package/README.md +172 -0
  3. package/bin/init.js +269 -0
  4. package/bun.lock +401 -0
  5. package/components.json +28 -0
  6. package/package.json +74 -0
  7. package/scripts/publish-npm.sh +202 -0
  8. package/src/AppShell.tsx +847 -0
  9. package/src/components/PageHeader.tsx +160 -0
  10. package/src/components/data-table/README.md +447 -0
  11. package/src/components/data-table/data-table-preferences.tsx +184 -0
  12. package/src/components/data-table/data-table-toolbar.tsx +118 -0
  13. package/src/components/data-table/data-table.tsx +37 -0
  14. package/src/components/data-table/index.ts +32 -0
  15. package/src/components/global-header/AllServicesButton.tsx +127 -0
  16. package/src/components/global-header/CategoriesButton.tsx +120 -0
  17. package/src/components/global-header/GlobalHeader.tsx +59 -0
  18. package/src/components/global-header/GlobalHeaderSearch.tsx +57 -0
  19. package/src/components/global-header/HeaderUtilities.tsx +243 -0
  20. package/src/components/global-header/ServicesMenu.tsx +246 -0
  21. package/src/components/layout/AppBreadcrumb.tsx +70 -0
  22. package/src/components/layout/AppFlashbar.tsx +95 -0
  23. package/src/components/layout/AppLayout.tsx +271 -0
  24. package/src/components/layout/AppNavigation.tsx +313 -0
  25. package/src/components/layout/AppSidebar.tsx +229 -0
  26. package/src/components/patterns/index.ts +14 -0
  27. package/src/components/patterns/p-alert-5.tsx +19 -0
  28. package/src/components/patterns/p-autocomplete-5.tsx +89 -0
  29. package/src/components/patterns/p-breadcrumb-1.tsx +28 -0
  30. package/src/components/patterns/p-button-42.tsx +37 -0
  31. package/src/components/patterns/p-button-51.tsx +14 -0
  32. package/src/components/patterns/p-button-6.tsx +5 -0
  33. package/src/components/patterns/p-calendar-1.tsx +18 -0
  34. package/src/components/patterns/p-card-1.tsx +33 -0
  35. package/src/components/patterns/p-card-2.tsx +26 -0
  36. package/src/components/patterns/p-card-5.tsx +31 -0
  37. package/src/components/patterns/p-collapsible-7.tsx +121 -0
  38. package/src/components/patterns/p-command-6.tsx +113 -0
  39. package/src/components/patterns/p-dialog-1.tsx +56 -0
  40. package/src/components/patterns/p-dropdown-menu-1.tsx +38 -0
  41. package/src/components/patterns/p-dropdown-menu-11.tsx +122 -0
  42. package/src/components/patterns/p-dropdown-menu-14.tsx +165 -0
  43. package/src/components/patterns/p-dropdown-menu-9.tsx +108 -0
  44. package/src/components/patterns/p-empty-2.tsx +34 -0
  45. package/src/components/patterns/p-file-upload-1.tsx +72 -0
  46. package/src/components/patterns/p-filters-1.tsx +666 -0
  47. package/src/components/patterns/p-frame-2.tsx +26 -0
  48. package/src/components/patterns/p-tabs-2.tsx +129 -0
  49. package/src/components/reui/alert.tsx +92 -0
  50. package/src/components/reui/autocomplete.tsx +343 -0
  51. package/src/components/reui/badge.tsx +87 -0
  52. package/src/components/reui/data-grid/data-grid-column-filter.tsx +165 -0
  53. package/src/components/reui/data-grid/data-grid-column-header.tsx +339 -0
  54. package/src/components/reui/data-grid/data-grid-column-visibility.tsx +55 -0
  55. package/src/components/reui/data-grid/data-grid-pagination.tsx +224 -0
  56. package/src/components/reui/data-grid/data-grid-table-dnd-rows.tsx +260 -0
  57. package/src/components/reui/data-grid/data-grid-table-dnd.tsx +253 -0
  58. package/src/components/reui/data-grid/data-grid-table.tsx +639 -0
  59. package/src/components/reui/data-grid/data-grid.tsx +209 -0
  60. package/src/components/reui/date-selector.tsx +1330 -0
  61. package/src/components/reui/filters.tsx +1869 -0
  62. package/src/components/reui/frame.tsx +134 -0
  63. package/src/components/reui/index.ts +17 -0
  64. package/src/components/reui/timeline.tsx +219 -0
  65. package/src/components/search/Autocomplete.tsx +183 -0
  66. package/src/components/search/AutocompleteClient.tsx +293 -0
  67. package/src/components/search/GlobalSearch.tsx +187 -0
  68. package/src/components/section-drawer/deal-drawer-content.tsx +891 -0
  69. package/src/components/section-drawer/index.ts +19 -0
  70. package/src/components/section-drawer/section-drawer.css +665 -0
  71. package/src/components/section-drawer/section-drawer.tsx +467 -0
  72. package/src/components/sectioned-list-board/README.md +78 -0
  73. package/src/components/sectioned-list-board/board-card-content.tsx +340 -0
  74. package/src/components/sectioned-list-board/date-range-filter.tsx +249 -0
  75. package/src/components/sectioned-list-board/index.ts +19 -0
  76. package/src/components/sectioned-list-board/sectioned-list-board.css +564 -0
  77. package/src/components/sectioned-list-board/sectioned-list-board.tsx +731 -0
  78. package/src/components/sectioned-list-board/sortable-card.tsx +314 -0
  79. package/src/components/sectioned-list-board/sortable-section.tsx +319 -0
  80. package/src/components/sectioned-list-board/types.ts +216 -0
  81. package/src/components/sectioned-list-table/README.md +80 -0
  82. package/src/components/sectioned-list-table/index.ts +14 -0
  83. package/src/components/sectioned-list-table/sectioned-list-table.css +534 -0
  84. package/src/components/sectioned-list-table/sectioned-list-table.tsx +740 -0
  85. package/src/components/sectioned-list-table/sortable-column-header.tsx +120 -0
  86. package/src/components/sectioned-list-table/sortable-row.tsx +420 -0
  87. package/src/components/sectioned-list-table/sortable-section.tsx +251 -0
  88. package/src/components/sectioned-list-table/table-cell-content.tsx +129 -0
  89. package/src/components/sectioned-list-table/types.ts +120 -0
  90. package/src/components/sectioned-list-table/use-column-preferences.ts +103 -0
  91. package/src/components/ui/actions-dropdown.tsx +109 -0
  92. package/src/components/ui/assignee-selector.tsx +209 -0
  93. package/src/components/ui/avatar.tsx +107 -0
  94. package/src/components/ui/breadcrumb.tsx +109 -0
  95. package/src/components/ui/button-group.tsx +83 -0
  96. package/src/components/ui/button.tsx +64 -0
  97. package/src/components/ui/calendar.tsx +220 -0
  98. package/src/components/ui/card.tsx +92 -0
  99. package/src/components/ui/chart.tsx +376 -0
  100. package/src/components/ui/checkbox.tsx +30 -0
  101. package/src/components/ui/collapsible.tsx +33 -0
  102. package/src/components/ui/command.tsx +182 -0
  103. package/src/components/ui/context-menu.tsx +250 -0
  104. package/src/components/ui/create-button-group.tsx +128 -0
  105. package/src/components/ui/dialog.tsx +156 -0
  106. package/src/components/ui/drawer.tsx +133 -0
  107. package/src/components/ui/dropdown-menu.tsx +255 -0
  108. package/src/components/ui/empty.tsx +104 -0
  109. package/src/components/ui/field.tsx +248 -0
  110. package/src/components/ui/form.tsx +165 -0
  111. package/src/components/ui/index.ts +37 -0
  112. package/src/components/ui/input-group.tsx +168 -0
  113. package/src/components/ui/input.tsx +21 -0
  114. package/src/components/ui/kbd.tsx +28 -0
  115. package/src/components/ui/label.tsx +22 -0
  116. package/src/components/ui/navigation-menu.tsx +168 -0
  117. package/src/components/ui/page-header.tsx +80 -0
  118. package/src/components/ui/popover.tsx +87 -0
  119. package/src/components/ui/scroll-area.tsx +56 -0
  120. package/src/components/ui/select.tsx +190 -0
  121. package/src/components/ui/separator.tsx +26 -0
  122. package/src/components/ui/sheet.tsx +141 -0
  123. package/src/components/ui/sidebar.tsx +726 -0
  124. package/src/components/ui/skeleton.tsx +13 -0
  125. package/src/components/ui/sonner.tsx +38 -0
  126. package/src/components/ui/switch.tsx +33 -0
  127. package/src/components/ui/tabs.tsx +91 -0
  128. package/src/components/ui/textarea.tsx +18 -0
  129. package/src/components/ui/toggle-group.tsx +83 -0
  130. package/src/components/ui/toggle.tsx +45 -0
  131. package/src/components/ui/tooltip.tsx +57 -0
  132. package/src/hooks/use-copy-to-clipboard.ts +37 -0
  133. package/src/hooks/use-file-upload.ts +415 -0
  134. package/src/hooks/use-mobile.ts +19 -0
  135. package/src/index.ts +95 -0
  136. package/src/lib/utils.ts +6 -0
  137. package/src/styles.css +1859 -0
  138. package/src/urls.ts +83 -0
  139. package/src/vite.d.ts +22 -0
  140. package/src/vite.js +241 -0
  141. package/tsconfig.base.json +18 -0
  142. package/tsconfig.json +24 -0
@@ -0,0 +1,534 @@
1
+ .sectioned-list-table {
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
6
+ font-size: 14px;
7
+ color: #1a1a1a;
8
+ }
9
+
10
+ /* Header */
11
+ .sectioned-list-header {
12
+ display: flex;
13
+ align-items: center;
14
+ position: sticky;
15
+ top: 0;
16
+ background: #fafafa;
17
+ border-bottom: 1px solid #e0e0e0;
18
+ z-index: 10;
19
+ min-height: 40px;
20
+ }
21
+
22
+ .column-header {
23
+ display: flex;
24
+ align-items: center;
25
+ padding: 8px 12px;
26
+ font-weight: 600;
27
+ color: #666;
28
+ position: relative;
29
+ user-select: none;
30
+ flex-shrink: 0;
31
+ }
32
+
33
+ .column-header.placeholder {
34
+ min-width: 60px;
35
+ }
36
+
37
+ .column-header.dragging {
38
+ opacity: 0.5;
39
+ background: #e8e8e8;
40
+ }
41
+
42
+ .column-header.sorted {
43
+ color: #0066cc;
44
+ }
45
+
46
+ .column-header-content {
47
+ display: flex;
48
+ align-items: center;
49
+ cursor: grab;
50
+ flex: 1;
51
+ }
52
+
53
+ .column-header-content:active {
54
+ cursor: grabbing;
55
+ }
56
+
57
+ .column-header-text {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 4px;
61
+ }
62
+
63
+ .column-header-text.sortable {
64
+ cursor: pointer;
65
+ }
66
+
67
+ .column-header-text.sortable:hover {
68
+ color: #0066cc;
69
+ }
70
+
71
+ .sort-indicator {
72
+ font-size: 12px;
73
+ opacity: 0.6;
74
+ }
75
+
76
+ .column-resize-handle {
77
+ position: absolute;
78
+ right: 0;
79
+ top: 0;
80
+ bottom: 0;
81
+ width: 4px;
82
+ cursor: col-resize;
83
+ background: transparent;
84
+ }
85
+
86
+ .column-resize-handle:hover {
87
+ background: #0066cc;
88
+ }
89
+
90
+ .column-header.add-column {
91
+ cursor: pointer;
92
+ min-width: 40px;
93
+ justify-content: center;
94
+ }
95
+
96
+ .column-header.add-column:hover {
97
+ background: #e8e8e8;
98
+ }
99
+
100
+ .add-column-icon {
101
+ font-size: 18px;
102
+ color: #666;
103
+ }
104
+
105
+ /* Section */
106
+ .sectioned-list-section {
107
+ margin-bottom: 8px;
108
+ background: white;
109
+ position: relative;
110
+ }
111
+
112
+ .sectioned-list-section.dragging {
113
+ opacity: 0.9;
114
+ background: #f8f9fa;
115
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
116
+ border-radius: 4px;
117
+ /* Ensure consistent sizing during drag */
118
+ width: 100%;
119
+ transform-origin: top left;
120
+ }
121
+
122
+ .sectioned-list-section-header {
123
+ display: flex;
124
+ align-items: center;
125
+ padding: 8px 0;
126
+ gap: 8px;
127
+ font-weight: 600;
128
+ font-size: 15px;
129
+ border-bottom: 1px solid #e0e0e0;
130
+ }
131
+
132
+ .section-drag-handle {
133
+ background: none;
134
+ border: none;
135
+ cursor: grab;
136
+ padding: 4px;
137
+ color: #999;
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ }
142
+
143
+ .section-drag-handle:active {
144
+ cursor: grabbing;
145
+ }
146
+
147
+ .section-drag-handle:hover {
148
+ color: #333;
149
+ }
150
+
151
+ .section-collapse-toggle {
152
+ background: none;
153
+ border: none;
154
+ cursor: pointer;
155
+ padding: 4px;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ }
160
+
161
+ .chevron {
162
+ font-size: 10px;
163
+ transition: transform 0.2s;
164
+ color: #666;
165
+ }
166
+
167
+ .chevron.collapsed {
168
+ transform: rotate(-90deg);
169
+ }
170
+
171
+ .section-name {
172
+ cursor: text;
173
+ }
174
+
175
+ .section-name-input {
176
+ font-size: 15px;
177
+ font-weight: 600;
178
+ border: 1px solid #0066cc;
179
+ border-radius: 4px;
180
+ padding: 2px 6px;
181
+ outline: none;
182
+ }
183
+
184
+ .section-count {
185
+ color: #999;
186
+ font-weight: 400;
187
+ font-size: 13px;
188
+ }
189
+
190
+ .sectioned-list-section-content {
191
+ padding-left: 8px;
192
+ }
193
+
194
+ .section-drop-indicator {
195
+ position: relative;
196
+ border-top: 2px solid #0972d3;
197
+ pointer-events: none;
198
+ margin: 4px 0;
199
+ }
200
+
201
+ .section-drop-indicator::before {
202
+ content: "";
203
+ position: absolute;
204
+ left: 0;
205
+ top: -4px;
206
+ width: 8px;
207
+ height: 8px;
208
+ border-radius: 50%;
209
+ background: #0972d3;
210
+ }
211
+
212
+ .section-drop-indicator-before {
213
+ margin-bottom: 6px;
214
+ }
215
+
216
+ .section-drop-indicator-after {
217
+ margin-top: 6px;
218
+ }
219
+
220
+ /* Row */
221
+ .sectioned-list-row {
222
+ display: flex;
223
+ align-items: center;
224
+ min-height: 40px;
225
+ border-bottom: 1px solid #f0f0f0;
226
+ transition: background 0.15s;
227
+ }
228
+
229
+ .sectioned-list-row:hover {
230
+ background: #f8f8f8;
231
+ }
232
+
233
+ .sectioned-list-row.completed {
234
+ opacity: 0.6;
235
+ }
236
+
237
+ .sectioned-list-row.completed .row-cell {
238
+ text-decoration: line-through;
239
+ }
240
+
241
+ .sectioned-list-row.dragging {
242
+ background: #e8f4ff;
243
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
244
+ }
245
+
246
+ .sectioned-list-row-overlay {
247
+ background: #ffffff;
248
+ border: 1px solid #d5dbdb;
249
+ border-radius: 6px;
250
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.18);
251
+ min-width: 480px;
252
+ }
253
+
254
+ .sectioned-list-row-overlay .row-drag-handle {
255
+ opacity: 1;
256
+ }
257
+
258
+ .row-drag-handle {
259
+ background: none;
260
+ border: none;
261
+ cursor: grab;
262
+ padding: 8px;
263
+ color: #ccc;
264
+ display: flex;
265
+ align-items: center;
266
+ justify-content: center;
267
+ opacity: 0;
268
+ transition: opacity 0.15s;
269
+ }
270
+
271
+ .sectioned-list-row:hover .row-drag-handle {
272
+ opacity: 1;
273
+ }
274
+
275
+ .row-drag-handle:active {
276
+ cursor: grabbing;
277
+ }
278
+
279
+ .row-drag-handle:hover {
280
+ color: #666;
281
+ }
282
+
283
+ .row-drag-handle.disabled {
284
+ cursor: not-allowed;
285
+ opacity: 0.3;
286
+ }
287
+
288
+ .row-checkbox-cell {
289
+ padding: 0 8px;
290
+ display: flex;
291
+ align-items: center;
292
+ }
293
+
294
+ .row-checkbox-cell input[type="checkbox"] {
295
+ -webkit-appearance: none;
296
+ appearance: none;
297
+ width: 18px;
298
+ height: 18px;
299
+ margin: 0;
300
+ border: 1.5px solid #9aa5b1;
301
+ border-radius: 50%;
302
+ box-sizing: border-box;
303
+ background: transparent;
304
+ display: inline-grid;
305
+ place-content: center;
306
+ cursor: pointer;
307
+ color: #9aa5b1;
308
+ }
309
+
310
+ .row-checkbox-cell input[type="checkbox"]::before {
311
+ content: "✓";
312
+ font-size: 15px;
313
+ font-weight: 700;
314
+ line-height: 1;
315
+ color: currentColor;
316
+ opacity: 0.9;
317
+ }
318
+
319
+ .row-checkbox-cell input[type="checkbox"]:checked {
320
+ border-color: #16a34a;
321
+ color: #16a34a;
322
+ }
323
+
324
+ .row-checkbox-cell input[type="checkbox"]:focus-visible {
325
+ outline: 2px solid #60a5fa;
326
+ outline-offset: 2px;
327
+ }
328
+
329
+ .row-cell {
330
+ padding: 8px 12px;
331
+ flex-shrink: 0;
332
+ overflow: hidden;
333
+ text-overflow: ellipsis;
334
+ white-space: nowrap;
335
+ }
336
+
337
+ .table-avatar {
338
+ width: 24px;
339
+ height: 24px;
340
+ border-radius: 50%;
341
+ background: #0972d3;
342
+ color: #ffffff;
343
+ display: inline-flex;
344
+ align-items: center;
345
+ justify-content: center;
346
+ font-size: 10px;
347
+ font-weight: 700;
348
+ }
349
+
350
+ button.table-avatar-editable {
351
+ border: none;
352
+ cursor: pointer;
353
+ margin-left: 3px;
354
+ transition: box-shadow 0.15s ease, transform 0.1s ease;
355
+ }
356
+
357
+ button.table-avatar-editable:hover {
358
+ box-shadow: 0 0 0 2px rgba(9, 114, 211, 0.4);
359
+ transform: scale(1.05);
360
+ }
361
+
362
+ button.table-avatar-editable:focus-visible {
363
+ outline: none;
364
+ box-shadow: 0 0 0 3px rgba(9, 114, 211, 0.5);
365
+ }
366
+
367
+ .row-drop-indicator {
368
+ border-top: 2px solid #0972d3;
369
+ margin: 2px 0;
370
+ pointer-events: none;
371
+ }
372
+
373
+ .cell-input {
374
+ width: 100%;
375
+ border: 1px solid #0066cc;
376
+ border-radius: 4px;
377
+ padding: 4px 8px;
378
+ font-size: 14px;
379
+ outline: none;
380
+ }
381
+
382
+ .drag-icon {
383
+ font-size: 14px;
384
+ letter-spacing: -2px;
385
+ }
386
+
387
+ /* Add Task Row */
388
+ .add-task-row {
389
+ display: flex;
390
+ align-items: center;
391
+ padding: 8px 12px;
392
+ padding-left: 60px;
393
+ color: #999;
394
+ cursor: pointer;
395
+ gap: 8px;
396
+ }
397
+
398
+ .add-task-row:hover {
399
+ color: #666;
400
+ background: #f8f8f8;
401
+ }
402
+
403
+ .add-task-icon {
404
+ font-size: 16px;
405
+ }
406
+
407
+ /* Add Section Button */
408
+ .add-section-button {
409
+ display: flex;
410
+ align-items: center;
411
+ gap: 8px;
412
+ padding: 12px 16px;
413
+ margin-top: 8px;
414
+ background: none;
415
+ border: none;
416
+ color: #666;
417
+ cursor: pointer;
418
+ font-size: 14px;
419
+ }
420
+
421
+ .add-section-button:hover {
422
+ color: #333;
423
+ background: #f8f8f8;
424
+ }
425
+
426
+ .add-section-icon {
427
+ font-size: 16px;
428
+ }
429
+
430
+ /* Context Menu */
431
+ .context-menu {
432
+ position: fixed;
433
+ background: white;
434
+ border: 1px solid #e0e0e0;
435
+ border-radius: 4px;
436
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
437
+ z-index: 1000;
438
+ min-width: 120px;
439
+ }
440
+
441
+ .context-menu button {
442
+ display: block;
443
+ width: 100%;
444
+ padding: 8px 16px;
445
+ border: none;
446
+ background: none;
447
+ text-align: left;
448
+ cursor: pointer;
449
+ font-size: 14px;
450
+ }
451
+
452
+ .context-menu button:hover {
453
+ background: #f0f0f0;
454
+ }
455
+
456
+ /* Column Picker Modal */
457
+ .column-picker-modal {
458
+ position: fixed;
459
+ top: 0;
460
+ left: 0;
461
+ right: 0;
462
+ bottom: 0;
463
+ background: rgba(0, 0, 0, 0.3);
464
+ display: flex;
465
+ align-items: center;
466
+ justify-content: center;
467
+ z-index: 1000;
468
+ }
469
+
470
+ .column-picker-content {
471
+ background: white;
472
+ border-radius: 8px;
473
+ padding: 24px;
474
+ min-width: 300px;
475
+ max-height: 80vh;
476
+ overflow-y: auto;
477
+ }
478
+
479
+ .column-picker-content h3 {
480
+ margin: 0 0 16px;
481
+ font-size: 16px;
482
+ }
483
+
484
+ .column-picker-item {
485
+ display: flex;
486
+ align-items: center;
487
+ gap: 8px;
488
+ padding: 8px 0;
489
+ cursor: pointer;
490
+ }
491
+
492
+ .column-picker-item:hover {
493
+ background: #f8f8f8;
494
+ }
495
+
496
+ .column-picker-actions {
497
+ display: flex;
498
+ gap: 8px;
499
+ margin-top: 16px;
500
+ padding-top: 16px;
501
+ border-top: 1px solid #e0e0e0;
502
+ }
503
+
504
+ .column-picker-actions button {
505
+ padding: 8px 16px;
506
+ border: 1px solid #e0e0e0;
507
+ border-radius: 4px;
508
+ background: white;
509
+ cursor: pointer;
510
+ font-size: 14px;
511
+ }
512
+
513
+ .column-picker-actions button:hover {
514
+ background: #f0f0f0;
515
+ }
516
+
517
+ .column-picker-actions button:first-child {
518
+ background: #0066cc;
519
+ color: white;
520
+ border-color: #0066cc;
521
+ }
522
+
523
+ .column-picker-actions button:first-child:hover {
524
+ background: #0052a3;
525
+ }
526
+
527
+ .drag-overlay-section {
528
+ background: #fff;
529
+ border: 1px solid #d5dbdb;
530
+ border-radius: 6px;
531
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.2);
532
+ padding: 0 12px;
533
+ min-width: 280px;
534
+ }