archsight 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 (122) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +24 -0
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/CONTRIBUTING.md +186 -0
  5. data/Dockerfile +39 -0
  6. data/LICENSE.txt +201 -0
  7. data/README.md +170 -0
  8. data/SECURITY.md +27 -0
  9. data/exe/archsight +9 -0
  10. data/lib/archsight/annotations/aggregators.rb +109 -0
  11. data/lib/archsight/annotations/annotation.rb +168 -0
  12. data/lib/archsight/annotations/architecture_annotations.rb +59 -0
  13. data/lib/archsight/annotations/backup_annotations.rb +21 -0
  14. data/lib/archsight/annotations/computed.rb +264 -0
  15. data/lib/archsight/annotations/email_recipient.rb +35 -0
  16. data/lib/archsight/annotations/generated_annotations.rb +17 -0
  17. data/lib/archsight/annotations/git_annotations.rb +21 -0
  18. data/lib/archsight/annotations/relation_resolver.rb +160 -0
  19. data/lib/archsight/cli.rb +120 -0
  20. data/lib/archsight/configuration.rb +36 -0
  21. data/lib/archsight/database.rb +183 -0
  22. data/lib/archsight/documentation.rb +171 -0
  23. data/lib/archsight/graph.rb +113 -0
  24. data/lib/archsight/helpers.rb +210 -0
  25. data/lib/archsight/linter.rb +77 -0
  26. data/lib/archsight/mcp/analyze_resource_tool.rb +222 -0
  27. data/lib/archsight/mcp/base.rb +48 -0
  28. data/lib/archsight/mcp/query_tool.rb +113 -0
  29. data/lib/archsight/mcp/resource_doc_tool.rb +87 -0
  30. data/lib/archsight/mcp.rb +6 -0
  31. data/lib/archsight/query/ast.rb +279 -0
  32. data/lib/archsight/query/errors.rb +39 -0
  33. data/lib/archsight/query/evaluator.rb +707 -0
  34. data/lib/archsight/query/lexer.rb +289 -0
  35. data/lib/archsight/query/parser.rb +506 -0
  36. data/lib/archsight/query.rb +68 -0
  37. data/lib/archsight/renderer.rb +134 -0
  38. data/lib/archsight/resources/application_component.rb +346 -0
  39. data/lib/archsight/resources/application_interface.rb +54 -0
  40. data/lib/archsight/resources/application_service.rb +222 -0
  41. data/lib/archsight/resources/base.rb +300 -0
  42. data/lib/archsight/resources/business_actor.rb +195 -0
  43. data/lib/archsight/resources/business_constraint.rb +32 -0
  44. data/lib/archsight/resources/business_process.rb +37 -0
  45. data/lib/archsight/resources/business_product.rb +206 -0
  46. data/lib/archsight/resources/business_requirement.rb +56 -0
  47. data/lib/archsight/resources/compliance_evidence.rb +42 -0
  48. data/lib/archsight/resources/data_object.rb +49 -0
  49. data/lib/archsight/resources/motivation_goal.rb +37 -0
  50. data/lib/archsight/resources/motivation_outcome.rb +33 -0
  51. data/lib/archsight/resources/motivation_stakeholder.rb +38 -0
  52. data/lib/archsight/resources/strategy_capability.rb +38 -0
  53. data/lib/archsight/resources/technology_artifact.rb +154 -0
  54. data/lib/archsight/resources/technology_interface.rb +34 -0
  55. data/lib/archsight/resources/technology_node.rb +42 -0
  56. data/lib/archsight/resources/technology_service.rb +35 -0
  57. data/lib/archsight/resources/technology_system_software.rb +37 -0
  58. data/lib/archsight/resources/view.rb +51 -0
  59. data/lib/archsight/resources.rb +49 -0
  60. data/lib/archsight/template.rb +49 -0
  61. data/lib/archsight/version.rb +5 -0
  62. data/lib/archsight/web/application.rb +290 -0
  63. data/lib/archsight/web/doc/archimate.md +215 -0
  64. data/lib/archsight/web/doc/computed_annotations.md +316 -0
  65. data/lib/archsight/web/doc/icons.md +303 -0
  66. data/lib/archsight/web/doc/index.md.erb +74 -0
  67. data/lib/archsight/web/doc/modeling.md +200 -0
  68. data/lib/archsight/web/doc/search.md +227 -0
  69. data/lib/archsight/web/doc/togaf.md +255 -0
  70. data/lib/archsight/web/doc/tool.md +90 -0
  71. data/lib/archsight/web/public/css/artifact.css +985 -0
  72. data/lib/archsight/web/public/css/base.css +201 -0
  73. data/lib/archsight/web/public/css/graph.css +106 -0
  74. data/lib/archsight/web/public/css/highlight.min.css +10 -0
  75. data/lib/archsight/web/public/css/iconoir.css +22 -0
  76. data/lib/archsight/web/public/css/instance.css +329 -0
  77. data/lib/archsight/web/public/css/layout.css +421 -0
  78. data/lib/archsight/web/public/css/mermaid-layers.css +188 -0
  79. data/lib/archsight/web/public/css/pico.min.css +4 -0
  80. data/lib/archsight/web/public/favicon.ico +0 -0
  81. data/lib/archsight/web/public/img/archimate.png +0 -0
  82. data/lib/archsight/web/public/img/togaf-high-level.png +0 -0
  83. data/lib/archsight/web/public/js/graph-zoom.js +18 -0
  84. data/lib/archsight/web/public/js/highlight.min.js +3899 -0
  85. data/lib/archsight/web/public/js/htmx.min.js +1 -0
  86. data/lib/archsight/web/public/js/mermaid-init.js +88 -0
  87. data/lib/archsight/web/public/js/mermaid.min.js +2811 -0
  88. data/lib/archsight/web/public/js/sparkline.js +42 -0
  89. data/lib/archsight/web/public/js/svg-pan-zoom.min.js +3 -0
  90. data/lib/archsight/web/public/js/svg-zoom-controls.js +93 -0
  91. data/lib/archsight/web/views/index.haml +12 -0
  92. data/lib/archsight/web/views/partials/artifact/_activity.haml +55 -0
  93. data/lib/archsight/web/views/partials/artifact/_agentic.haml +25 -0
  94. data/lib/archsight/web/views/partials/artifact/_deployment.haml +29 -0
  95. data/lib/archsight/web/views/partials/artifact/_git_info.haml +16 -0
  96. data/lib/archsight/web/views/partials/artifact/_language_stats.haml +53 -0
  97. data/lib/archsight/web/views/partials/artifact/_links.haml +24 -0
  98. data/lib/archsight/web/views/partials/artifact/_project_estimate.haml +26 -0
  99. data/lib/archsight/web/views/partials/artifact/_repositories.haml +55 -0
  100. data/lib/archsight/web/views/partials/artifact/_team.haml +83 -0
  101. data/lib/archsight/web/views/partials/artifact/_workflow.haml +69 -0
  102. data/lib/archsight/web/views/partials/components/_activity.haml +37 -0
  103. data/lib/archsight/web/views/partials/components/_git.haml +17 -0
  104. data/lib/archsight/web/views/partials/components/_jira.haml +18 -0
  105. data/lib/archsight/web/views/partials/components/_languages.haml +29 -0
  106. data/lib/archsight/web/views/partials/components/_owner.haml +15 -0
  107. data/lib/archsight/web/views/partials/components/_repositories.haml +37 -0
  108. data/lib/archsight/web/views/partials/components/_status.haml +23 -0
  109. data/lib/archsight/web/views/partials/instance/_detail.haml +99 -0
  110. data/lib/archsight/web/views/partials/instance/_graph.haml +6 -0
  111. data/lib/archsight/web/views/partials/instance/_list.haml +84 -0
  112. data/lib/archsight/web/views/partials/instance/_relations.haml +43 -0
  113. data/lib/archsight/web/views/partials/instance/_requirements.haml +41 -0
  114. data/lib/archsight/web/views/partials/instance/_view_detail.haml +57 -0
  115. data/lib/archsight/web/views/partials/layout/_content.haml +40 -0
  116. data/lib/archsight/web/views/partials/layout/_error.haml +22 -0
  117. data/lib/archsight/web/views/partials/layout/_head.haml +24 -0
  118. data/lib/archsight/web/views/partials/layout/_navigation.haml +20 -0
  119. data/lib/archsight/web/views/partials/layout/_sidebar.haml +27 -0
  120. data/lib/archsight/web/views/search.haml +53 -0
  121. data/lib/archsight.rb +17 -0
  122. metadata +311 -0
