@dataif/cli 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 (183) hide show
  1. package/README.md +16 -0
  2. package/bin/dataif.js +623 -0
  3. package/package.json +26 -0
  4. package/scripts/build-template.mjs +72 -0
  5. package/templates/dataif/README.md +157 -0
  6. package/templates/dataif/infra/.env.example +119 -0
  7. package/templates/dataif/infra/.env.stg.example +119 -0
  8. package/templates/dataif/infra/airflow/Dockerfile +11 -0
  9. package/templates/dataif/infra/airflow/Dockerfile.release +17 -0
  10. package/templates/dataif/infra/airflow/requirements.txt +3 -0
  11. package/templates/dataif/infra/docker-compose.yml +306 -0
  12. package/templates/dataif/infra/init-db/01-init-dataif.sh +129 -0
  13. package/templates/dataif/infra/init-db/pnp-curated-views.sqlinc +444 -0
  14. package/templates/dataif/infra/init-db/pnp-raw-staging-curated.sqlinc +701 -0
  15. package/templates/dataif/infra/keycloak/Dockerfile +4 -0
  16. package/templates/dataif/infra/keycloak/realm-dataif.json +73 -0
  17. package/templates/dataif/infra/ollama/Dockerfile +9 -0
  18. package/templates/dataif/infra/ollama/bootstrap-model.sh +100 -0
  19. package/templates/dataif/infra/ollama/sabia-7b.Modelfile +14 -0
  20. package/templates/dataif/infra/postgres/Dockerfile +4 -0
  21. package/templates/dataif/pipelines/airflow/dags/generated/.gitkeep +1 -0
  22. package/templates/dataif/pipelines/airflow/dags/generated/2020_financeiro_fcc6f1f3_sync.py +9 -0
  23. package/templates/dataif/pipelines/dataif_pipelines/__init__.py +1 -0
  24. package/templates/dataif/pipelines/dataif_pipelines/airflow/__init__.py +1 -0
  25. package/templates/dataif/pipelines/dataif_pipelines/airflow/pnp_pipeline_factory.py +167 -0
  26. package/templates/dataif/pipelines/dataif_pipelines/connectors/__init__.py +1 -0
  27. package/templates/dataif/pipelines/dataif_pipelines/connectors/base/__init__.py +1 -0
  28. package/templates/dataif/pipelines/dataif_pipelines/connectors/base/connector.py +28 -0
  29. package/templates/dataif/pipelines/dataif_pipelines/connectors/base/types.py +14 -0
  30. package/templates/dataif/pipelines/dataif_pipelines/connectors/nilo_pecanha/__init__.py +1 -0
  31. package/templates/dataif/pipelines/dataif_pipelines/connectors/nilo_pecanha/config.py +19 -0
  32. package/templates/dataif/pipelines/dataif_pipelines/connectors/nilo_pecanha/connector.py +558 -0
  33. package/templates/dataif/pipelines/dataif_pipelines/connectors/nilo_pecanha/powerbi_microdados.py +728 -0
  34. package/templates/dataif/pipelines/dataif_pipelines/connectors/nilo_pecanha/transform.py +296 -0
  35. package/templates/dataif/pipelines/dataif_pipelines/jobs/__init__.py +1 -0
  36. package/templates/dataif/pipelines/dataif_pipelines/jobs/nilo_pipeline.py +112 -0
  37. package/templates/dataif/pipelines/dataif_pipelines/orchestration/__init__.py +21 -0
  38. package/templates/dataif/pipelines/dataif_pipelines/orchestration/pnp_workflow.py +783 -0
  39. package/templates/dataif/pipelines/dataif_pipelines/repositories/__init__.py +1 -0
  40. package/templates/dataif/pipelines/dataif_pipelines/repositories/pnp_raw_repository.py +860 -0
  41. package/templates/dataif/pipelines/dataif_pipelines/services/__init__.py +19 -0
  42. package/templates/dataif/pipelines/dataif_pipelines/services/pnp_curated_service.py +66 -0
  43. package/templates/dataif/pipelines/dataif_pipelines/services/pnp_download_service.py +534 -0
  44. package/templates/dataif/pipelines/dataif_pipelines/services/pnp_quality_service.py +9 -0
  45. package/templates/dataif/pipelines/dataif_pipelines/services/pnp_raw_ingestion_service.py +124 -0
  46. package/templates/dataif/pipelines/dataif_pipelines/services/pnp_staging_service.py +271 -0
  47. package/templates/dataif/pipelines/dataif_pipelines/services/powerbi_catalog_service.py +159 -0
  48. package/templates/dataif/pipelines/sql/staging/020_pnp_matriculas.sql +112 -0
  49. package/templates/dataif/pipelines/sql/staging/030_pnp_eficiencia_academica.sql +83 -0
  50. package/templates/dataif/pipelines/sql/staging/040_pnp_servidores.sql +90 -0
  51. package/templates/dataif/pipelines/sql/staging/050_pnp_financeiro.sql +72 -0
  52. package/templates/dataif/pipelines/sql/views_curated/004_mv_pnp_dashboard_fast.sql +204 -0
  53. package/templates/dataif/pipelines/sql/views_curated/010_vw_pnp_admin_ingestao.sql +51 -0
  54. package/templates/dataif/pipelines/sql/views_curated/020_vw_pnp_qualidade_dados.sql +114 -0
  55. package/templates/dataif/pipelines/sql/views_curated/030_vw_pnp_matriculas.sql +67 -0
  56. package/templates/dataif/pipelines/sql/views_curated/040_vw_pnp_eficiencia.sql +33 -0
  57. package/templates/dataif/pipelines/sql/views_curated/050_vw_pnp_servidores.sql +30 -0
  58. package/templates/dataif/pipelines/sql/views_curated/060_vw_pnp_financeiro.sql +22 -0
  59. package/templates/dataif/pipelines/sql/views_curated/070_vw_pnp_vanna.sql +115 -0
  60. package/templates/dataif/scripts/configure-env.sh +149 -0
  61. package/templates/dataif/scripts/create_metabase_pnp_dashboard.py +943 -0
  62. package/templates/dataif/scripts/create_metabase_pnp_matriculas_dashboard.py +580 -0
  63. package/templates/dataif/scripts/deploy.sh +79 -0
  64. package/templates/dataif/scripts/fix_metabase_template_tag_ids.py +91 -0
  65. package/templates/dataif/scripts/pnp_powerbi_microdados_probe.py +14 -0
  66. package/templates/dataif/scripts/pnp_validate_raw_run.py +330 -0
  67. package/templates/dataif/scripts/publish-images.sh +31 -0
  68. package/templates/dataif/scripts/sync_metabase_dashboard_field_filters.py +241 -0
  69. package/templates/dataif/scripts/use-vanna-ollama.sh +139 -0
  70. package/templates/dataif/services/api/.dockerignore +18 -0
  71. package/templates/dataif/services/api/Dockerfile +12 -0
  72. package/templates/dataif/services/api/app/__init__.py +1 -0
  73. package/templates/dataif/services/api/app/auth.py +48 -0
  74. package/templates/dataif/services/api/app/config.py +59 -0
  75. package/templates/dataif/services/api/app/keycloak_admin.py +215 -0
  76. package/templates/dataif/services/api/app/main.py +2432 -0
  77. package/templates/dataif/services/api/app/metabase_admin.py +191 -0
  78. package/templates/dataif/services/api/app/metabase_bootstrap.py +44 -0
  79. package/templates/dataif/services/api/app/metabase_embed.py +15 -0
  80. package/templates/dataif/services/api/app/pnp_dag_provisioner.py +113 -0
  81. package/templates/dataif/services/api/app/pnp_instance_repository.py +951 -0
  82. package/templates/dataif/services/api/app/pnp_powerbi.py +438 -0
  83. package/templates/dataif/services/api/app/vanna_client.py +32 -0
  84. package/templates/dataif/services/api/requirements.txt +9 -0
  85. package/templates/dataif/services/vanna/.dockerignore +18 -0
  86. package/templates/dataif/services/vanna/Dockerfile +12 -0
  87. package/templates/dataif/services/vanna/app/config.py +57 -0
  88. package/templates/dataif/services/vanna/app/main.py +108 -0
  89. package/templates/dataif/services/vanna/app/runtime_config.py +114 -0
  90. package/templates/dataif/services/vanna/app/sql_guard.py +123 -0
  91. package/templates/dataif/services/vanna/app/vanna_engine.py +382 -0
  92. package/templates/dataif/services/vanna/requirements.txt +8 -0
  93. package/templates/dataif/services/web/.dockerignore +13 -0
  94. package/templates/dataif/services/web/Dockerfile +16 -0
  95. package/templates/dataif/services/web/index.html +12 -0
  96. package/templates/dataif/services/web/nginx.conf +74 -0
  97. package/templates/dataif/services/web/package-lock.json +4397 -0
  98. package/templates/dataif/services/web/package.json +32 -0
  99. package/templates/dataif/services/web/postcss.config.mjs +5 -0
  100. package/templates/dataif/services/web/src/App.jsx +2817 -0
  101. package/templates/dataif/services/web/src/adminAuth.js +245 -0
  102. package/templates/dataif/services/web/src/assets/avatar_placeholder.png +0 -0
  103. package/templates/dataif/services/web/src/assets/github_logo_icon_229278.svg +1 -0
  104. package/templates/dataif/services/web/src/assets/if-logo.png +0 -0
  105. package/templates/dataif/services/web/src/assets/if.svg +0 -0
  106. package/templates/dataif/services/web/src/assets/pnp-horizontal.svg +1 -0
  107. package/templates/dataif/services/web/src/components/AppHeader.jsx +233 -0
  108. package/templates/dataif/services/web/src/components/application/app-navigation/base-components/mobile-header.tsx +56 -0
  109. package/templates/dataif/services/web/src/components/application/app-navigation/base-components/nav-account-card.tsx +209 -0
  110. package/templates/dataif/services/web/src/components/application/app-navigation/base-components/nav-item-button.tsx +67 -0
  111. package/templates/dataif/services/web/src/components/application/app-navigation/base-components/nav-item.tsx +108 -0
  112. package/templates/dataif/services/web/src/components/application/app-navigation/base-components/nav-list.tsx +83 -0
  113. package/templates/dataif/services/web/src/components/application/app-navigation/config.ts +23 -0
  114. package/templates/dataif/services/web/src/components/application/app-navigation/header-navigation.tsx +240 -0
  115. package/templates/dataif/services/web/src/components/application/pagination/pagination-base.tsx +376 -0
  116. package/templates/dataif/services/web/src/components/application/pagination/pagination-dot.tsx +52 -0
  117. package/templates/dataif/services/web/src/components/application/pagination/pagination-line.tsx +48 -0
  118. package/templates/dataif/services/web/src/components/application/pagination/pagination.tsx +328 -0
  119. package/templates/dataif/services/web/src/components/application/tabs/tabs.tsx +223 -0
  120. package/templates/dataif/services/web/src/components/base/avatar/avatar-label-group.tsx +28 -0
  121. package/templates/dataif/services/web/src/components/base/avatar/avatar.tsx +129 -0
  122. package/templates/dataif/services/web/src/components/base/avatar/base-components/avatar-add-button.tsx +32 -0
  123. package/templates/dataif/services/web/src/components/base/avatar/base-components/avatar-company-icon.tsx +24 -0
  124. package/templates/dataif/services/web/src/components/base/avatar/base-components/avatar-online-indicator.tsx +29 -0
  125. package/templates/dataif/services/web/src/components/base/avatar/base-components/index.tsx +4 -0
  126. package/templates/dataif/services/web/src/components/base/avatar/base-components/verified-tick.tsx +32 -0
  127. package/templates/dataif/services/web/src/components/base/badges/badge-types.ts +264 -0
  128. package/templates/dataif/services/web/src/components/base/badges/badges.tsx +415 -0
  129. package/templates/dataif/services/web/src/components/base/button-group/button-group.tsx +104 -0
  130. package/templates/dataif/services/web/src/components/base/buttons/button.tsx +267 -0
  131. package/templates/dataif/services/web/src/components/base/input/hint-text.tsx +31 -0
  132. package/templates/dataif/services/web/src/components/base/input/input.tsx +269 -0
  133. package/templates/dataif/services/web/src/components/base/input/label.tsx +48 -0
  134. package/templates/dataif/services/web/src/components/base/radio-buttons/radio-buttons.tsx +127 -0
  135. package/templates/dataif/services/web/src/components/base/select/combobox.tsx +150 -0
  136. package/templates/dataif/services/web/src/components/base/select/multi-select.tsx +361 -0
  137. package/templates/dataif/services/web/src/components/base/select/popover.tsx +32 -0
  138. package/templates/dataif/services/web/src/components/base/select/select-item.tsx +95 -0
  139. package/templates/dataif/services/web/src/components/base/select/select-native.tsx +67 -0
  140. package/templates/dataif/services/web/src/components/base/select/select.tsx +144 -0
  141. package/templates/dataif/services/web/src/components/base/tags/base-components/tag-close-x.tsx +32 -0
  142. package/templates/dataif/services/web/src/components/base/tooltip/tooltip.tsx +107 -0
  143. package/templates/dataif/services/web/src/components/foundations/dot-icon.tsx +22 -0
  144. package/templates/dataif/services/web/src/components/foundations/logo/untitledui-logo-minimal.tsx +170 -0
  145. package/templates/dataif/services/web/src/components/foundations/logo/untitledui-logo.tsx +58 -0
  146. package/templates/dataif/services/web/src/hooks/use-breakpoint.ts +34 -0
  147. package/templates/dataif/services/web/src/hooks/use-resize-observer.ts +67 -0
  148. package/templates/dataif/services/web/src/main.jsx +14 -0
  149. package/templates/dataif/services/web/src/providers/theme-provider.jsx +62 -0
  150. package/templates/dataif/services/web/src/styles/globals.css +60 -0
  151. package/templates/dataif/services/web/src/styles/theme.css +1326 -0
  152. package/templates/dataif/services/web/src/styles/typography.css +430 -0
  153. package/templates/dataif/services/web/src/styles.css +1287 -0
  154. package/templates/dataif/services/web/src/utils/cx.ts +24 -0
  155. package/templates/dataif/services/web/src/utils/is-react-component.ts +33 -0
  156. package/templates/dataif/services/web/vite.config.js +14 -0
  157. package/templates/dataif/sql/ddl/001_schemas.sql +6 -0
  158. package/templates/dataif/sql/ddl/003_pnp_raw_staging_curated.sql +699 -0
  159. package/templates/dataif/sql/migrations/001_pnp_phase1_backfill.sql +3 -0
  160. package/templates/dataif/sql/migrations/002_pnp_phase2_admin_config_backfill.sql +184 -0
  161. package/templates/dataif/sql/migrations/003_pnp_phase3_raw_tabular_backfill.sql +3 -0
  162. package/templates/dataif/sql/migrations/004_pnp_phase3_raw_backfill_support_index.sql +3 -0
  163. package/templates/dataif/sql/migrations/005_pnp_phase7_staging_support_indexes.sql +2 -0
  164. package/templates/dataif/sql/migrations/006_pnp_phase7_staging_autovacuum_tuning.sql +2 -0
  165. package/templates/dataif/sql/migrations/007_pnp_phase7b_run_packages.sql +20 -0
  166. package/templates/dataif/sql/migrations/008_pnp_phase7a_pipeline_endpoints.sql +169 -0
  167. package/templates/dataif/sql/migrations/009_pnp_phase8_curated.sql +35 -0
  168. package/templates/dataif/sql/migrations/010_pnp_phase10_staging_incremental_upsert.sql +3 -0
  169. package/templates/dataif/sql/migrations/010_pnp_pipeline_uuid.sql +51 -0
  170. package/templates/dataif/sql/migrations/011_app_settings.sql +7 -0
  171. package/templates/dataif/sql/staging/020_pnp_matriculas.sql +112 -0
  172. package/templates/dataif/sql/staging/030_pnp_eficiencia_academica.sql +83 -0
  173. package/templates/dataif/sql/staging/040_pnp_servidores.sql +90 -0
  174. package/templates/dataif/sql/staging/050_pnp_financeiro.sql +72 -0
  175. package/templates/dataif/sql/views_curated/003_vw_pnp_microdados_admin.sql +160 -0
  176. package/templates/dataif/sql/views_curated/004_mv_pnp_dashboard_fast.sql +204 -0
  177. package/templates/dataif/sql/views_curated/010_vw_pnp_admin_ingestao.sql +51 -0
  178. package/templates/dataif/sql/views_curated/020_vw_pnp_qualidade_dados.sql +114 -0
  179. package/templates/dataif/sql/views_curated/030_vw_pnp_matriculas.sql +67 -0
  180. package/templates/dataif/sql/views_curated/040_vw_pnp_eficiencia.sql +33 -0
  181. package/templates/dataif/sql/views_curated/050_vw_pnp_servidores.sql +30 -0
  182. package/templates/dataif/sql/views_curated/060_vw_pnp_financeiro.sql +22 -0
  183. package/templates/dataif/sql/views_curated/070_vw_pnp_vanna.sql +115 -0
