@quazardous/qdadm 1.19.3

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 (291) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/package.json +101 -0
  4. package/src/assets/logo.svg +6 -0
  5. package/src/auth/SessionAuthAdapter.ts +459 -0
  6. package/src/auth/index.ts +15 -0
  7. package/src/chain/ActiveStack.ts +154 -0
  8. package/src/chain/StackHydrator.ts +292 -0
  9. package/src/chain/index.ts +25 -0
  10. package/src/chain/useActiveStack.ts +120 -0
  11. package/src/chain/useStackHydrator.ts +155 -0
  12. package/src/components/BoolCell.vue +34 -0
  13. package/src/components/InfoBanner.vue +73 -0
  14. package/src/components/QdadmRoot.vue +52 -0
  15. package/src/components/SeverityTag.vue +86 -0
  16. package/src/components/dialogs/BulkStatusDialog.vue +60 -0
  17. package/src/components/dialogs/MultiStepDialog.vue +331 -0
  18. package/src/components/dialogs/SimpleDialog.vue +122 -0
  19. package/src/components/dialogs/UnsavedChangesDialog.vue +80 -0
  20. package/src/components/display/BannerZone.vue +65 -0
  21. package/src/components/display/CardsGrid.vue +72 -0
  22. package/src/components/display/CopyableId.vue +84 -0
  23. package/src/components/display/EmptyState.vue +62 -0
  24. package/src/components/display/IntensityBar.vue +190 -0
  25. package/src/components/display/RichCardsGrid.vue +101 -0
  26. package/src/components/edit/FormActions.vue +78 -0
  27. package/src/components/edit/FormField.vue +82 -0
  28. package/src/components/edit/FormInput.vue +158 -0
  29. package/src/components/edit/FormPage.vue +260 -0
  30. package/src/components/edit/FormTab.vue +217 -0
  31. package/src/components/edit/FormTabs.vue +120 -0
  32. package/src/components/edit/LookupField.vue +406 -0
  33. package/src/components/edit/LookupPickerDialog.vue +230 -0
  34. package/src/components/editors/JsonEditorFoldable.vue +470 -0
  35. package/src/components/editors/JsonStructuredField.vue +264 -0
  36. package/src/components/editors/JsonViewer.vue +51 -0
  37. package/src/components/editors/KeyValueEditor.vue +314 -0
  38. package/src/components/editors/LanguageEditor.vue +259 -0
  39. package/src/components/editors/PermissionEditor.vue +558 -0
  40. package/src/components/editors/ScopeEditor.vue +372 -0
  41. package/src/components/editors/VanillaJsonEditor.vue +183 -0
  42. package/src/components/index.ts +83 -0
  43. package/src/components/item/FieldGroups.vue +392 -0
  44. package/src/components/layout/AppLayout.vue +1032 -0
  45. package/src/components/layout/BaseLayout.vue +190 -0
  46. package/src/components/layout/Breadcrumb.vue +55 -0
  47. package/src/components/layout/DashboardLayout.vue +104 -0
  48. package/src/components/layout/FormLayout.vue +256 -0
  49. package/src/components/layout/ListLayout.vue +278 -0
  50. package/src/components/layout/PageHeader.vue +156 -0
  51. package/src/components/layout/PageLayout.vue +126 -0
  52. package/src/components/layout/PageNav.vue +192 -0
  53. package/src/components/layout/SidebarBox.vue +87 -0
  54. package/src/components/layout/Zone.vue +182 -0
  55. package/src/components/layout/defaults/DefaultBreadcrumb.vue +149 -0
  56. package/src/components/layout/defaults/DefaultFooter.vue +89 -0
  57. package/src/components/layout/defaults/DefaultFormActions.vue +67 -0
  58. package/src/components/layout/defaults/DefaultHeader.vue +78 -0
  59. package/src/components/layout/defaults/DefaultMenu.vue +188 -0
  60. package/src/components/layout/defaults/DefaultPagination.vue +75 -0
  61. package/src/components/layout/defaults/DefaultTable.vue +137 -0
  62. package/src/components/layout/defaults/DefaultUserInfo.vue +111 -0
  63. package/src/components/layout/defaults/index.ts +16 -0
  64. package/src/components/lists/ActionButtons.vue +49 -0
  65. package/src/components/lists/ActionColumn.vue +40 -0
  66. package/src/components/lists/FilterBar.vue +54 -0
  67. package/src/components/lists/ListPage.vue +467 -0
  68. package/src/components/pages/LoginPage.vue +334 -0
  69. package/src/components/pages/NotFoundPage.vue +98 -0
  70. package/src/components/show/ShowDisplay.vue +343 -0
  71. package/src/components/show/ShowField.vue +67 -0
  72. package/src/components/show/ShowPage.vue +431 -0
  73. package/src/composables/index.ts +155 -0
  74. package/src/composables/useApp.ts +67 -0
  75. package/src/composables/useAuth.ts +98 -0
  76. package/src/composables/useBareForm.ts +319 -0
  77. package/src/composables/useBreadcrumb.ts +252 -0
  78. package/src/composables/useChildPage.ts +113 -0
  79. package/src/composables/useCurrentEntity.ts +60 -0
  80. package/src/composables/useDeferred.ts +94 -0
  81. package/src/composables/useDirtyState.ts +138 -0
  82. package/src/composables/useEntityItemFormPage.ts +942 -0
  83. package/src/composables/useEntityItemFormPage.types.ts +451 -0
  84. package/src/composables/useEntityItemPage.ts +438 -0
  85. package/src/composables/useEntityItemShowPage.ts +722 -0
  86. package/src/composables/useFieldManager.ts +692 -0
  87. package/src/composables/useForm.ts +544 -0
  88. package/src/composables/useGuardStore.ts +53 -0
  89. package/src/composables/useHooks.ts +56 -0
  90. package/src/composables/useInfoBanner.ts +217 -0
  91. package/src/composables/useJsonSyntax.ts +122 -0
  92. package/src/composables/useLayoutResolver.ts +329 -0
  93. package/src/composables/useListPage.ts +1535 -0
  94. package/src/composables/useListPage.types.ts +437 -0
  95. package/src/composables/useListPage.utils.ts +101 -0
  96. package/src/composables/useNavContext.ts +439 -0
  97. package/src/composables/useNavigation.ts +216 -0
  98. package/src/composables/useOptionsLookup.ts +323 -0
  99. package/src/composables/usePageTitle.ts +84 -0
  100. package/src/composables/useSSEBridge.ts +142 -0
  101. package/src/composables/useSemanticBreadcrumb.ts +222 -0
  102. package/src/composables/useSidebarState.ts +24 -0
  103. package/src/composables/useSignals.ts +52 -0
  104. package/src/composables/useUnsavedChangesGuard.ts +155 -0
  105. package/src/composables/useUserImpersonator.ts +317 -0
  106. package/src/composables/useZoneRegistry.ts +252 -0
  107. package/src/core/bundles.ts +558 -0
  108. package/src/core/decorator.ts +420 -0
  109. package/src/core/extension.ts +470 -0
  110. package/src/core/index.ts +59 -0
  111. package/src/deferred/DeferredRegistry.ts +353 -0
  112. package/src/deferred/index.ts +15 -0
  113. package/src/editors/index.ts +12 -0
  114. package/src/entity/EntityManager.cache.ts +530 -0
  115. package/src/entity/EntityManager.crud.ts +615 -0
  116. package/src/entity/EntityManager.interface.ts +78 -0
  117. package/src/entity/EntityManager.query.ts +221 -0
  118. package/src/entity/EntityManager.relations.ts +151 -0
  119. package/src/entity/EntityManager.ts +944 -0
  120. package/src/entity/EntityManager.types.ts +288 -0
  121. package/src/entity/auth/CompositeAuthAdapter.ts +194 -0
  122. package/src/entity/auth/EntityAuthAdapter.ts +119 -0
  123. package/src/entity/auth/PermissiveAdapter.ts +43 -0
  124. package/src/entity/auth/RoleHierarchy.ts +128 -0
  125. package/src/entity/auth/SecurityChecker.ts +202 -0
  126. package/src/entity/auth/factory.ts +203 -0
  127. package/src/entity/auth/index.ts +47 -0
  128. package/src/entity/factory.test.js +189 -0
  129. package/src/entity/factory.ts +146 -0
  130. package/src/entity/index.ts +49 -0
  131. package/src/entity/storage/ApiStorage.ts +228 -0
  132. package/src/entity/storage/IStorage.ts +100 -0
  133. package/src/entity/storage/LocalStorage.ts +200 -0
  134. package/src/entity/storage/MemoryStorage.ts +184 -0
  135. package/src/entity/storage/MockApiStorage.ts +318 -0
  136. package/src/entity/storage/SdkStorage.ts +377 -0
  137. package/src/entity/storage/factory.test.js +159 -0
  138. package/src/entity/storage/factory.ts +209 -0
  139. package/src/entity/storage/index.ts +75 -0
  140. package/src/gen/FieldMapper.ts +122 -0
  141. package/src/gen/StorageProfileFactory.ts +93 -0
  142. package/src/gen/connectors/BaseConnector.ts +150 -0
  143. package/src/gen/connectors/ManualConnector.test.js +499 -0
  144. package/src/gen/connectors/ManualConnector.ts +414 -0
  145. package/src/gen/connectors/OpenAPIConnector.test.js +836 -0
  146. package/src/gen/connectors/OpenAPIConnector.ts +693 -0
  147. package/src/gen/connectors/__fixtures__/sample-openapi.json +311 -0
  148. package/src/gen/connectors/index.ts +27 -0
  149. package/src/gen/createManagers.ts +245 -0
  150. package/src/gen/decorators.ts +134 -0
  151. package/src/gen/generateManagers.test.js +540 -0
  152. package/src/gen/generateManagers.ts +398 -0
  153. package/src/gen/index.ts +66 -0
  154. package/src/gen/schema.ts +248 -0
  155. package/src/gen/vite-plugin.ts +114 -0
  156. package/src/generated/managers/testManager.js +45 -0
  157. package/src/generated/managers/testManager.ts +46 -0
  158. package/src/hooks/HookRegistry.ts +16 -0
  159. package/src/hooks/index.ts +15 -0
  160. package/src/i18n/I18n.ts +344 -0
  161. package/src/i18n/IncrementalDomainProvider.ts +153 -0
  162. package/src/i18n/InlineTranslationProvider.ts +4 -0
  163. package/src/i18n/LazyTranslationProvider.ts +102 -0
  164. package/src/i18n/MessagesRegistry.ts +4 -0
  165. package/src/i18n/Resolver.ts +4 -0
  166. package/src/i18n/__tests__/I18n.test.ts +169 -0
  167. package/src/i18n/__tests__/IncrementalDomainProvider.test.ts +146 -0
  168. package/src/i18n/__tests__/LazyTranslationProvider.test.ts +100 -0
  169. package/src/i18n/__tests__/Resolver.test.ts +271 -0
  170. package/src/i18n/defaults/DefaultCoreProvider.ts +28 -0
  171. package/src/i18n/defaults/core.en.yml +55 -0
  172. package/src/i18n/defaults/core.fr.yml +55 -0
  173. package/src/i18n/index.ts +55 -0
  174. package/src/i18n/loaders/raw-modules.d.ts +15 -0
  175. package/src/i18n/loaders/yaml.ts +35 -0
  176. package/src/i18n/strategies.ts +4 -0
  177. package/src/i18n/types.ts +34 -0
  178. package/src/i18n/useI18n.ts +34 -0
  179. package/src/index.ts +453 -0
  180. package/src/kernel/EventRouter.ts +23 -0
  181. package/src/kernel/Kernel.api.ts +79 -0
  182. package/src/kernel/Kernel.auth.ts +120 -0
  183. package/src/kernel/Kernel.i18n.ts +29 -0
  184. package/src/kernel/Kernel.modules.ts +170 -0
  185. package/src/kernel/Kernel.registries.ts +237 -0
  186. package/src/kernel/Kernel.routing.ts +334 -0
  187. package/src/kernel/Kernel.ts +460 -0
  188. package/src/kernel/Kernel.types.ts +263 -0
  189. package/src/kernel/Kernel.vue.ts +304 -0
  190. package/src/kernel/KernelContext.entities.ts +80 -0
  191. package/src/kernel/KernelContext.events.ts +57 -0
  192. package/src/kernel/KernelContext.i18n.ts +37 -0
  193. package/src/kernel/KernelContext.permissions.ts +38 -0
  194. package/src/kernel/KernelContext.routing.ts +280 -0
  195. package/src/kernel/KernelContext.ts +252 -0
  196. package/src/kernel/KernelContext.types.ts +173 -0
  197. package/src/kernel/KernelContext.zones.ts +54 -0
  198. package/src/kernel/Module.ts +169 -0
  199. package/src/kernel/ModuleLoader.ts +645 -0
  200. package/src/kernel/SSEBridge.ts +11 -0
  201. package/src/kernel/SignalBus.ts +48 -0
  202. package/src/kernel/index.ts +56 -0
  203. package/src/module/index.ts +33 -0
  204. package/src/module/moduleRegistry.ts +492 -0
  205. package/src/modules/debug/AuthCollector.ts +501 -0
  206. package/src/modules/debug/Collector.ts +20 -0
  207. package/src/modules/debug/DebugBridge.ts +14 -0
  208. package/src/modules/debug/DebugModule.ts +220 -0
  209. package/src/modules/debug/EntitiesCollector.ts +839 -0
  210. package/src/modules/debug/ErrorCollector.ts +4 -0
  211. package/src/modules/debug/I18nCollector.ts +9 -0
  212. package/src/modules/debug/LocalStorageAdapter.ts +7 -0
  213. package/src/modules/debug/RouterCollector.ts +449 -0
  214. package/src/modules/debug/SignalCollector.ts +4 -0
  215. package/src/modules/debug/ToastCollector.ts +4 -0
  216. package/src/modules/debug/ZonesCollector.ts +447 -0
  217. package/src/modules/debug/components/DebugBar.vue +31 -0
  218. package/src/modules/debug/components/adminPanelsConfig.ts +42 -0
  219. package/src/modules/debug/components/index.ts +9 -0
  220. package/src/modules/debug/components/panels/AuthPanel.vue +267 -0
  221. package/src/modules/debug/components/panels/EntitiesPanel.vue +572 -0
  222. package/src/modules/debug/components/panels/I18nPanel.vue +738 -0
  223. package/src/modules/debug/components/panels/RouterPanel.vue +440 -0
  224. package/src/modules/debug/components/panels/ZonesPanel.vue +133 -0
  225. package/src/modules/debug/components/panels/index.ts +16 -0
  226. package/src/modules/debug/index.ts +58 -0
  227. package/src/modules/debug/styles.scss +2671 -0
  228. package/src/notifications/NotificationBadge.vue +35 -0
  229. package/src/notifications/NotificationListener.vue +71 -0
  230. package/src/notifications/NotificationModule.ts +76 -0
  231. package/src/notifications/NotificationPanel.vue +478 -0
  232. package/src/notifications/NotificationStore.ts +288 -0
  233. package/src/notifications/index.ts +42 -0
  234. package/src/notifications/styles.scss +32 -0
  235. package/src/orchestrator/Orchestrator.ts +427 -0
  236. package/src/orchestrator/index.ts +8 -0
  237. package/src/orchestrator/useOrchestrator.ts +80 -0
  238. package/src/plugin.ts +251 -0
  239. package/src/query/FilterQuery.ts +306 -0
  240. package/src/query/QueryExecutor.ts +341 -0
  241. package/src/query/index.ts +16 -0
  242. package/src/security/EntityRolesProvider.ts +385 -0
  243. package/src/security/PermissionMatcher.ts +152 -0
  244. package/src/security/PermissionRegistry.ts +273 -0
  245. package/src/security/PersistableRolesProvider.ts +584 -0
  246. package/src/security/RolesManager.ts +136 -0
  247. package/src/security/RolesProvider.ts +167 -0
  248. package/src/security/RolesProviderStorage.ts +211 -0
  249. package/src/security/SecurityModule.ts +94 -0
  250. package/src/security/StaticRolesProvider.ts +117 -0
  251. package/src/security/UsersManager.ts +163 -0
  252. package/src/security/index.ts +77 -0
  253. package/src/security/pages/RoleForm.vue +276 -0
  254. package/src/security/pages/RoleList.vue +123 -0
  255. package/src/styles/_alerts.scss +95 -0
  256. package/src/styles/_buttons.scss +391 -0
  257. package/src/styles/_cards.scss +241 -0
  258. package/src/styles/_code.scss +78 -0
  259. package/src/styles/_dialogs.scss +55 -0
  260. package/src/styles/_filter-bar.scss +70 -0
  261. package/src/styles/_forms.scss +434 -0
  262. package/src/styles/_helpers.scss +153 -0
  263. package/src/styles/_lists.scss +225 -0
  264. package/src/styles/_main.scss +356 -0
  265. package/src/styles/_markdown.scss +88 -0
  266. package/src/styles/_responsive.scss +255 -0
  267. package/src/styles/_show-pages.scss +186 -0
  268. package/src/styles/_sidebar.scss +380 -0
  269. package/src/styles/_states.scss +115 -0
  270. package/src/styles/_stats.scss +47 -0
  271. package/src/styles/_variables.scss +224 -0
  272. package/src/styles/index.scss +38 -0
  273. package/src/styles/theme/_components.scss +331 -0
  274. package/src/styles/theme/_index.scss +10 -0
  275. package/src/styles/theme/_tokens.scss +147 -0
  276. package/src/styles/theme/_utilities.scss +175 -0
  277. package/src/toast/ToastBridgeModule.ts +68 -0
  278. package/src/toast/ToastListener.vue +55 -0
  279. package/src/toast/index.ts +26 -0
  280. package/src/toast/useSignalToast.ts +154 -0
  281. package/src/types/index.ts +285 -0
  282. package/src/types/pluralize.d.ts +19 -0
  283. package/src/types/quarkernel.d.ts +50 -0
  284. package/src/utils/formatters.ts +174 -0
  285. package/src/utils/index.ts +35 -0
  286. package/src/utils/transformers.ts +131 -0
  287. package/src/vite/qdadmDebugPlugin.ts +401 -0
  288. package/src/vite-env.d.ts +50 -0
  289. package/src/zones/ZoneRegistry.ts +934 -0
  290. package/src/zones/index.ts +29 -0
  291. package/src/zones/zones.ts +191 -0
