@openmrs/esm-report-builder 0.1.1-pre.87

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 (551) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +19 -0
  3. package/.prettierrc +8 -0
  4. package/.tx/config +12 -0
  5. package/LICENSE +401 -0
  6. package/README.md +336 -0
  7. package/__mocks__/react-i18next.js +12 -0
  8. package/dist/162.js +1 -0
  9. package/dist/162.js.map +1 -0
  10. package/dist/184.js +2 -0
  11. package/dist/184.js.LICENSE.txt +14 -0
  12. package/dist/184.js.map +1 -0
  13. package/dist/242.js +2 -0
  14. package/dist/242.js.LICENSE.txt +21 -0
  15. package/dist/242.js.map +1 -0
  16. package/dist/253.js +1 -0
  17. package/dist/253.js.map +1 -0
  18. package/dist/300.js +1 -0
  19. package/dist/311.js +1 -0
  20. package/dist/311.js.map +1 -0
  21. package/dist/469.js +2 -0
  22. package/dist/469.js.LICENSE.txt +45 -0
  23. package/dist/469.js.map +1 -0
  24. package/dist/478.js +2 -0
  25. package/dist/478.js.LICENSE.txt +9 -0
  26. package/dist/478.js.map +1 -0
  27. package/dist/539.js +1 -0
  28. package/dist/539.js.map +1 -0
  29. package/dist/540.js +2 -0
  30. package/dist/540.js.LICENSE.txt +9 -0
  31. package/dist/540.js.map +1 -0
  32. package/dist/669.js +1 -0
  33. package/dist/669.js.map +1 -0
  34. package/dist/710.js +1 -0
  35. package/dist/710.js.map +1 -0
  36. package/dist/729.js +1 -0
  37. package/dist/729.js.map +1 -0
  38. package/dist/838.js +2 -0
  39. package/dist/838.js.LICENSE.txt +9 -0
  40. package/dist/838.js.map +1 -0
  41. package/dist/917.js +1 -0
  42. package/dist/917.js.map +1 -0
  43. package/dist/961.js +2 -0
  44. package/dist/961.js.LICENSE.txt +19 -0
  45. package/dist/961.js.map +1 -0
  46. package/dist/main.js +1 -0
  47. package/dist/main.js.map +1 -0
  48. package/dist/openmrs-esm-report-builder.js +1 -0
  49. package/dist/openmrs-esm-report-builder.js.buildmanifest.json +530 -0
  50. package/dist/openmrs-esm-report-builder.js.map +1 -0
  51. package/dist/routes.json +1 -0
  52. package/e2e/core/env.ts +5 -0
  53. package/e2e/core/global-setup.ts +34 -0
  54. package/e2e/core/test.ts +21 -0
  55. package/e2e/pages/app-shell.page.ts +34 -0
  56. package/e2e/pages/etl-sources.page.ts +35 -0
  57. package/e2e/pages/report-sections.page.ts +20 -0
  58. package/e2e/pages/section-preview.modal.ts +29 -0
  59. package/e2e/specs/etl-sources.spec.ts +51 -0
  60. package/e2e/specs/navigation.spec.ts +13 -0
  61. package/e2e/specs/section-preview-validation.spec.ts +38 -0
  62. package/e2e/specs/section-preview.spec.ts +94 -0
  63. package/e2e/support/github/Dockerfile +22 -0
  64. package/e2e/support/github/Dockerfile.dockerignore +13 -0
  65. package/e2e/support/github/docker-compose.yml +31 -0
  66. package/e2e/support/github/run-e2e-docker-env.sh +131 -0
  67. package/e2e/support/github/spa-assemble-config.json +9 -0
  68. package/e2e/tsconfig.json +11 -0
  69. package/example.env +5 -0
  70. package/jest.config.js +28 -0
  71. package/linelist_report_builder_design_spec.md +816 -0
  72. package/package.json +111 -0
  73. package/playwright.config.ts +28 -0
  74. package/routes.json +22 -0
  75. package/src/__debug__/all-designs.test.tsx +30 -0
  76. package/src/admin-card-link.extension.module.scss +55 -0
  77. package/src/admin-card-link.extension.tsx +24 -0
  78. package/src/components/admin/admin-page.component.tsx +75 -0
  79. package/src/components/admin/age-categories-page.component.tsx +109 -0
  80. package/src/components/admin/age-groups-page.component.tsx +146 -0
  81. package/src/components/admin/etl-browser/columns-tab.component.tsx +80 -0
  82. package/src/components/admin/etl-browser/etl-browser-page.component.tsx +309 -0
  83. package/src/components/admin/etl-browser/etl-browser.component.scss +424 -0
  84. package/src/components/admin/etl-browser/metadata-tab.component.tsx +65 -0
  85. package/src/components/admin/etl-browser/preview-grid.component.tsx +189 -0
  86. package/src/components/admin/etl-browser/relationships-tab.component.tsx +21 -0
  87. package/src/components/admin/etl-browser/sources-tree.component.tsx +118 -0
  88. package/src/components/admin/etl-browser/table-detail.component.tsx +124 -0
  89. package/src/components/admin/etl-browser/table-info-strip.component.tsx +51 -0
  90. package/src/components/admin/etl-browser/table-list.component.tsx +136 -0
  91. package/src/components/admin/etl-browser/use-table-preview.ts +47 -0
  92. package/src/components/admin/etl-sources-page.component.tsx +355 -0
  93. package/src/components/admin/etl-tasks-page.component.scss +370 -0
  94. package/src/components/admin/etl-tasks-page.component.tsx +768 -0
  95. package/src/components/admin/report-categories-page.component.tsx +267 -0
  96. package/src/components/admin/report-library-page.component.tsx +551 -0
  97. package/src/components/ai-support/ai-assist-button.component.tsx +30 -0
  98. package/src/components/ai-support/ai-assist-modal.component.tsx +81 -0
  99. package/src/components/ai-support/ai.service.ts +21 -0
  100. package/src/components/ai-support/ai.types.ts +12 -0
  101. package/src/components/app-shell/report-builder-shell.component.tsx +242 -0
  102. package/src/components/app-shell/report-builder-shell.scss +18 -0
  103. package/src/components/dashboards/dashboard-config.schema.ts +97 -0
  104. package/src/components/dashboards/dashboard-form-modal.component.tsx +150 -0
  105. package/src/components/dashboards/dashboards-admin.scss +62 -0
  106. package/src/components/dashboards/dashboards-page.component.tsx +153 -0
  107. package/src/components/dashboards/dashboards-table.component.tsx +130 -0
  108. package/src/components/dashboards/sections/dashboard-autoinclude.section.tsx +75 -0
  109. package/src/components/dashboards/sections/dashboard-basics.section.tsx +80 -0
  110. package/src/components/dashboards/sections/dashboard-json.section.tsx +79 -0
  111. package/src/components/dashboards/sections/dashboard-sections-editor.section.tsx +130 -0
  112. package/src/components/dashboards/sections/dashboard-widgets-editor.section.tsx +184 -0
  113. package/src/components/data-themes/data-theme-form.component.tsx +59 -0
  114. package/src/components/data-themes/data-theme-modal.component.tsx +349 -0
  115. package/src/components/data-themes/data-themes-page.component.tsx +139 -0
  116. package/src/components/data-themes/data-themes-table.component.tsx +98 -0
  117. package/src/components/data-themes/icon-registry.ts +35 -0
  118. package/src/components/data-themes/sections/data-theme-basics.section.tsx +63 -0
  119. package/src/components/data-themes/sections/data-theme-condition-columns.section.tsx +397 -0
  120. package/src/components/data-themes/sections/data-theme-fields-editor.section.tsx +125 -0
  121. package/src/components/data-themes/sections/data-theme-metadata.section.tsx +245 -0
  122. package/src/components/data-themes/sections/data-theme-preview.section.tsx +115 -0
  123. package/src/components/data-themes/sections/data-theme-source.section.tsx +184 -0
  124. package/src/components/data-visualizer/components/cqi-components/cqi-data-table.component.tsx +214 -0
  125. package/src/components/data-visualizer/components/cqi-components/cqi-elements.ts +203 -0
  126. package/src/components/data-visualizer/components/cqi-components/detail.component.tsx +110 -0
  127. package/src/components/data-visualizer/components/cqi-components/detail.scss +22 -0
  128. package/src/components/data-visualizer/components/data-table/data-table.component.tsx +208 -0
  129. package/src/components/data-visualizer/components/data-table/data-tables.scss +206 -0
  130. package/src/components/data-visualizer/components/empty-state/empty-state-illustration.component.tsx +53 -0
  131. package/src/components/data-visualizer/components/header/header.component.tsx +43 -0
  132. package/src/components/data-visualizer/components/header/header.scss +71 -0
  133. package/src/components/data-visualizer/components/model/confirm.component.tsx +40 -0
  134. package/src/components/data-visualizer/components/panel/panel.component.tsx +20 -0
  135. package/src/components/data-visualizer/components/panel/panel.scss +25 -0
  136. package/src/components/data-visualizer/components/popover/modifier-panel.tsx +53 -0
  137. package/src/components/data-visualizer/constants.ts +445 -0
  138. package/src/components/data-visualizer/data-visualizer-illustration.component.tsx +31 -0
  139. package/src/components/data-visualizer/data-visualizer.component.tsx +1935 -0
  140. package/src/components/data-visualizer/data-visualizer.resource.ts +462 -0
  141. package/src/components/data-visualizer/data-visualizer.scss +449 -0
  142. package/src/components/data-visualizer/declarations.d.ts +131 -0
  143. package/src/components/data-visualizer/parameter-inputs/boolean-parameter-input.component.tsx +34 -0
  144. package/src/components/data-visualizer/parameter-inputs/concept-parameter-input.component.tsx +81 -0
  145. package/src/components/data-visualizer/parameter-inputs/date-parameter-input.component.tsx +110 -0
  146. package/src/components/data-visualizer/parameter-inputs/date-range-input.component.scss +47 -0
  147. package/src/components/data-visualizer/parameter-inputs/date-range-input.component.tsx +228 -0
  148. package/src/components/data-visualizer/parameter-inputs/identifier-type-parameter-input.component.tsx +69 -0
  149. package/src/components/data-visualizer/parameter-inputs/list-parameter-input.component.tsx +73 -0
  150. package/src/components/data-visualizer/parameter-inputs/location-parameter-input.component.tsx +81 -0
  151. package/src/components/data-visualizer/parameter-inputs/number-parameter-input.component.tsx +40 -0
  152. package/src/components/data-visualizer/parameter-inputs/person-attribute-parameter-input.component.tsx +71 -0
  153. package/src/components/data-visualizer/parameter-inputs/text-parameter-input.component.tsx +52 -0
  154. package/src/components/data-visualizer/report-parameter-modal.component.tsx +383 -0
  155. package/src/components/data-visualizer/types.ts +206 -0
  156. package/src/components/etl-monitor/builder/builder-state-machine.ts +381 -0
  157. package/src/components/etl-monitor/builder/design-registry.tsx +139 -0
  158. package/src/components/etl-monitor/builder/etl-monitor-builder-context.tsx +702 -0
  159. package/src/components/etl-monitor/builder/etl-monitor-builder-modal.component.tsx +461 -0
  160. package/src/components/etl-monitor/builder/etl-monitor-builder-modal.scss +256 -0
  161. package/src/components/etl-monitor/builder/etl-monitor-builder-page.component.tsx +387 -0
  162. package/src/components/etl-monitor/builder/etl-monitor-builder-page.scss +976 -0
  163. package/src/components/etl-monitor/builder/generated-config-panel.component.tsx +168 -0
  164. package/src/components/etl-monitor/builder/generated-config-panel.scss +198 -0
  165. package/src/components/etl-monitor/builder/index.ts +5 -0
  166. package/src/components/etl-monitor/builder/monitor-preview.tsx +124 -0
  167. package/src/components/etl-monitor/builder/steps/data-source-step.component.tsx +667 -0
  168. package/src/components/etl-monitor/builder/steps/data-source-step.scss +284 -0
  169. package/src/components/etl-monitor/builder/steps/design-samples.ts +278 -0
  170. package/src/components/etl-monitor/builder/steps/design-step.component.tsx +299 -0
  171. package/src/components/etl-monitor/builder/steps/design-step.scss +479 -0
  172. package/src/components/etl-monitor/builder/steps/fields-step.component.tsx +859 -0
  173. package/src/components/etl-monitor/builder/steps/fields-step.scss +459 -0
  174. package/src/components/etl-monitor/builder/steps/general-step.component.tsx +288 -0
  175. package/src/components/etl-monitor/builder/steps/general-step.scss +103 -0
  176. package/src/components/etl-monitor/builder/steps/index.ts +5 -0
  177. package/src/components/etl-monitor/builder/steps/preview-step.component.tsx +245 -0
  178. package/src/components/etl-monitor/builder/steps/preview-step.scss +236 -0
  179. package/src/components/etl-monitor/etl-monitor-card-shell.component.tsx +154 -0
  180. package/src/components/etl-monitor/etl-monitor-card-shell.scss +103 -0
  181. package/src/components/etl-monitor/etl-monitor-dashboard.component.tsx +227 -0
  182. package/src/components/etl-monitor/etl-monitor-dashboard.scss +148 -0
  183. package/src/components/etl-monitor/etl-monitor-status-card.component.tsx +192 -0
  184. package/src/components/etl-monitor/etl-monitors-page.component.tsx +621 -0
  185. package/src/components/etl-monitor/renderers/DetailsRenderer.tsx +2 -0
  186. package/src/components/etl-monitor/renderers/ErrorLogRenderer.tsx +2 -0
  187. package/src/components/etl-monitor/renderers/EtlMonitorWidget.tsx +97 -0
  188. package/src/components/etl-monitor/renderers/MetricsGridRenderer.tsx +2 -0
  189. package/src/components/etl-monitor/renderers/MonitorRenderer.tsx +175 -0
  190. package/src/components/etl-monitor/renderers/ProgressRenderer.tsx +2 -0
  191. package/src/components/etl-monitor/renderers/StatusCardRenderer.tsx +2 -0
  192. package/src/components/etl-monitor/renderers/SummaryCardRenderer.tsx +2 -0
  193. package/src/components/etl-monitor/renderers/TableRenderer.tsx +2 -0
  194. package/src/components/etl-monitor/renderers/component-icons.tsx +33 -0
  195. package/src/components/etl-monitor/renderers/components/details-renderer.tsx +195 -0
  196. package/src/components/etl-monitor/renderers/components/error-log-renderer.tsx +104 -0
  197. package/src/components/etl-monitor/renderers/components/index.ts +6 -0
  198. package/src/components/etl-monitor/renderers/components/log-renderer.tsx +86 -0
  199. package/src/components/etl-monitor/renderers/components/metrics-grid-renderer.tsx +133 -0
  200. package/src/components/etl-monitor/renderers/components/progress-renderer.tsx +188 -0
  201. package/src/components/etl-monitor/renderers/components/status-card-renderer.tsx +247 -0
  202. package/src/components/etl-monitor/renderers/components/summary-card-renderer.tsx +160 -0
  203. package/src/components/etl-monitor/renderers/components/table-renderer.tsx +175 -0
  204. package/src/components/etl-monitor/renderers/components/time-series-renderer.tsx +310 -0
  205. package/src/components/etl-monitor/renderers/data-transformer.ts +361 -0
  206. package/src/components/etl-monitor/renderers/index.ts +11 -0
  207. package/src/components/etl-monitor/renderers/legacy-monitor-renderer.tsx +69 -0
  208. package/src/components/etl-monitor/renderers/monitor-renderer.tsx +6 -0
  209. package/src/components/etl-monitor/renderers/monitor-renderers.scss +1621 -0
  210. package/src/components/etl-monitor/renderers/monitor-widget-card.component.tsx +54 -0
  211. package/src/components/etl-monitor/renderers/monitor-widget-card.scss +16 -0
  212. package/src/components/etl-monitor/renderers/v2-monitor-renderer.tsx +227 -0
  213. package/src/components/import-export/artifact-groups.ts +153 -0
  214. package/src/components/import-export/export-report-modal.component.tsx +265 -0
  215. package/src/components/import-export/import-export-page.component.tsx +610 -0
  216. package/src/components/import-export/import-export.styles.scss +825 -0
  217. package/src/components/import-export/import-package-modal.component.tsx +401 -0
  218. package/src/components/import-export/index.ts +3 -0
  219. package/src/components/indicators/README.md +24 -0
  220. package/src/components/indicators/base-indicator-basic-fields.component.tsx +18 -0
  221. package/src/components/indicators/base-indicator-basics.section.tsx +54 -0
  222. package/src/components/indicators/base-indicator-countby.section.tsx +25 -0
  223. package/src/components/indicators/base-indicator-criteria.section.tsx +83 -0
  224. package/src/components/indicators/base-indicator-details-form.component.tsx +80 -0
  225. package/src/components/indicators/base-indicator-theme-unit-fields.component.tsx +39 -0
  226. package/src/components/indicators/create-base-indicator-modal.component.tsx +623 -0
  227. package/src/components/indicators/create-composite-base-indicator-modal.component.tsx +295 -0
  228. package/src/components/indicators/create-custom-indicator-modal.component.tsx +548 -0
  229. package/src/components/indicators/create-final-indicator-modal.component.tsx +285 -0
  230. package/src/components/indicators/custom-condition-input.component.tsx +310 -0
  231. package/src/components/indicators/diagnosis-filters-form.component.tsx +101 -0
  232. package/src/components/indicators/disaggregation-panel.component.tsx +93 -0
  233. package/src/components/indicators/handler/concept-search-multiselect.component.tsx +153 -0
  234. package/src/components/indicators/handler/question-answer-concept-search.component.tsx +336 -0
  235. package/src/components/indicators/indicator-run-preview-modal.component.tsx +391 -0
  236. package/src/components/indicators/indicator-search-select.component.tsx +297 -0
  237. package/src/components/indicators/indicator-status-tag.component.tsx +9 -0
  238. package/src/components/indicators/indicators-page.component.tsx +673 -0
  239. package/src/components/indicators/indicators-page.scss +121 -0
  240. package/src/components/indicators/indicators-table.component.tsx +188 -0
  241. package/src/components/indicators/preview-table.component.tsx +31 -0
  242. package/src/components/indicators/sections/composite-indicator-basics.section.tsx +36 -0
  243. package/src/components/indicators/sections/composite-indicator-picker.section.tsx +116 -0
  244. package/src/components/indicators/sections/composite-indicator-sql-preview.section.tsx +31 -0
  245. package/src/components/indicators/sections/custom-indicator-basics.section.tsx +65 -0
  246. package/src/components/indicators/sections/custom-indicator-disaggregation.section.tsx +93 -0
  247. package/src/components/indicators/sections/custom-indicator-filters.section.tsx +203 -0
  248. package/src/components/indicators/sections/custom-indicator-population.section.tsx +107 -0
  249. package/src/components/indicators/sections/custom-indicator-sql-preview.section.tsx +108 -0
  250. package/src/components/indicators/sections/final-indicator-basics.section.tsx +46 -0
  251. package/src/components/indicators/sections/final-indicator-disaggregation.section.tsx +47 -0
  252. package/src/components/indicators/sections/final-indicator-picker.section.tsx +60 -0
  253. package/src/components/indicators/sections/final-indicator-preview.section.tsx +20 -0
  254. package/src/components/indicators/sections/final-indicator-results-preview.section.tsx +65 -0
  255. package/src/components/indicators/sections/indicator-basics.section.tsx +40 -0
  256. package/src/components/indicators/sections/indicator-conditions.section.tsx +279 -0
  257. package/src/components/indicators/sections/indicator-sql-preview.section.tsx +63 -0
  258. package/src/components/indicators/sections/indicator-theme.section.tsx +48 -0
  259. package/src/components/indicators/sql-preview.component.tsx +19 -0
  260. package/src/components/indicators/tag-input.component.tsx +177 -0
  261. package/src/components/indicators/types/base-indicator-form.types.ts +17 -0
  262. package/src/components/indicators/types/base-indicator-theme.constants.ts +8 -0
  263. package/src/components/indicators/types/composite-indicator.types.ts +27 -0
  264. package/src/components/indicators/types/condition-ui.types.ts +11 -0
  265. package/src/components/indicators/types/custom-indicator.types.ts +161 -0
  266. package/src/components/indicators/types/data-theme-config.types.ts +88 -0
  267. package/src/components/indicators/types/indicator-types.ts +57 -0
  268. package/src/components/indicators/types/sql-builders.ts +43 -0
  269. package/src/components/indicators/utils/composite-indicator-sql.utils.test.ts +143 -0
  270. package/src/components/indicators/utils/composite-indicator-sql.utils.ts +426 -0
  271. package/src/components/indicators/utils/concept-preload.utils.ts +21 -0
  272. package/src/components/indicators/utils/custom-indicator-interpreter.test.ts +493 -0
  273. package/src/components/indicators/utils/custom-indicator-interpreter.ts +702 -0
  274. package/src/components/indicators/utils/final-indicator-sql.utils.ts +190 -0
  275. package/src/components/indicators/utils/indicator-conditions-hydration.utils.ts +254 -0
  276. package/src/components/indicators/utils/indicator-sql-resolution.utils.ts +204 -0
  277. package/src/components/indicators/utils/indicator-sql.utils.ts +721 -0
  278. package/src/components/indicators/utils/population-sql.compiler.test.ts +999 -0
  279. package/src/components/indicators/utils/population-sql.compiler.ts +858 -0
  280. package/src/components/landing/landing-action-item.component.tsx +50 -0
  281. package/src/components/landing/landing-action-list.component.tsx +12 -0
  282. package/src/components/landing/landing-activity-list.component.tsx +47 -0
  283. package/src/components/landing/landing-footer-grid.component.tsx +45 -0
  284. package/src/components/landing/landing-hero.component.tsx +18 -0
  285. package/src/components/landing/landing-section-card.component.tsx +33 -0
  286. package/src/components/landing/report-builder-landing-page.component.tsx +186 -0
  287. package/src/components/landing/report-builder-landing-page.scss +131 -0
  288. package/src/components/legacy-reports/legacy-report-detail-page.component.tsx +300 -0
  289. package/src/components/legacy-reports/legacy-report-editor-page.component.tsx +324 -0
  290. package/src/components/legacy-reports/legacy-report-upload-modal.component.tsx +307 -0
  291. package/src/components/legacy-reports/legacy-reports-page.component.tsx +206 -0
  292. package/src/components/legacy-reports/legacy-reports-table.component.tsx +154 -0
  293. package/src/components/legacy-reports/tabs/legacy-report-datasets-tab.component.tsx +344 -0
  294. package/src/components/legacy-reports/tabs/legacy-report-dimensions-tab.component.tsx +590 -0
  295. package/src/components/legacy-reports/tabs/legacy-report-indicators-tab.component.tsx +490 -0
  296. package/src/components/legacy-reports/tabs/legacy-report-json-preview-tab.component.tsx +272 -0
  297. package/src/components/legacy-reports/tabs/legacy-report-overview-tab.component.tsx +218 -0
  298. package/src/components/legacy-reports/tabs/legacy-report-parameters-tab.component.tsx +279 -0
  299. package/src/components/linelist/definition/indicator-to-sql.utils.ts +281 -0
  300. package/src/components/linelist/definition/linelist-definition-editor.component.tsx +1676 -0
  301. package/src/components/linelist/definition/linelist-definition-editor.scss +461 -0
  302. package/src/components/linelist/definition/linelist-definition.types.ts +108 -0
  303. package/src/components/linelist/definition/panels/column-properties-panel.component.tsx +328 -0
  304. package/src/components/linelist/definition/panels/column-selector-panel.component.tsx +1082 -0
  305. package/src/components/linelist/definition/panels/column-selector-panel.scss +100 -0
  306. package/src/components/linelist/definition/panels/custom-sql-column-modal.component.tsx +248 -0
  307. package/src/components/linelist/definition/panels/encounter-diagnosis-column-modal.component.tsx +300 -0
  308. package/src/components/linelist/definition/panels/encounter-diagnosis-column-modal.scss +21 -0
  309. package/src/components/linelist/definition/panels/multi-datasource-selector.component.tsx +332 -0
  310. package/src/components/linelist/definition/panels/multi-datasource-selector.scss +161 -0
  311. package/src/components/linelist/definition/panels/observation-column-modal.component.tsx +450 -0
  312. package/src/components/linelist/definition/panels/observation-column-modal.scss +29 -0
  313. package/src/components/linelist/definition/panels/parameter-panel.component.tsx +659 -0
  314. package/src/components/linelist/definition/panels/parameter-panel.scss +64 -0
  315. package/src/components/linelist/definition/panels/population-source-selector.component.tsx +407 -0
  316. package/src/components/linelist/definition/panels/population-source-selector.scss +187 -0
  317. package/src/components/linelist/design/panels/column-category-selector.component.tsx +433 -0
  318. package/src/components/linelist/design/panels/column-category-selector.scss +329 -0
  319. package/src/components/linelist/design/panels/column-debug-panel.component.tsx +197 -0
  320. package/src/components/linelist/design/panels/column-debug-panel.scss +141 -0
  321. package/src/components/linelist/design/panels/data-catalogue.component.tsx +1062 -0
  322. package/src/components/linelist/design/panels/data-catalogue.scss +263 -0
  323. package/src/components/linelist/design/panels/display-settings-panel.component.tsx +405 -0
  324. package/src/components/linelist/design/panels/display-settings-panel.scss +78 -0
  325. package/src/components/linelist/design/panels/filtermap-editor.component.tsx +434 -0
  326. package/src/components/linelist/design/panels/filtermap-editor.scss +176 -0
  327. package/src/components/linelist/design/panels/json-preview.component.tsx +114 -0
  328. package/src/components/linelist/design/panels/json-preview.scss +85 -0
  329. package/src/components/linelist/design/panels/query-config-panel.component.tsx +1137 -0
  330. package/src/components/linelist/design/panels/query-config-panel.scss +342 -0
  331. package/src/components/linelist/design/panels/sort-config-panel.component.tsx +330 -0
  332. package/src/components/linelist/design/panels/sort-config-panel.scss +77 -0
  333. package/src/components/linelist/design/panels/sql-builder-panel.component.tsx +475 -0
  334. package/src/components/linelist/design/panels/sql-builder-panel.scss +226 -0
  335. package/src/components/linelist/design/panels/transformation-panel.component.tsx +687 -0
  336. package/src/components/linelist/design/panels/transformation-panel.scss +81 -0
  337. package/src/components/linelist/design/panels/visual-filter-panel.component.tsx +595 -0
  338. package/src/components/linelist/design/panels/visual-filter-panel.scss +76 -0
  339. package/src/components/linelist/linelist-dashboard.page.component.tsx +756 -0
  340. package/src/components/linelist/linelist-dashboard.page.scss +240 -0
  341. package/src/components/linelist/linelist-editor.page.component.tsx +134 -0
  342. package/src/components/linelist/linelist-editor.page.scss +28 -0
  343. package/src/components/linelist/linelist-run-report.page.component.tsx +715 -0
  344. package/src/components/linelist/linelist-run-report.page.scss +136 -0
  345. package/src/components/linelist/modals/linelist-report-builder-modal.component.tsx +1454 -0
  346. package/src/components/linelist/modals/linelist-report-builder-modal.scss +164 -0
  347. package/src/components/linelist/modals/preview-parameter-modal.component.tsx +361 -0
  348. package/src/components/report/dashboard/reports-table.component.tsx +186 -0
  349. package/src/components/report/definition/panels/properties-panel.component.tsx +38 -0
  350. package/src/components/report/definition/panels/report-structure-panel.component.tsx +61 -0
  351. package/src/components/report/definition/panels/selection-panel.component.tsx +58 -0
  352. package/src/components/report/definition/report-definition-editor.component.tsx +99 -0
  353. package/src/components/report/definition/report-definition.types.ts +66 -0
  354. package/src/components/report/design/panels/IndicatorPropertiesPanel.scss +33 -0
  355. package/src/components/report/design/panels/IndicatorPropertiesPanel.tsx +389 -0
  356. package/src/components/report/design/panels/JsonPreviewPanel.scss +32 -0
  357. package/src/components/report/design/panels/JsonPreviewPanel.tsx +104 -0
  358. package/src/components/report/design/panels/mapping-preview-panel.component.tsx +82 -0
  359. package/src/components/report/design/panels/mapping-preview-panel.scss +55 -0
  360. package/src/components/report/design/panels/template-structure-panel.component.tsx +296 -0
  361. package/src/components/report/design/panels/template-structure-panel.scss +81 -0
  362. package/src/components/report/design/report-design-editor.component.tsx +1170 -0
  363. package/src/components/report/design/report-design.types.ts +48 -0
  364. package/src/components/report/design/report-design.utils.ts +86 -0
  365. package/src/components/report/panels/report-detail.component.tsx +71 -0
  366. package/src/components/report/panels/report-panel-shell.component.tsx +60 -0
  367. package/src/components/report/report-dashboard.page.component.tsx +554 -0
  368. package/src/components/report/report-editor.page.component.tsx +590 -0
  369. package/src/components/report/report.routes.tsx +32 -0
  370. package/src/components/report-sections/create-report-section-modal.component.tsx +388 -0
  371. package/src/components/report-sections/hooks/useAgeCategories.ts +25 -0
  372. package/src/components/report-sections/hooks/useSectionEditorState.ts +449 -0
  373. package/src/components/report-sections/panels/Dhis2MappingPanel.tsx +157 -0
  374. package/src/components/report-sections/panels/DisaggregationPanel.tsx +97 -0
  375. package/src/components/report-sections/panels/IndicatorPickerPanel.tsx +201 -0
  376. package/src/components/report-sections/panels/SectionBasicsPanel.tsx +27 -0
  377. package/src/components/report-sections/report-section-preview-modal.component.tsx +548 -0
  378. package/src/components/report-sections/report-sections-page.component.tsx +325 -0
  379. package/src/components/report-sections/section-disaggregation.utils.ts +637 -0
  380. package/src/components/report-sections/section-types.ts +55 -0
  381. package/src/components/report-sections/section-utils.ts +50 -0
  382. package/src/components/report-sections/sections-page.scss +79 -0
  383. package/src/components/run-reports/run-reports-page.component.tsx +8 -0
  384. package/src/components/security/access-denied-page.component.tsx +69 -0
  385. package/src/components/security/access-denied-page.scss +39 -0
  386. package/src/components/security/privilege-route.component.test.tsx +79 -0
  387. package/src/components/security/privilege-route.component.tsx +39 -0
  388. package/src/components/shared/compile-setup-modal.component.tsx +182 -0
  389. package/src/components/shared/concept-selector.component.tsx +245 -0
  390. package/src/components/shared/concept-selector.scss +121 -0
  391. package/src/components/shared/header/builder-header-actions.component.tsx +38 -0
  392. package/src/components/shared/header/header.component.tsx +85 -0
  393. package/src/components/shared/header/header.scss +150 -0
  394. package/src/components/shared/header/illustration.component.tsx +34 -0
  395. package/src/components/shared/indicator-properties-panel/IndicatorPropertiesPanel.scss +33 -0
  396. package/src/components/shared/indicator-properties-panel/IndicatorPropertiesPanel.tsx +389 -0
  397. package/src/components/shared/json-preview-panel/JsonPreviewPanel.scss +32 -0
  398. package/src/components/shared/json-preview-panel/JsonPreviewPanel.tsx +104 -0
  399. package/src/components/shared/mapping-preview-panel/mapping-preview-panel.component.tsx +82 -0
  400. package/src/components/shared/mapping-preview-panel/mapping-preview-panel.scss +55 -0
  401. package/src/components/shared/preview/query-results-preview.component.tsx +204 -0
  402. package/src/components/shared/template-structure-panel/template-structure-panel.component.tsx +296 -0
  403. package/src/components/shared/template-structure-panel/template-structure-panel.scss +81 -0
  404. package/src/config-schema.ts +43 -0
  405. package/src/constants/privileges.test.ts +53 -0
  406. package/src/constants/privileges.ts +118 -0
  407. package/src/features/dashboards/DashboardRendererPage.tsx +174 -0
  408. package/src/features/dashboards/DashboardsPage.tsx +164 -0
  409. package/src/features/dashboards/EtlDashboardPage.tsx +32 -0
  410. package/src/features/dashboards/components/DashboardEmptyState.tsx +41 -0
  411. package/src/features/dashboards/components/DashboardGrid.tsx +48 -0
  412. package/src/features/dashboards/components/DashboardHeader.tsx +58 -0
  413. package/src/features/dashboards/components/DashboardSection.tsx +46 -0
  414. package/src/features/dashboards/components/ReportLaunchCard.tsx +51 -0
  415. package/src/features/dashboards/components/WidgetSlotDispatcher.tsx +61 -0
  416. package/src/features/dashboards/components/WidgetUnavailableCard.tsx +36 -0
  417. package/src/features/dashboards/dashboards.scss +196 -0
  418. package/src/features/dashboards/hooks/useDashboard.ts +61 -0
  419. package/src/features/dashboards/hooks/useDashboardWidgets.ts +74 -0
  420. package/src/features/dashboards/hooks/useDashboards.ts +56 -0
  421. package/src/features/dashboards/hooks/useMonitorDataMap.ts +84 -0
  422. package/src/features/dashboards/index.ts +11 -0
  423. package/src/features/dashboards/utils/dashboard-config.util.test.ts +255 -0
  424. package/src/features/dashboards/utils/dashboard-config.util.ts +382 -0
  425. package/src/features/report-visualizer/ReportVisualizerPage.tsx +448 -0
  426. package/src/features/report-visualizer/components/Export/ExportMenu.tsx +141 -0
  427. package/src/features/report-visualizer/components/Export/index.ts +2 -0
  428. package/src/features/report-visualizer/components/ReportExplorer/QuickFilters.tsx +152 -0
  429. package/src/features/report-visualizer/components/ReportExplorer/ReportCategoryFilter.tsx +54 -0
  430. package/src/features/report-visualizer/components/ReportExplorer/ReportExplorerPanel.tsx +201 -0
  431. package/src/features/report-visualizer/components/ReportExplorer/ReportExplorerRail.tsx +202 -0
  432. package/src/features/report-visualizer/components/ReportExplorer/ReportList.tsx +287 -0
  433. package/src/features/report-visualizer/components/ReportExplorer/ReportSearch.tsx +151 -0
  434. package/src/features/report-visualizer/components/ReportExplorer/ReportTagFilter.tsx +100 -0
  435. package/src/features/report-visualizer/components/ReportExplorer/RunReportButton.tsx +42 -0
  436. package/src/features/report-visualizer/components/ReportExplorer/RuntimeParameterForm.tsx +259 -0
  437. package/src/features/report-visualizer/components/ReportExplorer/index.ts +8 -0
  438. package/src/features/report-visualizer/components/ReportWorkspace/ReportLayer.tsx +33 -0
  439. package/src/features/report-visualizer/components/ReportWorkspace/ReportSummary.tsx +88 -0
  440. package/src/features/report-visualizer/components/ReportWorkspace/ReportViewTabs.tsx +72 -0
  441. package/src/features/report-visualizer/components/ReportWorkspace/ReportWorkspaceHeader.tsx +92 -0
  442. package/src/features/report-visualizer/components/ReportWorkspace/ReportWorkspacePanel.tsx +242 -0
  443. package/src/features/report-visualizer/components/ReportWorkspace/index.ts +5 -0
  444. package/src/features/report-visualizer/components/TableView/ColumnVisibilityMenu.tsx +206 -0
  445. package/src/features/report-visualizer/components/TableView/ReportTable.tsx +253 -0
  446. package/src/features/report-visualizer/components/TableView/index.ts +2 -0
  447. package/src/features/report-visualizer/hooks/index.ts +4 -0
  448. package/src/features/report-visualizer/hooks/useExplorerPreferences.ts +103 -0
  449. package/src/features/report-visualizer/hooks/useReportCapabilities.ts +112 -0
  450. package/src/features/report-visualizer/hooks/useReportParameters.ts +152 -0
  451. package/src/features/report-visualizer/hooks/useReports.ts +135 -0
  452. package/src/features/report-visualizer/index.ts +6 -0
  453. package/src/features/report-visualizer/report-visualizer.scss +593 -0
  454. package/src/features/report-visualizer/types/index.ts +1 -0
  455. package/src/features/report-visualizer/types/report-visualizer.types.ts +104 -0
  456. package/src/features/report-visualizer/utils/status-colors.ts +117 -0
  457. package/src/globals.d.ts +14 -0
  458. package/src/hooks/address-template.ts +86 -0
  459. package/src/hooks/concept.ts +112 -0
  460. package/src/hooks/indicator/index.ts +1 -0
  461. package/src/hooks/indicator/useIndicatorsByTheme.ts +41 -0
  462. package/src/hooks/openmrs-reference-data.ts +432 -0
  463. package/src/hooks/theme/index.ts +4 -0
  464. package/src/hooks/theme/useDataTheme.ts +61 -0
  465. package/src/hooks/theme/useDataThemes.ts +28 -0
  466. package/src/hooks/theme/useMambaTableMeta.ts +34 -0
  467. package/src/hooks/theme/useMambaTables.ts +95 -0
  468. package/src/hooks/use-report-builder-privileges.test.tsx +98 -0
  469. package/src/hooks/use-report-builder-privileges.ts +58 -0
  470. package/src/index.ts +29 -0
  471. package/src/resources/address-template/address-template.api.ts +180 -0
  472. package/src/resources/agegroup/agegroups.api.ts +58 -0
  473. package/src/resources/concept/concept.api.ts +116 -0
  474. package/src/resources/concepts/concept-mapper.ts +21 -0
  475. package/src/resources/concepts/concept-types.ts +31 -0
  476. package/src/resources/concepts/concepts.resource.ts +44 -0
  477. package/src/resources/concepts/useConceptSearch.ts +41 -0
  478. package/src/resources/dashboard/dashboard.api.ts +107 -0
  479. package/src/resources/etl-monitor/etl-monitor-test.api.ts +409 -0
  480. package/src/resources/etl-monitor/etl-monitor.api.ts +381 -0
  481. package/src/resources/etl-source/etl-source.api.ts +65 -0
  482. package/src/resources/etl-task/etl-task.api.ts +96 -0
  483. package/src/resources/etl-task/etl-task.types.ts +31 -0
  484. package/src/resources/indicator/indicators.api.ts +125 -0
  485. package/src/resources/legacy-reports/legacy-reports.api.ts +144 -0
  486. package/src/resources/linelist/linelist-reports.api.ts +616 -0
  487. package/src/resources/location/location.api.ts +135 -0
  488. package/src/resources/openmrs-api.ts +40 -0
  489. package/src/resources/patient-identifier-type/patient-identifier-type.api.ts +65 -0
  490. package/src/resources/person-attribute-type/person-attribute-type.api.ts +71 -0
  491. package/src/resources/preview/sql-preview.api.ts +54 -0
  492. package/src/resources/report/reports.api.ts +140 -0
  493. package/src/resources/report-category/report-category.api.ts +41 -0
  494. package/src/resources/report-import-export/import-export-api.ts +164 -0
  495. package/src/resources/report-library/report-library.api.ts +63 -0
  496. package/src/resources/report-section/report-sections.api.ts +73 -0
  497. package/src/resources/report-section/section-preview.api.ts +25 -0
  498. package/src/resources/theme/data-theme.api.ts +88 -0
  499. package/src/resources/theme/etl-schema.api.ts +101 -0
  500. package/src/resources/theme/etl-table-meta.api.ts +45 -0
  501. package/src/root.component.tsx +20 -0
  502. package/src/routes/report-builder.routes.tsx +160 -0
  503. package/src/routes/report-builder.scss +56 -0
  504. package/src/routes.json +28 -0
  505. package/src/sample-template.ts +121 -0
  506. package/src/template-utils.ts +110 -0
  507. package/src/types/carbon-react-inert.d.ts +13 -0
  508. package/src/types/condition-operators.ts +63 -0
  509. package/src/types/dashboard/dashboard.types.ts +137 -0
  510. package/src/types/dashboard/index.ts +4 -0
  511. package/src/types/etl/etl-types.ts +238 -0
  512. package/src/types/etl-monitor/etl-monitor-builder.types.ts +555 -0
  513. package/src/types/etl-monitor/etl-monitor-v2.types.ts +397 -0
  514. package/src/types/etl-monitor/etl-monitor.types.ts +188 -0
  515. package/src/types/etl-monitor/index.ts +6 -0
  516. package/src/types/linelist/compile-config.ts +455 -0
  517. package/src/types/linelist-types.ts +2059 -0
  518. package/src/types/theme/data-theme.types.ts +88 -0
  519. package/src/utils/api-error.utils.test.ts +151 -0
  520. package/src/utils/api-error.utils.ts +131 -0
  521. package/src/utils/config-enhancer.ts +62 -0
  522. package/src/utils/etl-browser/etl-browser.util.test.ts +145 -0
  523. package/src/utils/etl-browser/export-csv.util.ts +43 -0
  524. package/src/utils/etl-browser/group-tables.util.ts +84 -0
  525. package/src/utils/etl-browser/index.ts +4 -0
  526. package/src/utils/etl-browser/summarize-columns.util.ts +27 -0
  527. package/src/utils/etl-browser/table-sql.util.ts +20 -0
  528. package/src/utils/etl-monitor/config-v2-adapter.util.ts +460 -0
  529. package/src/utils/etl-monitor/endpoint-config-normalizer.util.ts +383 -0
  530. package/src/utils/etl-monitor/index.ts +10 -0
  531. package/src/utils/etl-monitor/jsonpath-resolver.util.ts +118 -0
  532. package/src/utils/etl-monitor/normalization-examples.ts +0 -0
  533. package/src/utils/etl-monitor/schema-inspector.util.ts +76 -0
  534. package/src/utils/etl-monitor/semantic-type-detector.util.ts +76 -0
  535. package/src/utils/etl-monitor/status-mapper.util.ts +105 -0
  536. package/src/utils/etl-monitor/value-formatters.util.ts +167 -0
  537. package/src/utils/etl-task/etl-task-card.util.test.ts +239 -0
  538. package/src/utils/etl-task/etl-task-card.util.ts +276 -0
  539. package/src/utils/etl-task/index.ts +1 -0
  540. package/src/utils/html-entities.utils.ts +34 -0
  541. package/src/utils/parameter-resolution.ts +218 -0
  542. package/src/views/etl-monitor-builder/add-monitor-modal.component.scss +0 -0
  543. package/src/views/etl-monitor-builder/add-monitor-modal.component.tsx +210 -0
  544. package/src/views/etl-monitor-builder/etl-monitor-builder.component.scss +157 -0
  545. package/src/views/etl-monitor-builder/etl-monitor-builder.component.tsx +252 -0
  546. package/src/views/etl-monitor-builder/etl-monitor-builder.store.ts +126 -0
  547. package/tools/scss-stub.js +12 -0
  548. package/tools/setup-tests.ts +1 -0
  549. package/translations/en.json +65 -0
  550. package/tsconfig.json +43 -0
  551. package/webpack.config.js +30 -0