@@ -0,0 +1,329 @@
1
+ /* Instance Styles - Graphs, Tables, Lists, Views */
2
+
3
+ /* Reduce article padding for tighter layout */
4
+ .content article {
5
+ padding: 1rem;
6
+ }
7
+
8
+ /* Reduce graph container margin */
9
+ .content article .graph-container {
10
+ margin-bottom: 0.5rem;
11
+ }
12
+
13
+ /* Reduce footer margin */
14
+ .content article > footer {
15
+ margin-top: 0.5rem;
16
+ padding-top: 0.5rem;
17
+ }
18
+
19
+ /* Instance header with kind subtitle */
20
+ .instance-title-text {
21
+ display: flex;
22
+ flex-direction: column;
23
+ line-height: 1;
24
+ }
25
+
26
+ .instance-kind-subtitle {
27
+ font-size: 0.4em;
28
+ font-weight: 400;
29
+ color: var(--muted-color);
30
+ opacity: 0.7;
31
+ margin-top: 0.1em;
32
+ }
33
+
34
+ /* Graph container for svg-pan-zoom */
35
+ .graph-container {
36
+ position: relative;
37
+ overflow: hidden;
38
+ border: 1px solid var(--muted-border-color);
39
+ border-radius: 4px;
40
+ background-color: var(--card-background-color);
41
+ /* Let height adapt to content, cap at 70vh for large graphs */
42
+ height: auto;
43
+ min-height: 150px;
44
+ max-height: 70vh;
45
+ }
46
+
47
+ /* Expandable graphs (global view) - larger viewport */
48
+ .graph-container.graph-expand {
49
+ height: 85vh;
50
+ max-height: none;
51
+ }
52
+
53
+ /* Graphviz canvas container */
54
+ #graphviz {
55
+ width: 100%;
56
+ height: 100%;
57
+ }
58
+
59
+ #graphviz svg {
60
+ display: block;
61
+ }
62
+
63
+ /* Search instance list */
64
+ .search-instance-list {
65
+ list-style: none;
66
+ padding: 0;
67
+ margin: 0;
68
+ }
69
+
70
+ .search-instance-item {
71
+ display: flex;
72
+ justify-content: space-between;
73
+ align-items: center;
74
+ padding: 6px 8px;
75
+ margin-bottom: 2px;
76
+ background-color: var(--card-background-color);
77
+ border: 1px solid var(--muted-border-color);
78
+ border-radius: 4px;
79
+ transition: border-color 0.15s ease;
80
+ }
81
+
82
+ .search-instance-item:hover {
83
+ border-color: var(--primary);
84
+ }
85
+
86
+ .instance-main {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 12px;
90
+ flex: 1;
91
+ }
92
+
93
+ .instance-name {
94
+ font-weight: 600;
95
+ font-size: 1em;
96
+ color: var(--primary);
97
+ text-decoration: none;
98
+ }
99
+
100
+ .instance-name:hover {
101
+ text-decoration: underline;
102
+ }
103
+
104
+ .instance-kind {
105
+ font-size: 0.85em;
106
+ color: var(--muted-color);
107
+ padding: 2px 8px;
108
+ background-color: var(--code-background-color);
109
+ border-radius: 4px;
110
+ }
111
+
112
+ .instance-badges {
113
+ display: flex;
114
+ gap: 6px;
115
+ flex-wrap: wrap;
116
+ }
117
+
118
+ /* Resource list table styles */
119
+ .resource-list-table {
120
+ width: 100%;
121
+ border-collapse: collapse;
122
+ margin: 0;
123
+ }
124
+
125
+ .resource-list-table thead th {
126
+ text-align: left;
127
+ padding: 8px 12px;
128
+ font-weight: 600;
129
+ font-size: 0.85em;
130
+ color: var(--muted-color);
131
+ border-bottom: 2px solid var(--muted-border-color);
132
+ background-color: var(--card-background-color);
133
+ }
134
+
135
+ .resource-list-table tbody tr {
136
+ border-bottom: 1px solid var(--muted-border-color);
137
+ transition: background-color 0.15s ease;
138
+ }
139
+
140
+ .resource-list-table tbody tr:hover {
141
+ background-color: var(--card-background-color);
142
+ }
143
+
144
+ .resource-list-table td {
145
+ padding: 8px 12px;
146
+ vertical-align: middle;
147
+ }
148
+
149
+ .resource-list-table .col-name {
150
+ min-width: 200px;
151
+ }
152
+
153
+ .resource-list-table .col-kind {
154
+ white-space: nowrap;
155
+ }
156
+
157
+ .resource-list-table .col-annotation {
158
+ color: var(--color);
159
+ font-size: 0.9em;
160
+ }
161
+
162
+ .resource-list-table .empty-value {
163
+ color: var(--muted-color);
164
+ }
165
+
166
+ .resource-list-table .instance-name {
167
+ display: inline-flex;
168
+ align-items: center;
169
+ gap: 8px;
170
+ }
171
+
172
+ /* View resource styles */
173
+ .view-header {
174
+ margin-bottom: 0.75rem;
175
+ }
176
+
177
+ .view-header h2 {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 0.5rem;
181
+ }
182
+
183
+ .view-header h2 i {
184
+ color: var(--primary);
185
+ }
186
+
187
+ .view-description {
188
+ margin-top: 0.75rem;
189
+ padding: 0.75rem;
190
+ background-color: var(--card-background-color);
191
+ border-radius: 8px;
192
+ border: 1px solid var(--muted-border-color);
193
+ }
194
+
195
+ .view-query-section {
196
+ margin-bottom: 0.75rem;
197
+ }
198
+
199
+ .view-query-display {
200
+ display: flex;
201
+ flex-wrap: wrap;
202
+ gap: 1rem;
203
+ align-items: center;
204
+ padding: 0.5rem 0;
205
+ }
206
+
207
+ .view-fields-info {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: 0.5rem;
211
+ margin-bottom: 0.75rem;
212
+ font-size: 0.9em;
213
+ }
214
+
215
+ .view-fields-info .label {
216
+ font-weight: 600;
217
+ color: var(--muted-color);
218
+ text-transform: uppercase;
219
+ font-size: 0.85em;
220
+ }
221
+
222
+ .view-fields-info code {
223
+ padding: 0.25rem 0.5rem;
224
+ background-color: var(--code-background-color);
225
+ border-radius: 4px;
226
+ }
227
+
228
+ .view-result-meta {
229
+ font-size: 0.9em;
230
+ color: var(--muted-color);
231
+ margin-left: 1rem;
232
+ }
233
+
234
+ .view-empty-state {
235
+ padding: 1.5rem;
236
+ text-align: center;
237
+ color: var(--muted-color);
238
+ }
239
+
240
+ /* Requirement status icons */
241
+ .requirement-status-icon {
242
+ font-size: 1.2em;
243
+ }
244
+
245
+ .requirement-status-icon.status-implemented {
246
+ color: #10b981;
247
+ }
248
+
249
+ .requirement-status-icon.status-partial {
250
+ color: #f59e0b;
251
+ }
252
+
253
+ .requirement-status-icon.status-planned {
254
+ color: #3b82f6;
255
+ }
256
+
257
+ .requirement-status-icon.status-not-started,
258
+ .requirement-status-icon.status-unknown {
259
+ color: #9ca3af;
260
+ }
261
+
262
+ /* Relations section - two-column layout */
263
+ .relations-section .relations-grid {
264
+ display: grid;
265
+ grid-template-columns: 1fr 1fr;
266
+ gap: 1.5rem;
267
+ }
268
+
269
+ /* On desktop: Outgoing on right, Incoming on left */
270
+ .relations-section .relations-outgoing {
271
+ order: 2;
272
+ }
273
+
274
+ .relations-section .relations-incoming {
275
+ order: 1;
276
+ }
277
+
278
+ @media (max-width: 768px) {
279
+ .relations-section .relations-grid {
280
+ grid-template-columns: 1fr;
281
+ gap: 1rem;
282
+ }
283
+
284
+ /* On mobile: Outgoing on top */
285
+ .relations-section .relations-outgoing {
286
+ order: 1;
287
+ }
288
+
289
+ .relations-section .relations-incoming {
290
+ order: 2;
291
+ }
292
+ }
293
+
294
+ .relations-section .relations-column h3 {
295
+ display: flex;
296
+ align-items: center;
297
+ gap: 0.5rem;
298
+ margin-bottom: 0.75rem;
299
+ color: var(--muted-color);
300
+ font-size: 1rem;
301
+ font-weight: 600;
302
+ }
303
+
304
+ .relations-section .relation-group {
305
+ margin-bottom: 0.75rem;
306
+ padding: 0.5rem 0.75rem;
307
+ background-color: var(--card-background-color);
308
+ border: 1px solid var(--muted-border-color);
309
+ border-radius: 0.5rem;
310
+ }
311
+
312
+ .relations-section .relation-kind {
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 0.5rem;
316
+ font-weight: 600;
317
+ margin-bottom: 0.25rem;
318
+ }
319
+
320
+ .relations-section .relation-verb {
321
+ font-size: 0.875rem;
322
+ color: var(--muted-color);
323
+ margin-bottom: 0.5rem;
324
+ }
325
+
326
+ .relations-section .relations-empty {
327
+ color: var(--muted-color);
328
+ font-style: italic;
329
+ }
@@ -0,0 +1,421 @@
1
+ /* Layout Styles - Sidebar, Navigation, Search, Errors */
2
+
3
+ /* Sidebar */
4
+ .sidebar {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 0;
8
+ }
9
+
10
+ .sidebar-section {
11
+ padding-bottom: 16px;
12
+ margin-bottom: 16px;
13
+ }
14
+
15
+ .sidebar-section:not(:last-child) {
16
+ border-bottom: 1px solid var(--muted-border-color);
17
+ }
18
+
19
+ .sidebar-heading {
20
+ margin-bottom: 8px;
21
+ }
22
+
23
+ .kind-filter ul,
24
+ .instance-list ul {
25
+ padding: 0;
26
+ margin: 0;
27
+ }
28
+
29
+ .kind-filter li,
30
+ .instance-list li {
31
+ padding: 0;
32
+ margin: 0;
33
+ }
34
+
35
+ .kind-filter a,
36
+ .instance-list a {
37
+ display: flex;
38
+ justify-content: space-between;
39
+ align-items: center;
40
+ margin-bottom: 2px;
41
+ font-size: 0.85em;
42
+ padding: 0.25rem 0.5rem;
43
+ border-radius: 4px;
44
+ text-decoration: none;
45
+ }
46
+
47
+ .kind-filter a[aria-current="page"],
48
+ .instance-list a[aria-current="page"] {
49
+ background-color: var(--primary);
50
+ color: var(--primary-inverse);
51
+ }
52
+
53
+ .kind-count {
54
+ font-size: 0.85em;
55
+ padding: 2px 6px;
56
+ border-radius: 10px;
57
+ min-width: 24px;
58
+ text-align: center;
59
+ opacity: 0.7;
60
+ }
61
+
62
+ .kind-filter a[aria-current="page"] .kind-count {
63
+ opacity: 1;
64
+ }
65
+
66
+ /* Filter groups */
67
+ .filter-group {
68
+ margin-bottom: 0.5rem;
69
+ }
70
+
71
+ .filter-group:last-child {
72
+ margin-bottom: 0;
73
+ }
74
+
75
+ .filter-label {
76
+ font-size: 0.75em;
77
+ font-weight: 600;
78
+ color: var(--muted-color);
79
+ text-transform: uppercase;
80
+ margin-bottom: 0.25rem;
81
+ padding: 0;
82
+ }
83
+
84
+ .filter-chips {
85
+ display: flex;
86
+ flex-wrap: wrap;
87
+ gap: 0.25rem;
88
+ }
89
+
90
+ .filter-chip {
91
+ display: inline-block;
92
+ font-size: 0.75em;
93
+ padding: 0.2rem 0.5rem;
94
+ background-color: var(--card-background-color);
95
+ border: 1px solid var(--muted-border-color);
96
+ border-radius: 12px;
97
+ text-decoration: none;
98
+ color: var(--color);
99
+ transition: all 0.2s ease;
100
+ }
101
+
102
+ .filter-chip:hover {
103
+ background-color: var(--primary);
104
+ color: var(--primary-inverse);
105
+ border-color: var(--primary);
106
+ }
107
+
108
+ /* Responsive layout */
109
+ @media all and (min-width: 800px) {
110
+ main {
111
+ display: flex;
112
+ flex-direction: row;
113
+ gap: 1rem;
114
+ }
115
+
116
+ .sidebar {
117
+ width: clamp(250px, 20vw, 400px);
118
+ flex-shrink: 0;
119
+ }
120
+ }
121
+
122
+ /* Search query display */
123
+ .search-query-display {
124
+ display: flex;
125
+ flex-wrap: wrap;
126
+ gap: 1.5rem;
127
+ align-items: center;
128
+ padding: 1rem 0;
129
+ }
130
+
131
+ .query-item {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 0.5rem;
135
+ margin: 0;
136
+ padding: 0;
137
+ }
138
+
139
+ .query-item .label {
140
+ font-weight: 600;
141
+ color: var(--muted-color);
142
+ text-transform: uppercase;
143
+ font-size: 0.85em;
144
+ letter-spacing: 0.5px;
145
+ }
146
+
147
+ .query-item code {
148
+ padding: 0.35rem 0.75rem;
149
+ background-color: var(--code-background-color);
150
+ border-radius: 6px;
151
+ font-size: 0.95em;
152
+ font-family: monospace;
153
+ color: var(--color);
154
+ }
155
+
156
+ .query-value {
157
+ word-break: break-word;
158
+ }
159
+
160
+ .kind-value {
161
+ text-transform: capitalize;
162
+ }
163
+
164
+ .result-count {
165
+ font-weight: 600;
166
+ color: var(--color);
167
+ font-size: 1em;
168
+ }
169
+
170
+ .query-toggle {
171
+ display: inline-flex;
172
+ align-items: center;
173
+ justify-content: center;
174
+ width: 28px;
175
+ height: 28px;
176
+ border-radius: 50%;
177
+ background-color: var(--card-background-color);
178
+ border: 1px solid var(--muted-border-color);
179
+ transition: all 0.2s ease;
180
+ cursor: pointer;
181
+ margin-left: 0.25rem;
182
+ }
183
+
184
+ .query-toggle:hover {
185
+ background-color: var(--primary);
186
+ color: var(--primary-inverse);
187
+ border-color: var(--primary);
188
+ transform: rotate(180deg);
189
+ }
190
+
191
+ .query-toggle i {
192
+ font-size: 1.1em;
193
+ }
194
+
195
+ /* Search container and spinner */
196
+ .search-container {
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 0.5rem;
200
+ }
201
+
202
+ .search-container input.search {
203
+ min-width: 700px;
204
+ }
205
+
206
+ .search-spinner {
207
+ display: none;
208
+ }
209
+
210
+ .search-spinner.htmx-request {
211
+ display: inline-flex;
212
+ align-items: center;
213
+ }
214
+
215
+ .spinning {
216
+ animation: spin 1s linear infinite;
217
+ }
218
+
219
+ @keyframes spin {
220
+ from {
221
+ transform: rotate(0deg);
222
+ }
223
+
224
+ to {
225
+ transform: rotate(360deg);
226
+ }
227
+ }
228
+
229
+ /* Search help button */
230
+ .search-help {
231
+ display: inline-flex;
232
+ align-items: center;
233
+ justify-content: center;
234
+ width: 28px;
235
+ height: 28px;
236
+ border-radius: 50%;
237
+ background-color: var(--card-background-color);
238
+ border: 1px solid var(--muted-border-color);
239
+ transition: all 0.2s ease;
240
+ cursor: pointer;
241
+ color: var(--muted-color);
242
+ }
243
+
244
+ .search-help:hover {
245
+ background-color: var(--primary);
246
+ color: var(--primary-inverse);
247
+ border-color: var(--primary);
248
+ }
249
+
250
+ .search-help i {
251
+ font-size: 1.1em;
252
+ }
253
+
254
+ /* Search error styles */
255
+ .search-error {
256
+ padding: 1rem;
257
+ background-color: #fee2e2;
258
+ border: 1px solid #fecaca;
259
+ border-radius: 8px;
260
+ margin-bottom: 1rem;
261
+ }
262
+
263
+ .search-error-header {
264
+ display: flex;
265
+ align-items: center;
266
+ gap: 0.5rem;
267
+ margin-bottom: 0.5rem;
268
+ color: #991b1b;
269
+ font-weight: 600;
270
+ }
271
+
272
+ .search-error-header i {
273
+ font-size: 1.2em;
274
+ }
275
+
276
+ .search-error-message {
277
+ font-family: monospace;
278
+ font-size: 0.95em;
279
+ color: #991b1b;
280
+ background-color: #fef2f2;
281
+ padding: 0.75rem;
282
+ border-radius: 4px;
283
+ overflow-x: auto;
284
+ white-space: pre-wrap;
285
+ word-break: break-word;
286
+ }
287
+
288
+ .search-error-query {
289
+ margin-top: 0.5rem;
290
+ font-size: 0.85em;
291
+ color: #7f1d1d;
292
+ }
293
+
294
+ .search-error-query code {
295
+ background-color: #fef2f2;
296
+ padding: 0.25rem 0.5rem;
297
+ border-radius: 4px;
298
+ }
299
+
300
+ @media (prefers-color-scheme: dark) {
301
+ .search-error {
302
+ background-color: #450a0a;
303
+ border-color: #7f1d1d;
304
+ }
305
+
306
+ .search-error-header {
307
+ color: #fca5a5;
308
+ }
309
+
310
+ .search-error-message {
311
+ color: #fecaca;
312
+ background-color: #7f1d1d;
313
+ }
314
+
315
+ .search-error-query {
316
+ color: #fca5a5;
317
+ }
318
+
319
+ .search-error-query code {
320
+ background-color: #7f1d1d;
321
+ }
322
+ }
323
+
324
+ /* Error page styles */
325
+ .error-header {
326
+ margin-bottom: 1rem;
327
+ }
328
+
329
+ .error-header h3 {
330
+ color: #dc2626;
331
+ display: flex;
332
+ align-items: center;
333
+ gap: 0.5rem;
334
+ margin-bottom: 0.5rem;
335
+ }
336
+
337
+ .error-message {
338
+ font-size: 1.1rem;
339
+ margin-bottom: 0.5rem;
340
+ }
341
+
342
+ .error-location {
343
+ color: #6b7280;
344
+ font-family: monospace;
345
+ display: flex;
346
+ align-items: center;
347
+ gap: 0.5rem;
348
+ }
349
+
350
+ .error-line-badge {
351
+ background-color: #dc2626;
352
+ color: white;
353
+ padding: 0.125rem 0.5rem;
354
+ border-radius: 4px;
355
+ font-size: 0.875rem;
356
+ }
357
+
358
+ .reload-btn {
359
+ display: inline-flex;
360
+ align-items: center;
361
+ gap: 0.25rem;
362
+ }
363
+
364
+ .error-code-block {
365
+ width: 100%;
366
+ overflow-x: auto;
367
+ }
368
+
369
+ .error-code-block pre {
370
+ margin: 0;
371
+ padding: 1rem;
372
+ background-color: #1e1e1e;
373
+ border-radius: 8px;
374
+ overflow-x: auto;
375
+ }
376
+
377
+ .error-code-block code {
378
+ font-family: 'SF Mono', 'Monaco', 'Menlo', 'Consolas', monospace;
379
+ font-size: 0.8rem;
380
+ line-height: 1.1;
381
+ }
382
+
383
+ .error-code-block .code-line,
384
+ .error-code-block .error-line {
385
+ display: block;
386
+ white-space: pre;
387
+ }
388
+
389
+ .error-code-block .code-line {
390
+ color: #d4d4d4;
391
+ }
392
+
393
+ .error-code-block .error-line {
394
+ background-color: rgba(220, 38, 38, 0.3);
395
+ color: #fca5a5;
396
+ margin: 0 -1rem;
397
+ padding: 0 1rem;
398
+ }
399
+
400
+ .error-code-block .line-number {
401
+ color: #6b7280;
402
+ user-select: none;
403
+ margin-right: 1rem;
404
+ display: inline-block;
405
+ min-width: 3rem;
406
+ text-align: right;
407
+ }
408
+
409
+ .error-code-block .error-line .line-number {
410
+ color: #f87171;
411
+ }
412
+
413
+ @media (prefers-color-scheme: dark) {
414
+ .error-header h3 {
415
+ color: #f87171;
416
+ }
417
+
418
+ .error-location {
419
+ color: #9ca3af;
420
+ }
421
+ }