airview 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 (45) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +65 -0
  6. data/app/assets/javascripts/airview/application.js +425 -0
  7. data/app/assets/stylesheets/airview/application.css +1239 -0
  8. data/app/controllers/airview/application_controller.rb +7 -0
  9. data/app/controllers/airview/resources_controller.rb +261 -0
  10. data/app/controllers/airview/setup_controller.rb +90 -0
  11. data/app/controllers/airview/views_controller.rb +76 -0
  12. data/app/helpers/airview/application_helper.rb +479 -0
  13. data/app/javascript/airview/controllers/grid_controller.js +7 -0
  14. data/app/models/airview/application_record.rb +7 -0
  15. data/app/models/airview/field_definition.rb +22 -0
  16. data/app/models/airview/resource_definition.rb +48 -0
  17. data/app/models/airview/view.rb +27 -0
  18. data/app/views/airview/resources/_delete_modal.html.erb +49 -0
  19. data/app/views/airview/resources/_record_modal.html.erb +62 -0
  20. data/app/views/airview/resources/empty.html.erb +5 -0
  21. data/app/views/airview/resources/show.html.erb +258 -0
  22. data/app/views/airview/setup/_form.html.erb +73 -0
  23. data/app/views/airview/setup/edit.html.erb +16 -0
  24. data/app/views/airview/setup/index.html.erb +52 -0
  25. data/app/views/airview/setup/new.html.erb +14 -0
  26. data/app/views/airview/shared/_sidebar.html.erb +76 -0
  27. data/app/views/layouts/airview/application.html.erb +21 -0
  28. data/config/routes.rb +23 -0
  29. data/db/migrate/20260806000000_create_airview_views.rb +57 -0
  30. data/lib/airview/configuration.rb +6 -0
  31. data/lib/airview/engine.rb +15 -0
  32. data/lib/airview/field.rb +81 -0
  33. data/lib/airview/model_discovery.rb +38 -0
  34. data/lib/airview/query.rb +194 -0
  35. data/lib/airview/resource.rb +51 -0
  36. data/lib/airview/resource_builder.rb +62 -0
  37. data/lib/airview/schema_inference.rb +196 -0
  38. data/lib/airview/version.rb +5 -0
  39. data/lib/airview.rb +93 -0
  40. data/lib/generators/airview/install/install_generator.rb +38 -0
  41. data/lib/generators/airview/install/templates/add_folders_to_airview_views.rb +8 -0
  42. data/lib/generators/airview/install/templates/airview.rb +12 -0
  43. data/lib/generators/airview/install/templates/create_airview_views.rb +57 -0
  44. data/sig/airview.rbs +54 -0
  45. metadata +110 -0