@@ -0,0 +1,1621 @@
1
+ /**
2
+ * Monitor Renderers - Shared Styles
3
+ *
4
+ * Common styling for all ETL monitor display components
5
+ */
6
+
7
+ /* ===== Base Monitor Component Styles ===== */
8
+
9
+ .monitor-status-card,
10
+ .monitor-summary-card,
11
+ .monitor-progress,
12
+ .monitor-table,
13
+ .monitor-metrics-grid,
14
+ .monitor-error-log,
15
+ .monitor-details {
16
+ background-color: #ffffff;
17
+ border: 1px solid #e0e0e0;
18
+ border-radius: 0.5rem;
19
+ overflow: hidden;
20
+ font-family: 'IBM Plex Sans', 'Helvetica Neue', Arial, sans-serif;
21
+ }
22
+
23
+ .monitor-status-card {
24
+ background: linear-gradient(135deg, #ffffff 0%, #fafafa 100%);
25
+ border: 1px solid #e8e8e8;
26
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
27
+ }
28
+
29
+ /* ===== Common Header Styles ===== */
30
+
31
+ .monitor-status-card__header,
32
+ .monitor-summary-card__header,
33
+ .monitor-progress__header,
34
+ .monitor-table__header,
35
+ .monitor-metrics-grid__header,
36
+ .monitor-error-log__header,
37
+ .monitor-details__header {
38
+ padding: 0.875rem 1rem;
39
+ border-bottom: 1px solid #e0e0e0;
40
+ background: linear-gradient(180deg, #fafafa 0%, #ffffff 100%);
41
+ }
42
+
43
+ .monitor-status-card__header {
44
+ padding: 1.25rem 1.5rem 0.75rem 1.5rem;
45
+ background: linear-gradient(180deg, #f8f9fa 0%, #ffffff 100%);
46
+ border-bottom: 1px solid #e8e8e8;
47
+ }
48
+
49
+ .monitor-status-card__title,
50
+ .monitor-summary-card__title,
51
+ .monitor-progress__title,
52
+ .monitor-table__title,
53
+ .monitor-metrics-grid__title,
54
+ .monitor-error-log__title,
55
+ .monitor-details__title {
56
+ margin: 0;
57
+ font-size: 0.875rem;
58
+ font-weight: 600;
59
+ color: #262626;
60
+ }
61
+
62
+ .monitor-status-card__title {
63
+ font-size: 1.125rem;
64
+ font-weight: 600;
65
+ color: #161616;
66
+ letter-spacing: -0.01em;
67
+ }
68
+
69
+ /* ===== Subtitle Styles ===== */
70
+
71
+ .monitor-status-card__subtitle {
72
+ margin: 0.375rem 0 0 0;
73
+ font-size: 0.875rem;
74
+ color: #525252;
75
+ line-height: 1.4;
76
+ }
77
+
78
+ /* ===== Common Body Styles ===== */
79
+
80
+ .monitor-status-card__body,
81
+ .monitor-summary-card__body,
82
+ .monitor-progress__body,
83
+ .monitor-table__body,
84
+ .monitor-metrics-grid__body,
85
+ .monitor-error-log__body,
86
+ .monitor-details__body {
87
+ padding: 1rem;
88
+ }
89
+
90
+ .monitor-status-card__body {
91
+ padding: 1.25rem 1.5rem 1rem 1.5rem;
92
+ }
93
+
94
+ /* ===== Status Card Styles ===== */
95
+
96
+ .monitor-status {
97
+ display: flex;
98
+ align-items: flex-start;
99
+ gap: 0.75rem;
100
+ padding: 1rem;
101
+ border-radius: 0.5rem;
102
+ margin-bottom: 1rem;
103
+ background-color: #f9f9f9;
104
+ border: 1px solid #f0f0f0;
105
+
106
+ &__indicator {
107
+ flex-shrink: 0;
108
+
109
+ .monitor-status__dot {
110
+ display: inline-block;
111
+ width: 12px;
112
+ height: 12px;
113
+ border-radius: 50%;
114
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
115
+ }
116
+
117
+ .monitor-status__icon {
118
+ font-size: 1.25rem;
119
+ line-height: 1;
120
+ }
121
+ }
122
+
123
+ &__content {
124
+ flex: 1;
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: 0.25rem;
128
+ }
129
+
130
+ &__label {
131
+ font-size: 0.8125rem;
132
+ font-weight: 600;
133
+ text-transform: uppercase;
134
+ letter-spacing: 0.5px;
135
+ color: #525252;
136
+ }
137
+
138
+ &__description {
139
+ font-size: 0.875rem;
140
+ font-weight: 500;
141
+ color: #161616;
142
+ }
143
+
144
+ /* Tone Variants */
145
+ &--success {
146
+ background-color: #defbe6;
147
+ border-color: #a8e6b8;
148
+
149
+ .monitor-status__dot {
150
+ background-color: #198038;
151
+ box-shadow: 0 0 8px rgba(25, 128, 56, 0.3);
152
+ }
153
+
154
+ .monitor-status__label {
155
+ color: #0e6027;
156
+ }
157
+
158
+ .monitor-status__description {
159
+ color: #0f6027;
160
+ }
161
+ }
162
+
163
+ &--critical {
164
+ background-color: #ffd7d9;
165
+ border-color: #ffc1c1;
166
+
167
+ .monitor-status__dot {
168
+ background-color: #da1e28;
169
+ box-shadow: 0 0 8px rgba(218, 30, 40, 0.3);
170
+ }
171
+
172
+ .monitor-status__label {
173
+ color: #8a1a24;
174
+ }
175
+
176
+ .monitor-status__description {
177
+ color: #8a1a24;
178
+ }
179
+ }
180
+
181
+ &--warning {
182
+ background-color: #fff1c9;
183
+ border-color: #ffe8a1;
184
+
185
+ .monitor-status__dot {
186
+ background-color: #f1c21b;
187
+ box-shadow: 0 0 8px rgba(241, 194, 27, 0.3);
188
+ }
189
+
190
+ .monitor-status__label {
191
+ color: #8a6d00;
192
+ }
193
+
194
+ .monitor-status__description {
195
+ color: #8a6d00;
196
+ }
197
+ }
198
+
199
+ &--info {
200
+ background-color: #d0e2ff;
201
+ border-color: #a6c8ff;
202
+
203
+ .monitor-status__dot {
204
+ background-color: #0f62fe;
205
+ box-shadow: 0 0 8px rgba(15, 98, 254, 0.3);
206
+ }
207
+
208
+ .monitor-status__label {
209
+ color: #0043ce;
210
+ }
211
+
212
+ .monitor-status__description {
213
+ color: #0043ce;
214
+ }
215
+ }
216
+
217
+ &--neutral {
218
+ background-color: #f4f4f4;
219
+ border-color: #e0e0e0;
220
+
221
+ .monitor-status__dot {
222
+ background-color: #6f6f6f;
223
+ box-shadow: 0 0 8px rgba(111, 111, 111, 0.3);
224
+ }
225
+
226
+ .monitor-status__label {
227
+ color: #262626;
228
+ }
229
+
230
+ .monitor-status__description {
231
+ color: #262626;
232
+ }
233
+ }
234
+ }
235
+
236
+ .monitor-status-card__fields {
237
+ margin-top: 1rem;
238
+ padding-top: 1rem;
239
+ border-top: 1px solid #f0f0f0;
240
+ }
241
+
242
+ .monitor-status-card__field {
243
+ display: flex;
244
+ justify-content: space-between;
245
+ align-items: center;
246
+ padding: 0.625rem 0;
247
+ border-bottom: 1px solid #f5f5f5;
248
+
249
+ &:last-child {
250
+ border-bottom: none;
251
+ }
252
+
253
+ &-label {
254
+ font-size: 0.8125rem;
255
+ font-weight: 500;
256
+ color: #525252;
257
+ text-transform: none;
258
+ letter-spacing: 0;
259
+ }
260
+
261
+ &-value {
262
+ font-size: 0.875rem;
263
+ font-weight: 600;
264
+ color: #161616;
265
+ }
266
+ }
267
+
268
+ .monitor-status-card__timestamp {
269
+ margin-top: 1rem;
270
+ padding-top: 0.75rem;
271
+ border-top: 1px solid #f0f0f0;
272
+ font-size: 0.75rem;
273
+ color: #8d8d8d;
274
+ text-align: right;
275
+ font-style: italic;
276
+ }
277
+
278
+ /* ===== Summary Card Styles ===== */
279
+
280
+ .monitor-summary-card__metrics {
281
+ display: grid;
282
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
283
+ gap: 0.75rem;
284
+ }
285
+
286
+ .monitor-summary-card__metric {
287
+ display: flex;
288
+ flex-direction: column;
289
+ gap: 0.25rem;
290
+ padding: 0.625rem;
291
+ background-color: #f9f9f9;
292
+ border-radius: 0.375rem;
293
+
294
+ &-label {
295
+ font-size: 0.75rem;
296
+ color: #6f6f6f;
297
+ }
298
+
299
+ &-value {
300
+ font-size: 1rem;
301
+ font-weight: 600;
302
+ color: #262626;
303
+ }
304
+ }
305
+
306
+ /* ===== Progress Styles ===== */
307
+
308
+ .monitor-progress__bar-container {
309
+ height: 8px;
310
+ background-color: #e0e0e0;
311
+ border-radius: 4px;
312
+ overflow: hidden;
313
+ margin-bottom: 0.75rem;
314
+ }
315
+
316
+ .monitor-progress__bar {
317
+ height: 100%;
318
+ background: linear-gradient(90deg, #198038 0%, #4faa6e 100%);
319
+ border-radius: 4px;
320
+ transition: width 0.3s ease;
321
+ }
322
+
323
+ .monitor-progress__info {
324
+ display: flex;
325
+ justify-content: space-between;
326
+ align-items: center;
327
+ margin-bottom: 0.875rem;
328
+ }
329
+
330
+ .monitor-progress__percentage {
331
+ font-size: 1.125rem;
332
+ font-weight: 600;
333
+ color: #198038;
334
+ }
335
+
336
+ .monitor-progress__stage {
337
+ font-size: 0.8125rem;
338
+ color: #6f6f6f;
339
+ }
340
+
341
+ .monitor-progress__idle {
342
+ text-align: center;
343
+ padding: 1.5rem 0;
344
+ color: #8d8d8d;
345
+
346
+ &-text {
347
+ font-size: 0.875rem;
348
+ color: #8d8d8d;
349
+ }
350
+ }
351
+
352
+ .monitor-progress__fields {
353
+ display: flex;
354
+ flex-direction: column;
355
+ gap: 0.5rem;
356
+ }
357
+
358
+ .monitor-progress__field {
359
+ display: flex;
360
+ justify-content: space-between;
361
+ font-size: 0.8125rem;
362
+
363
+ &-label {
364
+ color: #6f6f6f;
365
+ }
366
+
367
+ &-value {
368
+ color: #262626;
369
+ font-weight: 500;
370
+ }
371
+ }
372
+
373
+ /* ===== Table Styles ===== */
374
+
375
+ .monitor-table__empty {
376
+ text-align: center;
377
+ padding: 2rem;
378
+ color: #8d8d8d;
379
+ font-size: 0.875rem;
380
+ }
381
+
382
+ .monitor-table__element {
383
+ width: 100%;
384
+ border-collapse: collapse;
385
+ font-size: 0.8125rem;
386
+
387
+ thead {
388
+ background-color: #f4f4f4;
389
+ border-bottom: 2px solid #e0e0e0;
390
+
391
+ th {
392
+ padding: 0.625rem 0.75rem;
393
+ text-align: left;
394
+ font-weight: 600;
395
+ color: #262626;
396
+ cursor: pointer;
397
+ user-select: none;
398
+ white-space: nowrap;
399
+
400
+ &:hover {
401
+ background-color: #e8e8e8;
402
+ }
403
+
404
+ &.monitor-table__th--sorted {
405
+ background-color: #e0e0e0;
406
+ }
407
+ }
408
+ }
409
+
410
+ tbody {
411
+ tr {
412
+ border-bottom: 1px solid #f0f0f0;
413
+
414
+ &:hover {
415
+ background-color: #fafafa;
416
+ }
417
+
418
+ &:last-child {
419
+ border-bottom: none;
420
+ }
421
+
422
+ td {
423
+ padding: 0.625rem 0.75rem;
424
+ color: #262626;
425
+ }
426
+ }
427
+ }
428
+ }
429
+
430
+ .monitor-table__th-content {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 0.5rem;
434
+ }
435
+
436
+ .monitor-table__sort-icon {
437
+ font-size: 0.75rem;
438
+ color: #198038;
439
+ }
440
+
441
+ /* ===== Metrics Grid Styles ===== */
442
+
443
+ .monitor-metrics-grid__items {
444
+ display: grid;
445
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
446
+ gap: 0.625rem;
447
+ }
448
+
449
+ .monitor-metrics-grid__item {
450
+ display: flex;
451
+ flex-direction: column;
452
+ gap: 0.25rem;
453
+ padding: 0.5rem;
454
+ background-color: #f9f9f9;
455
+ border-radius: 0.375rem;
456
+ text-align: center;
457
+
458
+ &-label {
459
+ font-size: 0.6875rem;
460
+ color: #6f6f6f;
461
+ text-transform: uppercase;
462
+ letter-spacing: 0.5px;
463
+ }
464
+
465
+ &-value {
466
+ font-size: 0.875rem;
467
+ font-weight: 600;
468
+ color: #262626;
469
+ }
470
+ }
471
+
472
+ /* ===== Error Log Styles ===== */
473
+
474
+ .monitor-error-log__count {
475
+ font-size: 0.75rem;
476
+ color: #da1e28;
477
+ font-weight: 500;
478
+ }
479
+
480
+ .monitor-error-log__empty {
481
+ text-align: center;
482
+ padding: 1.5rem;
483
+ color: #8d8d8d;
484
+ font-size: 0.875rem;
485
+ }
486
+
487
+ .monitor-error-log__items {
488
+ display: flex;
489
+ flex-direction: column;
490
+ gap: 0.5rem;
491
+ }
492
+
493
+ .monitor-error-log__item {
494
+ display: flex;
495
+ gap: 0.75rem;
496
+ padding: 0.625rem;
497
+ border-radius: 0.375rem;
498
+ border: 1px solid #e0e0e0;
499
+
500
+ &-indicator {
501
+ flex-shrink: 0;
502
+ width: 8px;
503
+ height: 8px;
504
+ border-radius: 50%;
505
+ margin-top: 4px;
506
+ }
507
+
508
+ &--critical {
509
+ background-color: #fff0f0;
510
+ border-color: #ffc1c1;
511
+
512
+ .monitor-error-log__item-indicator {
513
+ background-color: #da1e28;
514
+ }
515
+ }
516
+
517
+ &--warning {
518
+ background-color: #fffbf0;
519
+ border-color: #ffe8a1;
520
+
521
+ .monitor-error-log__item-indicator {
522
+ background-color: #f1c21b;
523
+ }
524
+ }
525
+
526
+ &--info {
527
+ background-color: #f0f6ff;
528
+ border-color: #c1deff;
529
+
530
+ .monitor-error-log__item-indicator {
531
+ background-color: #0f62fe;
532
+ }
533
+ }
534
+
535
+ &--neutral {
536
+ background-color: #f9f9f9;
537
+
538
+ .monitor-error-log__item-indicator {
539
+ background-color: #6f6f6f;
540
+ }
541
+ }
542
+ }
543
+
544
+ .monitor-error-log__item-content {
545
+ flex: 1;
546
+ display: flex;
547
+ flex-direction: column;
548
+ gap: 0.25rem;
549
+ }
550
+
551
+ .monitor-error-log__item-field {
552
+ font-size: 0.8125rem;
553
+
554
+ &-label {
555
+ color: #6f6f6f;
556
+ font-weight: 500;
557
+ }
558
+
559
+ &-value {
560
+ color: #262626;
561
+ }
562
+ }
563
+
564
+ /* ===== Details Styles ===== */
565
+
566
+ .monitor-details__group {
567
+ margin-bottom: 1rem;
568
+
569
+ &:last-child {
570
+ margin-bottom: 0;
571
+ }
572
+ }
573
+
574
+ .monitor-details__group-title {
575
+ font-size: 0.8125rem;
576
+ font-weight: 600;
577
+ color: #262626;
578
+ margin: 0 0 0.625rem 0;
579
+ padding-bottom: 0.375rem;
580
+ border-bottom: 1px solid #e0e0e0;
581
+ }
582
+
583
+ .monitor-details__items {
584
+ display: flex;
585
+ flex-direction: column;
586
+ gap: 0.375rem;
587
+ }
588
+
589
+ .monitor-details__item {
590
+ display: flex;
591
+ justify-content: space-between;
592
+ align-items: center;
593
+ font-size: 0.8125rem;
594
+ padding: 0.375rem 0.5rem;
595
+ border-radius: 0.25rem;
596
+
597
+ &:hover {
598
+ background-color: #f9f9f9;
599
+ }
600
+
601
+ &-label {
602
+ color: #6f6f6f;
603
+ }
604
+
605
+ &-value {
606
+ color: #262626;
607
+ font-weight: 500;
608
+ }
609
+ }
610
+
611
+ /* ===== State Components ===== */
612
+
613
+ .monitor-empty-state,
614
+ .monitor-loading-state,
615
+ .monitor-error-state {
616
+ display: flex;
617
+ flex-direction: column;
618
+ align-items: center;
619
+ justify-content: center;
620
+ padding: 2rem;
621
+ text-align: center;
622
+ gap: 1rem;
623
+ min-height: 200px;
624
+ }
625
+
626
+ .monitor-empty-state__icon,
627
+ .monitor-error-state__icon {
628
+ color: #c6c6c6;
629
+ }
630
+
631
+ .monitor-empty-state__title,
632
+ .monitor-error-state__title {
633
+ margin: 0;
634
+ font-size: 0.9375rem;
635
+ font-weight: 600;
636
+ color: #262626;
637
+ }
638
+
639
+ .monitor-empty-state__description,
640
+ .monitor-error-state__description,
641
+ .monitor-loading-state__text {
642
+ margin: 0;
643
+ font-size: 0.8125rem;
644
+ color: #6f6f6f;
645
+ }
646
+
647
+ .monitor-loading-state__spinner {
648
+ width: 32px;
649
+ height: 32px;
650
+ border: 3px solid #e0e0e0;
651
+ border-top-color: #198038;
652
+ border-radius: 50%;
653
+ animation: spin 1s linear infinite;
654
+ }
655
+
656
+ @keyframes spin {
657
+ to { transform: rotate(360deg); }
658
+ }
659
+
660
+ .monitor-fallback {
661
+ background-color: #f9f9f9;
662
+ border: 1px dashed #c6c6c6;
663
+ border-radius: 0.5rem;
664
+ overflow: hidden;
665
+
666
+ &__header {
667
+ padding: 0.75rem 1rem;
668
+ border-bottom: 1px solid #e0e0e0;
669
+ background-color: #f4f4f4;
670
+ }
671
+
672
+ &__content {
673
+ padding: 1rem;
674
+ }
675
+
676
+ &__note {
677
+ font-size: 0.8125rem;
678
+ color: #6f6f6f;
679
+ margin-bottom: 0.5rem;
680
+ }
681
+
682
+ &__data {
683
+ font-size: 0.6875rem;
684
+ background-color: #ffffff;
685
+ padding: 0.5rem;
686
+ border-radius: 0.25rem;
687
+ overflow-x: auto;
688
+ max-height: 200px;
689
+ overflow-y: auto;
690
+ }
691
+ }
692
+
693
+ /* ===== Dark Theme Support ===== */
694
+
695
+ [data-theme='dark'] {
696
+ .monitor-status-card,
697
+ .monitor-summary-card,
698
+ .monitor-progress,
699
+ .monitor-table,
700
+ .monitor-metrics-grid,
701
+ .monitor-error-log,
702
+ .monitor-details {
703
+ background-color: #1a1a1a;
704
+ border-color: #393939;
705
+ }
706
+
707
+ .monitor-status-card__header,
708
+ .monitor-summary-card__header,
709
+ .monitor-progress__header,
710
+ .monitor-table__header,
711
+ .monitor-metrics-grid__header,
712
+ .monitor-error-log__header,
713
+ .monitor-details__header {
714
+ background: linear-gradient(180deg, #262626 0%, #1a1a1a 100%);
715
+ border-color: #393939;
716
+
717
+ h4, h5 {
718
+ color: #f4f4f4;
719
+ }
720
+ }
721
+
722
+ .monitor-status-card__field,
723
+ .monitor-summary-card__metric,
724
+ .monitor-metrics-grid__item,
725
+ .monitor-progress__field,
726
+ .monitor-details__item {
727
+ background-color: #262626;
728
+ }
729
+
730
+ .monitor-status-card__field-value,
731
+ .monitor-summary-card__metric-value,
732
+ .monitor-metrics-grid__item-value,
733
+ .monitor-status__label,
734
+ .monitor-details__item-value {
735
+ color: #f4f4f4;
736
+ }
737
+
738
+ .monitor-status-card__field-label,
739
+ .monitor-summary-card__metric-label,
740
+ .monitor-metrics-grid__item-label,
741
+ .monitor-status__description,
742
+ .monitor-details__item-label {
743
+ color: #8d8d8d;
744
+ }
745
+
746
+ .monitor-table__element {
747
+ thead {
748
+ background-color: #262626;
749
+ border-color: #393939;
750
+
751
+ th {
752
+ color: #f4f4f4;
753
+
754
+ &:hover {
755
+ background-color: #303030;
756
+ }
757
+ }
758
+ }
759
+
760
+ tbody {
761
+ tr {
762
+ border-color: #262626;
763
+
764
+ &:hover {
765
+ background-color: #303030;
766
+ }
767
+
768
+ td {
769
+ color: #c6c6c6;
770
+ }
771
+ }
772
+ }
773
+ }
774
+
775
+ .monitor-error-log__item--critical {
776
+ background-color: #2a1a1a;
777
+ border-color: #4a2a2a;
778
+ }
779
+
780
+ .monitor-error-log__item--warning {
781
+ background-color: #2a261a;
782
+ border-color: #4a3a2a;
783
+ }
784
+
785
+ .monitor-error-log__item--info {
786
+ background-color: #1a1a2a;
787
+ border-color: #2a2a4a;
788
+ }
789
+
790
+ .monitor-empty-state__title,
791
+ .monitor-error-state__title {
792
+ color: #f4f4f4;
793
+ }
794
+
795
+ .monitor-empty-state__description,
796
+ .monitor-error-state__description,
797
+ .monitor-loading-state__text {
798
+ color: #8d8d8d;
799
+ }
800
+
801
+ .monitor-fallback {
802
+ background-color: #1a1a1a;
803
+ border-color: #393939;
804
+
805
+ &__header {
806
+ background-color: #262626;
807
+ }
808
+
809
+ &__data {
810
+ background-color: #0d0d0d;
811
+ }
812
+ }
813
+ }
814
+
815
+ /* ===== Monitor Preview Wrapper ===== */
816
+
817
+ .monitor-preview-wrapper {
818
+ min-height: 300px;
819
+ background-color: #ffffff;
820
+ border-radius: 8px;
821
+ overflow: hidden;
822
+ border: 1px solid #e0e0e0;
823
+
824
+ [data-theme='dark'] & {
825
+ background-color: #1a1a1a;
826
+ border-color: #393939;
827
+ }
828
+ }
829
+
830
+
831
+ /* ===== Status Card (reference widget style) ===== */
832
+
833
+ .status-card-premium {
834
+ --sc-tone: #525252;
835
+ --sc-tone-soft: #e0e0e0;
836
+
837
+ background: #ffffff;
838
+ border: 1px solid #e8e8e8;
839
+ border-radius: 0.75rem;
840
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
841
+ overflow: hidden;
842
+ font-family: 'IBM Plex Sans', 'Helvetica Neue', Arial, sans-serif;
843
+
844
+ &--success {
845
+ --sc-tone: #198038;
846
+ --sc-tone-soft: #defbe6;
847
+ }
848
+
849
+ &--critical {
850
+ --sc-tone: #da1e28;
851
+ --sc-tone-soft: #ffd7d9;
852
+ }
853
+
854
+ &--warning {
855
+ --sc-tone: #8a6100;
856
+ --sc-tone-soft: #fff1c9;
857
+ }
858
+
859
+ &--info {
860
+ --sc-tone: #0f62fe;
861
+ --sc-tone-soft: #d0e2ff;
862
+ }
863
+
864
+ &--neutral {
865
+ --sc-tone: #525252;
866
+ --sc-tone-soft: #e0e0e0;
867
+ }
868
+
869
+ &__header {
870
+ display: flex;
871
+ align-items: center;
872
+ gap: 0.75rem;
873
+ padding: 1.25rem 1.5rem 0 1.5rem;
874
+ }
875
+
876
+ &__icon-tile {
877
+ display: inline-flex;
878
+ align-items: center;
879
+ justify-content: center;
880
+ width: 44px;
881
+ height: 44px;
882
+ flex-shrink: 0;
883
+ border-radius: 0.625rem;
884
+ background-color: var(--sc-tone-soft);
885
+ color: var(--sc-tone);
886
+ }
887
+
888
+ &__title {
889
+ margin: 0;
890
+ font-size: 1.125rem;
891
+ font-weight: 600;
892
+ color: #161616;
893
+ letter-spacing: -0.01em;
894
+ }
895
+
896
+ &__body {
897
+ padding: 0.75rem 1.5rem 1.5rem 1.5rem;
898
+ }
899
+
900
+ &__status-row {
901
+ display: flex;
902
+ align-items: center;
903
+ gap: 0.5rem;
904
+ }
905
+
906
+ &__status-value {
907
+ font-size: 1.75rem;
908
+ font-weight: 700;
909
+ color: var(--sc-tone);
910
+ line-height: 1.2;
911
+ }
912
+
913
+ &__dot {
914
+ width: 10px;
915
+ height: 10px;
916
+ border-radius: 50%;
917
+ background-color: var(--sc-tone);
918
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--sc-tone) 18%, transparent);
919
+ }
920
+
921
+ &__description {
922
+ margin: 0.375rem 0 0 0;
923
+ font-size: 0.875rem;
924
+ color: #525252;
925
+ line-height: 1.45;
926
+ }
927
+
928
+ &__footer {
929
+ display: grid;
930
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
931
+ gap: 1rem;
932
+ padding: 1rem 1.5rem;
933
+ border-top: 1px solid #f0f0f0;
934
+ }
935
+
936
+ &__meta {
937
+ display: flex;
938
+ flex-direction: column;
939
+ gap: 0.125rem;
940
+ min-width: 0;
941
+ }
942
+
943
+ &__meta-label {
944
+ display: flex;
945
+ align-items: center;
946
+ gap: 0.375rem;
947
+ font-size: 0.75rem;
948
+ color: #6f6f6f;
949
+
950
+ svg {
951
+ color: #8d8d8d;
952
+ }
953
+ }
954
+
955
+ &__meta-value {
956
+ font-size: 0.875rem;
957
+ font-weight: 600;
958
+ color: #161616;
959
+ overflow: hidden;
960
+ text-overflow: ellipsis;
961
+ white-space: nowrap;
962
+ }
963
+ }
964
+
965
+ [data-theme='dark'] {
966
+ .status-card-premium {
967
+ background: #1a1a1a;
968
+ border-color: #393939;
969
+
970
+ &--success {
971
+ --sc-tone: #42be65;
972
+ --sc-tone-soft: rgba(66, 190, 101, 0.15);
973
+ }
974
+
975
+ &--critical {
976
+ --sc-tone: #fa4d56;
977
+ --sc-tone-soft: rgba(250, 77, 86, 0.15);
978
+ }
979
+
980
+ &--warning {
981
+ --sc-tone: #f1c21b;
982
+ --sc-tone-soft: rgba(241, 194, 27, 0.15);
983
+ }
984
+
985
+ &--info {
986
+ --sc-tone: #4589ff;
987
+ --sc-tone-soft: rgba(69, 137, 255, 0.15);
988
+ }
989
+
990
+ &--neutral {
991
+ --sc-tone: #8d8d8d;
992
+ --sc-tone-soft: rgba(141, 141, 141, 0.15);
993
+ }
994
+
995
+ &__title {
996
+ color: #f4f4f4;
997
+ }
998
+
999
+ &__description {
1000
+ color: #8d8d8d;
1001
+ }
1002
+
1003
+ &__meta-value {
1004
+ color: #f4f4f4;
1005
+ }
1006
+
1007
+ &__footer {
1008
+ border-top-color: #393939;
1009
+ }
1010
+ }
1011
+ }
1012
+
1013
+ /* ===== Reference widget styles (docs/image-series-monitor/widgets) ===== */
1014
+
1015
+ /* Empty state tones (widget #4: "no errors" is a positive state) */
1016
+ .monitor-empty-state__icon {
1017
+ color: #8d8d8d;
1018
+
1019
+ &--success {
1020
+ color: #24a148;
1021
+ }
1022
+
1023
+ &--critical {
1024
+ color: #da1e28;
1025
+ }
1026
+
1027
+ &--warning {
1028
+ color: #f1c21b;
1029
+ }
1030
+
1031
+ &--info {
1032
+ color: #0f62fe;
1033
+ }
1034
+ }
1035
+
1036
+ /* Metric Summary Card (final design: widgets/metrics_final.png) */
1037
+ .metrics-grid-renderer {
1038
+ // Header: icon tile + title + subtitle
1039
+ &__head {
1040
+ display: flex;
1041
+ align-items: center;
1042
+ gap: 0.875rem;
1043
+ margin-bottom: 1rem;
1044
+ }
1045
+
1046
+ &__head-icon {
1047
+ display: inline-flex;
1048
+ align-items: center;
1049
+ justify-content: center;
1050
+ width: 52px;
1051
+ height: 52px;
1052
+ border-radius: 0.75rem;
1053
+ flex-shrink: 0;
1054
+
1055
+ svg {
1056
+ width: 24px;
1057
+ height: 24px;
1058
+ }
1059
+ }
1060
+
1061
+ &__head-text {
1062
+ display: flex;
1063
+ flex-direction: column;
1064
+ gap: 0.125rem;
1065
+ min-width: 0;
1066
+ }
1067
+
1068
+ &__head-title {
1069
+ margin: 0;
1070
+ font-size: 1.25rem;
1071
+ font-weight: 600;
1072
+ color: #161616;
1073
+ letter-spacing: -0.01em;
1074
+ }
1075
+
1076
+ &__head-sub {
1077
+ margin: 0;
1078
+ font-size: 0.875rem;
1079
+ color: #6f6f6f;
1080
+ }
1081
+
1082
+ &__grid {
1083
+ display: grid;
1084
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1085
+ gap: 0.75rem;
1086
+ }
1087
+
1088
+ &__grid--hero {
1089
+ grid-template-columns: 1fr;
1090
+ }
1091
+
1092
+ // Tile: colored icon tile LEFT, label/value/subtitle stacked right
1093
+ &__tile {
1094
+ display: flex;
1095
+ align-items: center;
1096
+ gap: 0.875rem;
1097
+ padding: 1rem;
1098
+ background: #ffffff;
1099
+ border: 1px solid #e0e0e0;
1100
+ border-radius: 0.625rem;
1101
+ text-align: left;
1102
+ min-width: 0;
1103
+ }
1104
+
1105
+ &__tile-icon {
1106
+ display: inline-flex;
1107
+ align-items: center;
1108
+ justify-content: center;
1109
+ width: 48px;
1110
+ height: 48px;
1111
+ border-radius: 0.625rem;
1112
+ background-color: #f4f4f4;
1113
+ color: #525252;
1114
+ flex-shrink: 0;
1115
+
1116
+ svg {
1117
+ width: 24px;
1118
+ height: 24px;
1119
+ }
1120
+ }
1121
+
1122
+ &__tile-body {
1123
+ display: flex;
1124
+ flex-direction: column;
1125
+ gap: 0.125rem;
1126
+ min-width: 0;
1127
+ }
1128
+
1129
+ // labels wrap instead of truncating — tiles are narrow at thumbnail scale
1130
+ &__tile-label {
1131
+ font-size: 0.8125rem;
1132
+ font-weight: 500;
1133
+ color: #525252;
1134
+ line-height: 1.25;
1135
+ }
1136
+
1137
+ &__tile-value {
1138
+ font-size: 1.5rem;
1139
+ font-weight: 700;
1140
+ color: #161616;
1141
+ line-height: 1.15;
1142
+ overflow-wrap: anywhere;
1143
+ }
1144
+
1145
+ &__tile-sub {
1146
+ font-size: 0.75rem;
1147
+ color: #8d8d8d;
1148
+ }
1149
+
1150
+ &__footer {
1151
+ display: flex;
1152
+ align-items: center;
1153
+ gap: 0.375rem;
1154
+ margin-top: 0.875rem;
1155
+ padding-top: 0.75rem;
1156
+ border-top: 1px solid #f0f0f0;
1157
+ font-size: 0.8125rem;
1158
+ color: #6f6f6f;
1159
+
1160
+ svg {
1161
+ color: #8d8d8d;
1162
+ }
1163
+ }
1164
+ }
1165
+
1166
+ /* Widget #5: inline progress bar cells + table footer */
1167
+ .table-renderer__progress {
1168
+ display: inline-flex;
1169
+ align-items: center;
1170
+ gap: 0.5rem;
1171
+ min-width: 120px;
1172
+
1173
+ &-label {
1174
+ font-size: 0.8125rem;
1175
+ font-weight: 600;
1176
+ color: #161616;
1177
+ min-width: 38px;
1178
+ }
1179
+
1180
+ &-track {
1181
+ display: inline-block;
1182
+ flex: 1;
1183
+ height: 6px;
1184
+ border-radius: 3px;
1185
+ background-color: #e0e0e0;
1186
+ overflow: hidden;
1187
+ }
1188
+
1189
+ &-fill {
1190
+ display: block;
1191
+ height: 100%;
1192
+ border-radius: 3px;
1193
+ background-color: #198038;
1194
+ }
1195
+ }
1196
+
1197
+ .table-renderer__footer {
1198
+ display: flex;
1199
+ align-items: center;
1200
+ justify-content: space-between;
1201
+ gap: 0.75rem;
1202
+ padding-top: 0.75rem;
1203
+ border-top: 1px solid #f0f0f0;
1204
+
1205
+ &-count {
1206
+ font-size: 0.75rem;
1207
+ color: #6f6f6f;
1208
+ }
1209
+
1210
+ &-link {
1211
+ display: inline-flex;
1212
+ align-items: center;
1213
+ gap: 0.25rem;
1214
+ font-size: 0.8125rem;
1215
+ font-weight: 600;
1216
+ color: #0f62fe;
1217
+ text-decoration: none;
1218
+
1219
+ &:hover {
1220
+ text-decoration: underline;
1221
+ }
1222
+ }
1223
+ }
1224
+
1225
+ /* Widget #8: datetime with relative-time subline */
1226
+ .details-renderer__timestamp {
1227
+ display: flex;
1228
+ flex-direction: column;
1229
+ gap: 0.125rem;
1230
+ }
1231
+
1232
+ .details-renderer__timestamp-sub {
1233
+ font-size: 0.75rem;
1234
+ color: #6f6f6f;
1235
+ }
1236
+
1237
+ /* Widget #7: summary badges sit on their own line */
1238
+ .monitor-summary-card__metric-value .cds--tag {
1239
+ margin: 0;
1240
+ }
1241
+
1242
+ [data-theme='dark'] {
1243
+ .monitor-empty-state__icon--success {
1244
+ color: #42be65;
1245
+ }
1246
+
1247
+ .monitor-empty-state__icon--critical {
1248
+ color: #fa4d56;
1249
+ }
1250
+
1251
+ .monitor-empty-state__icon--warning {
1252
+ color: #f1c21b;
1253
+ }
1254
+
1255
+ .monitor-empty-state__icon--info {
1256
+ color: #4589ff;
1257
+ }
1258
+
1259
+ .table-renderer__progress-label {
1260
+ color: #f4f4f4;
1261
+ }
1262
+
1263
+ .table-renderer__progress-track {
1264
+ background-color: #393939;
1265
+ }
1266
+
1267
+ .table-renderer__footer {
1268
+ border-top-color: #393939;
1269
+
1270
+ &-count {
1271
+ color: #8d8d8d;
1272
+ }
1273
+ }
1274
+
1275
+ .table-renderer__footer-link {
1276
+ color: #78a9ff;
1277
+ }
1278
+
1279
+ .details-renderer__timestamp-sub {
1280
+ color: #8d8d8d;
1281
+ }
1282
+ }
1283
+
1284
+ /* ===== Log / Timeline Card ===== */
1285
+
1286
+ .log-renderer {
1287
+ &__title {
1288
+ margin: 0 0 0.75rem 0;
1289
+ font-size: 1rem;
1290
+ font-weight: 600;
1291
+ color: #161616;
1292
+ }
1293
+
1294
+ &__empty {
1295
+ padding: 1rem 0;
1296
+ font-size: 0.8125rem;
1297
+ color: #8d8d8d;
1298
+ }
1299
+
1300
+ &__timeline {
1301
+ list-style: none;
1302
+ margin: 0;
1303
+ padding: 0;
1304
+ }
1305
+
1306
+ &__entry {
1307
+ position: relative;
1308
+ display: flex;
1309
+ align-items: baseline;
1310
+ gap: 0.75rem;
1311
+ padding: 0.5rem 0 0.5rem 1.25rem;
1312
+
1313
+ // vertical line
1314
+ &::before {
1315
+ content: '';
1316
+ position: absolute;
1317
+ left: 0;
1318
+ top: 0;
1319
+ bottom: 0;
1320
+ width: 2px;
1321
+ background-color: #e0e0e0;
1322
+ }
1323
+
1324
+ &:first-child::before {
1325
+ top: 50%;
1326
+ }
1327
+
1328
+ &:last-child::before {
1329
+ bottom: 50%;
1330
+ }
1331
+
1332
+ &:only-child::before {
1333
+ display: none;
1334
+ }
1335
+
1336
+ // event dot
1337
+ &::after {
1338
+ content: '';
1339
+ position: absolute;
1340
+ left: -3px;
1341
+ top: 50%;
1342
+ transform: translateY(-50%);
1343
+ width: 8px;
1344
+ height: 8px;
1345
+ border-radius: 50%;
1346
+ background-color: #24a148;
1347
+ box-shadow: 0 0 0 2px #ffffff;
1348
+ }
1349
+ }
1350
+
1351
+ &__time {
1352
+ flex-shrink: 0;
1353
+ min-width: 76px;
1354
+ font-size: 0.75rem;
1355
+ color: #6f6f6f;
1356
+ font-variant-numeric: tabular-nums;
1357
+ }
1358
+
1359
+ &__message {
1360
+ font-size: 0.8125rem;
1361
+ font-weight: 500;
1362
+ color: #161616;
1363
+ min-width: 0;
1364
+ }
1365
+ }
1366
+
1367
+ [data-theme='dark'] {
1368
+ .log-renderer__title,
1369
+ .log-renderer__message {
1370
+ color: #f4f4f4;
1371
+ }
1372
+
1373
+ .log-renderer__time,
1374
+ .log-renderer__empty {
1375
+ color: #8d8d8d;
1376
+ }
1377
+
1378
+ .log-renderer__entry {
1379
+ &::before {
1380
+ background-color: #393939;
1381
+ }
1382
+
1383
+ &::after {
1384
+ background-color: #42be65;
1385
+ box-shadow: 0 0 0 2px #1a1a1a;
1386
+ }
1387
+ }
1388
+ }
1389
+
1390
+ /* ===== Status card header pill (reference sheet: "Running" badge) ===== */
1391
+
1392
+ .status-card-premium__pill {
1393
+ margin-left: auto;
1394
+ padding: 0.25rem 0.625rem;
1395
+ border-radius: 1rem;
1396
+ font-size: 0.75rem;
1397
+ font-weight: 600;
1398
+ background-color: var(--sc-tone-soft, #e0e0e0);
1399
+ color: var(--sc-tone, #525252);
1400
+ white-space: nowrap;
1401
+ }
1402
+
1403
+ /* ===== Time Series Card (widgets/timeseries.png) ===== */
1404
+
1405
+ .time-series-renderer {
1406
+ --ts-accent: #1a7f37;
1407
+ --ts-surface: #ffffff;
1408
+ --ts-grid: #e0e0e0;
1409
+ --ts-muted: #6f6f6f;
1410
+ --ts-up: #24a148;
1411
+ --ts-down: #da1e28;
1412
+
1413
+ &__head {
1414
+ display: flex;
1415
+ align-items: center;
1416
+ gap: 0.75rem;
1417
+ margin-bottom: 0.5rem;
1418
+ }
1419
+
1420
+ &__icon {
1421
+ display: inline-flex;
1422
+ align-items: center;
1423
+ justify-content: center;
1424
+ width: 40px;
1425
+ height: 40px;
1426
+ border-radius: 0.625rem;
1427
+ background-color: rgba(138, 63, 252, 0.1);
1428
+ color: #8a3ffc;
1429
+ flex-shrink: 0;
1430
+ }
1431
+
1432
+ &__head-text {
1433
+ display: flex;
1434
+ flex-direction: column;
1435
+ gap: 0.125rem;
1436
+ min-width: 0;
1437
+ }
1438
+
1439
+ &__label {
1440
+ font-size: 0.8125rem;
1441
+ font-weight: 500;
1442
+ color: #525252;
1443
+ overflow: hidden;
1444
+ text-overflow: ellipsis;
1445
+ white-space: nowrap;
1446
+ }
1447
+
1448
+ &__value {
1449
+ font-size: 1.625rem;
1450
+ font-weight: 700;
1451
+ color: #161616;
1452
+ line-height: 1.1;
1453
+ }
1454
+
1455
+ &__head-delta {
1456
+ display: flex;
1457
+ flex-direction: column;
1458
+ align-items: flex-end;
1459
+ gap: 0.125rem;
1460
+ margin-left: auto;
1461
+ }
1462
+
1463
+ &__delta {
1464
+ font-size: 0.8125rem;
1465
+ font-weight: 600;
1466
+
1467
+ &--up {
1468
+ color: var(--ts-up);
1469
+ }
1470
+
1471
+ &--down {
1472
+ color: var(--ts-down);
1473
+ }
1474
+ }
1475
+
1476
+ &__delta-note {
1477
+ font-size: 0.6875rem;
1478
+ color: #8d8d8d;
1479
+ }
1480
+
1481
+ &__empty {
1482
+ padding: 1rem 0;
1483
+ font-size: 0.8125rem;
1484
+ color: #8d8d8d;
1485
+ }
1486
+
1487
+ &__chart {
1488
+ position: relative;
1489
+
1490
+ svg {
1491
+ display: block;
1492
+ overflow: visible;
1493
+
1494
+ &:focus-visible {
1495
+ outline: 2px solid #0f62fe;
1496
+ outline-offset: 2px;
1497
+ }
1498
+ }
1499
+ }
1500
+
1501
+ // hairline solid gridlines, recessive
1502
+ &__grid {
1503
+ stroke: var(--ts-grid);
1504
+ stroke-width: 1;
1505
+ }
1506
+
1507
+ &__tick {
1508
+ fill: var(--ts-muted);
1509
+ font-size: 10px;
1510
+ font-family: 'IBM Plex Sans', 'Helvetica Neue', Arial, sans-serif;
1511
+ }
1512
+
1513
+ &__crosshair {
1514
+ stroke: var(--ts-muted);
1515
+ stroke-width: 1;
1516
+ }
1517
+
1518
+ // 2px line, round caps, series hue
1519
+ &__line {
1520
+ fill: none;
1521
+ stroke: var(--ts-accent);
1522
+ stroke-width: 2;
1523
+ stroke-linecap: round;
1524
+ stroke-linejoin: round;
1525
+ }
1526
+
1527
+ // series hue wash ~10%
1528
+ &__area {
1529
+ fill: var(--ts-accent);
1530
+ opacity: 0.1;
1531
+ }
1532
+
1533
+ // >=8px dot with a 2px surface ring
1534
+ &__dot {
1535
+ fill: var(--ts-accent);
1536
+ stroke: var(--ts-surface);
1537
+ stroke-width: 2;
1538
+ }
1539
+
1540
+ &__tooltip {
1541
+ position: absolute;
1542
+ transform: translateX(-50%);
1543
+ display: flex;
1544
+ flex-direction: column;
1545
+ align-items: center;
1546
+ gap: 0.125rem;
1547
+ padding: 0.375rem 0.625rem;
1548
+ background: #161616;
1549
+ border-radius: 0.375rem;
1550
+ pointer-events: none;
1551
+ white-space: nowrap;
1552
+ z-index: 3;
1553
+ }
1554
+
1555
+ // values lead, labels follow
1556
+ &__tooltip-value {
1557
+ font-size: 0.8125rem;
1558
+ font-weight: 600;
1559
+ color: #ffffff;
1560
+ }
1561
+
1562
+ &__tooltip-time {
1563
+ font-size: 0.6875rem;
1564
+ color: #c6c6c6;
1565
+ }
1566
+ }
1567
+
1568
+ [data-theme='dark'] {
1569
+ .time-series-renderer {
1570
+ --ts-accent: #42be65;
1571
+ --ts-surface: #1a1a1a;
1572
+ --ts-grid: #393939;
1573
+ --ts-muted: #8d8d8d;
1574
+ --ts-up: #42be65;
1575
+ --ts-down: #fa4d56;
1576
+
1577
+ &__label {
1578
+ color: #a8a8a8;
1579
+ }
1580
+
1581
+ &__value {
1582
+ color: #f4f4f4;
1583
+ }
1584
+
1585
+ &__delta-note {
1586
+ color: #8d8d8d;
1587
+ }
1588
+
1589
+ &__empty {
1590
+ color: #8d8d8d;
1591
+ }
1592
+
1593
+ &__tooltip {
1594
+ background: #262626;
1595
+ }
1596
+ }
1597
+
1598
+ .metrics-grid-renderer__tile {
1599
+ background: #1a1a1a;
1600
+ border-color: #393939;
1601
+ }
1602
+
1603
+ .metrics-grid-renderer__head-title,
1604
+ .metrics-grid-renderer__tile-value {
1605
+ color: #f4f4f4;
1606
+ }
1607
+
1608
+ .metrics-grid-renderer__head-sub,
1609
+ .metrics-grid-renderer__tile-label {
1610
+ color: #8d8d8d;
1611
+ }
1612
+
1613
+ .metrics-grid-renderer__tile-sub {
1614
+ color: #6f6f6f;
1615
+ }
1616
+
1617
+ .metrics-grid-renderer__footer {
1618
+ border-top-color: #393939;
1619
+ color: #8d8d8d;
1620
+ }
1621
+ }