@@ -0,0 +1,1287 @@
1
+ :root {
2
+ --ifrs-bg: #f3f4ef;
3
+ --ifrs-surface: #ffffff;
4
+ --ifrs-surface-muted: #eef1ea;
5
+ --ifrs-border: #d8ddd2;
6
+ --ifrs-border-strong: #c6ccbf;
7
+ --ifrs-text: #1f261d;
8
+ --ifrs-text-muted: #667062;
9
+ --ifrs-accent: #1f5a37;
10
+ --ifrs-accent-hover: #18492d;
11
+ --ifrs-accent-soft: #e7efe9;
12
+ --ifrs-danger: #a64536;
13
+ --ifrs-danger-soft: #f5e6e2;
14
+ --ifrs-warning: #9f6a1d;
15
+ --ifrs-warning-soft: #f5ecd9;
16
+ --ifrs-neutral-soft: #ecefe8;
17
+ --ifrs-shadow: 0 1px 3px rgba(31, 38, 29, 0.06);
18
+ }
19
+
20
+ html.dark-mode {
21
+ --ifrs-bg: #141916;
22
+ --ifrs-surface: #1b211d;
23
+ --ifrs-surface-muted: #212923;
24
+ --ifrs-border: #2c342d;
25
+ --ifrs-border-strong: #3c463d;
26
+ --ifrs-text: #edf0ea;
27
+ --ifrs-text-muted: #a8b2a7;
28
+ --ifrs-accent: #74a07d;
29
+ --ifrs-accent-hover: #8db595;
30
+ --ifrs-accent-soft: rgba(116, 160, 125, 0.12);
31
+ --ifrs-danger: #e08779;
32
+ --ifrs-danger-soft: rgba(224, 135, 121, 0.14);
33
+ --ifrs-warning: #d3a05a;
34
+ --ifrs-warning-soft: rgba(211, 160, 90, 0.14);
35
+ --ifrs-neutral-soft: #232b25;
36
+ --ifrs-shadow: 0 1px 3px rgba(0, 0, 0, 0.24);
37
+ }
38
+
39
+ * {
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ html,
44
+ body {
45
+ margin: 0;
46
+ min-width: 320px;
47
+ background: var(--ifrs-bg);
48
+ color: var(--ifrs-text);
49
+ font-family: "IBM Plex Sans", system-ui, sans-serif;
50
+ }
51
+
52
+ body {
53
+ line-height: 1.5;
54
+ }
55
+
56
+ a {
57
+ color: inherit;
58
+ }
59
+
60
+ button,
61
+ input,
62
+ textarea,
63
+ select {
64
+ font: inherit;
65
+ }
66
+
67
+ #root {
68
+ min-height: 100vh;
69
+ }
70
+
71
+ button:not(.icon-button):not(.account-dropdown-item),
72
+ .button-link {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ min-height: 40px;
77
+ padding: 0 14px;
78
+ border: 1px solid var(--ifrs-accent);
79
+ border-radius: 8px;
80
+ background: var(--ifrs-accent);
81
+ color: #fff;
82
+ text-decoration: none;
83
+ cursor: pointer;
84
+ transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease;
85
+ }
86
+
87
+ button:not(.icon-button):not(.account-dropdown-item):hover,
88
+ .button-link:hover {
89
+ background: var(--ifrs-accent-hover);
90
+ border-color: var(--ifrs-accent-hover);
91
+ }
92
+
93
+ button.secondary:not(.icon-button):not(.account-dropdown-item),
94
+ .button-link.secondary {
95
+ background: transparent;
96
+ color: var(--ifrs-accent);
97
+ }
98
+
99
+ button.secondary:not(.icon-button):not(.account-dropdown-item):hover,
100
+ .button-link.secondary:hover {
101
+ background: var(--ifrs-accent-soft);
102
+ color: var(--ifrs-accent-hover);
103
+ }
104
+
105
+ button:disabled,
106
+ .button-link:disabled {
107
+ opacity: 0.6;
108
+ cursor: not-allowed;
109
+ }
110
+
111
+ input,
112
+ textarea,
113
+ select {
114
+ width: 100%;
115
+ border: 1px solid var(--ifrs-border);
116
+ border-radius: 8px;
117
+ background: var(--ifrs-surface);
118
+ color: var(--ifrs-text);
119
+ padding: 10px 12px;
120
+ }
121
+
122
+ input:focus,
123
+ textarea:focus,
124
+ select:focus {
125
+ outline: 2px solid rgba(31, 90, 55, 0.12);
126
+ outline-offset: 1px;
127
+ border-color: var(--ifrs-accent);
128
+ }
129
+
130
+ textarea {
131
+ min-height: 220px;
132
+ resize: vertical;
133
+ }
134
+
135
+ table {
136
+ width: 100%;
137
+ border-collapse: collapse;
138
+ }
139
+
140
+ th,
141
+ td {
142
+ padding: 12px;
143
+ border-bottom: 1px solid var(--ifrs-border);
144
+ vertical-align: top;
145
+ text-align: left;
146
+ }
147
+
148
+ th {
149
+ color: var(--ifrs-text-muted);
150
+ font-size: 0.92rem;
151
+ font-weight: 600;
152
+ }
153
+
154
+ td strong,
155
+ td span {
156
+ display: block;
157
+ }
158
+
159
+ .app-shell {
160
+ min-height: 100vh;
161
+ }
162
+
163
+ .app-header {
164
+ position: sticky;
165
+ top: 0;
166
+ z-index: 20;
167
+ border-bottom: 1px solid var(--ifrs-border);
168
+ background: color-mix(in srgb, var(--ifrs-bg) 92%, var(--ifrs-surface) 8%);
169
+ backdrop-filter: blur(10px);
170
+ }
171
+
172
+ .app-header-inner {
173
+ max-width: 1380px;
174
+ margin: 0 auto;
175
+ padding: 18px 24px 16px;
176
+ }
177
+
178
+ .app-header-top {
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: space-between;
182
+ gap: 16px;
183
+ }
184
+
185
+ .app-brand {
186
+ display: inline-flex;
187
+ align-items: center;
188
+ gap: 12px;
189
+ text-decoration: none;
190
+ font-weight: 600;
191
+ }
192
+
193
+ .app-brand-mark {
194
+ display: inline-flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ width: 42px;
198
+ height: 42px;
199
+ overflow: hidden;
200
+ border: 1px solid var(--ifrs-border);
201
+ border-radius: 10px;
202
+ background: var(--ifrs-surface);
203
+ }
204
+
205
+ .app-brand-mark img {
206
+ width: 100%;
207
+ height: 100%;
208
+ object-fit: cover;
209
+ object-position: top;
210
+ transform: scale(1.22);
211
+ }
212
+
213
+ .app-brand-label {
214
+ font-size: 1.05rem;
215
+ letter-spacing: -0.02em;
216
+ }
217
+
218
+ .app-header-actions,
219
+ .nav-row,
220
+ .actions-row,
221
+ .toolbar-row {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 10px;
225
+ flex-wrap: wrap;
226
+ }
227
+
228
+ .app-header-actions {
229
+ justify-content: flex-end;
230
+ }
231
+
232
+ .icon-button {
233
+ display: inline-flex;
234
+ align-items: center;
235
+ justify-content: center;
236
+ width: 40px;
237
+ height: 40px;
238
+ border: 1px solid var(--ifrs-border);
239
+ border-radius: 8px;
240
+ background: var(--ifrs-surface);
241
+ color: var(--ifrs-text);
242
+ cursor: pointer;
243
+ transition: background-color 140ms ease, border-color 140ms ease;
244
+ }
245
+
246
+ .icon-button:hover {
247
+ background: var(--ifrs-surface-muted);
248
+ border-color: var(--ifrs-border-strong);
249
+ }
250
+
251
+ .avatar-button {
252
+ padding: 0;
253
+ overflow: hidden;
254
+ border-radius: 999px;
255
+ }
256
+
257
+ .avatar-button img {
258
+ width: 100%;
259
+ height: 100%;
260
+ object-fit: cover;
261
+ }
262
+
263
+ .github-icon {
264
+ width: 18px;
265
+ height: 18px;
266
+ }
267
+
268
+ .account-menu {
269
+ position: relative;
270
+ }
271
+
272
+ .account-dropdown {
273
+ position: absolute;
274
+ top: calc(100% + 10px);
275
+ right: 0;
276
+ min-width: 220px;
277
+ padding: 8px;
278
+ border: 1px solid var(--ifrs-border);
279
+ border-radius: 10px;
280
+ background: var(--ifrs-surface);
281
+ box-shadow: 0 12px 32px rgba(31, 38, 29, 0.12);
282
+ }
283
+
284
+ .account-dropdown-head {
285
+ display: grid;
286
+ gap: 2px;
287
+ padding: 8px 10px 10px;
288
+ border-bottom: 1px solid var(--ifrs-border);
289
+ }
290
+
291
+ .account-dropdown-head strong {
292
+ font-size: 0.95rem;
293
+ }
294
+
295
+ .account-dropdown-head span {
296
+ color: var(--ifrs-text-muted);
297
+ font-size: 0.88rem;
298
+ }
299
+
300
+ .account-dropdown-group {
301
+ display: grid;
302
+ gap: 4px;
303
+ padding: 8px 0;
304
+ }
305
+
306
+ .account-dropdown-item {
307
+ width: 100%;
308
+ min-height: 36px;
309
+ padding: 0 10px;
310
+ border: 0;
311
+ border-radius: 8px;
312
+ background: transparent;
313
+ color: var(--ifrs-text);
314
+ text-align: left;
315
+ cursor: pointer;
316
+ }
317
+
318
+ .account-dropdown-item:hover {
319
+ background: var(--ifrs-surface-muted);
320
+ }
321
+
322
+ .account-dropdown-item-danger {
323
+ color: var(--ifrs-danger);
324
+ }
325
+
326
+ .app-header-navs {
327
+ display: flex;
328
+ flex-direction: column;
329
+ gap: 10px;
330
+ margin-top: 14px;
331
+ }
332
+
333
+ .nav-row {
334
+ gap: 8px;
335
+ }
336
+
337
+ .nav-link {
338
+ display: inline-flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ min-height: 36px;
342
+ padding: 0 12px;
343
+ border: 1px solid transparent;
344
+ border-radius: 8px;
345
+ text-decoration: none;
346
+ color: var(--ifrs-text-muted);
347
+ transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease;
348
+ }
349
+
350
+ .nav-link:hover {
351
+ color: var(--ifrs-text);
352
+ background: var(--ifrs-surface);
353
+ border-color: var(--ifrs-border);
354
+ }
355
+
356
+ .nav-link.active {
357
+ color: var(--ifrs-text);
358
+ background: var(--ifrs-surface);
359
+ border-color: var(--ifrs-border-strong);
360
+ }
361
+
362
+ .content-shell {
363
+ max-width: 1380px;
364
+ margin: 0 auto;
365
+ padding: 24px;
366
+ }
367
+
368
+ .notice-banner,
369
+ .error-banner {
370
+ margin: 0 0 16px;
371
+ padding: 12px 14px;
372
+ border-radius: 8px;
373
+ border: 1px solid var(--ifrs-border);
374
+ background: var(--ifrs-surface);
375
+ }
376
+
377
+ .notice-banner {
378
+ border-color: color-mix(in srgb, var(--ifrs-accent) 25%, var(--ifrs-border) 75%);
379
+ background: var(--ifrs-accent-soft);
380
+ color: var(--ifrs-accent-hover);
381
+ }
382
+
383
+ .error-banner {
384
+ border-color: color-mix(in srgb, var(--ifrs-danger) 35%, var(--ifrs-border) 65%);
385
+ background: var(--ifrs-danger-soft);
386
+ color: var(--ifrs-danger);
387
+ }
388
+
389
+ .page {
390
+ display: flex;
391
+ flex-direction: column;
392
+ gap: 16px;
393
+ }
394
+
395
+ .narrow-page {
396
+ max-width: 760px;
397
+ }
398
+
399
+ .page-header {
400
+ display: flex;
401
+ align-items: flex-end;
402
+ justify-content: space-between;
403
+ gap: 16px;
404
+ flex-wrap: wrap;
405
+ }
406
+
407
+ .page-header h1 {
408
+ margin: 0;
409
+ font-size: clamp(1.6rem, 2vw, 2.1rem);
410
+ line-height: 1.1;
411
+ letter-spacing: -0.03em;
412
+ }
413
+
414
+ .page-header p {
415
+ margin: 6px 0 0;
416
+ color: var(--ifrs-text-muted);
417
+ }
418
+
419
+ .panel {
420
+ border: 1px solid var(--ifrs-border);
421
+ border-radius: 10px;
422
+ background: var(--ifrs-surface);
423
+ box-shadow: var(--ifrs-shadow);
424
+ padding: 18px;
425
+ }
426
+
427
+ .panel-header {
428
+ display: flex;
429
+ align-items: center;
430
+ justify-content: space-between;
431
+ gap: 12px;
432
+ margin-bottom: 16px;
433
+ }
434
+
435
+ .panel-header h2,
436
+ .subsection h3 {
437
+ margin: 0;
438
+ font-size: 1rem;
439
+ font-weight: 600;
440
+ }
441
+
442
+ .layout-main {
443
+ display: grid;
444
+ grid-template-columns: minmax(0, 2fr) minmax(300px, 360px);
445
+ gap: 16px;
446
+ }
447
+
448
+ .layout-sidebar {
449
+ display: grid;
450
+ grid-template-columns: minmax(280px, 340px) minmax(0, 1fr);
451
+ gap: 16px;
452
+ }
453
+
454
+ .stack {
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 16px;
458
+ }
459
+
460
+ .card-grid {
461
+ display: grid;
462
+ gap: 16px;
463
+ }
464
+
465
+ .card-grid.two-col {
466
+ grid-template-columns: repeat(2, minmax(0, 1fr));
467
+ }
468
+
469
+ .card-grid.three-col {
470
+ grid-template-columns: repeat(3, minmax(0, 1fr));
471
+ }
472
+
473
+ .entity-card-grid {
474
+ display: grid;
475
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
476
+ gap: 16px;
477
+ }
478
+
479
+ button.entity-card {
480
+ display: grid;
481
+ min-height: 180px;
482
+ grid-template-columns: minmax(88px, 35%) minmax(0, 1fr);
483
+ gap: 16px;
484
+ align-items: stretch;
485
+ justify-content: stretch;
486
+ padding: 16px;
487
+ border: 1px solid var(--ifrs-border);
488
+ border-radius: 10px;
489
+ background: transparent;
490
+ color: var(--ifrs-text);
491
+ box-shadow: none;
492
+ text-align: left;
493
+ }
494
+
495
+ button.entity-card:hover {
496
+ background: color-mix(in srgb, var(--ifrs-surface-muted) 42%, transparent);
497
+ border-color: var(--ifrs-border-strong);
498
+ }
499
+
500
+ .entity-card-logo {
501
+ display: flex;
502
+ align-items: center;
503
+ justify-content: center;
504
+ min-width: 0;
505
+ padding: 8px;
506
+ border: 0;
507
+ border-radius: 8px;
508
+ background: transparent;
509
+ }
510
+
511
+ .entity-card-logo img {
512
+ display: block;
513
+ width: 100%;
514
+ max-height: 92px;
515
+ object-fit: contain;
516
+ }
517
+
518
+ .entity-card-content {
519
+ display: grid;
520
+ min-width: 0;
521
+ grid-template-rows: auto 1fr auto;
522
+ gap: 12px;
523
+ }
524
+
525
+ .entity-card-head {
526
+ display: flex;
527
+ align-items: flex-start;
528
+ justify-content: flex-start;
529
+ gap: 12px;
530
+ }
531
+
532
+ .entity-card-head h3 {
533
+ margin: 0;
534
+ min-width: 0;
535
+ font-size: 1rem;
536
+ font-weight: 600;
537
+ line-height: 1.35;
538
+ overflow-wrap: anywhere;
539
+ }
540
+
541
+ .entity-card-meta {
542
+ display: grid;
543
+ grid-template-columns: repeat(2, minmax(0, 1fr));
544
+ gap: 10px;
545
+ align-self: end;
546
+ margin: 0;
547
+ padding-top: 12px;
548
+ border-top: 1px solid var(--ifrs-border);
549
+ }
550
+
551
+ .entity-card-meta div {
552
+ display: grid;
553
+ gap: 2px;
554
+ padding: 8px;
555
+ border: 1px solid var(--ifrs-border);
556
+ border-radius: 8px;
557
+ background: color-mix(in srgb, var(--ifrs-surface) 72%, transparent);
558
+ }
559
+
560
+ .entity-card-meta dt {
561
+ color: var(--ifrs-text-muted);
562
+ font-size: 0.86rem;
563
+ }
564
+
565
+ .entity-card-meta dd {
566
+ margin: 0;
567
+ color: var(--ifrs-text);
568
+ font-size: 0.94rem;
569
+ overflow-wrap: anywhere;
570
+ }
571
+
572
+ .modal-backdrop {
573
+ position: fixed;
574
+ inset: 0;
575
+ z-index: 60;
576
+ display: flex;
577
+ align-items: center;
578
+ justify-content: center;
579
+ padding: 24px;
580
+ background: color-mix(in srgb, var(--ifrs-text) 45%, transparent);
581
+ }
582
+
583
+ .modal-panel {
584
+ display: flex;
585
+ width: min(960px, 100%);
586
+ max-height: min(820px, calc(100vh - 48px));
587
+ flex-direction: column;
588
+ overflow: hidden;
589
+ border: 1px solid var(--ifrs-border);
590
+ border-radius: 10px;
591
+ background: var(--ifrs-surface);
592
+ box-shadow: var(--ifrs-shadow);
593
+ }
594
+
595
+ .modal-header,
596
+ .modal-actions {
597
+ display: flex;
598
+ align-items: center;
599
+ justify-content: space-between;
600
+ gap: 12px;
601
+ flex-wrap: wrap;
602
+ padding: 16px 18px;
603
+ border-bottom: 1px solid var(--ifrs-border);
604
+ }
605
+
606
+ .modal-header h2 {
607
+ margin: 0;
608
+ font-size: 1.15rem;
609
+ font-weight: 600;
610
+ line-height: 1.3;
611
+ overflow-wrap: anywhere;
612
+ }
613
+
614
+ .modal-actions {
615
+ justify-content: flex-start;
616
+ background: var(--ifrs-surface-muted);
617
+ }
618
+
619
+ .modal-body {
620
+ padding: 18px;
621
+ overflow: auto;
622
+ }
623
+
624
+ .modal-content-section {
625
+ display: grid;
626
+ gap: 12px;
627
+ padding: 14px;
628
+ border: 1px solid var(--ifrs-border);
629
+ border-radius: 8px;
630
+ background: var(--ifrs-surface);
631
+ }
632
+
633
+ .modal-content-section h3 {
634
+ margin: 0;
635
+ font-size: 1rem;
636
+ font-weight: 600;
637
+ }
638
+
639
+ .modal-split-grid {
640
+ display: grid;
641
+ grid-template-columns: repeat(2, minmax(0, 1fr));
642
+ gap: 16px;
643
+ }
644
+
645
+ .modal-detail-list {
646
+ display: grid;
647
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
648
+ gap: 10px;
649
+ margin: 0;
650
+ }
651
+
652
+ .modal-detail-list div {
653
+ display: grid;
654
+ gap: 4px;
655
+ min-width: 0;
656
+ padding: 10px;
657
+ border: 1px solid var(--ifrs-border);
658
+ border-radius: 8px;
659
+ background: var(--ifrs-surface-muted);
660
+ }
661
+
662
+ .modal-detail-list dt {
663
+ color: var(--ifrs-text-muted);
664
+ font-size: 0.86rem;
665
+ }
666
+
667
+ .modal-detail-list dd {
668
+ margin: 0;
669
+ min-width: 0;
670
+ font-weight: 600;
671
+ overflow-wrap: anywhere;
672
+ }
673
+
674
+ .summary-grid {
675
+ display: grid;
676
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
677
+ gap: 12px;
678
+ }
679
+
680
+ .summary-item {
681
+ padding: 12px;
682
+ border: 1px solid var(--ifrs-border);
683
+ border-radius: 8px;
684
+ background: var(--ifrs-surface-muted);
685
+ }
686
+
687
+ .summary-item dt {
688
+ margin: 0 0 6px;
689
+ color: var(--ifrs-text-muted);
690
+ font-size: 0.9rem;
691
+ }
692
+
693
+ .summary-item dd {
694
+ margin: 0;
695
+ font-weight: 600;
696
+ }
697
+
698
+ .status-badge {
699
+ display: inline-flex;
700
+ align-items: center;
701
+ justify-content: center;
702
+ min-height: 28px;
703
+ padding: 0 10px;
704
+ border-radius: 6px;
705
+ font-size: 0.88rem;
706
+ font-weight: 600;
707
+ border: 1px solid transparent;
708
+ white-space: nowrap;
709
+ }
710
+
711
+ .status-badge.success {
712
+ color: var(--ifrs-accent);
713
+ background: var(--ifrs-accent-soft);
714
+ border-color: color-mix(in srgb, var(--ifrs-accent) 20%, transparent);
715
+ }
716
+
717
+ .status-badge.warning {
718
+ color: var(--ifrs-warning);
719
+ background: var(--ifrs-warning-soft);
720
+ border-color: color-mix(in srgb, var(--ifrs-warning) 20%, transparent);
721
+ }
722
+
723
+ .status-badge.danger {
724
+ color: var(--ifrs-danger);
725
+ background: var(--ifrs-danger-soft);
726
+ border-color: color-mix(in srgb, var(--ifrs-danger) 20%, transparent);
727
+ }
728
+
729
+ .status-badge.neutral {
730
+ color: var(--ifrs-text-muted);
731
+ background: var(--ifrs-neutral-soft);
732
+ border-color: var(--ifrs-border);
733
+ }
734
+
735
+ .selection-list,
736
+ .record-list,
737
+ .choice-list,
738
+ .link-list {
739
+ display: flex;
740
+ flex-direction: column;
741
+ gap: 10px;
742
+ }
743
+
744
+ .selection-item,
745
+ .record-row,
746
+ .choice-item {
747
+ border: 1px solid var(--ifrs-border);
748
+ border-radius: 8px;
749
+ background: var(--ifrs-surface);
750
+ }
751
+
752
+ .selection-item {
753
+ width: 100%;
754
+ padding: 14px;
755
+ text-align: left;
756
+ color: inherit;
757
+ background: var(--ifrs-surface);
758
+ border-color: var(--ifrs-border);
759
+ }
760
+
761
+ .selection-item:hover {
762
+ background: var(--ifrs-surface-muted);
763
+ border-color: var(--ifrs-border-strong);
764
+ }
765
+
766
+ .selection-item.selected {
767
+ background: var(--ifrs-accent-soft);
768
+ border-color: color-mix(in srgb, var(--ifrs-accent) 30%, var(--ifrs-border) 70%);
769
+ }
770
+
771
+ .selection-item-head,
772
+ .record-row {
773
+ display: flex;
774
+ align-items: flex-start;
775
+ justify-content: space-between;
776
+ gap: 12px;
777
+ }
778
+
779
+ .selection-item-head strong,
780
+ .record-row strong {
781
+ display: block;
782
+ font-size: 0.98rem;
783
+ }
784
+
785
+ .selection-item-body,
786
+ .record-row span {
787
+ color: var(--ifrs-text-muted);
788
+ font-size: 0.92rem;
789
+ }
790
+
791
+ .selection-item-body {
792
+ display: grid;
793
+ gap: 4px;
794
+ margin-top: 8px;
795
+ }
796
+
797
+ .record-row {
798
+ padding: 12px 14px;
799
+ }
800
+
801
+ .record-row > div {
802
+ display: grid;
803
+ gap: 4px;
804
+ }
805
+
806
+ .record-actions {
807
+ display: flex;
808
+ align-items: center;
809
+ gap: 8px;
810
+ flex-wrap: wrap;
811
+ }
812
+
813
+ .subsection {
814
+ display: flex;
815
+ flex-direction: column;
816
+ gap: 12px;
817
+ }
818
+
819
+ .field {
820
+ display: grid;
821
+ gap: 6px;
822
+ }
823
+
824
+ .field span,
825
+ .checkbox-row span {
826
+ color: var(--ifrs-text-muted);
827
+ font-size: 0.92rem;
828
+ }
829
+
830
+ .form-grid {
831
+ display: grid;
832
+ gap: 16px;
833
+ }
834
+
835
+ .two-col-form {
836
+ grid-template-columns: repeat(2, minmax(0, 1fr));
837
+ }
838
+
839
+ .checkbox-row {
840
+ display: inline-flex;
841
+ align-items: center;
842
+ gap: 10px;
843
+ margin-top: 16px;
844
+ }
845
+
846
+ .checkbox-row input,
847
+ .choice-item input {
848
+ width: 16px;
849
+ height: 16px;
850
+ margin: 0;
851
+ }
852
+
853
+ .choice-item {
854
+ display: inline-flex;
855
+ align-items: center;
856
+ gap: 10px;
857
+ padding: 10px 12px;
858
+ }
859
+
860
+ .table-shell {
861
+ overflow-x: auto;
862
+ }
863
+
864
+ .break-cell {
865
+ word-break: break-all;
866
+ }
867
+
868
+ .empty-state {
869
+ display: flex;
870
+ flex-direction: column;
871
+ gap: 12px;
872
+ color: var(--ifrs-text-muted);
873
+ }
874
+
875
+ .compact-empty-state {
876
+ padding: 12px 0 0;
877
+ }
878
+
879
+ .embed-panel {
880
+ min-height: 520px;
881
+ }
882
+
883
+ .dashboard-frame {
884
+ width: 100%;
885
+ min-height: 520px;
886
+ border: 0;
887
+ border-radius: 8px;
888
+ background: var(--ifrs-surface-muted);
889
+ }
890
+
891
+ .muted {
892
+ margin: 0;
893
+ color: var(--ifrs-text-muted);
894
+ }
895
+
896
+ .error-inline {
897
+ margin: 0;
898
+ color: var(--ifrs-danger);
899
+ font-size: 0.92rem;
900
+ }
901
+
902
+ .block-button {
903
+ width: 100%;
904
+ justify-content: flex-start;
905
+ }
906
+
907
+ .compact-field {
908
+ min-width: 180px;
909
+ }
910
+
911
+ .vanna-form {
912
+ display: grid;
913
+ gap: 12px;
914
+ }
915
+
916
+ .vanna-form button {
917
+ justify-self: flex-start;
918
+ }
919
+
920
+ .answer-block {
921
+ display: grid;
922
+ gap: 16px;
923
+ margin-top: 16px;
924
+ }
925
+
926
+ .answer-section {
927
+ display: grid;
928
+ gap: 8px;
929
+ }
930
+
931
+ .answer-section strong {
932
+ font-size: 0.95rem;
933
+ }
934
+
935
+ .sql-page {
936
+ padding-block: 0;
937
+ }
938
+
939
+ .sql-page .sql-console {
940
+ --sql-bg: #141916;
941
+ --sql-surface: #1b211d;
942
+ --sql-surface-muted: #212923;
943
+ --sql-border: #2c342d;
944
+ --sql-border-strong: #3c463d;
945
+ --sql-text: #edf0ea;
946
+ --sql-muted: #a8b2a7;
947
+ --sql-accent: #74a07d;
948
+ --sql-danger: #e08779;
949
+ display: flex;
950
+ min-height: min(720px, calc(100vh - 180px));
951
+ flex-direction: column;
952
+ overflow: hidden;
953
+ border: 1px solid var(--sql-border);
954
+ border-radius: 8px;
955
+ background: var(--sql-bg);
956
+ color: var(--sql-text);
957
+ }
958
+
959
+ .sql-result-area {
960
+ min-height: 340px;
961
+ flex: 1 1 auto;
962
+ overflow: auto;
963
+ border-bottom: 1px solid var(--sql-border);
964
+ background: var(--sql-bg);
965
+ }
966
+
967
+ .sql-output {
968
+ display: grid;
969
+ min-height: 100%;
970
+ grid-template-rows: auto minmax(0, 1fr) auto;
971
+ padding: 16px;
972
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
973
+ }
974
+
975
+ .sql-output-query {
976
+ display: grid;
977
+ grid-template-columns: 18px minmax(0, 1fr);
978
+ gap: 10px;
979
+ align-items: start;
980
+ margin-bottom: 12px;
981
+ color: var(--sql-muted);
982
+ }
983
+
984
+ .sql-output-query pre {
985
+ padding: 0;
986
+ border: 0;
987
+ background: transparent;
988
+ color: var(--sql-text);
989
+ font-size: 1rem;
990
+ line-height: 1.55;
991
+ white-space: pre-wrap;
992
+ }
993
+
994
+ .sql-result-area .table-shell {
995
+ width: 100%;
996
+ max-width: 100%;
997
+ max-height: min(390px, calc(100vh - 380px));
998
+ overflow: auto;
999
+ border: 1px solid var(--sql-border-strong);
1000
+ overscroll-behavior: contain;
1001
+ }
1002
+
1003
+ .sql-result-area table {
1004
+ width: auto;
1005
+ min-width: min(100%, 420px);
1006
+ max-width: none;
1007
+ color: var(--sql-text);
1008
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
1009
+ }
1010
+
1011
+ .sql-result-area th,
1012
+ .sql-result-area td {
1013
+ max-width: 320px;
1014
+ padding: 7px 10px;
1015
+ border: 1px solid var(--sql-border-strong);
1016
+ background: transparent;
1017
+ color: var(--sql-text);
1018
+ font-size: 0.92rem;
1019
+ line-height: 1.35;
1020
+ overflow: hidden;
1021
+ text-overflow: ellipsis;
1022
+ white-space: nowrap;
1023
+ }
1024
+
1025
+ .sql-result-area th {
1026
+ position: sticky;
1027
+ top: 0;
1028
+ z-index: 1;
1029
+ background: var(--sql-bg);
1030
+ color: var(--sql-text);
1031
+ font-weight: 700;
1032
+ }
1033
+
1034
+ .sql-result-area td span,
1035
+ .sql-result-area td strong {
1036
+ display: inline;
1037
+ }
1038
+
1039
+ .sql-row-count {
1040
+ margin: 8px 0 0;
1041
+ color: var(--sql-text);
1042
+ font-size: 0.95rem;
1043
+ }
1044
+
1045
+ .sql-output-error {
1046
+ max-width: 100%;
1047
+ padding: 10px 0 0 28px;
1048
+ color: var(--sql-danger);
1049
+ white-space: pre-wrap;
1050
+ }
1051
+
1052
+ .sql-result-area .empty-state {
1053
+ padding: 0 0 0 28px;
1054
+ background: transparent;
1055
+ color: var(--sql-muted);
1056
+ }
1057
+
1058
+ .sql-console-form {
1059
+ display: grid;
1060
+ flex: 0 0 auto;
1061
+ gap: 0;
1062
+ background: var(--sql-surface);
1063
+ }
1064
+
1065
+ .sql-editor-shell {
1066
+ position: relative;
1067
+ border-bottom: 1px solid var(--sql-border);
1068
+ background: var(--sql-surface);
1069
+ }
1070
+
1071
+ .sql-editor-textarea {
1072
+ min-height: 118px;
1073
+ max-height: 280px;
1074
+ border: 0;
1075
+ border-radius: 0;
1076
+ background: var(--sql-surface);
1077
+ color: var(--sql-text);
1078
+ caret-color: var(--sql-text);
1079
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
1080
+ font-size: 1rem;
1081
+ line-height: 1.55;
1082
+ outline: none;
1083
+ resize: vertical;
1084
+ }
1085
+
1086
+ .sql-editor-textarea:focus {
1087
+ border-color: transparent;
1088
+ outline: none;
1089
+ }
1090
+
1091
+ .sql-suggestion-list {
1092
+ position: absolute;
1093
+ z-index: 10;
1094
+ display: grid;
1095
+ gap: 0;
1096
+ overflow: auto;
1097
+ border: 1px solid var(--sql-border-strong);
1098
+ border-radius: 4px;
1099
+ background: #34343a;
1100
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.28);
1101
+ }
1102
+
1103
+ button.sql-suggestion-item {
1104
+ display: grid;
1105
+ width: 100%;
1106
+ min-height: 0;
1107
+ grid-template-columns: minmax(0, 1fr) auto;
1108
+ gap: 8px;
1109
+ align-items: baseline;
1110
+ padding: 5px 8px;
1111
+ border: 0;
1112
+ border-radius: 0;
1113
+ background: transparent;
1114
+ color: var(--sql-text);
1115
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
1116
+ text-align: left;
1117
+ }
1118
+
1119
+ button.sql-suggestion-item:hover,
1120
+ button.sql-suggestion-item.active {
1121
+ border: 0;
1122
+ background: #3d5588;
1123
+ color: #ffffff;
1124
+ }
1125
+
1126
+ .sql-suggestion-item strong {
1127
+ overflow: hidden;
1128
+ font-size: 0.88rem;
1129
+ font-weight: 600;
1130
+ text-overflow: ellipsis;
1131
+ white-space: nowrap;
1132
+ }
1133
+
1134
+ .sql-suggestion-item span {
1135
+ color: #d5d7de;
1136
+ font-size: 0.72rem;
1137
+ }
1138
+
1139
+ .sql-console-toolbar {
1140
+ align-items: center;
1141
+ padding: 10px 12px;
1142
+ background: var(--sql-surface-muted);
1143
+ }
1144
+
1145
+ .sql-console-toolbar .status-badge {
1146
+ margin-left: auto;
1147
+ }
1148
+
1149
+ .sql-shortcut-help {
1150
+ display: flex;
1151
+ gap: 8px 14px;
1152
+ flex-wrap: wrap;
1153
+ color: var(--ifrs-text-muted);
1154
+ font-size: 0.84rem;
1155
+ }
1156
+
1157
+ .sql-shortcut-help kbd {
1158
+ display: inline-flex;
1159
+ min-width: 22px;
1160
+ justify-content: center;
1161
+ padding: 1px 5px;
1162
+ border: 1px solid var(--ifrs-border-strong);
1163
+ border-radius: 4px;
1164
+ background: var(--ifrs-surface-muted);
1165
+ color: var(--ifrs-text);
1166
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
1167
+ font-size: 0.78rem;
1168
+ line-height: 1.5;
1169
+ }
1170
+
1171
+ .sql-result-area,
1172
+ .sql-result-area .table-shell,
1173
+ .sql-editor-textarea,
1174
+ .sql-suggestion-list {
1175
+ scrollbar-width: thin;
1176
+ scrollbar-color: var(--sql-border-strong) var(--sql-surface);
1177
+ }
1178
+
1179
+ .sql-result-area::-webkit-scrollbar,
1180
+ .sql-result-area .table-shell::-webkit-scrollbar,
1181
+ .sql-editor-textarea::-webkit-scrollbar,
1182
+ .sql-suggestion-list::-webkit-scrollbar {
1183
+ width: 10px;
1184
+ height: 10px;
1185
+ }
1186
+
1187
+ .sql-result-area::-webkit-scrollbar-track,
1188
+ .sql-result-area .table-shell::-webkit-scrollbar-track,
1189
+ .sql-editor-textarea::-webkit-scrollbar-track,
1190
+ .sql-suggestion-list::-webkit-scrollbar-track {
1191
+ background: var(--sql-surface);
1192
+ }
1193
+
1194
+ .sql-result-area::-webkit-scrollbar-thumb,
1195
+ .sql-result-area .table-shell::-webkit-scrollbar-thumb,
1196
+ .sql-editor-textarea::-webkit-scrollbar-thumb,
1197
+ .sql-suggestion-list::-webkit-scrollbar-thumb {
1198
+ border: 2px solid var(--sql-surface);
1199
+ border-radius: 8px;
1200
+ background: var(--sql-border-strong);
1201
+ }
1202
+
1203
+ pre {
1204
+ margin: 0;
1205
+ padding: 14px;
1206
+ overflow: auto;
1207
+ border: 1px solid var(--ifrs-border);
1208
+ border-radius: 8px;
1209
+ background: var(--ifrs-surface-muted);
1210
+ color: var(--ifrs-text);
1211
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
1212
+ font-size: 0.9rem;
1213
+ }
1214
+
1215
+ @media (max-width: 1120px) {
1216
+ .layout-main,
1217
+ .layout-sidebar,
1218
+ .card-grid.two-col,
1219
+ .card-grid.three-col,
1220
+ .two-col-form {
1221
+ grid-template-columns: 1fr;
1222
+ }
1223
+ }
1224
+
1225
+ @media (max-width: 720px) {
1226
+ .app-header-inner,
1227
+ .content-shell {
1228
+ padding: 16px;
1229
+ }
1230
+
1231
+ .app-header-top,
1232
+ .page-header,
1233
+ .panel-header {
1234
+ align-items: stretch;
1235
+ }
1236
+
1237
+ .app-header-top {
1238
+ flex-direction: column;
1239
+ }
1240
+
1241
+ .app-header-actions {
1242
+ justify-content: flex-start;
1243
+ }
1244
+
1245
+ .nav-row {
1246
+ overflow-x: auto;
1247
+ padding-bottom: 2px;
1248
+ }
1249
+
1250
+ .embed-panel,
1251
+ .dashboard-frame {
1252
+ min-height: 420px;
1253
+ }
1254
+
1255
+ .sql-console {
1256
+ min-height: 480px;
1257
+ }
1258
+
1259
+ .entity-card-grid {
1260
+ grid-template-columns: 1fr;
1261
+ }
1262
+
1263
+ button.entity-card {
1264
+ min-height: 0;
1265
+ grid-template-columns: minmax(92px, 35%) minmax(0, 1fr);
1266
+ }
1267
+
1268
+ .entity-card-meta,
1269
+ .modal-split-grid {
1270
+ grid-template-columns: 1fr;
1271
+ }
1272
+
1273
+ .modal-backdrop {
1274
+ align-items: stretch;
1275
+ padding: 12px;
1276
+ }
1277
+
1278
+ .modal-panel {
1279
+ max-height: calc(100vh - 24px);
1280
+ }
1281
+
1282
+ .modal-header,
1283
+ .modal-actions,
1284
+ .modal-body {
1285
+ padding: 14px;
1286
+ }
1287
+ }