@@ -0,0 +1,2671 @@
1
+ /**
2
+ * qdadm Debug Module Styles
3
+ *
4
+ * Consolidated styles for debug bar and panels.
5
+ * Loaded dynamically when DebugModule is used.
6
+ */
7
+
8
+ // =============================================================================
9
+ // VARIABLES
10
+ // =============================================================================
11
+
12
+ // Zinc palette (dark theme)
13
+ $debug-bg: #18181b;
14
+ $debug-bg-elevated: #27272a;
15
+ $debug-border: #3f3f46;
16
+ $debug-border-hover: #52525b;
17
+ $debug-text: #f4f4f5;
18
+ $debug-text-muted: #a1a1aa;
19
+ $debug-text-dim: #71717a;
20
+
21
+ // Accent colors
22
+ $debug-accent: #60a5fa;
23
+ $debug-purple: #a78bfa;
24
+ $debug-error: #ef4444;
25
+ $debug-warning: #f59e0b;
26
+ $debug-success: #22c55e;
27
+ $debug-info: #3b82f6;
28
+
29
+ // =============================================================================
30
+ // DEBUG BAR
31
+ // =============================================================================
32
+
33
+ /* Minimized button */
34
+ .debug-minimized {
35
+ position: fixed;
36
+ bottom: 1rem;
37
+ right: 1rem;
38
+ width: 44px;
39
+ height: 44px;
40
+ border-radius: 8px;
41
+ background: #18181b;
42
+ border: 1px solid #3f3f46;
43
+ box-shadow: 0 4px 12px rgba(0,0,0,0.4);
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ cursor: pointer;
48
+ transition: transform 0.15s;
49
+ }
50
+ .debug-minimized:hover {
51
+ transform: scale(1.08);
52
+ border-color: #60a5fa;
53
+ }
54
+
55
+ /* Separate badges */
56
+ .debug-badge {
57
+ position: absolute;
58
+ min-width: 16px;
59
+ height: 16px;
60
+ padding: 0 4px;
61
+ border-radius: 8px;
62
+ font-size: 10px;
63
+ font-weight: 600;
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ gap: 2px;
68
+ }
69
+ .debug-badge .pi {
70
+ font-size: 8px;
71
+ }
72
+
73
+ /* Header inline badges */
74
+ .debug-header-badge {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ gap: 3px;
78
+ padding: 2px 6px;
79
+ border-radius: 10px;
80
+ font-size: 11px;
81
+ font-weight: 600;
82
+ }
83
+ .debug-header-badge .pi {
84
+ font-size: 10px;
85
+ }
86
+ .debug-header-badge-error {
87
+ background: #ef4444;
88
+ color: white;
89
+ }
90
+ .debug-header-badge-signal {
91
+ background: #8b5cf6;
92
+ color: white;
93
+ }
94
+ .debug-badge-error {
95
+ top: -4px;
96
+ right: -4px;
97
+ background: #ef4444;
98
+ color: white;
99
+ }
100
+ .debug-badge-signal {
101
+ bottom: -4px;
102
+ right: -4px;
103
+ background: #8b5cf6;
104
+ color: white;
105
+ }
106
+
107
+ /* Panel base */
108
+ .debug-panel {
109
+ position: fixed;
110
+ background: #18181b;
111
+ border: 1px solid #3f3f46;
112
+ font-family: system-ui, sans-serif;
113
+ font-size: 13px;
114
+ color: #f4f4f5;
115
+ display: flex;
116
+ flex-direction: column;
117
+ }
118
+
119
+ /* Bottom mode */
120
+ .debug-bottom {
121
+ bottom: 0; left: 0; right: 0;
122
+ border-top: 1px solid #3f3f46;
123
+ border-left: none; border-right: none; border-bottom: none;
124
+ }
125
+ .debug-bottom.debug-expanded {
126
+ min-height: 100px;
127
+ max-height: 600px;
128
+ }
129
+
130
+ /* Right mode - vertical header on left, horizontal slide */
131
+ .debug-right {
132
+ top: 0; right: 0; bottom: 0;
133
+ flex-direction: row;
134
+ border-left: 1px solid #3f3f46;
135
+ border-top: none; border-right: none; border-bottom: none;
136
+ transition: transform 0.2s ease-out;
137
+ }
138
+ .debug-right:not(.debug-expanded) {
139
+ transform: translateX(calc(100% - 44px));
140
+ }
141
+ .debug-right.debug-expanded {
142
+ min-width: 200px;
143
+ max-width: 800px;
144
+ transform: translateX(0);
145
+ }
146
+
147
+ /* Window mode - floating draggable/resizable */
148
+ .debug-window {
149
+ /* Window appearance */
150
+ position: fixed;
151
+ border-radius: 8px;
152
+ box-shadow: 0 8px 32px rgba(0,0,0,0.5);
153
+ border: 1px solid #3f3f46;
154
+ min-width: 280px;
155
+ min-height: 200px;
156
+ }
157
+ .debug-window .debug-header {
158
+ cursor: move;
159
+ user-select: none;
160
+ flex-wrap: nowrap;
161
+ }
162
+ .debug-window .debug-tabs {
163
+ flex: 1;
164
+ min-width: 0;
165
+ overflow: hidden;
166
+ }
167
+ .debug-window .debug-actions {
168
+ flex-shrink: 0;
169
+ }
170
+ .debug-window .debug-content {
171
+ flex: 1;
172
+ min-height: 0;
173
+ overflow: auto;
174
+ }
175
+ .debug-resize-handle {
176
+ position: absolute;
177
+ bottom: 0;
178
+ right: 0;
179
+ width: 16px;
180
+ height: 16px;
181
+ cursor: nwse-resize;
182
+ background: linear-gradient(135deg, transparent 50%, #3f3f46 50%);
183
+ border-bottom-right-radius: 8px;
184
+ z-index: 10;
185
+ }
186
+ .debug-resize-handle:hover {
187
+ background: linear-gradient(135deg, transparent 50%, #60a5fa 50%);
188
+ }
189
+
190
+ /* Panel resize handles for docked modes */
191
+ .debug-panel-resize {
192
+ position: absolute;
193
+ z-index: 10;
194
+ background: transparent;
195
+ }
196
+ .debug-panel-resize-top {
197
+ top: 0;
198
+ left: 0;
199
+ right: 0;
200
+ height: 4px;
201
+ cursor: ns-resize;
202
+ }
203
+ .debug-panel-resize-top:hover {
204
+ background: linear-gradient(180deg, #60a5fa 0%, transparent 100%);
205
+ }
206
+ .debug-panel-resize-left {
207
+ top: 0;
208
+ left: 0;
209
+ bottom: 0;
210
+ width: 4px;
211
+ cursor: ew-resize;
212
+ }
213
+ .debug-panel-resize-left:hover {
214
+ background: linear-gradient(90deg, #60a5fa 0%, transparent 100%);
215
+ }
216
+
217
+ .debug-right .debug-header {
218
+ flex-direction: column;
219
+ width: 44px;
220
+ padding: 8px 6px;
221
+ border-bottom: none;
222
+ border-right: 1px solid #3f3f46;
223
+ align-items: center;
224
+ gap: 4px;
225
+ }
226
+ .debug-right .debug-title {
227
+ flex-direction: column;
228
+ gap: 4px;
229
+ }
230
+ .debug-right .debug-title span:not(.debug-header-badge) {
231
+ display: none;
232
+ }
233
+ .debug-right .debug-tabs {
234
+ flex-direction: column;
235
+ margin-left: 0;
236
+ margin-top: 8px;
237
+ gap: 2px;
238
+ }
239
+ .debug-right .debug-tab {
240
+ width: 32px;
241
+ height: 32px;
242
+ padding: 0;
243
+ justify-content: center;
244
+ position: relative;
245
+ }
246
+ .debug-right .debug-tab-label {
247
+ display: none;
248
+ }
249
+ .debug-right .debug-tab .qd-badge {
250
+ position: absolute;
251
+ top: -2px;
252
+ right: -2px;
253
+ min-width: 14px;
254
+ height: 14px;
255
+ font-size: 9px;
256
+ padding: 0 3px;
257
+ }
258
+ /* Content header for right mode */
259
+ .debug-content-header {
260
+ display: flex;
261
+ align-items: center;
262
+ justify-content: space-between;
263
+ padding: 6px 12px;
264
+ background: #27272a;
265
+ border-bottom: 1px solid #3f3f46;
266
+ flex-shrink: 0;
267
+ }
268
+ .debug-content-title {
269
+ font-weight: 600;
270
+ font-size: 12px;
271
+ color: #a1a1aa;
272
+ }
273
+ .debug-content-controls {
274
+ display: flex;
275
+ gap: 4px;
276
+ }
277
+ .debug-content-controls .debug-tab-toggle,
278
+ .debug-content-controls .debug-tab-clear {
279
+ margin-left: 0;
280
+ width: 22px;
281
+ height: 22px;
282
+ }
283
+ .debug-right .debug-actions {
284
+ flex-direction: column;
285
+ margin-left: 0;
286
+ margin-top: auto;
287
+ gap: 2px;
288
+ }
289
+ .debug-right .debug-actions .p-button {
290
+ width: 28px;
291
+ height: 28px;
292
+ }
293
+ .debug-right .debug-content {
294
+ flex: 1;
295
+ min-width: 0;
296
+ }
297
+
298
+ /* Fullscreen - standalone mode like window but full viewport */
299
+ .debug-fullscreen {
300
+ position: fixed;
301
+ top: 0;
302
+ left: 0;
303
+ right: 0;
304
+ bottom: 0;
305
+ width: auto;
306
+ height: auto;
307
+ border: none;
308
+ border-radius: 0;
309
+ flex-direction: column;
310
+ }
311
+ .debug-fullscreen .debug-header {
312
+ flex-direction: row;
313
+ width: auto;
314
+ height: auto;
315
+ padding: 8px 16px;
316
+ border-bottom: 1px solid #3f3f46;
317
+ border-right: none;
318
+ }
319
+ .debug-fullscreen .debug-title {
320
+ flex-direction: row;
321
+ }
322
+ .debug-fullscreen .debug-title span:not(.debug-header-badge) {
323
+ display: inline;
324
+ }
325
+ .debug-fullscreen .debug-tabs {
326
+ flex-direction: row;
327
+ margin-left: 12px;
328
+ margin-top: 0;
329
+ }
330
+ .debug-fullscreen .debug-tab {
331
+ width: auto;
332
+ height: auto;
333
+ padding: 4px 10px;
334
+ }
335
+ .debug-fullscreen .debug-tab-label {
336
+ display: inline;
337
+ }
338
+ .debug-fullscreen .debug-tab .qd-badge {
339
+ position: static;
340
+ }
341
+ .debug-fullscreen .debug-actions {
342
+ flex-direction: row;
343
+ margin-left: auto;
344
+ margin-top: 0;
345
+ }
346
+ .debug-fullscreen .debug-actions .p-button {
347
+ width: auto;
348
+ height: auto;
349
+ }
350
+ .debug-fullscreen .debug-content {
351
+ flex: 1;
352
+ min-height: 0;
353
+ overflow: auto;
354
+ }
355
+
356
+ /* Mobile mode - fullscreen with vertical menu like right panel */
357
+ .debug-mobile {
358
+ position: fixed;
359
+ top: 0;
360
+ left: 0;
361
+ right: 0;
362
+ bottom: 0;
363
+ width: auto;
364
+ height: auto;
365
+ border: none;
366
+ border-radius: 0;
367
+ flex-direction: row; /* Like right panel: header on left, content on right */
368
+ }
369
+ .debug-mobile .debug-header {
370
+ flex-direction: column;
371
+ width: 44px;
372
+ padding: 8px 6px;
373
+ border-bottom: none;
374
+ border-right: 1px solid #3f3f46;
375
+ align-items: center;
376
+ gap: 4px;
377
+ height: 100%;
378
+ overflow: hidden;
379
+ }
380
+ .debug-mobile .debug-title {
381
+ flex-direction: column;
382
+ gap: 4px;
383
+ flex-shrink: 0;
384
+ }
385
+ .debug-mobile .debug-title span:not(.debug-header-badge) {
386
+ display: none;
387
+ }
388
+ .debug-mobile .debug-tabs {
389
+ flex-direction: column;
390
+ margin-left: 0;
391
+ margin-top: 8px;
392
+ gap: 2px;
393
+ flex: 1;
394
+ overflow-y: auto;
395
+ overflow-x: visible;
396
+ min-height: 0;
397
+ padding-right: 4px; /* Space for badge overflow */
398
+ }
399
+ .debug-mobile .debug-tab {
400
+ width: 32px;
401
+ height: 32px;
402
+ padding: 0;
403
+ justify-content: center;
404
+ position: relative;
405
+ }
406
+ .debug-mobile .debug-tab-label {
407
+ display: none;
408
+ }
409
+ .debug-mobile .debug-tab .qd-badge {
410
+ position: absolute;
411
+ top: -2px;
412
+ right: -2px;
413
+ min-width: 14px;
414
+ height: 14px;
415
+ font-size: 9px;
416
+ padding: 0 3px;
417
+ }
418
+ .debug-mobile .debug-actions {
419
+ flex-direction: column;
420
+ margin-left: 0;
421
+ margin-top: 8px;
422
+ padding-top: 8px;
423
+ border-top: 1px solid #3f3f46;
424
+ gap: 2px;
425
+ flex-shrink: 0;
426
+ }
427
+ .debug-mobile .debug-actions .p-button {
428
+ width: 28px;
429
+ height: 28px;
430
+ }
431
+ .debug-mobile .debug-content {
432
+ flex: 1;
433
+ min-width: 0;
434
+ min-height: 0;
435
+ overflow: auto;
436
+ }
437
+
438
+ /* Header */
439
+ .debug-header {
440
+ display: flex;
441
+ align-items: center;
442
+ gap: 8px;
443
+ padding: 6px 12px;
444
+ background: #27272a;
445
+ border-bottom: 1px solid #3f3f46;
446
+ flex-shrink: 0;
447
+ }
448
+ .debug-title {
449
+ display: flex;
450
+ align-items: center;
451
+ gap: 6px;
452
+ font-weight: 600;
453
+ }
454
+ .debug-title-draggable {
455
+ cursor: grab;
456
+ }
457
+ .debug-title-draggable:active {
458
+ cursor: grabbing;
459
+ }
460
+ .debug-tabs {
461
+ display: flex;
462
+ gap: 2px;
463
+ margin-left: 12px;
464
+ }
465
+ .debug-tabs-compact {
466
+ gap: 1px;
467
+ }
468
+ .debug-tabs-compact .debug-tab {
469
+ padding: 4px 6px;
470
+ }
471
+ .debug-tab {
472
+ display: flex;
473
+ align-items: center;
474
+ gap: 4px;
475
+ padding: 4px 10px;
476
+ background: transparent;
477
+ border: none;
478
+ border-radius: 4px;
479
+ color: #a1a1aa;
480
+ cursor: pointer;
481
+ font-size: 12px;
482
+ }
483
+ .debug-tab:hover {
484
+ background: #3f3f46;
485
+ color: #f4f4f5;
486
+ }
487
+ .debug-tab-active {
488
+ background: #3f3f46;
489
+ color: #a78bfa;
490
+ }
491
+
492
+ /* Tabs dropdown mode */
493
+ .debug-tabs-dropdown {
494
+ position: relative;
495
+ margin-left: 12px;
496
+ overflow: visible;
497
+ }
498
+ .debug-dropdown-trigger {
499
+ display: flex;
500
+ align-items: center;
501
+ gap: 6px;
502
+ padding: 4px 10px;
503
+ background: #3f3f46;
504
+ border: none;
505
+ border-radius: 4px;
506
+ color: #f4f4f5;
507
+ cursor: pointer;
508
+ font-size: 12px;
509
+ }
510
+ .debug-dropdown-trigger:hover {
511
+ background: #52525b;
512
+ }
513
+ .debug-dropdown-trigger .pi-chevron-down {
514
+ font-size: 10px;
515
+ color: #71717a;
516
+ margin-left: 4px;
517
+ }
518
+ .debug-dropdown-menu {
519
+ position: absolute;
520
+ top: 100%;
521
+ left: 0;
522
+ margin-top: 4px;
523
+ background: #27272a;
524
+ border: 1px solid #3f3f46;
525
+ border-radius: 6px;
526
+ box-shadow: 0 4px 12px rgba(0,0,0,0.4);
527
+ min-width: 160px;
528
+ z-index: 10001;
529
+ padding: 4px;
530
+ }
531
+ .debug-dropdown-item {
532
+ display: flex;
533
+ align-items: center;
534
+ gap: 8px;
535
+ width: 100%;
536
+ padding: 6px 10px;
537
+ background: transparent;
538
+ border: none;
539
+ border-radius: 4px;
540
+ color: #a1a1aa;
541
+ cursor: pointer;
542
+ font-size: 12px;
543
+ text-align: left;
544
+ }
545
+ .debug-dropdown-item:hover {
546
+ background: #3f3f46;
547
+ color: #f4f4f5;
548
+ }
549
+ .debug-dropdown-item-active {
550
+ background: #3f3f46;
551
+ color: #a78bfa;
552
+ }
553
+ .debug-actions {
554
+ display: flex;
555
+ gap: 2px;
556
+ margin-left: auto;
557
+ }
558
+
559
+ /* Content */
560
+ .debug-content {
561
+ flex: 1;
562
+ overflow: auto;
563
+ background: #18181b;
564
+ }
565
+ .debug-empty {
566
+ display: flex;
567
+ flex-direction: column;
568
+ align-items: center;
569
+ justify-content: center;
570
+ height: 100%;
571
+ color: #71717a;
572
+ gap: 8px;
573
+ }
574
+
575
+ /* Per-collector toggle button */
576
+ .debug-tab-toggle {
577
+ display: flex;
578
+ align-items: center;
579
+ justify-content: center;
580
+ width: 18px;
581
+ height: 18px;
582
+ margin-left: 4px;
583
+ padding: 0;
584
+ background: transparent;
585
+ border: none;
586
+ border-radius: 3px;
587
+ color: #71717a;
588
+ cursor: pointer;
589
+ font-size: 9px;
590
+ }
591
+ .debug-tab-toggle:hover {
592
+ background: #52525b;
593
+ color: #f4f4f5;
594
+ }
595
+ .debug-tab-toggle-paused {
596
+ color: #f59e0b;
597
+ }
598
+ .debug-tab-clear {
599
+ display: flex;
600
+ align-items: center;
601
+ justify-content: center;
602
+ width: 18px;
603
+ height: 18px;
604
+ margin-left: 2px;
605
+ padding: 0;
606
+ background: transparent;
607
+ border: none;
608
+ border-radius: 3px;
609
+ color: #71717a;
610
+ cursor: pointer;
611
+ font-size: 9px;
612
+ }
613
+ .debug-tab-clear:hover {
614
+ background: #ef4444;
615
+ color: white;
616
+ }
617
+
618
+ /* Custom mode toggle button */
619
+ .debug-mode-btn {
620
+ display: flex;
621
+ align-items: center;
622
+ justify-content: center;
623
+ width: 2rem;
624
+ height: 2rem;
625
+ padding: 0;
626
+ background: transparent;
627
+ border: none;
628
+ border-radius: 50%;
629
+ color: #a1a1aa;
630
+ cursor: pointer;
631
+ font-size: 18px;
632
+ font-weight: bold;
633
+ font-family: monospace;
634
+ line-height: 1;
635
+ transition: background-color 0.15s, color 0.15s;
636
+ }
637
+ .debug-mode-btn:hover {
638
+ background: rgba(255, 255, 255, 0.1);
639
+ color: #f4f4f5;
640
+ }
641
+
642
+ /* =============================================================================
643
+ PANEL TOOLBAR (unified action bar at top of panels)
644
+ ============================================================================= */
645
+
646
+ .debug-panel-toolbar {
647
+ display: flex;
648
+ align-items: center;
649
+ gap: 8px;
650
+ padding: 8px 12px;
651
+ background: #27272a;
652
+ border-bottom: 1px solid #3f3f46;
653
+ }
654
+
655
+ /* Toolbar button - standard */
656
+ .debug-toolbar-btn {
657
+ display: inline-flex;
658
+ align-items: center;
659
+ gap: 4px;
660
+ padding: 3px 8px;
661
+ background: #3f3f46;
662
+ border: none;
663
+ border-radius: 3px;
664
+ color: #a1a1aa;
665
+ cursor: pointer;
666
+ font-size: 10px;
667
+ white-space: nowrap;
668
+ }
669
+
670
+ .debug-toolbar-btn:hover {
671
+ background: #52525b;
672
+ color: #f4f4f5;
673
+ }
674
+
675
+ .debug-toolbar-btn .pi {
676
+ font-size: 10px;
677
+ }
678
+
679
+ /* Toolbar button - danger variant */
680
+ .debug-toolbar-btn--danger {
681
+ background: rgba(239, 68, 68, 0.15);
682
+ color: #f87171;
683
+ }
684
+
685
+ .debug-toolbar-btn--danger:hover {
686
+ background: rgba(239, 68, 68, 0.3);
687
+ color: #fca5a5;
688
+ }
689
+
690
+ /* Toolbar button - active/pressed state */
691
+ .debug-toolbar-btn--active {
692
+ background: #8b5cf6;
693
+ color: white;
694
+ }
695
+
696
+ .debug-toolbar-btn--active:hover {
697
+ background: #7c3aed;
698
+ }
699
+
700
+ /* Toolbar input */
701
+ .debug-toolbar-input {
702
+ flex: 1;
703
+ min-width: 0;
704
+ font-size: 11px;
705
+ padding: 4px 8px;
706
+ background: #18181b;
707
+ border: 1px solid #3f3f46;
708
+ border-radius: 4px;
709
+ color: #f4f4f5;
710
+ }
711
+
712
+ .debug-toolbar-input:focus {
713
+ outline: none;
714
+ border-color: #8b5cf6;
715
+ }
716
+
717
+ .debug-toolbar-input::placeholder {
718
+ color: #71717a;
719
+ }
720
+
721
+ /* Toolbar icon (standalone) */
722
+ .debug-toolbar-icon {
723
+ color: #71717a;
724
+ font-size: 12px;
725
+ }
726
+
727
+ /* Toolbar label/text */
728
+ .debug-toolbar-label {
729
+ font-size: 10px;
730
+ color: #71717a;
731
+ }
732
+
733
+ /* Toolbar separator */
734
+ .debug-toolbar-separator {
735
+ width: 1px;
736
+ height: 16px;
737
+ background: #3f3f46;
738
+ }
739
+
740
+ /* =============================================================================
741
+ OBJECT TREE
742
+ ============================================================================= */
743
+
744
+ .obj-node {
745
+ font-family: 'JetBrains Mono', 'Fira Code', Consolas, monospace;
746
+ font-size: 12px;
747
+ line-height: 1.4;
748
+ }
749
+
750
+ .obj-line {
751
+ display: flex;
752
+ align-items: flex-start;
753
+ gap: 4px;
754
+ padding: 1px 0;
755
+ cursor: default;
756
+ white-space: nowrap;
757
+ }
758
+
759
+ .obj-line:hover {
760
+ background: rgba(255, 255, 255, 0.05);
761
+ }
762
+
763
+ .obj-toggle {
764
+ color: #71717a;
765
+ font-size: 10px;
766
+ width: 12px;
767
+ flex-shrink: 0;
768
+ cursor: pointer;
769
+ transition: transform 0.1s;
770
+ display: inline-block;
771
+ }
772
+
773
+ .obj-toggle.obj-expanded {
774
+ transform: rotate(90deg);
775
+ }
776
+
777
+ .obj-key {
778
+ color: #a78bfa;
779
+ }
780
+
781
+ .obj-preview {
782
+ color: #71717a;
783
+ font-style: italic;
784
+ }
785
+
786
+ .obj-empty {
787
+ color: #71717a;
788
+ }
789
+
790
+ .obj-children {
791
+ border-left: 1px solid #3f3f46;
792
+ margin-left: 5px;
793
+ }
794
+
795
+ .obj-string {
796
+ color: #fbbf24;
797
+ }
798
+
799
+ .obj-number {
800
+ color: #34d399;
801
+ }
802
+
803
+ .obj-boolean {
804
+ color: #60a5fa;
805
+ }
806
+
807
+ .obj-null, .obj-undefined {
808
+ color: #71717a;
809
+ font-style: italic;
810
+ }
811
+
812
+ .obj-function {
813
+ color: #c084fc;
814
+ font-style: italic;
815
+ }
816
+
817
+ .obj-truncated, .obj-max-depth {
818
+ color: #71717a;
819
+ font-style: italic;
820
+ padding-left: 16px;
821
+ }
822
+
823
+ /* =============================================================================
824
+ AUTH PANEL
825
+ ============================================================================= */
826
+
827
+ .auth-panel {
828
+ padding: 0;
829
+ display: flex;
830
+ flex-direction: column;
831
+ gap: 8px;
832
+ }
833
+
834
+ .auth-panel-content {
835
+ padding: 0 8px 8px 8px;
836
+ display: flex;
837
+ flex-direction: column;
838
+ gap: 8px;
839
+ }
840
+
841
+ /* Activity indicator */
842
+ .auth-activity {
843
+ display: flex;
844
+ align-items: center;
845
+ gap: 8px;
846
+ padding: 8px 12px;
847
+ border-radius: 4px;
848
+ font-size: 12px;
849
+ font-weight: 600;
850
+ transition: opacity 3s ease-out, transform 0.3s ease-out;
851
+ }
852
+
853
+ .auth-activity.fading {
854
+ opacity: 0;
855
+ }
856
+
857
+ /* TransitionGroup animations */
858
+ .event-enter-active {
859
+ transition: all 0.3s ease-out;
860
+ }
861
+ .event-leave-active {
862
+ transition: all 0.5s ease-in;
863
+ }
864
+ .event-enter-from {
865
+ opacity: 0;
866
+ transform: translateY(-10px);
867
+ }
868
+ .event-leave-to {
869
+ opacity: 0;
870
+ transform: translateY(30px);
871
+ }
872
+
873
+ .auth-activity.login {
874
+ background: linear-gradient(90deg, rgba(34, 197, 94, 0.2) 0%, rgba(34, 197, 94, 0.05) 100%);
875
+ border-left: 3px solid #22c55e;
876
+ color: #22c55e;
877
+ }
878
+ .auth-activity.logout {
879
+ background: linear-gradient(90deg, rgba(239, 68, 68, 0.2) 0%, rgba(239, 68, 68, 0.05) 100%);
880
+ border-left: 3px solid #ef4444;
881
+ color: #ef4444;
882
+ }
883
+ .auth-activity.impersonate {
884
+ background: linear-gradient(90deg, rgba(249, 115, 22, 0.2) 0%, rgba(249, 115, 22, 0.05) 100%);
885
+ border-left: 3px solid #f97316;
886
+ color: #f97316;
887
+ }
888
+ .auth-activity.impersonate-stop {
889
+ background: linear-gradient(90deg, rgba(161, 161, 170, 0.2) 0%, rgba(161, 161, 170, 0.05) 100%);
890
+ border-left: 3px solid #a1a1aa;
891
+ color: #a1a1aa;
892
+ }
893
+ .auth-activity.login-error {
894
+ background: linear-gradient(90deg, rgba(239, 68, 68, 0.2) 0%, rgba(239, 68, 68, 0.05) 100%);
895
+ border-left: 3px solid #ef4444;
896
+ color: #ef4444;
897
+ }
898
+
899
+ .auth-time {
900
+ margin-left: auto;
901
+ font-size: 10px;
902
+ opacity: 0.6;
903
+ font-weight: 400;
904
+ }
905
+
906
+ .auth-item {
907
+ background: #27272a;
908
+ border-radius: 4px;
909
+ padding: 8px;
910
+ }
911
+ .auth-item--impersonated {
912
+ background: linear-gradient(90deg, rgba(249, 115, 22, 0.15) 0%, rgba(249, 115, 22, 0.05) 100%);
913
+ border-left: 3px solid #f97316;
914
+ }
915
+ .auth-header {
916
+ display: flex;
917
+ align-items: center;
918
+ gap: 6px;
919
+ margin-bottom: 6px;
920
+ color: #10b981;
921
+ }
922
+ .auth-header--impersonated {
923
+ color: #f97316;
924
+ }
925
+ .auth-label {
926
+ font-weight: 600;
927
+ }
928
+ .auth-message {
929
+ color: #71717a;
930
+ font-size: 12px;
931
+ }
932
+
933
+ /* =============================================================================
934
+ ENTITIES PANEL
935
+ ============================================================================= */
936
+
937
+ .entities-panel {
938
+ padding: 8px;
939
+ display: flex;
940
+ flex-direction: column;
941
+ gap: 8px;
942
+ }
943
+ .entities-status {
944
+ color: #71717a;
945
+ font-size: 12px;
946
+ padding: 12px;
947
+ text-align: center;
948
+ }
949
+ .entity-item {
950
+ background: #27272a;
951
+ border-radius: 4px;
952
+ padding: 8px;
953
+ border-left: 3px solid transparent;
954
+ transition: border-color 0.2s ease;
955
+ }
956
+ .entity-active {
957
+ border-left-color: #f59e0b;
958
+ background: linear-gradient(90deg, rgba(245, 158, 11, 0.1) 0%, #27272a 30%);
959
+ }
960
+ .entity-system {
961
+ border-left-color: #ef4444;
962
+ background: linear-gradient(90deg, rgba(239, 68, 68, 0.1) 0%, #27272a 30%);
963
+ }
964
+ .entity-system .entity-header {
965
+ color: #ef4444;
966
+ }
967
+ .entity-system .entity-header:hover {
968
+ color: #f87171;
969
+ }
970
+ .entity-system .entity-name::after {
971
+ content: ' (system)';
972
+ font-size: 9px;
973
+ color: #f87171;
974
+ font-weight: normal;
975
+ }
976
+ .entity-header {
977
+ display: flex;
978
+ align-items: center;
979
+ gap: 8px;
980
+ color: #3b82f6;
981
+ cursor: pointer;
982
+ }
983
+ .entity-header:hover {
984
+ color: #60a5fa;
985
+ }
986
+ .entity-expand {
987
+ display: flex;
988
+ align-items: center;
989
+ justify-content: center;
990
+ width: 16px;
991
+ height: 16px;
992
+ padding: 0;
993
+ background: transparent;
994
+ border: none;
995
+ color: #71717a;
996
+ cursor: pointer;
997
+ font-size: 10px;
998
+ }
999
+ .entity-expand:hover {
1000
+ color: #f4f4f5;
1001
+ }
1002
+ .entity-name {
1003
+ font-weight: 600;
1004
+ font-family: 'JetBrains Mono', monospace;
1005
+ }
1006
+ .entity-perms-icons {
1007
+ display: flex;
1008
+ gap: 4px;
1009
+ margin-left: 6px;
1010
+ }
1011
+ .entity-perms-icons .pi {
1012
+ font-size: 12px;
1013
+ cursor: help;
1014
+ }
1015
+ .perm-icon-granted {
1016
+ color: #22c55e;
1017
+ }
1018
+ .perm-icon-denied {
1019
+ color: #52525b;
1020
+ }
1021
+ .perm-icon-readonly {
1022
+ color: #f59e0b;
1023
+ margin-left: 2px;
1024
+ }
1025
+ .perm-icon-auth-sensitive {
1026
+ color: #8b5cf6;
1027
+ margin-left: 2px;
1028
+ }
1029
+ .debug-panel .entity-label {
1030
+ color: #a1a1aa;
1031
+ font-size: 11px;
1032
+ }
1033
+ .entity-cache {
1034
+ margin-left: auto;
1035
+ display: flex;
1036
+ align-items: center;
1037
+ gap: 4px;
1038
+ padding: 2px 6px;
1039
+ background: #3f3f46;
1040
+ border-radius: 3px;
1041
+ font-size: 10px;
1042
+ color: #71717a;
1043
+ }
1044
+ .entity-cache-valid {
1045
+ background: rgba(34, 197, 94, 0.2);
1046
+ color: #22c55e;
1047
+ }
1048
+ .entity-cache-disabled {
1049
+ background: transparent;
1050
+ color: #52525b;
1051
+ font-size: 9px;
1052
+ }
1053
+ .entity-cache-na {
1054
+ color: #52525b;
1055
+ font-style: italic;
1056
+ }
1057
+ .entity-load-btn {
1058
+ display: inline-flex;
1059
+ align-items: center;
1060
+ gap: 4px;
1061
+ padding: 2px 8px;
1062
+ background: #3f3f46;
1063
+ border: none;
1064
+ border-radius: 3px;
1065
+ color: #a1a1aa;
1066
+ cursor: pointer;
1067
+ font-size: 10px;
1068
+ margin-left: auto;
1069
+ }
1070
+ .entity-load-btn:hover {
1071
+ background: #52525b;
1072
+ color: #f4f4f5;
1073
+ }
1074
+ .entity-load-btn:disabled {
1075
+ opacity: 0.5;
1076
+ cursor: not-allowed;
1077
+ }
1078
+ .entity-invalidate-btn {
1079
+ display: inline-flex;
1080
+ align-items: center;
1081
+ justify-content: center;
1082
+ width: 20px;
1083
+ height: 20px;
1084
+ padding: 0;
1085
+ background: transparent;
1086
+ border: none;
1087
+ border-radius: 3px;
1088
+ color: #71717a;
1089
+ cursor: pointer;
1090
+ margin-left: auto;
1091
+ }
1092
+ .entity-invalidate-btn:hover {
1093
+ background: rgba(239, 68, 68, 0.2);
1094
+ color: #ef4444;
1095
+ }
1096
+ .entity-test-btn {
1097
+ display: inline-flex;
1098
+ align-items: center;
1099
+ gap: 4px;
1100
+ padding: 2px 8px;
1101
+ background: #3b82f6;
1102
+ border: none;
1103
+ border-radius: 3px;
1104
+ color: #fff;
1105
+ cursor: pointer;
1106
+ font-size: 10px;
1107
+ margin-left: auto;
1108
+ }
1109
+ .entity-test-btn:hover {
1110
+ background: #2563eb;
1111
+ }
1112
+ .entity-test-btn:disabled {
1113
+ opacity: 0.5;
1114
+ cursor: not-allowed;
1115
+ }
1116
+ .entity-test-result {
1117
+ display: inline-flex;
1118
+ align-items: center;
1119
+ gap: 4px;
1120
+ padding: 2px 6px;
1121
+ border-radius: 3px;
1122
+ font-size: 10px;
1123
+ margin-left: 8px;
1124
+ }
1125
+ .test-success {
1126
+ background: rgba(34, 197, 94, 0.2);
1127
+ color: #22c55e;
1128
+ }
1129
+ .test-error {
1130
+ background: rgba(239, 68, 68, 0.2);
1131
+ color: #ef4444;
1132
+ }
1133
+ .entity-test-na {
1134
+ color: #52525b;
1135
+ font-style: italic;
1136
+ }
1137
+
1138
+ /* Collapsed summary */
1139
+ .entity-summary {
1140
+ display: flex;
1141
+ align-items: center;
1142
+ gap: 8px;
1143
+ margin-left: 24px;
1144
+ margin-top: 4px;
1145
+ font-size: 11px;
1146
+ color: #71717a;
1147
+ }
1148
+ .entity-storage {
1149
+ color: #a1a1aa;
1150
+ }
1151
+ .entity-fields {
1152
+ color: #71717a;
1153
+ }
1154
+
1155
+ /* Expanded details */
1156
+ .entity-details {
1157
+ font-size: 11px;
1158
+ margin-left: 24px;
1159
+ margin-top: 8px;
1160
+ padding-top: 8px;
1161
+ border-top: 1px solid #3f3f46;
1162
+ }
1163
+ .entity-row {
1164
+ display: flex;
1165
+ align-items: center;
1166
+ gap: 6px;
1167
+ margin-bottom: 3px;
1168
+ }
1169
+ .entity-key {
1170
+ color: #71717a;
1171
+ min-width: 60px;
1172
+ }
1173
+ .entity-value {
1174
+ color: #d4d4d8;
1175
+ }
1176
+ .entity-endpoint {
1177
+ color: #a1a1aa;
1178
+ font-family: 'JetBrains Mono', monospace;
1179
+ font-size: 10px;
1180
+ padding: 1px 4px;
1181
+ background: #3f3f46;
1182
+ border-radius: 2px;
1183
+ }
1184
+ .entity-normalize-badge {
1185
+ display: inline-flex;
1186
+ align-items: center;
1187
+ justify-content: center;
1188
+ width: 18px;
1189
+ height: 18px;
1190
+ background: rgba(139, 92, 246, 0.2);
1191
+ color: #a78bfa;
1192
+ border-radius: 3px;
1193
+ font-size: 10px;
1194
+ }
1195
+ .entity-multi-badge {
1196
+ display: inline-flex;
1197
+ align-items: center;
1198
+ gap: 3px;
1199
+ padding: 2px 6px;
1200
+ background: rgba(59, 130, 246, 0.2);
1201
+ color: #60a5fa;
1202
+ border-radius: 3px;
1203
+ font-size: 10px;
1204
+ font-weight: 600;
1205
+ }
1206
+ .perm-icon-asymmetric {
1207
+ color: #a855f7;
1208
+ margin-left: 2px;
1209
+ }
1210
+ /* Storages section */
1211
+ .entity-storages-section {
1212
+ margin-bottom: 8px;
1213
+ }
1214
+ .entity-storages-header {
1215
+ display: flex;
1216
+ align-items: center;
1217
+ gap: 6px;
1218
+ color: #a1a1aa;
1219
+ font-size: 11px;
1220
+ margin-bottom: 6px;
1221
+ }
1222
+ .entity-storages-header .pi {
1223
+ font-size: 10px;
1224
+ }
1225
+ .entity-storage-card {
1226
+ background: #1f1f23;
1227
+ border-radius: 4px;
1228
+ padding: 6px 8px;
1229
+ margin-bottom: 4px;
1230
+ border-left: 2px solid #3b82f6;
1231
+ }
1232
+ .entity-storage-alt {
1233
+ border-left-color: #8b5cf6;
1234
+ }
1235
+ .entity-storage-header {
1236
+ display: flex;
1237
+ align-items: center;
1238
+ gap: 6px;
1239
+ }
1240
+ .entity-storage-name {
1241
+ color: #60a5fa;
1242
+ font-weight: 500;
1243
+ font-family: 'JetBrains Mono', monospace;
1244
+ font-size: 11px;
1245
+ }
1246
+ .entity-storage-alt .entity-storage-name {
1247
+ color: #a78bfa;
1248
+ }
1249
+ .entity-storage-type {
1250
+ color: #a1a1aa;
1251
+ font-size: 10px;
1252
+ }
1253
+ .entity-storage-endpoint {
1254
+ color: #71717a;
1255
+ font-family: 'JetBrains Mono', monospace;
1256
+ font-size: 10px;
1257
+ padding: 2px 0;
1258
+ margin-top: 2px;
1259
+ }
1260
+ .entity-storage-row {
1261
+ display: flex;
1262
+ align-items: center;
1263
+ gap: 8px;
1264
+ margin-top: 4px;
1265
+ }
1266
+ .entity-storage-caps {
1267
+ display: flex;
1268
+ gap: 4px;
1269
+ flex-wrap: wrap;
1270
+ }
1271
+ .entity-storage-fetch-btn {
1272
+ display: inline-flex;
1273
+ align-items: center;
1274
+ justify-content: center;
1275
+ width: 22px;
1276
+ height: 22px;
1277
+ padding: 0;
1278
+ margin-left: auto;
1279
+ background: #3b82f6;
1280
+ border: none;
1281
+ border-radius: 3px;
1282
+ color: #fff;
1283
+ cursor: pointer;
1284
+ font-size: 10px;
1285
+ }
1286
+ .entity-storage-fetch-btn:hover {
1287
+ background: #2563eb;
1288
+ }
1289
+ .entity-storage-fetch-btn:disabled {
1290
+ opacity: 0.5;
1291
+ cursor: not-allowed;
1292
+ }
1293
+ .entity-storage-test-result {
1294
+ display: inline-flex;
1295
+ align-items: center;
1296
+ gap: 3px;
1297
+ padding: 2px 6px;
1298
+ border-radius: 3px;
1299
+ font-size: 10px;
1300
+ margin-left: auto;
1301
+ }
1302
+ .entity-capabilities {
1303
+ display: flex;
1304
+ gap: 4px;
1305
+ flex-wrap: wrap;
1306
+ }
1307
+ .entity-cap {
1308
+ display: flex;
1309
+ align-items: center;
1310
+ justify-content: center;
1311
+ width: 20px;
1312
+ height: 20px;
1313
+ border-radius: 3px;
1314
+ cursor: help;
1315
+ }
1316
+ .entity-cap .pi {
1317
+ font-size: 11px;
1318
+ }
1319
+ .entity-cap-enabled {
1320
+ background: rgba(34, 197, 94, 0.2);
1321
+ color: #22c55e;
1322
+ }
1323
+ .entity-cap-disabled {
1324
+ background: rgba(239, 68, 68, 0.15);
1325
+ color: #71717a;
1326
+ }
1327
+ .entity-cap-auth {
1328
+ background: rgba(245, 158, 11, 0.2);
1329
+ color: #f59e0b;
1330
+ }
1331
+ .entity-required {
1332
+ color: #f59e0b;
1333
+ font-size: 10px;
1334
+ }
1335
+ .entity-relation {
1336
+ display: inline-flex;
1337
+ align-items: center;
1338
+ gap: 2px;
1339
+ padding: 1px 4px;
1340
+ background: #3f3f46;
1341
+ border-radius: 2px;
1342
+ margin-right: 4px;
1343
+ font-size: 10px;
1344
+ }
1345
+ .entity-relation .pi {
1346
+ font-size: 8px;
1347
+ }
1348
+ .entity-reference {
1349
+ background: #1e3a5f;
1350
+ color: #93c5fd;
1351
+ }
1352
+ /* Stats */
1353
+ .entity-stats {
1354
+ margin-top: 8px;
1355
+ padding-top: 8px;
1356
+ border-top: 1px solid #3f3f46;
1357
+ }
1358
+ .entity-stats-header {
1359
+ display: flex;
1360
+ align-items: center;
1361
+ gap: 6px;
1362
+ color: #a1a1aa;
1363
+ font-size: 11px;
1364
+ margin-bottom: 6px;
1365
+ }
1366
+ .entity-stats-header .pi {
1367
+ font-size: 10px;
1368
+ }
1369
+ .entity-stats-grid {
1370
+ display: flex;
1371
+ gap: 8px;
1372
+ flex-wrap: wrap;
1373
+ }
1374
+ .entity-stat {
1375
+ display: flex;
1376
+ flex-direction: column;
1377
+ align-items: center;
1378
+ padding: 4px 8px;
1379
+ background: #1f1f23;
1380
+ border-radius: 4px;
1381
+ min-width: 40px;
1382
+ }
1383
+ .entity-stat-value {
1384
+ font-size: 14px;
1385
+ font-weight: 600;
1386
+ color: #d4d4d8;
1387
+ font-family: 'JetBrains Mono', monospace;
1388
+ }
1389
+ .entity-stat-label {
1390
+ font-size: 9px;
1391
+ color: #71717a;
1392
+ text-transform: uppercase;
1393
+ }
1394
+ .entity-stat-cache {
1395
+ border-left: 1px solid #3f3f46;
1396
+ padding-left: 12px;
1397
+ margin-left: 4px;
1398
+ }
1399
+ .entity-stat-max {
1400
+ border-left: 1px solid #3f3f46;
1401
+ padding-left: 12px;
1402
+ margin-left: 4px;
1403
+ }
1404
+ .entity-stat-max .entity-stat-value {
1405
+ color: #60a5fa;
1406
+ }
1407
+ .stat-positive {
1408
+ color: #22c55e;
1409
+ }
1410
+ .stat-negative {
1411
+ color: #f59e0b;
1412
+ }
1413
+ /* Cached items */
1414
+ .entity-items {
1415
+ margin-top: 8px;
1416
+ padding-top: 8px;
1417
+ border-top: 1px solid #3f3f46;
1418
+ }
1419
+ .entity-items-header {
1420
+ display: flex;
1421
+ align-items: center;
1422
+ gap: 6px;
1423
+ color: #a1a1aa;
1424
+ font-size: 11px;
1425
+ margin-bottom: 6px;
1426
+ }
1427
+ .entity-items-header .pi {
1428
+ font-size: 10px;
1429
+ }
1430
+ .entity-items-list {
1431
+ display: flex;
1432
+ flex-direction: column;
1433
+ gap: 4px;
1434
+ max-height: 200px;
1435
+ overflow-y: auto;
1436
+ }
1437
+ .entity-item-row {
1438
+ background: #1f1f23;
1439
+ border-radius: 3px;
1440
+ padding: 4px 6px;
1441
+ }
1442
+ .entity-items-more {
1443
+ color: #71717a;
1444
+ font-size: 10px;
1445
+ font-style: italic;
1446
+ padding: 4px;
1447
+ }
1448
+
1449
+ /* Full config tree */
1450
+ .entity-config {
1451
+ margin-top: 8px;
1452
+ padding-top: 8px;
1453
+ border-top: 1px solid #3f3f46;
1454
+ }
1455
+ .entity-config summary {
1456
+ cursor: pointer;
1457
+ color: #71717a;
1458
+ font-size: 11px;
1459
+ }
1460
+ .entity-config summary:hover {
1461
+ color: #a1a1aa;
1462
+ }
1463
+
1464
+ /* =============================================================================
1465
+ ENTRIES PANEL
1466
+ ============================================================================= */
1467
+
1468
+ /* Horizontal entries (bottom mode) */
1469
+ .entries-h {
1470
+ display: flex;
1471
+ gap: 1px;
1472
+ height: 100%;
1473
+ overflow-x: auto;
1474
+ }
1475
+ .entry-h {
1476
+ flex: 0 0 auto;
1477
+ min-width: 200px;
1478
+ max-width: 320px;
1479
+ padding: 8px 12px;
1480
+ border-right: 1px solid #3f3f46;
1481
+ overflow: hidden;
1482
+ }
1483
+ .entry-h:last-child {
1484
+ border-right: none;
1485
+ }
1486
+
1487
+ /* Vertical entries (right/fullscreen mode) */
1488
+ .entries-v {
1489
+ display: flex;
1490
+ flex-direction: column;
1491
+ }
1492
+ .entry-v {
1493
+ padding: 8px 12px;
1494
+ border-bottom: 1px solid #27272a;
1495
+ }
1496
+ .entry-v:hover {
1497
+ background: #1f1f23;
1498
+ }
1499
+
1500
+ /* New entry indicator */
1501
+ .entry-new {
1502
+ position: relative;
1503
+ background: rgba(245, 158, 11, 0.08);
1504
+ }
1505
+ .entry-v.entry-new::before {
1506
+ content: '';
1507
+ position: absolute;
1508
+ left: 0;
1509
+ top: 0;
1510
+ bottom: 0;
1511
+ width: 3px;
1512
+ background: #f59e0b;
1513
+ }
1514
+ .entry-h.entry-new {
1515
+ border-left: 3px solid #f59e0b;
1516
+ }
1517
+
1518
+ .entry-new-dot {
1519
+ display: inline-block;
1520
+ width: 6px;
1521
+ height: 6px;
1522
+ background: #f59e0b;
1523
+ border-radius: 50%;
1524
+ margin-right: 4px;
1525
+ flex-shrink: 0;
1526
+ }
1527
+
1528
+ /* Entry parts */
1529
+ .entry-meta, .entry-header {
1530
+ display: flex;
1531
+ align-items: center;
1532
+ gap: 6px;
1533
+ margin-bottom: 4px;
1534
+ }
1535
+ .entry-time {
1536
+ font-family: 'JetBrains Mono', monospace;
1537
+ font-size: 10px;
1538
+ color: #71717a;
1539
+ background: #27272a;
1540
+ padding: 1px 4px;
1541
+ border-radius: 2px;
1542
+ }
1543
+ .entry-name {
1544
+ color: #a78bfa;
1545
+ font-weight: 500;
1546
+ font-size: 12px;
1547
+ }
1548
+ .entry-message {
1549
+ color: #f87171;
1550
+ font-size: 12px;
1551
+ }
1552
+ /* Copy button */
1553
+ .entry-copy {
1554
+ margin-left: auto;
1555
+ display: flex;
1556
+ align-items: center;
1557
+ justify-content: center;
1558
+ width: 22px;
1559
+ height: 22px;
1560
+ padding: 0;
1561
+ background: transparent;
1562
+ border: none;
1563
+ border-radius: 3px;
1564
+ color: #71717a;
1565
+ cursor: pointer;
1566
+ opacity: 0;
1567
+ transition: opacity 0.15s, background 0.15s, color 0.15s;
1568
+ }
1569
+ .entry-v:hover .entry-copy {
1570
+ opacity: 1;
1571
+ }
1572
+ .entry-copy:hover {
1573
+ background: #3f3f46;
1574
+ color: #d4d4d8;
1575
+ }
1576
+ .entry-copied {
1577
+ opacity: 1;
1578
+ color: #22c55e;
1579
+ }
1580
+ .entry-copy .pi {
1581
+ font-size: 12px;
1582
+ }
1583
+
1584
+ /* =============================================================================
1585
+ ROUTER PANEL
1586
+ ============================================================================= */
1587
+
1588
+ .router-panel {
1589
+ display: flex;
1590
+ flex-direction: column;
1591
+ height: 100%;
1592
+ overflow: hidden;
1593
+ }
1594
+
1595
+ /* Address Bar */
1596
+ .address-bar {
1597
+ display: flex;
1598
+ align-items: center;
1599
+ gap: 8px;
1600
+ padding: 8px 12px;
1601
+ background: #18181b;
1602
+ border-bottom: 1px solid #3f3f46;
1603
+ }
1604
+
1605
+ .address-bar .pi {
1606
+ color: #71717a;
1607
+ font-size: 12px;
1608
+ }
1609
+
1610
+ .address-input {
1611
+ flex: 1;
1612
+ font-size: 12px;
1613
+ padding: 6px 10px;
1614
+ background: #27272a;
1615
+ border: 1px solid #3f3f46;
1616
+ border-radius: 4px;
1617
+ color: #f4f4f5;
1618
+ font-family: monospace;
1619
+ }
1620
+
1621
+ .address-input:focus {
1622
+ border-color: #3b82f6;
1623
+ outline: none;
1624
+ }
1625
+
1626
+ .address-go {
1627
+ display: flex;
1628
+ align-items: center;
1629
+ justify-content: center;
1630
+ width: 28px;
1631
+ height: 28px;
1632
+ background: #3b82f6;
1633
+ border: none;
1634
+ border-radius: 4px;
1635
+ color: white;
1636
+ cursor: pointer;
1637
+ }
1638
+
1639
+ .address-go:hover:not(:disabled) {
1640
+ background: #2563eb;
1641
+ }
1642
+
1643
+ .address-go:disabled {
1644
+ background: #3f3f46;
1645
+ color: #71717a;
1646
+ cursor: not-allowed;
1647
+ }
1648
+
1649
+ .address-go .pi {
1650
+ font-size: 12px;
1651
+ color: inherit;
1652
+ }
1653
+
1654
+ /* ActiveStack */
1655
+ .stack-empty {
1656
+ display: flex;
1657
+ align-items: center;
1658
+ gap: 8px;
1659
+ padding: 8px;
1660
+ background: #27272a;
1661
+ border-radius: 4px;
1662
+ color: #71717a;
1663
+ font-size: 11px;
1664
+ }
1665
+
1666
+ .stack-list {
1667
+ display: flex;
1668
+ flex-direction: column;
1669
+ gap: 4px;
1670
+ }
1671
+
1672
+ .stack-entry {
1673
+ padding: 6px 8px;
1674
+ background: #27272a;
1675
+ border-radius: 4px;
1676
+ font-size: 11px;
1677
+ border-left: 2px solid #3f3f46;
1678
+ }
1679
+
1680
+ .stack-current {
1681
+ border-left-color: #3b82f6;
1682
+ background: #1e3a5f;
1683
+ }
1684
+
1685
+ .stack-entry-header {
1686
+ display: flex;
1687
+ align-items: center;
1688
+ gap: 8px;
1689
+ }
1690
+
1691
+ .stack-index {
1692
+ width: 16px;
1693
+ height: 16px;
1694
+ display: flex;
1695
+ align-items: center;
1696
+ justify-content: center;
1697
+ background: #3f3f46;
1698
+ border-radius: 50%;
1699
+ font-size: 10px;
1700
+ color: #a1a1aa;
1701
+ }
1702
+
1703
+ .stack-entity {
1704
+ font-weight: 500;
1705
+ color: #60a5fa;
1706
+ }
1707
+
1708
+ .stack-has-data {
1709
+ color: #10b981;
1710
+ font-size: 10px;
1711
+ }
1712
+
1713
+ .stack-loading {
1714
+ opacity: 0.7;
1715
+ }
1716
+
1717
+ /* Hydration badge */
1718
+ .stack-hydration-badge {
1719
+ font-size: 10px;
1720
+ margin-left: auto;
1721
+ }
1722
+
1723
+ .hydration-badge-loading {
1724
+ color: #f59e0b;
1725
+ }
1726
+
1727
+ .hydration-badge-data {
1728
+ color: #10b981;
1729
+ }
1730
+
1731
+ .hydration-badge-ready {
1732
+ color: #71717a;
1733
+ }
1734
+
1735
+ .hydration-badge-pending {
1736
+ color: #f59e0b;
1737
+ }
1738
+
1739
+ /* Hydration details row */
1740
+ .stack-entry-hydration {
1741
+ padding-left: 24px;
1742
+ margin-top: 4px;
1743
+ font-size: 10px;
1744
+ }
1745
+
1746
+ .hydration-loading {
1747
+ color: #f59e0b;
1748
+ }
1749
+
1750
+ .hydration-ready {
1751
+ display: flex;
1752
+ align-items: center;
1753
+ gap: 6px;
1754
+ }
1755
+
1756
+ .hydration-label {
1757
+ color: #a1a1aa;
1758
+ font-style: italic;
1759
+ }
1760
+
1761
+ .hydration-data {
1762
+ font-size: 10px;
1763
+ title: "Has entity data";
1764
+ }
1765
+
1766
+ .hydration-pending {
1767
+ color: #71717a;
1768
+ }
1769
+
1770
+ .stack-entry-props {
1771
+ display: flex;
1772
+ flex-wrap: wrap;
1773
+ gap: 12px;
1774
+ padding-left: 24px;
1775
+ margin-top: 4px;
1776
+ }
1777
+
1778
+ .stack-prop {
1779
+ color: #71717a;
1780
+ font-size: 10px;
1781
+ }
1782
+
1783
+ .stack-prop code {
1784
+ color: #fbbf24;
1785
+ background: #18181b;
1786
+ padding: 1px 4px;
1787
+ border-radius: 2px;
1788
+ }
1789
+
1790
+ .router-tabs {
1791
+ display: flex;
1792
+ gap: 2px;
1793
+ padding: 8px 12px;
1794
+ background: #27272a;
1795
+ border-bottom: 1px solid #3f3f46;
1796
+ }
1797
+
1798
+ .router-tab {
1799
+ display: flex;
1800
+ align-items: center;
1801
+ gap: 6px;
1802
+ padding: 4px 12px;
1803
+ font-size: 11px;
1804
+ background: transparent;
1805
+ border: none;
1806
+ border-radius: 4px;
1807
+ color: #a1a1aa;
1808
+ cursor: pointer;
1809
+ }
1810
+
1811
+ .router-tab:hover {
1812
+ background: #3f3f46;
1813
+ color: #f4f4f5;
1814
+ }
1815
+
1816
+ .router-tab-active {
1817
+ background: #3b82f6;
1818
+ color: white;
1819
+ }
1820
+
1821
+ .router-tab .pi {
1822
+ font-size: 12px;
1823
+ }
1824
+
1825
+ .tab-badge {
1826
+ background: #f59e0b;
1827
+ color: #18181b;
1828
+ font-size: 10px;
1829
+ padding: 0 5px;
1830
+ border-radius: 8px;
1831
+ font-weight: 600;
1832
+ }
1833
+
1834
+ .tab-count {
1835
+ font-size: 10px;
1836
+ color: #71717a;
1837
+ }
1838
+
1839
+ .router-content {
1840
+ flex: 1;
1841
+ overflow-y: auto;
1842
+ padding: 8px;
1843
+ }
1844
+
1845
+ .router-empty {
1846
+ display: flex;
1847
+ flex-direction: column;
1848
+ align-items: center;
1849
+ justify-content: center;
1850
+ height: 100%;
1851
+ color: #71717a;
1852
+ gap: 8px;
1853
+ }
1854
+
1855
+ .router-empty .pi {
1856
+ font-size: 24px;
1857
+ }
1858
+
1859
+ /* Current Route */
1860
+ .route-current {
1861
+ padding: 8px;
1862
+ }
1863
+
1864
+ .route-header {
1865
+ display: flex;
1866
+ flex-direction: column;
1867
+ gap: 4px;
1868
+ margin-bottom: 12px;
1869
+ }
1870
+
1871
+ .route-name {
1872
+ font-size: 14px;
1873
+ font-weight: 600;
1874
+ color: #3b82f6;
1875
+ }
1876
+
1877
+ .route-path {
1878
+ font-size: 12px;
1879
+ font-family: monospace;
1880
+ color: #a1a1aa;
1881
+ word-break: break-all;
1882
+ }
1883
+
1884
+ /* Router-panel breadcrumb list — namespaced under .router-panel because
1885
+ `.breadcrumb-list` already exists globally for the AppLayout breadcrumb
1886
+ in styles/_main.scss (align-items: center, gap, etc.) and would otherwise
1887
+ clobber these rules. */
1888
+ .router-panel .breadcrumb-list {
1889
+ display: flex;
1890
+ flex-direction: column;
1891
+ align-items: stretch;
1892
+ gap: 4px;
1893
+ }
1894
+
1895
+ .router-panel .breadcrumb-entry {
1896
+ padding: 6px 8px;
1897
+ background: #27272a;
1898
+ border-radius: 4px;
1899
+ font-size: 11px;
1900
+ border-left: 2px solid #3f3f46;
1901
+ }
1902
+
1903
+ .router-panel .breadcrumb-entry-header {
1904
+ display: flex;
1905
+ align-items: center;
1906
+ gap: 8px;
1907
+ }
1908
+
1909
+ .router-panel .breadcrumb-index {
1910
+ width: 16px;
1911
+ height: 16px;
1912
+ display: flex;
1913
+ align-items: center;
1914
+ justify-content: center;
1915
+ background: #3f3f46;
1916
+ border-radius: 50%;
1917
+ font-size: 10px;
1918
+ color: #a1a1aa;
1919
+ }
1920
+
1921
+ .router-panel .breadcrumb-kind {
1922
+ font-weight: 500;
1923
+ color: #f4f4f5;
1924
+ }
1925
+
1926
+ .router-panel .breadcrumb-entry-props {
1927
+ display: flex;
1928
+ flex-wrap: wrap;
1929
+ gap: 12px;
1930
+ padding-left: 24px;
1931
+ margin-top: 4px;
1932
+ }
1933
+
1934
+ .router-panel .breadcrumb-prop {
1935
+ color: #71717a;
1936
+ font-size: 10px;
1937
+ }
1938
+
1939
+ .router-panel .breadcrumb-prop code {
1940
+ color: #60a5fa;
1941
+ background: #18181b;
1942
+ padding: 1px 4px;
1943
+ border-radius: 2px;
1944
+ }
1945
+
1946
+ /* Kind-based colors */
1947
+ .router-panel .breadcrumb-route {
1948
+ border-left-color: #71717a;
1949
+ }
1950
+
1951
+ .router-panel .breadcrumb-entity-list {
1952
+ border-left-color: #3b82f6;
1953
+ }
1954
+
1955
+ .router-panel .breadcrumb-entity-show {
1956
+ border-left-color: #10b981;
1957
+ }
1958
+
1959
+ .router-panel .breadcrumb-entity-edit {
1960
+ border-left-color: #f59e0b;
1961
+ }
1962
+
1963
+ .router-panel .breadcrumb-entity-create {
1964
+ border-left-color: #8b5cf6;
1965
+ }
1966
+
1967
+ .router-panel .breadcrumb-entity-delete {
1968
+ border-left-color: #ef4444;
1969
+ }
1970
+
1971
+ .route-section {
1972
+ margin-bottom: 12px;
1973
+ }
1974
+
1975
+ .section-label {
1976
+ font-size: 10px;
1977
+ font-weight: 600;
1978
+ color: #71717a;
1979
+ text-transform: uppercase;
1980
+ margin-bottom: 4px;
1981
+ }
1982
+
1983
+ .route-hash {
1984
+ font-size: 12px;
1985
+ color: #fbbf24;
1986
+ background: #27272a;
1987
+ padding: 2px 6px;
1988
+ border-radius: 3px;
1989
+ }
1990
+
1991
+ /* Matched Routes */
1992
+ .matched-list {
1993
+ display: flex;
1994
+ flex-direction: column;
1995
+ gap: 4px;
1996
+ }
1997
+
1998
+ .matched-entry {
1999
+ padding: 6px 8px;
2000
+ background: #27272a;
2001
+ border-radius: 4px;
2002
+ font-size: 11px;
2003
+ border-left: 2px solid #3f3f46;
2004
+ }
2005
+
2006
+ .matched-header {
2007
+ display: flex;
2008
+ align-items: center;
2009
+ gap: 8px;
2010
+ }
2011
+
2012
+ .matched-index {
2013
+ width: 16px;
2014
+ height: 16px;
2015
+ display: flex;
2016
+ align-items: center;
2017
+ justify-content: center;
2018
+ background: #3f3f46;
2019
+ border-radius: 50%;
2020
+ font-size: 10px;
2021
+ color: #a1a1aa;
2022
+ }
2023
+
2024
+ .matched-name {
2025
+ font-weight: 500;
2026
+ color: #d4d4d8;
2027
+ }
2028
+
2029
+ .matched-path {
2030
+ font-size: 10px;
2031
+ color: #71717a;
2032
+ font-family: monospace;
2033
+ padding-left: 24px;
2034
+ margin-top: 2px;
2035
+ }
2036
+
2037
+ .matched-meta {
2038
+ padding-left: 24px;
2039
+ margin-top: 4px;
2040
+ }
2041
+
2042
+ /* History */
2043
+ .history-header-bar {
2044
+ display: flex;
2045
+ justify-content: space-between;
2046
+ align-items: center;
2047
+ padding: 8px;
2048
+ background: #27272a;
2049
+ border-radius: 4px;
2050
+ margin-bottom: 8px;
2051
+ }
2052
+
2053
+ .history-stats {
2054
+ font-size: 11px;
2055
+ color: #71717a;
2056
+ }
2057
+
2058
+ .history-max {
2059
+ display: flex;
2060
+ align-items: center;
2061
+ gap: 6px;
2062
+ font-size: 11px;
2063
+ color: #a1a1aa;
2064
+ }
2065
+
2066
+ .max-select {
2067
+ padding: 2px 6px;
2068
+ font-size: 11px;
2069
+ background: #18181b;
2070
+ border: 1px solid #3f3f46;
2071
+ border-radius: 4px;
2072
+ color: #f4f4f5;
2073
+ cursor: pointer;
2074
+ }
2075
+
2076
+ .max-select:focus {
2077
+ border-color: #3b82f6;
2078
+ outline: none;
2079
+ }
2080
+
2081
+ .history-list {
2082
+ display: flex;
2083
+ flex-direction: column;
2084
+ gap: 4px;
2085
+ }
2086
+
2087
+ .history-entry {
2088
+ padding: 8px;
2089
+ background: #27272a;
2090
+ border-radius: 4px;
2091
+ font-size: 12px;
2092
+ }
2093
+
2094
+ .history-entry:hover {
2095
+ background: #3f3f46;
2096
+ }
2097
+
2098
+ .history-new {
2099
+ border-left: 2px solid #f59e0b;
2100
+ padding-left: 6px;
2101
+ }
2102
+
2103
+ .history-header {
2104
+ display: flex;
2105
+ align-items: center;
2106
+ gap: 8px;
2107
+ }
2108
+
2109
+ .history-dot {
2110
+ width: 6px;
2111
+ height: 6px;
2112
+ background: #f59e0b;
2113
+ border-radius: 50%;
2114
+ flex-shrink: 0;
2115
+ }
2116
+
2117
+ .history-time {
2118
+ font-size: 10px;
2119
+ color: #71717a;
2120
+ font-family: monospace;
2121
+ }
2122
+
2123
+ .history-arrow {
2124
+ display: flex;
2125
+ align-items: center;
2126
+ gap: 4px;
2127
+ color: #d4d4d8;
2128
+ }
2129
+
2130
+ .history-arrow .pi {
2131
+ font-size: 10px;
2132
+ color: #52525b;
2133
+ }
2134
+
2135
+ .history-path {
2136
+ font-size: 11px;
2137
+ color: #71717a;
2138
+ font-family: monospace;
2139
+ margin-top: 4px;
2140
+ word-break: break-all;
2141
+ }
2142
+
2143
+ .history-nav-btn {
2144
+ margin-left: auto;
2145
+ display: flex;
2146
+ align-items: center;
2147
+ justify-content: center;
2148
+ width: 20px;
2149
+ height: 20px;
2150
+ background: transparent;
2151
+ border: none;
2152
+ border-radius: 3px;
2153
+ color: #71717a;
2154
+ cursor: pointer;
2155
+ opacity: 0;
2156
+ transition: opacity 0.15s;
2157
+ }
2158
+
2159
+ .history-entry:hover .history-nav-btn {
2160
+ opacity: 1;
2161
+ }
2162
+
2163
+ .history-nav-btn:hover {
2164
+ background: #3f3f46;
2165
+ color: #3b82f6;
2166
+ }
2167
+
2168
+ .history-nav-btn .pi {
2169
+ font-size: 11px;
2170
+ }
2171
+
2172
+ /* Routes */
2173
+ .routes-filter {
2174
+ display: flex;
2175
+ align-items: center;
2176
+ gap: 8px;
2177
+ padding: 8px;
2178
+ background: #27272a;
2179
+ border-radius: 4px;
2180
+ margin-bottom: 8px;
2181
+ }
2182
+
2183
+ .routes-filter .pi {
2184
+ color: #71717a;
2185
+ font-size: 12px;
2186
+ }
2187
+
2188
+ .filter-input {
2189
+ flex: 1;
2190
+ font-size: 12px;
2191
+ padding: 4px 8px;
2192
+ background: #18181b;
2193
+ border: 1px solid #3f3f46;
2194
+ border-radius: 4px;
2195
+ color: #f4f4f5;
2196
+ }
2197
+
2198
+ .filter-input:focus {
2199
+ border-color: #3b82f6;
2200
+ outline: none;
2201
+ }
2202
+
2203
+ .routes-list {
2204
+ display: flex;
2205
+ flex-direction: column;
2206
+ gap: 4px;
2207
+ }
2208
+
2209
+ .route-entry {
2210
+ padding: 8px;
2211
+ background: #27272a;
2212
+ border-radius: 4px;
2213
+ font-size: 12px;
2214
+ }
2215
+
2216
+ .route-entry:hover {
2217
+ background: #3f3f46;
2218
+ }
2219
+
2220
+ .route-current-entry {
2221
+ border-left: 2px solid #3b82f6;
2222
+ padding-left: 6px;
2223
+ }
2224
+
2225
+ .route-internal {
2226
+ opacity: 0.6;
2227
+ }
2228
+
2229
+ .route-internal .route-entry-name {
2230
+ font-style: italic;
2231
+ }
2232
+
2233
+ .route-entry-header {
2234
+ display: flex;
2235
+ align-items: center;
2236
+ gap: 6px;
2237
+ }
2238
+
2239
+ .route-entry-name {
2240
+ font-weight: 500;
2241
+ color: #d4d4d8;
2242
+ }
2243
+
2244
+ .route-no-component {
2245
+ color: #f59e0b;
2246
+ font-size: 10px;
2247
+ }
2248
+
2249
+ .route-entry-path {
2250
+ font-size: 11px;
2251
+ color: #71717a;
2252
+ font-family: monospace;
2253
+ margin-top: 2px;
2254
+ }
2255
+
2256
+ .route-entry-meta {
2257
+ display: flex;
2258
+ gap: 4px;
2259
+ margin-top: 4px;
2260
+ }
2261
+
2262
+ .meta-tag {
2263
+ padding: 1px 6px;
2264
+ font-size: 10px;
2265
+ border-radius: 3px;
2266
+ }
2267
+
2268
+ .meta-public {
2269
+ background: #065f46;
2270
+ color: #6ee7b7;
2271
+ }
2272
+
2273
+ .meta-entity {
2274
+ background: #1e3a5f;
2275
+ color: #93c5fd;
2276
+ }
2277
+
2278
+ .meta-permission {
2279
+ background: #4c1d95;
2280
+ color: #c4b5fd;
2281
+ }
2282
+
2283
+ /* =============================================================================
2284
+ SIGNALS PANEL
2285
+ ============================================================================= */
2286
+
2287
+ .signals-panel {
2288
+ display: flex;
2289
+ flex-direction: column;
2290
+ height: 100%;
2291
+ overflow-x: hidden;
2292
+ }
2293
+
2294
+ .signals-filter {
2295
+ padding: 8px 12px;
2296
+ background: #27272a;
2297
+ border-bottom: 1px solid #3f3f46;
2298
+ display: flex;
2299
+ flex-direction: column;
2300
+ gap: 6px;
2301
+ }
2302
+
2303
+ .signals-filter-input {
2304
+ display: flex;
2305
+ align-items: center;
2306
+ gap: 8px;
2307
+ }
2308
+
2309
+ .signals-filter-input .pi {
2310
+ color: #71717a;
2311
+ font-size: 12px;
2312
+ }
2313
+
2314
+ .filter-input {
2315
+ flex: 1;
2316
+ font-size: 12px;
2317
+ padding: 4px 8px;
2318
+ background: #18181b;
2319
+ border: 1px solid #3f3f46;
2320
+ border-radius: 4px;
2321
+ color: #f4f4f5;
2322
+ }
2323
+
2324
+ .filter-input:focus {
2325
+ border-color: #8b5cf6;
2326
+ outline: none;
2327
+ }
2328
+
2329
+ .signals-count {
2330
+ font-size: 11px;
2331
+ color: #71717a;
2332
+ min-width: 40px;
2333
+ text-align: right;
2334
+ }
2335
+
2336
+ .signals-max-label {
2337
+ font-size: 10px;
2338
+ color: #52525b;
2339
+ margin-left: 8px;
2340
+ }
2341
+
2342
+ .max-input {
2343
+ width: 50px;
2344
+ font-size: 11px;
2345
+ padding: 2px 4px;
2346
+ background: #18181b;
2347
+ border: 1px solid #3f3f46;
2348
+ border-radius: 3px;
2349
+ color: #a1a1aa;
2350
+ text-align: center;
2351
+ }
2352
+
2353
+ .max-input:focus {
2354
+ border-color: #8b5cf6;
2355
+ outline: none;
2356
+ color: #f4f4f5;
2357
+ }
2358
+
2359
+ .signals-presets {
2360
+ display: flex;
2361
+ gap: 4px;
2362
+ flex-wrap: wrap;
2363
+ }
2364
+
2365
+ .preset-btn {
2366
+ padding: 2px 8px;
2367
+ font-size: 10px;
2368
+ background: #3f3f46;
2369
+ border: none;
2370
+ border-radius: 3px;
2371
+ color: #a1a1aa;
2372
+ cursor: pointer;
2373
+ }
2374
+
2375
+ .preset-btn:hover {
2376
+ background: #52525b;
2377
+ color: #f4f4f5;
2378
+ }
2379
+
2380
+ .preset-active {
2381
+ background: #8b5cf6;
2382
+ color: white;
2383
+ }
2384
+
2385
+ .signals-list {
2386
+ flex: 1;
2387
+ overflow-y: auto;
2388
+ padding: 4px;
2389
+ }
2390
+
2391
+ .signals-empty {
2392
+ display: flex;
2393
+ flex-direction: column;
2394
+ align-items: center;
2395
+ justify-content: center;
2396
+ height: 100%;
2397
+ color: #71717a;
2398
+ gap: 8px;
2399
+ }
2400
+
2401
+ .signal-entry {
2402
+ padding: 6px 8px;
2403
+ margin-bottom: 2px;
2404
+ background: #27272a;
2405
+ border-radius: 4px;
2406
+ font-size: 12px;
2407
+ }
2408
+
2409
+ .signal-entry:hover {
2410
+ background: #3f3f46;
2411
+ }
2412
+
2413
+ .signal-entry.signal-new {
2414
+ border-left: 2px solid #f59e0b;
2415
+ padding-left: 6px;
2416
+ }
2417
+
2418
+ .signal-new-dot {
2419
+ display: inline-block;
2420
+ width: 6px;
2421
+ height: 6px;
2422
+ background: #f59e0b;
2423
+ border-radius: 50%;
2424
+ margin-right: 4px;
2425
+ flex-shrink: 0;
2426
+ }
2427
+
2428
+ .signal-header {
2429
+ display: flex;
2430
+ align-items: center;
2431
+ gap: 8px;
2432
+ }
2433
+
2434
+ .signal-time {
2435
+ font-size: 10px;
2436
+ color: #71717a;
2437
+ font-family: monospace;
2438
+ }
2439
+
2440
+ .signal-name {
2441
+ font-weight: 500;
2442
+ font-family: monospace;
2443
+ }
2444
+
2445
+ .signal-data {
2446
+ margin-top: 4px;
2447
+ padding-left: 12px;
2448
+ font-size: 11px;
2449
+ }
2450
+
2451
+ /* =============================================================================
2452
+ TOASTS PANEL
2453
+ ============================================================================= */
2454
+
2455
+ .toasts-panel {
2456
+ display: flex;
2457
+ flex-direction: column;
2458
+ }
2459
+ .toast-entry {
2460
+ padding: 8px 12px;
2461
+ border-bottom: 1px solid #27272a;
2462
+ border-left: 3px solid;
2463
+ }
2464
+ .toast-entry:hover {
2465
+ background: #1f1f23;
2466
+ }
2467
+ .toast-success { border-left-color: #22c55e; }
2468
+ .toast-info { border-left-color: #3b82f6; }
2469
+ .toast-warn { border-left-color: #f59e0b; }
2470
+ .toast-error { border-left-color: #ef4444; }
2471
+
2472
+ .toast-header {
2473
+ display: flex;
2474
+ align-items: center;
2475
+ gap: 6px;
2476
+ margin-bottom: 4px;
2477
+ }
2478
+ .toast-time {
2479
+ font-family: 'JetBrains Mono', monospace;
2480
+ font-size: 10px;
2481
+ color: #71717a;
2482
+ background: #27272a;
2483
+ padding: 1px 4px;
2484
+ border-radius: 2px;
2485
+ }
2486
+ .toast-severity {
2487
+ padding: 1px 6px;
2488
+ border-radius: 3px;
2489
+ font-size: 10px;
2490
+ font-weight: 600;
2491
+ text-transform: uppercase;
2492
+ }
2493
+ .toast-severity-success { background: #22c55e; color: white; }
2494
+ .toast-severity-info { background: #3b82f6; color: white; }
2495
+ .toast-severity-warn { background: #f59e0b; color: white; }
2496
+ .toast-severity-error { background: #ef4444; color: white; }
2497
+
2498
+ .toast-summary {
2499
+ font-weight: 500;
2500
+ color: #f4f4f5;
2501
+ }
2502
+ .toast-detail {
2503
+ color: #a1a1aa;
2504
+ font-size: 11px;
2505
+ margin-top: 4px;
2506
+ }
2507
+ .toast-emitter {
2508
+ margin-left: auto;
2509
+ padding: 1px 6px;
2510
+ background: #3f3f46;
2511
+ border-radius: 3px;
2512
+ font-size: 10px;
2513
+ color: #a1a1aa;
2514
+ font-family: 'JetBrains Mono', monospace;
2515
+ }
2516
+
2517
+ /* New entry indicator */
2518
+ .entry-new {
2519
+ position: relative;
2520
+ background: rgba(139, 92, 246, 0.08);
2521
+ }
2522
+ .entry-new::before {
2523
+ content: '';
2524
+ position: absolute;
2525
+ left: 0;
2526
+ top: 0;
2527
+ bottom: 0;
2528
+ width: 3px;
2529
+ background: #8b5cf6;
2530
+ }
2531
+
2532
+ /* =============================================================================
2533
+ ZONES PANEL
2534
+ ============================================================================= */
2535
+
2536
+ .zones-panel {
2537
+ padding: 0;
2538
+ display: flex;
2539
+ flex-direction: column;
2540
+ gap: 8px;
2541
+ }
2542
+
2543
+ .zones-panel-content {
2544
+ padding: 0 8px 8px 8px;
2545
+ display: flex;
2546
+ flex-direction: column;
2547
+ gap: 8px;
2548
+ }
2549
+ .zones-toolbar {
2550
+ display: flex;
2551
+ align-items: center;
2552
+ gap: 8px;
2553
+ margin-bottom: 4px;
2554
+ }
2555
+ .zones-empty {
2556
+ display: flex;
2557
+ flex-direction: column;
2558
+ align-items: center;
2559
+ justify-content: center;
2560
+ gap: 8px;
2561
+ padding: 32px;
2562
+ color: #71717a;
2563
+ font-size: 12px;
2564
+ }
2565
+ .zones-empty i {
2566
+ font-size: 24px;
2567
+ }
2568
+ .zones-toggle {
2569
+ display: flex;
2570
+ align-items: center;
2571
+ gap: 6px;
2572
+ padding: 4px 10px;
2573
+ background: #3f3f46;
2574
+ border: none;
2575
+ border-radius: 4px;
2576
+ color: #a1a1aa;
2577
+ cursor: pointer;
2578
+ font-size: 11px;
2579
+ }
2580
+ .zones-toggle:hover {
2581
+ background: #52525b;
2582
+ color: #f4f4f5;
2583
+ }
2584
+ .zones-toggle-on {
2585
+ background: #06b6d4;
2586
+ color: white;
2587
+ }
2588
+ .zones-toggle-on:hover {
2589
+ background: #0891b2;
2590
+ }
2591
+ .zones-toggle-internal {
2592
+ background: #f59e0b;
2593
+ color: white;
2594
+ }
2595
+ .zones-toggle-internal:hover {
2596
+ background: #d97706;
2597
+ }
2598
+ .zone-item {
2599
+ background: #27272a;
2600
+ border-radius: 4px;
2601
+ padding: 8px;
2602
+ }
2603
+ .zone-header {
2604
+ display: flex;
2605
+ align-items: center;
2606
+ gap: 8px;
2607
+ margin-bottom: 6px;
2608
+ }
2609
+ .zone-highlight {
2610
+ display: flex;
2611
+ align-items: center;
2612
+ justify-content: center;
2613
+ width: 22px;
2614
+ height: 22px;
2615
+ padding: 0;
2616
+ background: #3f3f46;
2617
+ border: none;
2618
+ border-radius: 4px;
2619
+ color: #71717a;
2620
+ cursor: pointer;
2621
+ }
2622
+ .zone-highlight:hover {
2623
+ background: #52525b;
2624
+ color: #06b6d4;
2625
+ }
2626
+ .zone-highlight-active {
2627
+ background: #06b6d4;
2628
+ color: white;
2629
+ }
2630
+ .zone-name {
2631
+ font-weight: 600;
2632
+ color: #06b6d4;
2633
+ }
2634
+ .zone-count {
2635
+ color: #71717a;
2636
+ font-size: 11px;
2637
+ }
2638
+ .zone-blocks {
2639
+ display: flex;
2640
+ flex-direction: column;
2641
+ gap: 4px;
2642
+ margin-left: 30px;
2643
+ }
2644
+ .zone-block {
2645
+ display: flex;
2646
+ align-items: center;
2647
+ gap: 8px;
2648
+ font-size: 11px;
2649
+ padding: 2px 6px;
2650
+ background: #1f1f23;
2651
+ border-radius: 2px;
2652
+ }
2653
+ .block-id {
2654
+ color: #a78bfa;
2655
+ font-weight: 500;
2656
+ }
2657
+ .block-component {
2658
+ color: #d4d4d8;
2659
+ }
2660
+ .block-weight {
2661
+ color: #71717a;
2662
+ font-size: 10px;
2663
+ }
2664
+ .block-wrappers {
2665
+ color: #f59e0b;
2666
+ }
2667
+ .zone-default {
2668
+ color: #71717a;
2669
+ font-size: 11px;
2670
+ margin-left: 30px;
2671
+ }