@@ -0,0 +1,1239 @@
1
+ :root {
2
+ --airview-bg: #f7f8fb;
3
+ --airview-panel: #ffffff;
4
+ --airview-border: #d6dbe4;
5
+ --airview-soft-border: #e7eaf0;
6
+ --airview-text: #1f2937;
7
+ --airview-muted: #5b6475;
8
+ --airview-accent: #1668db;
9
+ --airview-accent-strong: #0958c8;
10
+ --airview-danger: #b42318;
11
+ --airview-tint: #fff3eb;
12
+ }
13
+
14
+ .airview {
15
+ margin: 0;
16
+ background: var(--airview-bg);
17
+ color: var(--airview-text);
18
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
19
+ font-size: 14px;
20
+ }
21
+
22
+ .airview a {
23
+ color: inherit;
24
+ }
25
+
26
+ .airview-shell {
27
+ display: grid;
28
+ grid-template-columns: 280px minmax(0, 1fr);
29
+ min-height: 100vh;
30
+ }
31
+
32
+ .airview-sidebar {
33
+ border-right: 1px solid var(--airview-border);
34
+ background: #ffffff;
35
+ color: var(--airview-text);
36
+ padding: 12px 10px;
37
+ }
38
+
39
+ .airview-brand {
40
+ font-size: 18px;
41
+ font-weight: 700;
42
+ margin-bottom: 20px;
43
+ }
44
+
45
+ .airview-resource-list {
46
+ display: grid;
47
+ gap: 4px;
48
+ }
49
+
50
+ .airview-resource-link {
51
+ border-radius: 4px;
52
+ color: var(--airview-text);
53
+ padding: 8px 10px;
54
+ text-decoration: none;
55
+ }
56
+
57
+ .airview-resource-link.is-active,
58
+ .airview-resource-link:hover {
59
+ background: #f2f4f7;
60
+ color: var(--airview-text);
61
+ }
62
+
63
+ .airview-view-list {
64
+ display: grid;
65
+ gap: 2px;
66
+ margin: 2px 0 10px 12px;
67
+ }
68
+
69
+ .airview-view-row {
70
+ align-items: center;
71
+ display: grid;
72
+ gap: 4px;
73
+ grid-template-columns: minmax(0, 1fr) auto;
74
+ }
75
+
76
+ .airview-view-link {
77
+ border-radius: 4px;
78
+ color: var(--airview-muted);
79
+ font-size: 13px;
80
+ min-width: 0;
81
+ overflow: hidden;
82
+ padding: 7px 10px;
83
+ text-decoration: none;
84
+ text-overflow: ellipsis;
85
+ white-space: nowrap;
86
+ }
87
+
88
+ .airview-view-link.is-active,
89
+ .airview-view-link:hover {
90
+ background: #eef4ff;
91
+ color: #174ea6;
92
+ }
93
+
94
+ .airview-view-folder {
95
+ color: var(--airview-muted);
96
+ font-size: 11px;
97
+ font-weight: 700;
98
+ margin: 9px 8px 3px;
99
+ text-transform: uppercase;
100
+ }
101
+
102
+ .airview-view-menu,
103
+ .airview-new-view {
104
+ position: relative;
105
+ }
106
+
107
+ .airview-view-menu summary,
108
+ .airview-new-view summary {
109
+ border-radius: 4px;
110
+ color: var(--airview-muted);
111
+ cursor: pointer;
112
+ font-size: 13px;
113
+ list-style: none;
114
+ padding: 5px 7px;
115
+ }
116
+
117
+ .airview-view-menu summary::-webkit-details-marker,
118
+ .airview-new-view summary::-webkit-details-marker {
119
+ display: none;
120
+ }
121
+
122
+ .airview-view-menu[open] summary,
123
+ .airview-view-menu summary:hover,
124
+ .airview-new-view[open] summary,
125
+ .airview-new-view summary:hover {
126
+ background: #f2f4f7;
127
+ color: var(--airview-text);
128
+ }
129
+
130
+ .airview-view-menu-panel,
131
+ .airview-new-view-panel {
132
+ background: #ffffff;
133
+ border: 1px solid var(--airview-border);
134
+ border-radius: 6px;
135
+ box-shadow: 0 14px 34px rgba(15, 23, 42, 0.16);
136
+ display: grid;
137
+ gap: 8px;
138
+ left: 0;
139
+ min-width: 230px;
140
+ padding: 10px;
141
+ position: absolute;
142
+ top: 32px;
143
+ z-index: 40;
144
+ }
145
+
146
+ .airview-view-menu-panel {
147
+ left: auto;
148
+ right: 0;
149
+ }
150
+
151
+ .airview-view-edit-form {
152
+ display: grid;
153
+ gap: 7px;
154
+ }
155
+
156
+ .airview-view-edit-form input[type="text"],
157
+ .airview-view-edit-form input[type="search"] {
158
+ min-height: 30px;
159
+ width: 100%;
160
+ }
161
+
162
+ .airview-view-edit-form input[type="submit"] {
163
+ min-height: 30px;
164
+ }
165
+
166
+ .airview-view-delete {
167
+ background: #ffffff !important;
168
+ border-color: var(--airview-border) !important;
169
+ color: var(--airview-danger) !important;
170
+ min-height: 30px;
171
+ width: 100%;
172
+ }
173
+
174
+ .airview-new-view {
175
+ margin-top: 8px;
176
+ }
177
+
178
+ .airview-main {
179
+ min-width: 0;
180
+ padding: 0;
181
+ }
182
+
183
+ .airview-main--grid {
184
+ display: grid;
185
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
186
+ height: 100vh;
187
+ overflow: hidden;
188
+ }
189
+
190
+ .airview-toolbar,
191
+ .airview-basebar {
192
+ align-items: center;
193
+ display: flex;
194
+ gap: 16px;
195
+ justify-content: space-between;
196
+ padding: 14px 18px 10px;
197
+ }
198
+
199
+ .airview-toolbar h1,
200
+ .airview-basebar h1 {
201
+ font-size: 24px;
202
+ line-height: 1.2;
203
+ margin: 0;
204
+ }
205
+
206
+ .airview-toolbar p,
207
+ .airview-basebar p {
208
+ color: var(--airview-muted);
209
+ margin: 4px 0 0;
210
+ }
211
+
212
+ .airview-search,
213
+ .airview-save-view,
214
+ .airview-cell-form {
215
+ align-items: center;
216
+ display: flex;
217
+ gap: 6px;
218
+ }
219
+
220
+ .airview-views,
221
+ .airview-filters,
222
+ .airview-create {
223
+ background: var(--airview-panel);
224
+ border: 1px solid var(--airview-border);
225
+ border-radius: 8px;
226
+ margin-bottom: 12px;
227
+ padding: 12px;
228
+ }
229
+
230
+ .airview-gridbar {
231
+ align-items: center;
232
+ background: #ffffff;
233
+ border-bottom: 1px solid var(--airview-border);
234
+ border-top: 1px solid var(--airview-soft-border);
235
+ display: flex;
236
+ gap: 12px;
237
+ justify-content: space-between;
238
+ min-height: 46px;
239
+ padding: 0 18px;
240
+ }
241
+
242
+ .airview-gridbar-left,
243
+ .airview-gridbar-right {
244
+ align-items: center;
245
+ display: flex;
246
+ gap: 8px;
247
+ min-width: 0;
248
+ }
249
+
250
+ .airview-view-name {
251
+ align-items: center;
252
+ display: inline-flex;
253
+ font-weight: 600;
254
+ gap: 6px;
255
+ min-height: 32px;
256
+ padding-right: 8px;
257
+ }
258
+
259
+ .airview-popover {
260
+ position: relative;
261
+ }
262
+
263
+ .airview-popover summary {
264
+ border-radius: 4px;
265
+ color: #3f4654;
266
+ cursor: pointer;
267
+ display: block;
268
+ font-size: 13px;
269
+ list-style: none;
270
+ padding: 7px 10px;
271
+ user-select: none;
272
+ }
273
+
274
+ .airview-popover summary::-webkit-details-marker {
275
+ display: none;
276
+ }
277
+
278
+ .airview-popover[open] summary,
279
+ .airview-popover summary:hover {
280
+ background: #f2f4f7;
281
+ }
282
+
283
+ .airview-popover-panel {
284
+ background: #ffffff;
285
+ border: 1px solid var(--airview-border);
286
+ border-radius: 6px;
287
+ box-shadow: 0 14px 34px rgba(15, 23, 42, 0.16);
288
+ left: 0;
289
+ padding: 12px;
290
+ position: absolute;
291
+ top: 38px;
292
+ z-index: 20;
293
+ }
294
+
295
+ .airview-popover-panel--narrow {
296
+ min-width: 240px;
297
+ }
298
+
299
+ .airview-popover-panel--filter {
300
+ min-width: 620px;
301
+ }
302
+
303
+ .airview-popover-panel--create {
304
+ max-height: 70vh;
305
+ min-width: 520px;
306
+ overflow: auto;
307
+ right: 0;
308
+ }
309
+
310
+ .airview-gridbar-right .airview-popover-panel {
311
+ left: auto;
312
+ right: 0;
313
+ }
314
+
315
+ .airview-check-row {
316
+ align-items: center;
317
+ display: flex !important;
318
+ flex-direction: row;
319
+ gap: 8px;
320
+ padding: 5px 0;
321
+ }
322
+
323
+ .airview-check-row input {
324
+ min-height: auto;
325
+ width: auto;
326
+ }
327
+
328
+ .airview-popover-search {
329
+ margin-bottom: 8px;
330
+ width: 100%;
331
+ }
332
+
333
+ .airview-field-actions {
334
+ display: flex;
335
+ gap: 6px;
336
+ margin-bottom: 8px;
337
+ }
338
+
339
+ .airview-field-actions button {
340
+ background: #ffffff;
341
+ border-color: var(--airview-border);
342
+ color: var(--airview-text);
343
+ min-height: 28px;
344
+ padding: 4px 8px;
345
+ }
346
+
347
+ .airview-field-option-list {
348
+ max-height: 280px;
349
+ overflow: auto;
350
+ }
351
+
352
+ .airview-field-option-list .is-hidden {
353
+ display: none !important;
354
+ }
355
+
356
+ .airview-filter-title {
357
+ color: var(--airview-muted);
358
+ margin-bottom: 12px;
359
+ }
360
+
361
+ .airview-filter-condition {
362
+ align-items: center;
363
+ display: grid;
364
+ gap: 8px;
365
+ grid-template-columns: auto 150px 132px minmax(160px, 1fr) auto;
366
+ margin-bottom: 4px;
367
+ }
368
+
369
+ .airview-filter-field-picker {
370
+ min-width: 0;
371
+ position: relative;
372
+ }
373
+
374
+ .airview-filter-field-picker input {
375
+ width: 100%;
376
+ }
377
+
378
+ .airview-filter-field-results {
379
+ background: #ffffff;
380
+ border: 1px solid var(--airview-border);
381
+ border-radius: 6px;
382
+ box-shadow: 0 12px 28px rgba(15, 23, 42, 0.16);
383
+ display: none;
384
+ left: 0;
385
+ max-height: 230px;
386
+ overflow: auto;
387
+ position: absolute;
388
+ right: 0;
389
+ top: calc(100% + 4px);
390
+ z-index: 45;
391
+ }
392
+
393
+ .airview-filter-field-results.is-open {
394
+ display: grid;
395
+ }
396
+
397
+ .airview-filter-field-option {
398
+ background: #ffffff !important;
399
+ border: 0 !important;
400
+ border-bottom: 1px solid var(--airview-soft-border) !important;
401
+ border-radius: 0 !important;
402
+ color: var(--airview-text) !important;
403
+ min-height: 30px;
404
+ overflow: hidden;
405
+ padding: 6px 9px !important;
406
+ text-align: left;
407
+ text-overflow: ellipsis;
408
+ white-space: nowrap;
409
+ }
410
+
411
+ .airview-filter-field-option:hover,
412
+ .airview-filter-field-option:focus {
413
+ background: #f5f8ff !important;
414
+ }
415
+
416
+ .airview-filter-field-option.is-hidden {
417
+ display: none;
418
+ }
419
+
420
+ .airview-filter-remove {
421
+ background: #ffffff !important;
422
+ border-color: transparent !important;
423
+ color: var(--airview-danger) !important;
424
+ min-height: 30px;
425
+ }
426
+
427
+ .airview-filter-actions {
428
+ margin: 8px 0;
429
+ }
430
+
431
+ .airview-filter-actions button {
432
+ background: #ffffff;
433
+ border-color: var(--airview-border);
434
+ color: var(--airview-accent-strong);
435
+ min-height: 30px;
436
+ }
437
+
438
+ .airview-views {
439
+ align-items: center;
440
+ display: flex;
441
+ flex-wrap: wrap;
442
+ gap: 8px;
443
+ }
444
+
445
+ .airview-view-pill {
446
+ border: 1px solid var(--airview-border);
447
+ border-radius: 999px;
448
+ color: var(--airview-muted);
449
+ padding: 5px 10px;
450
+ text-decoration: none;
451
+ }
452
+
453
+ .airview-view-pill.is-active {
454
+ background: #e6fffb;
455
+ border-color: #99f6e4;
456
+ color: var(--airview-accent-strong);
457
+ }
458
+
459
+ .airview-filter-grid,
460
+ .airview-create-grid {
461
+ display: grid;
462
+ gap: 10px;
463
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
464
+ margin-bottom: 10px;
465
+ }
466
+
467
+ .airview-create h2 {
468
+ font-size: 15px;
469
+ margin: 0 0 10px;
470
+ }
471
+
472
+ .airview-setup-form {
473
+ display: grid;
474
+ gap: 12px;
475
+ }
476
+
477
+ .airview-setup-table .airview-actions,
478
+ .airview-setup-fields .airview-actions {
479
+ white-space: nowrap;
480
+ }
481
+
482
+ .airview-checkbox-label {
483
+ align-items: center;
484
+ display: flex !important;
485
+ flex-direction: row;
486
+ gap: 8px;
487
+ }
488
+
489
+ .airview-checkbox-label input {
490
+ min-height: auto;
491
+ width: auto;
492
+ }
493
+
494
+ .airview label {
495
+ color: var(--airview-muted);
496
+ display: grid;
497
+ gap: 4px;
498
+ min-width: 0;
499
+ }
500
+
501
+ .airview input,
502
+ .airview select,
503
+ .airview textarea,
504
+ .airview button,
505
+ .airview input[type="submit"] {
506
+ border: 1px solid var(--airview-border);
507
+ border-radius: 6px;
508
+ box-sizing: border-box;
509
+ font: inherit;
510
+ min-height: 34px;
511
+ padding: 6px 8px;
512
+ }
513
+
514
+ .airview input[type="submit"],
515
+ .airview button {
516
+ background: var(--airview-accent);
517
+ border-color: var(--airview-accent);
518
+ color: #ffffff;
519
+ cursor: pointer;
520
+ }
521
+
522
+ .airview-grid-wrap {
523
+ background: var(--airview-panel);
524
+ border: 0;
525
+ border-radius: 0;
526
+ overflow: auto;
527
+ }
528
+
529
+ .airview-grid {
530
+ border-collapse: separate;
531
+ border-spacing: 0;
532
+ table-layout: fixed;
533
+ min-width: 900px;
534
+ width: 100%;
535
+ }
536
+
537
+ .airview-grid col {
538
+ width: 170px;
539
+ }
540
+
541
+ .airview-grid .airview-actions-col {
542
+ width: 96px;
543
+ }
544
+
545
+ .airview-grid .airview-expand-col {
546
+ width: 42px;
547
+ }
548
+
549
+ .airview-grid th,
550
+ .airview-grid td {
551
+ border-bottom: 1px solid var(--airview-border);
552
+ border-right: 1px solid var(--airview-border);
553
+ height: 31px;
554
+ padding: 4px 8px;
555
+ text-align: left;
556
+ vertical-align: middle;
557
+ }
558
+
559
+ .airview-grid th {
560
+ background: #fbfcfe;
561
+ color: #1f2937;
562
+ font-size: 13px;
563
+ font-weight: 600;
564
+ position: sticky;
565
+ top: 0;
566
+ z-index: 1;
567
+ }
568
+
569
+ .airview-grid th:first-child,
570
+ .airview-grid td:first-child {
571
+ left: 0;
572
+ position: sticky;
573
+ z-index: 2;
574
+ }
575
+
576
+ .airview-expand-cell {
577
+ min-width: 42px;
578
+ text-align: center !important;
579
+ width: 42px;
580
+ }
581
+
582
+ .airview-expand-button {
583
+ border-radius: 4px;
584
+ color: var(--airview-muted);
585
+ display: inline-grid;
586
+ height: 24px;
587
+ place-items: center;
588
+ text-decoration: none;
589
+ width: 24px;
590
+ }
591
+
592
+ .airview-expand-button:hover {
593
+ background: #eef4ff;
594
+ color: var(--airview-accent-strong);
595
+ }
596
+
597
+ .airview-grid td:first-child {
598
+ background: #ffffff;
599
+ }
600
+
601
+ .airview-grid th:first-child {
602
+ z-index: 3;
603
+ }
604
+
605
+ .airview-grid th[data-airview-column] {
606
+ position: sticky;
607
+ }
608
+
609
+ .airview-column-resizer {
610
+ bottom: 0;
611
+ cursor: col-resize;
612
+ position: absolute;
613
+ right: 0;
614
+ top: 0;
615
+ width: 7px;
616
+ }
617
+
618
+ .airview-column-resizer:hover {
619
+ background: #99f6e4;
620
+ }
621
+
622
+ .airview-column-header {
623
+ align-items: center;
624
+ display: flex;
625
+ gap: 6px;
626
+ justify-content: space-between;
627
+ }
628
+
629
+ .airview-sort-link {
630
+ align-items: center;
631
+ display: inline-flex;
632
+ gap: 5px;
633
+ min-width: 0;
634
+ text-decoration: none;
635
+ }
636
+
637
+ .airview-column-label {
638
+ overflow: hidden;
639
+ text-overflow: ellipsis;
640
+ white-space: nowrap;
641
+ }
642
+
643
+ .airview-sort-link.is-active {
644
+ color: var(--airview-accent-strong);
645
+ }
646
+
647
+ .airview-sort-indicator {
648
+ color: var(--airview-accent-strong);
649
+ flex: 0 0 auto;
650
+ font-size: 14px;
651
+ line-height: 1;
652
+ }
653
+
654
+ .airview-column-menu {
655
+ position: relative;
656
+ }
657
+
658
+ .airview-column-menu summary {
659
+ border-radius: 4px;
660
+ cursor: pointer;
661
+ list-style: none;
662
+ padding: 0 5px;
663
+ }
664
+
665
+ .airview-column-menu summary::-webkit-details-marker {
666
+ display: none;
667
+ }
668
+
669
+ .airview-column-menu[open] summary,
670
+ .airview-column-menu summary:hover {
671
+ background: #e9edf5;
672
+ }
673
+
674
+ .airview-column-menu-panel {
675
+ background: #ffffff;
676
+ border: 1px solid var(--airview-border);
677
+ border-radius: 6px;
678
+ box-shadow: 0 12px 26px rgba(15, 23, 42, 0.16);
679
+ display: grid;
680
+ gap: 2px;
681
+ min-width: 132px;
682
+ padding: 6px;
683
+ position: absolute;
684
+ right: 0;
685
+ top: 24px;
686
+ z-index: 30;
687
+ }
688
+
689
+ .airview-column-menu-panel form,
690
+ .airview-column-menu-panel button {
691
+ width: 100%;
692
+ }
693
+
694
+ .airview-column-menu-panel button {
695
+ background: transparent;
696
+ border: 0;
697
+ color: var(--airview-text);
698
+ min-height: 28px;
699
+ text-align: left;
700
+ }
701
+
702
+ .airview-column-menu-panel button:hover {
703
+ background: #f2f4f7;
704
+ }
705
+
706
+ .airview-grid td:focus-within,
707
+ .airview-grid td:focus {
708
+ outline: 2px solid var(--airview-accent);
709
+ outline-offset: -2px;
710
+ }
711
+
712
+ .airview-grid input,
713
+ .airview-grid select,
714
+ .airview-grid textarea {
715
+ border-color: transparent;
716
+ min-height: 28px;
717
+ min-width: 0;
718
+ padding: 3px 5px;
719
+ width: 100%;
720
+ }
721
+
722
+ .airview-cell-form input[type="submit"] {
723
+ display: none;
724
+ }
725
+
726
+ .airview-actions {
727
+ width: 96px;
728
+ }
729
+
730
+ .airview-readonly {
731
+ color: var(--airview-muted);
732
+ display: block;
733
+ min-height: 34px;
734
+ overflow-wrap: anywhere;
735
+ padding: 7px 0;
736
+ }
737
+
738
+ .airview-cell-text {
739
+ display: block;
740
+ max-width: 280px;
741
+ overflow: hidden;
742
+ text-overflow: ellipsis;
743
+ white-space: nowrap;
744
+ }
745
+
746
+ .airview-check {
747
+ border: 1px solid #b8c0cc;
748
+ border-radius: 3px;
749
+ display: inline-grid;
750
+ height: 17px;
751
+ place-items: center;
752
+ width: 17px;
753
+ }
754
+
755
+ .airview-check.is-on {
756
+ background: #e8f7ee;
757
+ border-color: #84d29c;
758
+ color: #15803d;
759
+ font-weight: 700;
760
+ }
761
+
762
+ .airview-pill {
763
+ background: #e9edf5;
764
+ border-radius: 999px;
765
+ display: inline-block;
766
+ max-width: 260px;
767
+ overflow: hidden;
768
+ padding: 2px 9px;
769
+ text-overflow: ellipsis;
770
+ white-space: nowrap;
771
+ }
772
+
773
+ .airview-reference-pill,
774
+ .airview-reference-empty {
775
+ background: #e9edf5;
776
+ border-radius: 999px;
777
+ display: inline-block;
778
+ max-width: 260px;
779
+ overflow: hidden;
780
+ padding: 2px 9px;
781
+ text-decoration: none;
782
+ text-overflow: ellipsis;
783
+ white-space: nowrap;
784
+ }
785
+
786
+ .airview-reference-empty {
787
+ background: transparent;
788
+ color: var(--airview-muted);
789
+ }
790
+
791
+ .airview-reference-list {
792
+ align-items: center;
793
+ display: flex;
794
+ gap: 4px;
795
+ max-width: 100%;
796
+ overflow: hidden;
797
+ }
798
+
799
+ .airview-reference-list--cards {
800
+ gap: 6px;
801
+ }
802
+
803
+ .airview-reference-count {
804
+ background: #f2f4f7;
805
+ border-radius: 999px;
806
+ color: var(--airview-muted);
807
+ display: inline-block;
808
+ flex: 0 0 auto;
809
+ padding: 2px 7px;
810
+ text-decoration: none;
811
+ }
812
+
813
+ .airview-reference-count--link:hover {
814
+ background: #e9edf5;
815
+ color: var(--airview-accent-strong);
816
+ }
817
+
818
+ .airview-attachment {
819
+ align-items: center;
820
+ color: var(--airview-accent-strong);
821
+ display: inline-flex;
822
+ max-width: 100%;
823
+ text-decoration: none;
824
+ }
825
+
826
+ .airview-attachment-thumb {
827
+ border: 1px solid var(--airview-border);
828
+ border-radius: 4px;
829
+ display: block;
830
+ height: 28px;
831
+ object-fit: cover;
832
+ width: 40px;
833
+ }
834
+
835
+ .airview-attachment-file {
836
+ background: #e9edf5;
837
+ border-radius: 999px;
838
+ display: inline-block;
839
+ max-width: 220px;
840
+ overflow: hidden;
841
+ padding: 2px 9px;
842
+ text-overflow: ellipsis;
843
+ white-space: nowrap;
844
+ }
845
+
846
+ .airview-reference-preview {
847
+ background: #f8fafc;
848
+ border: 1px solid var(--airview-border);
849
+ border-radius: 8px;
850
+ display: grid;
851
+ gap: 5px;
852
+ padding: 10px;
853
+ }
854
+
855
+ .airview-reference-preview--compact {
856
+ flex: 0 0 auto;
857
+ gap: 2px;
858
+ max-width: 155px;
859
+ min-width: 112px;
860
+ padding: 6px 9px;
861
+ }
862
+
863
+ .airview-reference-card-link {
864
+ color: inherit;
865
+ text-decoration: none;
866
+ }
867
+
868
+ .airview-reference-card-link:hover {
869
+ background: #eef4ff;
870
+ border-color: #b7cffb;
871
+ }
872
+
873
+ .airview-reference-preview.is-empty {
874
+ color: var(--airview-muted);
875
+ }
876
+
877
+ .airview-reference-preview-title {
878
+ font-weight: 600;
879
+ }
880
+
881
+ .airview-reference-preview-details {
882
+ color: var(--airview-muted);
883
+ font-size: 12px;
884
+ overflow: hidden;
885
+ text-overflow: ellipsis;
886
+ white-space: nowrap;
887
+ }
888
+
889
+ .airview-reference-open {
890
+ color: var(--airview-accent-strong);
891
+ font-size: 12px;
892
+ text-decoration: none;
893
+ }
894
+
895
+ .airview-reference-picker {
896
+ align-items: center;
897
+ display: flex;
898
+ gap: 8px;
899
+ position: relative;
900
+ }
901
+
902
+ .airview-reference-picker input {
903
+ flex: 1 1 auto;
904
+ }
905
+
906
+ .airview-reference-results {
907
+ background: #ffffff;
908
+ border: 1px solid var(--airview-border);
909
+ border-radius: 6px;
910
+ box-shadow: 0 12px 28px rgba(15, 23, 42, 0.16);
911
+ display: none;
912
+ left: 0;
913
+ max-height: 280px;
914
+ overflow: auto;
915
+ position: absolute;
916
+ right: 0;
917
+ top: calc(100% + 4px);
918
+ z-index: 50;
919
+ }
920
+
921
+ .airview-reference-results.is-open {
922
+ display: grid;
923
+ }
924
+
925
+ .airview-reference-result {
926
+ background: #ffffff !important;
927
+ border: 0 !important;
928
+ border-bottom: 1px solid var(--airview-soft-border) !important;
929
+ border-radius: 0 !important;
930
+ color: var(--airview-text) !important;
931
+ display: grid;
932
+ gap: 3px;
933
+ min-height: 48px;
934
+ padding: 7px 10px !important;
935
+ text-align: left;
936
+ width: 100%;
937
+ }
938
+
939
+ .airview-reference-result:hover,
940
+ .airview-reference-result:focus {
941
+ background: #f5f8ff !important;
942
+ }
943
+
944
+ .airview-reference-result-title {
945
+ font-weight: 600;
946
+ overflow: hidden;
947
+ text-overflow: ellipsis;
948
+ white-space: nowrap;
949
+ }
950
+
951
+ .airview-reference-result-meta,
952
+ .airview-reference-no-results {
953
+ color: var(--airview-muted);
954
+ font-size: 12px;
955
+ }
956
+
957
+ .airview-reference-no-results {
958
+ padding: 10px;
959
+ }
960
+
961
+ .airview-reference-clear {
962
+ background: #ffffff !important;
963
+ border-color: var(--airview-border) !important;
964
+ color: var(--airview-muted) !important;
965
+ }
966
+
967
+ .airview-empty-value {
968
+ color: #a6adbb;
969
+ }
970
+
971
+ .airview-modal-backdrop {
972
+ align-items: stretch;
973
+ background: rgba(15, 23, 42, 0.38);
974
+ display: flex;
975
+ inset: 0;
976
+ justify-content: flex-end;
977
+ position: fixed;
978
+ z-index: 100;
979
+ }
980
+
981
+ .airview-record-modal {
982
+ background: #ffffff;
983
+ box-shadow: -18px 0 42px rgba(15, 23, 42, 0.18);
984
+ display: grid;
985
+ grid-template-rows: auto minmax(0, 1fr);
986
+ max-width: 760px;
987
+ width: min(760px, 100vw);
988
+ }
989
+
990
+ .airview-record-modal-header {
991
+ align-items: center;
992
+ border-bottom: 1px solid var(--airview-border);
993
+ display: flex;
994
+ justify-content: space-between;
995
+ padding: 18px 22px;
996
+ }
997
+
998
+ .airview-record-modal-header h2 {
999
+ font-size: 20px;
1000
+ margin: 0;
1001
+ }
1002
+
1003
+ .airview-record-modal-header p {
1004
+ color: var(--airview-muted);
1005
+ margin: 3px 0 0;
1006
+ }
1007
+
1008
+ .airview-modal-close {
1009
+ border-radius: 6px;
1010
+ color: var(--airview-muted);
1011
+ font-size: 26px;
1012
+ line-height: 1;
1013
+ padding: 4px 9px;
1014
+ text-decoration: none;
1015
+ }
1016
+
1017
+ .airview-modal-close:hover {
1018
+ background: #f2f4f7;
1019
+ }
1020
+
1021
+ .airview-record-form {
1022
+ display: grid;
1023
+ gap: 0;
1024
+ overflow: auto;
1025
+ padding: 8px 22px 22px;
1026
+ }
1027
+
1028
+ .airview-record-field {
1029
+ border-bottom: 1px solid var(--airview-soft-border);
1030
+ padding: 12px 0;
1031
+ }
1032
+
1033
+ .airview-record-field.is-hidden {
1034
+ display: none;
1035
+ }
1036
+
1037
+ .airview-record-hidden-fields {
1038
+ border-bottom: 1px solid var(--airview-soft-border);
1039
+ padding: 10px 0;
1040
+ }
1041
+
1042
+ .airview-record-hidden-fields summary {
1043
+ border-radius: 4px;
1044
+ color: var(--airview-muted);
1045
+ cursor: pointer;
1046
+ display: inline-block;
1047
+ font-size: 13px;
1048
+ list-style: none;
1049
+ padding: 6px 8px;
1050
+ }
1051
+
1052
+ .airview-record-hidden-fields summary::-webkit-details-marker {
1053
+ display: none;
1054
+ }
1055
+
1056
+ .airview-record-hidden-fields[open] summary,
1057
+ .airview-record-hidden-fields summary:hover {
1058
+ background: #f2f4f7;
1059
+ color: var(--airview-text);
1060
+ }
1061
+
1062
+ .airview-record-hidden-picker {
1063
+ display: grid;
1064
+ gap: 2px;
1065
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1066
+ margin-top: 8px;
1067
+ }
1068
+
1069
+ .airview-record-field label {
1070
+ color: var(--airview-text);
1071
+ display: grid;
1072
+ gap: 7px;
1073
+ }
1074
+
1075
+ .airview-record-field label > span {
1076
+ color: var(--airview-muted);
1077
+ font-size: 12px;
1078
+ font-weight: 600;
1079
+ }
1080
+
1081
+ .airview-record-field input,
1082
+ .airview-record-field select,
1083
+ .airview-record-field textarea {
1084
+ width: 100%;
1085
+ }
1086
+
1087
+ .airview-record-readonly {
1088
+ min-height: 34px;
1089
+ padding: 7px 0;
1090
+ }
1091
+
1092
+ .airview-record-modal-actions {
1093
+ align-items: center;
1094
+ display: flex;
1095
+ gap: 10px;
1096
+ padding-top: 16px;
1097
+ }
1098
+
1099
+ .airview-danger-link {
1100
+ color: var(--airview-danger);
1101
+ text-decoration: none;
1102
+ }
1103
+
1104
+ .airview-danger-link:hover {
1105
+ text-decoration: underline;
1106
+ }
1107
+
1108
+ .airview-danger-button {
1109
+ background: var(--airview-danger) !important;
1110
+ border-color: var(--airview-danger) !important;
1111
+ }
1112
+
1113
+ .airview-delete-modal {
1114
+ max-width: 620px;
1115
+ }
1116
+
1117
+ .airview-delete-body {
1118
+ overflow: auto;
1119
+ padding: 18px 22px 0;
1120
+ }
1121
+
1122
+ .airview-delete-body code {
1123
+ background: #f2f4f7;
1124
+ border-radius: 4px;
1125
+ padding: 2px 5px;
1126
+ }
1127
+
1128
+ .airview-delete-impact-list {
1129
+ border: 1px solid var(--airview-border);
1130
+ border-radius: 8px;
1131
+ display: grid;
1132
+ margin: 14px 0;
1133
+ }
1134
+
1135
+ .airview-delete-impact {
1136
+ display: grid;
1137
+ gap: 3px;
1138
+ padding: 11px 12px;
1139
+ }
1140
+
1141
+ .airview-delete-impact + .airview-delete-impact {
1142
+ border-top: 1px solid var(--airview-soft-border);
1143
+ }
1144
+
1145
+ .airview-delete-impact span,
1146
+ .airview-delete-impact small,
1147
+ .airview-delete-note,
1148
+ .airview-delete-empty {
1149
+ color: var(--airview-muted);
1150
+ }
1151
+
1152
+ .airview-delete-empty {
1153
+ background: #f8fafc;
1154
+ border: 1px solid var(--airview-border);
1155
+ border-radius: 8px;
1156
+ margin: 14px 0;
1157
+ padding: 12px;
1158
+ }
1159
+
1160
+ .airview-delete-actions {
1161
+ padding: 16px 22px 22px;
1162
+ }
1163
+
1164
+ .airview-add-row td {
1165
+ color: var(--airview-muted);
1166
+ font-size: 20px;
1167
+ }
1168
+
1169
+ .airview-link-button {
1170
+ background: transparent !important;
1171
+ border: 0 !important;
1172
+ color: var(--airview-danger) !important;
1173
+ min-height: 0 !important;
1174
+ padding: 0 !important;
1175
+ }
1176
+
1177
+ .airview-pagination {
1178
+ display: flex;
1179
+ gap: 10px;
1180
+ padding: 14px 0;
1181
+ }
1182
+
1183
+ .airview-pagination a {
1184
+ background: var(--airview-panel);
1185
+ border: 1px solid var(--airview-border);
1186
+ border-radius: 6px;
1187
+ padding: 8px 12px;
1188
+ text-decoration: none;
1189
+ }
1190
+
1191
+ .airview-flash {
1192
+ border-bottom: 1px solid var(--airview-border);
1193
+ padding: 10px 18px;
1194
+ }
1195
+
1196
+ .airview-flash--notice {
1197
+ background: #ecfdf3;
1198
+ color: #067647;
1199
+ }
1200
+
1201
+ .airview-flash--alert {
1202
+ background: #fef3f2;
1203
+ color: var(--airview-danger);
1204
+ }
1205
+
1206
+ .airview-empty {
1207
+ margin: 48px auto;
1208
+ max-width: 520px;
1209
+ }
1210
+
1211
+ @media (max-width: 760px) {
1212
+ .airview-shell {
1213
+ grid-template-columns: 1fr;
1214
+ }
1215
+
1216
+ .airview-sidebar {
1217
+ border-right: 0;
1218
+ }
1219
+
1220
+ .airview-toolbar {
1221
+ align-items: stretch;
1222
+ flex-direction: column;
1223
+ }
1224
+
1225
+ .airview-main--grid {
1226
+ height: auto;
1227
+ overflow: visible;
1228
+ }
1229
+
1230
+ .airview-gridbar {
1231
+ align-items: flex-start;
1232
+ flex-direction: column;
1233
+ padding: 10px;
1234
+ }
1235
+
1236
+ .airview-popover-panel {
1237
+ min-width: calc(100vw - 32px);
1238
+ }
1239
+ }