@memberjunction/ng-dashboards 5.38.0 → 5.39.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 (244) hide show
  1. package/README.md +14 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -856
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7841
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  31. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  33. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  35. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  37. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  39. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  41. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
  43. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
  45. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  47. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  49. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  50. package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
  51. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
  53. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  54. package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
  55. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  57. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  58. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  59. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  61. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
  63. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
  65. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  67. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  69. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
  71. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
  73. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  74. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
  75. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
  77. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  78. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
  79. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
  81. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  83. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  85. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
  87. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
  89. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  90. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
  91. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  92. package/dist/AI/components/models/model-management.component.js +209 -208
  93. package/dist/AI/components/models/model-management.component.js.map +1 -1
  94. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  95. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  96. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  97. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  98. package/dist/AI/components/system/system-configuration.component.js +17 -17
  99. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  100. package/dist/AI/components/tags/tags-resource.component.js +550 -532
  101. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  102. package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
  103. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  104. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  105. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  106. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  107. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  108. package/dist/AI/services/cache-metrics.d.ts +50 -0
  109. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  110. package/dist/AI/services/cache-metrics.js +43 -0
  111. package/dist/AI/services/cache-metrics.js.map +1 -0
  112. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  113. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  114. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  115. package/dist/Actions/components/actions-overview.component.js +141 -141
  116. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  117. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  118. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  120. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  122. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  123. package/dist/Admin/admin-data-schema.component.js +2 -2
  124. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  125. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  126. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  127. package/dist/Admin/admin-identity-access.component.js +2 -2
  128. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  129. package/dist/Admin/admin-monitoring.component.js +2 -2
  130. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  131. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  132. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  134. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  135. package/dist/Communication/communication-logs-resource.component.js +72 -50
  136. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  138. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  139. package/dist/Communication/communication-providers-resource.component.js +52 -51
  140. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  141. package/dist/Communication/communication-runs-resource.component.js +39 -38
  142. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  143. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  144. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  145. package/dist/Communication/communication-templates-resource.component.js +92 -89
  146. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  147. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  148. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  149. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  150. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  151. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  152. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  153. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  154. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  155. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  156. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  157. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  158. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  159. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  160. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  161. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  162. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  163. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  164. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  165. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  166. package/dist/DevTools/app-state-inspector.component.js +18 -17
  167. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  168. package/dist/DevTools/class-registry.component.js +88 -85
  169. package/dist/DevTools/class-registry.component.js.map +1 -1
  170. package/dist/DevTools/event-monitor.component.js +155 -150
  171. package/dist/DevTools/event-monitor.component.js.map +1 -1
  172. package/dist/DevTools/graphql-console.component.js +245 -243
  173. package/dist/DevTools/graphql-console.component.js.map +1 -1
  174. package/dist/DevTools/layout-inspector.component.js +18 -17
  175. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  176. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  177. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  178. package/dist/Home/home-dashboard.component.js +2 -2
  179. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  180. package/dist/Integration/components/activity/activity.component.js +236 -229
  181. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  182. package/dist/Integration/components/connections/connections.component.js +390 -389
  183. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  184. package/dist/Integration/components/overview/overview.component.js +2 -2
  185. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
  186. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  187. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
  188. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  189. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  190. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  191. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  192. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  193. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  194. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  195. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  196. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  197. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  198. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  199. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  200. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  201. package/dist/MCP/mcp-dashboard.component.js +443 -438
  202. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  203. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  204. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  205. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  207. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  208. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  209. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  210. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  211. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  212. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  213. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  214. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  215. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  216. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  217. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  218. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  219. package/dist/Testing/components/testing-explorer.component.js +436 -427
  220. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  221. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  222. package/dist/Testing/components/testing-runs.component.js +116 -115
  223. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  224. package/dist/Testing/testing-dashboard.component.js +6 -7
  225. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  226. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  227. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  228. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  229. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  230. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  231. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  232. package/dist/ai-dashboards.module.d.ts +47 -35
  233. package/dist/ai-dashboards.module.d.ts.map +1 -1
  234. package/dist/ai-dashboards.module.js +40 -1
  235. package/dist/ai-dashboards.module.js.map +1 -1
  236. package/dist/communication-dashboards.module.d.ts +1 -1
  237. package/dist/communication-dashboards.module.d.ts.map +1 -1
  238. package/dist/communication-dashboards.module.js +7 -1
  239. package/dist/communication-dashboards.module.js.map +1 -1
  240. package/dist/testing-dashboards.module.d.ts +4 -5
  241. package/dist/testing-dashboards.module.d.ts.map +1 -1
  242. package/dist/testing-dashboards.module.js +7 -5
  243. package/dist/testing-dashboards.module.js.map +1 -1
  244. package/package.json +55 -54
@@ -47,15 +47,19 @@ const _forTrack3 = ($index, $item) => $item.Label;
47
47
  const _forTrack4 = ($index, $item) => $item.When;
48
48
  function TagsResourceComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
49
49
  i0.ɵɵelement(0, "i", 13);
50
- i0.ɵɵtext(1, " Running\u2026 ");
50
+ i0.ɵɵelementStart(1, "span", 14);
51
+ i0.ɵɵtext(2, "Running\u2026");
52
+ i0.ɵɵelementEnd();
51
53
  } }
52
54
  function TagsResourceComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelement(0, "i", 14);
54
- i0.ɵɵtext(1, " Run Tag Health ");
55
+ i0.ɵɵelement(0, "i", 15);
56
+ i0.ɵɵelementStart(1, "span", 14);
57
+ i0.ɵɵtext(2, "Run Tag Health");
58
+ i0.ɵɵelementEnd();
55
59
  } }
56
60
  function TagsResourceComponent_Conditional_11_Case_1_Template(rf, ctx) { if (rf & 1) {
57
61
  const _r1 = i0.ɵɵgetCurrentView();
58
- i0.ɵɵelementStart(0, "input", 17);
62
+ i0.ɵɵelementStart(0, "input", 18);
59
63
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_11_Case_1_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.TagSearchQuery, $event) || (ctx_r1.TagSearchQuery = $event); return i0.ɵɵresetView($event); });
60
64
  i0.ɵɵlistener("input", function TagsResourceComponent_Conditional_11_Case_1_Template_input_input_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FilterTags()); });
61
65
  i0.ɵɵelementEnd();
@@ -65,7 +69,7 @@ function TagsResourceComponent_Conditional_11_Case_1_Template(rf, ctx) { if (rf
65
69
  } }
66
70
  function TagsResourceComponent_Conditional_11_Case_2_Template(rf, ctx) { if (rf & 1) {
67
71
  const _r3 = i0.ɵɵgetCurrentView();
68
- i0.ɵɵelementStart(0, "mj-tab-nav", 18);
72
+ i0.ɵɵelementStart(0, "mj-tab-nav", 19);
69
73
  i0.ɵɵlistener("TabChange", function TagsResourceComponent_Conditional_11_Case_2_Template_mj_tab_nav_TabChange_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTaxSubTabChange($event)); });
70
74
  i0.ɵɵelementEnd();
71
75
  } if (rf & 2) {
@@ -74,7 +78,7 @@ function TagsResourceComponent_Conditional_11_Case_2_Template(rf, ctx) { if (rf
74
78
  } }
75
79
  function TagsResourceComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
76
80
  i0.ɵɵelementStart(0, "div", 7);
77
- i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_11_Case_1_Template, 1, 1, "input", 15)(2, TagsResourceComponent_Conditional_11_Case_2_Template, 1, 2, "mj-tab-nav", 16);
81
+ i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_11_Case_1_Template, 1, 1, "input", 16)(2, TagsResourceComponent_Conditional_11_Case_2_Template, 1, 2, "mj-tab-nav", 17);
78
82
  i0.ɵɵelementEnd();
79
83
  } if (rf & 2) {
80
84
  let tmp_1_0;
@@ -84,63 +88,77 @@ function TagsResourceComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
84
88
  } }
85
89
  function TagsResourceComponent_Case_13_Template(rf, ctx) { if (rf & 1) {
86
90
  const _r4 = i0.ɵɵgetCurrentView();
87
- i0.ɵɵelementStart(0, "button", 19);
91
+ i0.ɵɵelementStart(0, "button", 20);
88
92
  i0.ɵɵlistener("click", function TagsResourceComponent_Case_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.RefreshTaxonomyData()); });
89
- i0.ɵɵelement(1, "i", 20);
90
- i0.ɵɵtext(2, " Refresh ");
91
- i0.ɵɵelementEnd();
93
+ i0.ɵɵelement(1, "i", 21);
94
+ i0.ɵɵelementStart(2, "span", 22);
95
+ i0.ɵɵtext(3, "Refresh");
96
+ i0.ɵɵelementEnd()();
92
97
  } }
93
- function TagsResourceComponent_Case_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
98
+ function TagsResourceComponent_Case_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
94
99
  i0.ɵɵelement(0, "i", 13);
95
- i0.ɵɵtext(1, " Running\u2026 ");
100
+ i0.ɵɵelementStart(1, "span", 22);
101
+ i0.ɵɵtext(2, "Running\u2026");
102
+ i0.ɵɵelementEnd();
96
103
  } }
97
- function TagsResourceComponent_Case_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
98
- i0.ɵɵelement(0, "i", 14);
99
- i0.ɵɵtext(1, " Run Tag Health ");
104
+ function TagsResourceComponent_Case_14_Conditional_6_Template(rf, ctx) { if (rf & 1) {
105
+ i0.ɵɵelement(0, "i", 15);
106
+ i0.ɵɵelementStart(1, "span", 22);
107
+ i0.ɵɵtext(2, "Run Tag Health");
108
+ i0.ɵɵelementEnd();
100
109
  } }
101
110
  function TagsResourceComponent_Case_14_Template(rf, ctx) { if (rf & 1) {
102
111
  const _r5 = i0.ɵɵgetCurrentView();
103
- i0.ɵɵelementStart(0, "button", 19);
112
+ i0.ɵɵelementStart(0, "button", 20);
104
113
  i0.ɵɵlistener("click", function TagsResourceComponent_Case_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadSuggestions()); });
105
- i0.ɵɵelement(1, "i", 20);
106
- i0.ɵɵtext(2, " Refresh ");
107
- i0.ɵɵelementEnd();
108
- i0.ɵɵelementStart(3, "button", 21);
109
- i0.ɵɵlistener("click", function TagsResourceComponent_Case_14_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.RunHealthNow()); });
110
- i0.ɵɵconditionalCreate(4, TagsResourceComponent_Case_14_Conditional_4_Template, 2, 0)(5, TagsResourceComponent_Case_14_Conditional_5_Template, 2, 0);
114
+ i0.ɵɵelement(1, "i", 21);
115
+ i0.ɵɵelementStart(2, "span", 22);
116
+ i0.ɵɵtext(3, "Refresh");
117
+ i0.ɵɵelementEnd()();
118
+ i0.ɵɵelementStart(4, "button", 23);
119
+ i0.ɵɵlistener("click", function TagsResourceComponent_Case_14_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.RunHealthNow()); });
120
+ i0.ɵɵconditionalCreate(5, TagsResourceComponent_Case_14_Conditional_5_Template, 3, 0)(6, TagsResourceComponent_Case_14_Conditional_6_Template, 3, 0);
111
121
  i0.ɵɵelementEnd();
112
122
  } if (rf & 2) {
113
123
  const ctx_r1 = i0.ɵɵnextContext();
114
- i0.ɵɵadvance(3);
124
+ i0.ɵɵadvance(4);
115
125
  i0.ɵɵproperty("disabled", ctx_r1.HealthRunning);
116
126
  i0.ɵɵadvance();
117
- i0.ɵɵconditional(ctx_r1.HealthRunning ? 4 : 5);
127
+ i0.ɵɵconditional(ctx_r1.HealthRunning ? 5 : 6);
118
128
  } }
119
129
  function TagsResourceComponent_Case_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
120
130
  i0.ɵɵelement(0, "i", 13);
121
- i0.ɵɵtext(1, " Rebuilding\u2026 ");
131
+ i0.ɵɵelementStart(1, "span", 22);
132
+ i0.ɵɵtext(2, "Rebuilding\u2026");
133
+ i0.ɵɵelementEnd();
122
134
  } }
123
135
  function TagsResourceComponent_Case_15_Conditional_2_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelement(0, "i", 22);
125
- i0.ɵɵtext(1, " Rebuild stale embeddings ");
136
+ i0.ɵɵelement(0, "i", 24);
137
+ i0.ɵɵelementStart(1, "span", 22);
138
+ i0.ɵɵtext(2, "Rebuild stale embeddings");
139
+ i0.ɵɵelementEnd();
126
140
  } }
127
141
  function TagsResourceComponent_Case_15_Conditional_4_Template(rf, ctx) { if (rf & 1) {
128
142
  i0.ɵɵelement(0, "i", 13);
129
- i0.ɵɵtext(1, " Running\u2026 ");
143
+ i0.ɵɵelementStart(1, "span", 22);
144
+ i0.ɵɵtext(2, "Running\u2026");
145
+ i0.ɵɵelementEnd();
130
146
  } }
131
147
  function TagsResourceComponent_Case_15_Conditional_5_Template(rf, ctx) { if (rf & 1) {
132
- i0.ɵɵelement(0, "i", 23);
133
- i0.ɵɵtext(1, " Run now ");
148
+ i0.ɵɵelement(0, "i", 25);
149
+ i0.ɵɵelementStart(1, "span", 22);
150
+ i0.ɵɵtext(2, "Run now");
151
+ i0.ɵɵelementEnd();
134
152
  } }
135
153
  function TagsResourceComponent_Case_15_Template(rf, ctx) { if (rf & 1) {
136
154
  const _r6 = i0.ɵɵgetCurrentView();
137
155
  i0.ɵɵelementStart(0, "button", 2);
138
156
  i0.ɵɵlistener("click", function TagsResourceComponent_Case_15_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.RebuildEmbeddings()); });
139
- i0.ɵɵconditionalCreate(1, TagsResourceComponent_Case_15_Conditional_1_Template, 2, 0)(2, TagsResourceComponent_Case_15_Conditional_2_Template, 2, 0);
157
+ i0.ɵɵconditionalCreate(1, TagsResourceComponent_Case_15_Conditional_1_Template, 3, 0)(2, TagsResourceComponent_Case_15_Conditional_2_Template, 3, 0);
140
158
  i0.ɵɵelementEnd();
141
- i0.ɵɵelementStart(3, "button", 21);
159
+ i0.ɵɵelementStart(3, "button", 23);
142
160
  i0.ɵɵlistener("click", function TagsResourceComponent_Case_15_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.RunHealthNow()); });
143
- i0.ɵɵconditionalCreate(4, TagsResourceComponent_Case_15_Conditional_4_Template, 2, 0)(5, TagsResourceComponent_Case_15_Conditional_5_Template, 2, 0);
161
+ i0.ɵɵconditionalCreate(4, TagsResourceComponent_Case_15_Conditional_4_Template, 3, 0)(5, TagsResourceComponent_Case_15_Conditional_5_Template, 3, 0);
144
162
  i0.ɵɵelementEnd();
145
163
  } if (rf & 2) {
146
164
  const ctx_r1 = i0.ɵɵnextContext();
@@ -154,27 +172,27 @@ function TagsResourceComponent_Case_15_Template(rf, ctx) { if (rf & 1) {
154
172
  } }
155
173
  function TagsResourceComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
156
174
  i0.ɵɵelementStart(0, "div", 11);
157
- i0.ɵɵelement(1, "mj-loading", 24);
175
+ i0.ɵɵelement(1, "mj-loading", 26);
158
176
  i0.ɵɵelementEnd();
159
177
  } }
160
178
  function TagsResourceComponent_Conditional_19_Conditional_0_For_22_Template(rf, ctx) { if (rf & 1) {
161
179
  const _r7 = i0.ɵɵgetCurrentView();
162
- i0.ɵɵelementStart(0, "tr", 45);
180
+ i0.ɵɵelementStart(0, "tr", 47);
163
181
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_0_For_22_Template_tr_click_0_listener() { const row_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.DrillDownTag(row_r8.Tag)); });
164
- i0.ɵɵelementStart(1, "td", 46);
182
+ i0.ɵɵelementStart(1, "td", 48);
165
183
  i0.ɵɵtext(2);
166
184
  i0.ɵɵelementEnd();
167
185
  i0.ɵɵelementStart(3, "td");
168
186
  i0.ɵɵtext(4);
169
187
  i0.ɵɵelementEnd();
170
- i0.ɵɵelementStart(5, "td")(6, "div", 47)(7, "div", 48);
171
- i0.ɵɵelement(8, "div", 49);
188
+ i0.ɵɵelementStart(5, "td")(6, "div", 49)(7, "div", 50);
189
+ i0.ɵɵelement(8, "div", 51);
172
190
  i0.ɵɵelementEnd();
173
- i0.ɵɵelementStart(9, "span", 50);
191
+ i0.ɵɵelementStart(9, "span", 52);
174
192
  i0.ɵɵtext(10);
175
193
  i0.ɵɵelementEnd()()();
176
- i0.ɵɵelementStart(11, "td")(12, "div", 51);
177
- i0.ɵɵelement(13, "div", 52);
194
+ i0.ɵɵelementStart(11, "td")(12, "div", 53);
195
+ i0.ɵɵelement(13, "div", 54);
178
196
  i0.ɵɵelementEnd()();
179
197
  i0.ɵɵelementStart(14, "td");
180
198
  i0.ɵɵtext(15);
@@ -203,13 +221,13 @@ function TagsResourceComponent_Conditional_19_Conditional_0_For_22_Template(rf,
203
221
  i0.ɵɵtextInterpolate(row_r8.FirstSeen);
204
222
  } }
205
223
  function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_8_Template(rf, ctx) { if (rf & 1) {
206
- i0.ɵɵelementStart(0, "div", 59)(1, "p");
224
+ i0.ɵɵelementStart(0, "div", 61)(1, "p");
207
225
  i0.ɵɵtext(2, "No content items found for this tag.");
208
226
  i0.ɵɵelementEnd()();
209
227
  } }
210
228
  function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_9_For_13_Template(rf, ctx) { if (rf & 1) {
211
229
  const _r10 = i0.ɵɵgetCurrentView();
212
- i0.ɵɵelementStart(0, "tr", 45);
230
+ i0.ɵɵelementStart(0, "tr", 47);
213
231
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_9_For_13_Template_tr_click_0_listener() { const di_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OpenItemDetailByID(di_r11.ID)); });
214
232
  i0.ɵɵelementStart(1, "td");
215
233
  i0.ɵɵtext(2);
@@ -236,7 +254,7 @@ function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Condi
236
254
  i0.ɵɵtextInterpolate(di_r11.UpdatedAt);
237
255
  } }
238
256
  function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_9_Template(rf, ctx) { if (rf & 1) {
239
- i0.ɵɵelementStart(0, "table", 31)(1, "thead")(2, "tr")(3, "th");
257
+ i0.ɵɵelementStart(0, "table", 33)(1, "thead")(2, "tr")(3, "th");
240
258
  i0.ɵɵtext(4, "Name");
241
259
  i0.ɵɵelementEnd();
242
260
  i0.ɵɵelementStart(5, "th");
@@ -249,7 +267,7 @@ function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Condi
249
267
  i0.ɵɵtext(10, "Updated");
250
268
  i0.ɵɵelementEnd()()();
251
269
  i0.ɵɵelementStart(11, "tbody");
252
- i0.ɵɵrepeaterCreate(12, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_9_For_13_Template, 9, 4, "tr", 60, _forTrack2);
270
+ i0.ɵɵrepeaterCreate(12, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_9_For_13_Template, 9, 4, "tr", 62, _forTrack2);
253
271
  i0.ɵɵelementEnd()();
254
272
  } if (rf & 2) {
255
273
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -258,16 +276,16 @@ function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Condi
258
276
  } }
259
277
  function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Template(rf, ctx) { if (rf & 1) {
260
278
  const _r9 = i0.ɵɵgetCurrentView();
261
- i0.ɵɵelementStart(0, "div", 33)(1, "div", 53)(2, "span", 54);
262
- i0.ɵɵelement(3, "i", 55);
279
+ i0.ɵɵelementStart(0, "div", 35)(1, "div", 55)(2, "span", 56);
280
+ i0.ɵɵelement(3, "i", 57);
263
281
  i0.ɵɵtext(4);
264
282
  i0.ɵɵelementEnd();
265
- i0.ɵɵelementStart(5, "button", 56);
283
+ i0.ɵɵelementStart(5, "button", 58);
266
284
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseDrillDownTag()); });
267
- i0.ɵɵelement(6, "i", 57);
285
+ i0.ɵɵelement(6, "i", 59);
268
286
  i0.ɵɵelementEnd()();
269
- i0.ɵɵelementStart(7, "div", 58);
270
- i0.ɵɵconditionalCreate(8, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_8_Template, 3, 0, "div", 59)(9, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_9_Template, 14, 0, "table", 31);
287
+ i0.ɵɵelementStart(7, "div", 60);
288
+ i0.ɵɵconditionalCreate(8, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_8_Template, 3, 0, "div", 61)(9, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Conditional_9_Template, 14, 0, "table", 33);
271
289
  i0.ɵɵelementEnd()();
272
290
  } if (rf & 2) {
273
291
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -277,18 +295,18 @@ function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Templ
277
295
  i0.ɵɵconditional(ctx_r1.TagDrillDownItems.length === 0 ? 8 : 9);
278
296
  } }
279
297
  function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_29_Template(rf, ctx) { if (rf & 1) {
280
- i0.ɵɵelement(0, "mj-word-cloud", 38);
298
+ i0.ɵɵelement(0, "mj-word-cloud", 40);
281
299
  } if (rf & 2) {
282
300
  const ctx_r1 = i0.ɵɵnextContext(3);
283
301
  i0.ɵɵproperty("Items", ctx_r1.TagCloudWordItems)("MaxFontSize", 40)("MinFontSize", 12)("MaxItems", 20)("Interactive", true)("Animate", true);
284
302
  } }
285
303
  function TagsResourceComponent_Conditional_19_Conditional_0_Conditional_30_Template(rf, ctx) { if (rf & 1) {
286
- i0.ɵɵelementStart(0, "div", 39);
304
+ i0.ɵɵelementStart(0, "div", 41);
287
305
  i0.ɵɵtext(1, "No tags yet");
288
306
  i0.ɵɵelementEnd();
289
307
  } }
290
308
  function TagsResourceComponent_Conditional_19_Conditional_0_For_37_Template(rf, ctx) { if (rf & 1) {
291
- i0.ɵɵelementStart(0, "div", 44)(1, "span");
309
+ i0.ɵɵelementStart(0, "div", 46)(1, "span");
292
310
  i0.ɵɵtext(2);
293
311
  i0.ɵɵelementEnd();
294
312
  i0.ɵɵelementStart(3, "strong");
@@ -302,7 +320,7 @@ function TagsResourceComponent_Conditional_19_Conditional_0_For_37_Template(rf,
302
320
  i0.ɵɵtextInterpolate(s_r12.Count);
303
321
  } }
304
322
  function TagsResourceComponent_Conditional_19_Conditional_0_Template(rf, ctx) { if (rf & 1) {
305
- i0.ɵɵelementStart(0, "div", 25)(1, "div", 27)(2, "div", 28)(3, "div", 29)(4, "div", 30)(5, "table", 31)(6, "thead")(7, "tr")(8, "th");
323
+ i0.ɵɵelementStart(0, "div", 27)(1, "div", 29)(2, "div", 30)(3, "div", 31)(4, "div", 32)(5, "table", 33)(6, "thead")(7, "tr")(8, "th");
306
324
  i0.ɵɵtext(9, "Tag");
307
325
  i0.ɵɵelementEnd();
308
326
  i0.ɵɵelementStart(10, "th");
@@ -321,22 +339,22 @@ function TagsResourceComponent_Conditional_19_Conditional_0_Template(rf, ctx) {
321
339
  i0.ɵɵtext(19, "First Seen");
322
340
  i0.ɵɵelementEnd()()();
323
341
  i0.ɵɵelementStart(20, "tbody");
324
- i0.ɵɵrepeaterCreate(21, TagsResourceComponent_Conditional_19_Conditional_0_For_22_Template, 18, 17, "tr", 32, _forTrack0);
342
+ i0.ɵɵrepeaterCreate(21, TagsResourceComponent_Conditional_19_Conditional_0_For_22_Template, 18, 17, "tr", 34, _forTrack0);
325
343
  i0.ɵɵelementEnd()()()();
326
- i0.ɵɵconditionalCreate(23, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Template, 10, 3, "div", 33);
344
+ i0.ɵɵconditionalCreate(23, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_23_Template, 10, 3, "div", 35);
327
345
  i0.ɵɵelementEnd();
328
- i0.ɵɵelementStart(24, "div", 34)(25, "div", 35)(26, "div", 36);
329
- i0.ɵɵelement(27, "i", 37);
346
+ i0.ɵɵelementStart(24, "div", 36)(25, "div", 37)(26, "div", 38);
347
+ i0.ɵɵelement(27, "i", 39);
330
348
  i0.ɵɵtext(28, " Tag Cloud");
331
349
  i0.ɵɵelementEnd();
332
- i0.ɵɵconditionalCreate(29, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_29_Template, 1, 6, "mj-word-cloud", 38)(30, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_30_Template, 2, 0, "div", 39);
350
+ i0.ɵɵconditionalCreate(29, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_29_Template, 1, 6, "mj-word-cloud", 40)(30, TagsResourceComponent_Conditional_19_Conditional_0_Conditional_30_Template, 2, 0, "div", 41);
333
351
  i0.ɵɵelementEnd();
334
- i0.ɵɵelementStart(31, "div", 40)(32, "div", 41);
335
- i0.ɵɵelement(33, "i", 42);
352
+ i0.ɵɵelementStart(31, "div", 42)(32, "div", 43);
353
+ i0.ɵɵelement(33, "i", 44);
336
354
  i0.ɵɵtext(34, " By Source");
337
355
  i0.ɵɵelementEnd();
338
- i0.ɵɵelementStart(35, "div", 43);
339
- i0.ɵɵrepeaterCreate(36, TagsResourceComponent_Conditional_19_Conditional_0_For_37_Template, 5, 2, "div", 44, _forTrack1);
356
+ i0.ɵɵelementStart(35, "div", 45);
357
+ i0.ɵɵrepeaterCreate(36, TagsResourceComponent_Conditional_19_Conditional_0_For_37_Template, 5, 2, "div", 46, _forTrack1);
340
358
  i0.ɵɵelementEnd()()()()();
341
359
  } if (rf & 2) {
342
360
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -350,15 +368,15 @@ function TagsResourceComponent_Conditional_19_Conditional_0_Template(rf, ctx) {
350
368
  i0.ɵɵrepeater(ctx_r1.TagsBySource);
351
369
  } }
352
370
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
353
- i0.ɵɵelementStart(0, "div", 59);
354
- i0.ɵɵelement(1, "i", 88);
371
+ i0.ɵɵelementStart(0, "div", 61);
372
+ i0.ɵɵelement(1, "i", 90);
355
373
  i0.ɵɵelementStart(2, "p");
356
374
  i0.ɵɵtext(3, "No tags found");
357
375
  i0.ɵɵelementEnd()();
358
376
  } }
359
377
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
360
378
  const _r16 = i0.ɵɵgetCurrentView();
361
- i0.ɵɵelementStart(0, "input", 96);
379
+ i0.ɵɵelementStart(0, "input", 98);
362
380
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Conditional_1_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r16); const node_r15 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ToggleNodeSelection(node_r15, $event)); });
363
381
  i0.ɵɵelementEnd();
364
382
  } if (rf & 2) {
@@ -368,22 +386,22 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11
368
386
  } }
369
387
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template(rf, ctx) { if (rf & 1) {
370
388
  const _r14 = i0.ɵɵgetCurrentView();
371
- i0.ɵɵelementStart(0, "div", 89);
389
+ i0.ɵɵelementStart(0, "div", 91);
372
390
  i0.ɵɵlistener("dragstart", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template_div_dragstart_0_listener($event) { const node_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnTreeNodeDragStart($event, node_r15)); })("dragover", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template_div_dragover_0_listener($event) { const node_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnTreeNodeDragOver($event, node_r15)); })("dragleave", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template_div_dragleave_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnTreeNodeDragLeave()); })("drop", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template_div_drop_0_listener($event) { const node_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.OnTreeNodeDrop($event, node_r15); return i0.ɵɵresetView($event.stopPropagation()); })("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template_div_click_0_listener() { const node_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectTaxNode(node_r15)); });
373
- i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Conditional_1_Template, 1, 1, "input", 90);
374
- i0.ɵɵelementStart(2, "span", 91);
391
+ i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Conditional_1_Template, 1, 1, "input", 92);
392
+ i0.ɵɵelementStart(2, "span", 93);
375
393
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template_span_click_2_listener($event) { const node_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.ToggleTaxNode(node_r15); return i0.ɵɵresetView($event.stopPropagation()); });
376
394
  i0.ɵɵelementEnd();
377
- i0.ɵɵelement(3, "span", 92);
378
- i0.ɵɵelementStart(4, "span", 93);
395
+ i0.ɵɵelement(3, "span", 94);
396
+ i0.ɵɵelementStart(4, "span", 95);
379
397
  i0.ɵɵtext(5);
380
398
  i0.ɵɵelementEnd();
381
- i0.ɵɵelementStart(6, "span", 94);
399
+ i0.ɵɵelementStart(6, "span", 96);
382
400
  i0.ɵɵtext(7);
383
401
  i0.ɵɵelementEnd();
384
- i0.ɵɵelementStart(8, "span", 95);
402
+ i0.ɵɵelementStart(8, "span", 97);
385
403
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template_span_click_8_listener($event) { const node_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.OpenCreateChildTagFor(node_r15); return i0.ɵɵresetView($event.stopPropagation()); });
386
- i0.ɵɵelement(9, "i", 66);
404
+ i0.ɵɵelement(9, "i", 68);
387
405
  i0.ɵɵelementEnd()();
388
406
  } if (rf & 2) {
389
407
  const node_r15 = ctx.$implicit;
@@ -405,17 +423,17 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11
405
423
  i0.ɵɵtextInterpolate1("(", node_r15.ItemCount, ")");
406
424
  } }
407
425
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
408
- i0.ɵɵelementStart(0, "div", 71);
409
- i0.ɵɵelement(1, "mj-loading", 97);
426
+ i0.ɵɵelementStart(0, "div", 73);
427
+ i0.ɵɵelement(1, "mj-loading", 99);
410
428
  i0.ɵɵelementEnd();
411
429
  } }
412
430
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_For_3_Template(rf, ctx) { if (rf & 1) {
413
431
  const _r17 = i0.ɵɵgetCurrentView();
414
- i0.ɵɵelementStart(0, "span", 109);
432
+ i0.ɵɵelementStart(0, "span", 111);
415
433
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_For_3_Template_span_click_0_listener() { const bc_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.NavigateToBreadcrumb(bc_r18.ID)); });
416
434
  i0.ɵɵtext(1);
417
435
  i0.ɵɵelementEnd();
418
- i0.ɵɵelementStart(2, "span", 110);
436
+ i0.ɵɵelementStart(2, "span", 112);
419
437
  i0.ɵɵtext(3, "\u203A");
420
438
  i0.ɵɵelementEnd();
421
439
  } if (rf & 2) {
@@ -424,7 +442,7 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
424
442
  i0.ɵɵtextInterpolate(bc_r18.Name);
425
443
  } }
426
444
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
427
- i0.ɵɵelementStart(0, "div", 114);
445
+ i0.ɵɵelementStart(0, "div", 116);
428
446
  i0.ɵɵtext(1);
429
447
  i0.ɵɵelementEnd();
430
448
  } if (rf & 2) {
@@ -434,13 +452,13 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
434
452
  } }
435
453
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_6_Template(rf, ctx) { if (rf & 1) {
436
454
  const _r19 = i0.ɵɵgetCurrentView();
437
- i0.ɵɵelementStart(0, "div", 111);
455
+ i0.ɵɵelementStart(0, "div", 113);
438
456
  i0.ɵɵtext(1);
439
- i0.ɵɵelementStart(2, "span", 112);
457
+ i0.ɵɵelementStart(2, "span", 114);
440
458
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_6_Template_span_click_2_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.StartEditTag()); });
441
- i0.ɵɵelement(3, "i", 113);
459
+ i0.ɵɵelement(3, "i", 115);
442
460
  i0.ɵɵelementEnd()();
443
- i0.ɵɵconditionalCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_6_Conditional_4_Template, 2, 1, "div", 114);
461
+ i0.ɵɵconditionalCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_6_Conditional_4_Template, 2, 1, "div", 116);
444
462
  } if (rf & 2) {
445
463
  const ctx_r1 = i0.ɵɵnextContext(5);
446
464
  i0.ɵɵadvance();
@@ -450,23 +468,23 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
450
468
  } }
451
469
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_7_Template(rf, ctx) { if (rf & 1) {
452
470
  const _r20 = i0.ɵɵgetCurrentView();
453
- i0.ɵɵelementStart(0, "div", 101)(1, "div", 115)(2, "label", 116);
471
+ i0.ɵɵelementStart(0, "div", 103)(1, "div", 117)(2, "label", 118);
454
472
  i0.ɵɵtext(3, "Name");
455
473
  i0.ɵɵelementEnd();
456
- i0.ɵɵelementStart(4, "input", 117);
474
+ i0.ɵɵelementStart(4, "input", 119);
457
475
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_7_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(5); i0.ɵɵtwoWayBindingSet(ctx_r1.TaxEditName, $event) || (ctx_r1.TaxEditName = $event); return i0.ɵɵresetView($event); });
458
476
  i0.ɵɵelementEnd()();
459
- i0.ɵɵelementStart(5, "div", 115)(6, "label", 116);
477
+ i0.ɵɵelementStart(5, "div", 117)(6, "label", 118);
460
478
  i0.ɵɵtext(7, "Description");
461
479
  i0.ɵɵelementEnd();
462
- i0.ɵɵelementStart(8, "textarea", 118);
480
+ i0.ɵɵelementStart(8, "textarea", 120);
463
481
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_7_Template_textarea_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(5); i0.ɵɵtwoWayBindingSet(ctx_r1.TaxEditDescription, $event) || (ctx_r1.TaxEditDescription = $event); return i0.ɵɵresetView($event); });
464
482
  i0.ɵɵelementEnd()();
465
- i0.ɵɵelementStart(9, "div", 119)(10, "button", 120);
483
+ i0.ɵɵelementStart(9, "div", 121)(10, "button", 122);
466
484
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_7_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.SaveEditTag()); });
467
485
  i0.ɵɵtext(11, "Save");
468
486
  i0.ɵɵelementEnd();
469
- i0.ɵɵelementStart(12, "button", 121);
487
+ i0.ɵɵelementStart(12, "button", 123);
470
488
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_7_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.CancelEditTag()); });
471
489
  i0.ɵɵtext(13, "Cancel");
472
490
  i0.ɵɵelementEnd()()();
@@ -479,43 +497,43 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
479
497
  } }
480
498
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template(rf, ctx) { if (rf & 1) {
481
499
  const _r21 = i0.ɵɵgetCurrentView();
482
- i0.ɵɵelementStart(0, "div", 107)(1, "button", 122);
500
+ i0.ɵɵelementStart(0, "div", 109)(1, "button", 124);
483
501
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OpenCreateChildTag()); });
484
- i0.ɵɵelement(2, "i", 66);
502
+ i0.ɵɵelement(2, "i", 68);
485
503
  i0.ɵɵtext(3, " Add Child");
486
504
  i0.ɵɵelementEnd();
487
- i0.ɵɵelementStart(4, "button", 122);
505
+ i0.ɵɵelementStart(4, "button", 124);
488
506
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.StartEditTag()); });
489
- i0.ɵɵelement(5, "i", 113);
507
+ i0.ɵɵelement(5, "i", 115);
490
508
  i0.ɵɵtext(6, " Rename");
491
509
  i0.ɵɵelementEnd();
492
- i0.ɵɵelementStart(7, "button", 122);
510
+ i0.ɵɵelementStart(7, "button", 124);
493
511
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OpenMoveDialog(ctx_r1.TaxSelectedNode)); });
494
- i0.ɵɵelement(8, "i", 123);
512
+ i0.ɵɵelement(8, "i", 125);
495
513
  i0.ɵɵtext(9, " Move");
496
514
  i0.ɵɵelementEnd();
497
- i0.ɵɵelementStart(10, "button", 122);
515
+ i0.ɵɵelementStart(10, "button", 124);
498
516
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OpenMergeIntoDialog(ctx_r1.TaxSelectedNode)); });
499
- i0.ɵɵelement(11, "i", 124);
517
+ i0.ɵɵelement(11, "i", 126);
500
518
  i0.ɵɵtext(12, " Merge Into...");
501
519
  i0.ɵɵelementEnd();
502
- i0.ɵɵelementStart(13, "button", 122);
520
+ i0.ɵɵelementStart(13, "button", 124);
503
521
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OpenSplitDialog(ctx_r1.TaxSelectedNode)); });
504
- i0.ɵɵelement(14, "i", 125);
522
+ i0.ɵɵelement(14, "i", 127);
505
523
  i0.ɵɵtext(15, " Split");
506
524
  i0.ɵɵelementEnd();
507
- i0.ɵɵelementStart(16, "button", 126);
525
+ i0.ɵɵelementStart(16, "button", 128);
508
526
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.DeleteTag(ctx_r1.TaxSelectedNode)); });
509
- i0.ɵɵelement(17, "i", 127);
527
+ i0.ɵɵelement(17, "i", 129);
510
528
  i0.ɵɵtext(18, " Delete");
511
529
  i0.ɵɵelementEnd()();
512
530
  } }
513
531
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_35_For_5_Template(rf, ctx) { if (rf & 1) {
514
532
  const _r22 = i0.ɵɵgetCurrentView();
515
- i0.ɵɵelementStart(0, "span", 131);
533
+ i0.ɵɵelementStart(0, "span", 133);
516
534
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_35_For_5_Template_span_click_0_listener() { const child_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.SelectTaxNode(child_r23)); });
517
535
  i0.ɵɵtext(1);
518
- i0.ɵɵelementStart(2, "span", 132);
536
+ i0.ɵɵelementStart(2, "span", 134);
519
537
  i0.ɵɵtext(3);
520
538
  i0.ɵɵelementEnd()();
521
539
  } if (rf & 2) {
@@ -526,11 +544,11 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
526
544
  i0.ɵɵtextInterpolate(child_r23.ItemCount);
527
545
  } }
528
546
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_35_Template(rf, ctx) { if (rf & 1) {
529
- i0.ɵɵelementStart(0, "div", 108)(1, "div", 128);
547
+ i0.ɵɵelementStart(0, "div", 110)(1, "div", 130);
530
548
  i0.ɵɵtext(2, "Child Tags");
531
549
  i0.ɵɵelementEnd();
532
- i0.ɵɵelementStart(3, "div", 129);
533
- i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_35_For_5_Template, 4, 2, "span", 130, _forTrack2);
550
+ i0.ɵɵelementStart(3, "div", 131);
551
+ i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_35_For_5_Template, 4, 2, "span", 132, _forTrack2);
534
552
  i0.ɵɵelementEnd()();
535
553
  } if (rf & 2) {
536
554
  const ctx_r1 = i0.ɵɵnextContext(5);
@@ -538,16 +556,16 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
538
556
  i0.ɵɵrepeater(ctx_r1.TaxSelectedNode.Children);
539
557
  } }
540
558
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_36_For_5_Template(rf, ctx) { if (rf & 1) {
541
- i0.ɵɵelementStart(0, "div", 134)(1, "div", 135);
559
+ i0.ɵɵelementStart(0, "div", 136)(1, "div", 137);
542
560
  i0.ɵɵelement(2, "i");
543
561
  i0.ɵɵelementEnd();
544
- i0.ɵɵelementStart(3, "div", 136);
562
+ i0.ɵɵelementStart(3, "div", 138);
545
563
  i0.ɵɵtext(4);
546
564
  i0.ɵɵelementEnd();
547
- i0.ɵɵelementStart(5, "div", 137);
565
+ i0.ɵɵelementStart(5, "div", 139);
548
566
  i0.ɵɵtext(6);
549
567
  i0.ɵɵelementEnd();
550
- i0.ɵɵelementStart(7, "div", 138);
568
+ i0.ɵɵelementStart(7, "div", 140);
551
569
  i0.ɵɵtext(8);
552
570
  i0.ɵɵelementEnd()();
553
571
  } if (rf & 2) {
@@ -562,11 +580,11 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
562
580
  i0.ɵɵtextInterpolate(item_r24.Date);
563
581
  } }
564
582
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_36_Template(rf, ctx) { if (rf & 1) {
565
- i0.ɵɵelementStart(0, "div", 108)(1, "div", 128);
583
+ i0.ɵɵelementStart(0, "div", 110)(1, "div", 130);
566
584
  i0.ɵɵtext(2, "Recently Tagged Items");
567
585
  i0.ɵɵelementEnd();
568
- i0.ɵɵelementStart(3, "div", 133);
569
- i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_36_For_5_Template, 9, 5, "div", 134, i0.ɵɵrepeaterTrackByIndex);
586
+ i0.ɵɵelementStart(3, "div", 135);
587
+ i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_36_For_5_Template, 9, 5, "div", 136, i0.ɵɵrepeaterTrackByIndex);
570
588
  i0.ɵɵelementEnd()();
571
589
  } if (rf & 2) {
572
590
  const ctx_r1 = i0.ɵɵnextContext(5);
@@ -579,7 +597,7 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
579
597
  i0.ɵɵelementEnd();
580
598
  } }
581
599
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_For_56_Template(rf, ctx) { if (rf & 1) {
582
- i0.ɵɵelementStart(0, "span", 150);
600
+ i0.ɵɵelementStart(0, "span", 152);
583
601
  i0.ɵɵtext(1);
584
602
  i0.ɵɵelementEnd();
585
603
  } if (rf & 2) {
@@ -588,7 +606,7 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
588
606
  i0.ɵɵtextInterpolate2("", s_r26.EntityName, " \u00B7 ", s_r26.DisplayName);
589
607
  } }
590
608
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_57_Template(rf, ctx) { if (rf & 1) {
591
- i0.ɵɵelementStart(0, "span", 151);
609
+ i0.ɵɵelementStart(0, "span", 153);
592
610
  i0.ɵɵtext(1);
593
611
  i0.ɵɵelementEnd();
594
612
  } if (rf & 2) {
@@ -597,21 +615,21 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
597
615
  i0.ɵɵtextInterpolate1(" No scope rows. ", ctx_r1.SelectedTagFull.IsGlobal ? "Tag is global." : "Tag is non-global with no scope \u2014 currently unreachable.", " ");
598
616
  } }
599
617
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_80_Template(rf, ctx) { if (rf & 1) {
600
- i0.ɵɵelementStart(0, "div", 151);
618
+ i0.ɵɵelementStart(0, "div", 153);
601
619
  i0.ɵɵtext(1, "No synonyms yet.");
602
620
  i0.ɵɵelementEnd();
603
621
  } }
604
622
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_81_For_1_Template(rf, ctx) { if (rf & 1) {
605
623
  const _r27 = i0.ɵɵgetCurrentView();
606
- i0.ɵɵelementStart(0, "div", 165)(1, "div", 166);
624
+ i0.ɵɵelementStart(0, "div", 167)(1, "div", 168);
607
625
  i0.ɵɵtext(2);
608
626
  i0.ɵɵelementEnd();
609
627
  i0.ɵɵelementStart(3, "span");
610
628
  i0.ɵɵtext(4);
611
629
  i0.ɵɵelementEnd();
612
- i0.ɵɵelementStart(5, "span", 167);
630
+ i0.ɵɵelementStart(5, "span", 169);
613
631
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_81_For_1_Template_span_click_5_listener() { const s_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.RemoveSynonym(s_r28)); });
614
- i0.ɵɵelement(6, "i", 168);
632
+ i0.ɵɵelement(6, "i", 170);
615
633
  i0.ɵɵelementEnd()();
616
634
  } if (rf & 2) {
617
635
  const s_r28 = ctx.$implicit;
@@ -624,121 +642,121 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
624
642
  i0.ɵɵtextInterpolate(s_r28.Source);
625
643
  } }
626
644
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_81_Template(rf, ctx) { if (rf & 1) {
627
- i0.ɵɵrepeaterCreate(0, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_81_For_1_Template, 7, 7, "div", 164, _forTrack2);
645
+ i0.ɵɵrepeaterCreate(0, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_81_For_1_Template, 7, 7, "div", 166, _forTrack2);
628
646
  } if (rf & 2) {
629
647
  const ctx_r1 = i0.ɵɵnextContext(6);
630
648
  i0.ɵɵrepeater(ctx_r1.SelectedTagSynonyms);
631
649
  } }
632
650
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template(rf, ctx) { if (rf & 1) {
633
651
  const _r25 = i0.ɵɵgetCurrentView();
634
- i0.ɵɵelementStart(0, "div", 108)(1, "div", 128);
652
+ i0.ɵɵelementStart(0, "div", 110)(1, "div", 130);
635
653
  i0.ɵɵtext(2, "Governance \u2014 how the autotagger may grow this subtree");
636
654
  i0.ɵɵelementEnd();
637
- i0.ɵɵelementStart(3, "div", 139)(4, "div", 140)(5, "span", 141);
655
+ i0.ɵɵelementStart(3, "div", 141)(4, "div", 142)(5, "span", 143);
638
656
  i0.ɵɵtext(6, "Allow auto-grow under this tag");
639
657
  i0.ɵɵelementEnd();
640
- i0.ɵɵelementStart(7, "span", 142);
658
+ i0.ɵɵelementStart(7, "span", 144);
641
659
  i0.ɵɵtext(8, "Lets the classifier create child tags below this one. Off = constrained subtree.");
642
660
  i0.ɵɵelementEnd()();
643
- i0.ɵɵelementStart(9, "div", 143);
661
+ i0.ɵɵelementStart(9, "div", 145);
644
662
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_div_click_9_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.ToggleGovernanceFlag("AllowAutoGrow")); });
645
663
  i0.ɵɵelementEnd()();
646
- i0.ɵɵelementStart(10, "div", 139)(11, "div", 140)(12, "span", 141);
664
+ i0.ɵɵelementStart(10, "div", 141)(11, "div", 142)(12, "span", 143);
647
665
  i0.ɵɵtext(13, "Freeze this subtree");
648
666
  i0.ɵɵelementEnd();
649
- i0.ɵɵelementStart(14, "span", 142);
667
+ i0.ɵɵelementStart(14, "span", 144);
650
668
  i0.ɵɵtext(15, "Locks this entire subtree against auto-creation, regardless of mode.");
651
669
  i0.ɵɵelementEnd()();
652
- i0.ɵɵelementStart(16, "div", 143);
670
+ i0.ɵɵelementStart(16, "div", 145);
653
671
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_div_click_16_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.ToggleGovernanceFlag("IsFrozen")); });
654
672
  i0.ɵɵelementEnd()();
655
- i0.ɵɵelementStart(17, "div", 139)(18, "div", 140)(19, "span", 141);
673
+ i0.ɵɵelementStart(17, "div", 141)(18, "div", 142)(19, "span", 143);
656
674
  i0.ɵɵtext(20, "Requires review for matches");
657
675
  i0.ɵɵelementEnd();
658
- i0.ɵɵelementStart(21, "span", 142);
676
+ i0.ɵɵelementStart(21, "span", 144);
659
677
  i0.ɵɵtext(22, "High-confidence matches against this tag are routed to the suggestion queue first.");
660
678
  i0.ɵɵelementEnd()();
661
- i0.ɵɵelementStart(23, "div", 143);
679
+ i0.ɵɵelementStart(23, "div", 145);
662
680
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_div_click_23_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.ToggleGovernanceFlag("RequiresReview")); });
663
681
  i0.ɵɵelementEnd()();
664
- i0.ɵɵelementStart(24, "div", 144)(25, "div", 145)(26, "label");
682
+ i0.ɵɵelementStart(24, "div", 146)(25, "div", 147)(26, "label");
665
683
  i0.ɵɵtext(27, "Max children");
666
684
  i0.ɵɵelementEnd();
667
- i0.ɵɵelementStart(28, "input", 146);
685
+ i0.ɵɵelementStart(28, "input", 148);
668
686
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_input_change_28_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.SaveSelectedTagNumber("MaxChildren", $event.target.value)); });
669
687
  i0.ɵɵelementEnd();
670
- i0.ɵɵelementStart(29, "span", 147);
688
+ i0.ɵɵelementStart(29, "span", 149);
671
689
  i0.ɵɵtext(30, "Hard cap on direct children. Blank = unlimited.");
672
690
  i0.ɵɵelementEnd()();
673
- i0.ɵɵelementStart(31, "div", 145)(32, "label");
691
+ i0.ɵɵelementStart(31, "div", 147)(32, "label");
674
692
  i0.ɵɵtext(33, "Max descendant depth");
675
693
  i0.ɵɵelementEnd();
676
- i0.ɵɵelementStart(34, "input", 146);
694
+ i0.ɵɵelementStart(34, "input", 148);
677
695
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_input_change_34_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.SaveSelectedTagNumber("MaxDescendantDepth", $event.target.value)); });
678
696
  i0.ɵɵelementEnd();
679
- i0.ɵɵelementStart(35, "span", 147);
697
+ i0.ɵɵelementStart(35, "span", 149);
680
698
  i0.ɵɵtext(36, "From this node down. 0 = leaf-only.");
681
699
  i0.ɵɵelementEnd()();
682
- i0.ɵɵelementStart(37, "div", 145)(38, "label");
700
+ i0.ɵɵelementStart(37, "div", 147)(38, "label");
683
701
  i0.ɵɵtext(39, "Min confidence");
684
702
  i0.ɵɵelementEnd();
685
- i0.ɵɵelementStart(40, "input", 148);
703
+ i0.ɵɵelementStart(40, "input", 150);
686
704
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_input_change_40_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.SaveSelectedTagNumber("MinWeight", $event.target.value)); });
687
705
  i0.ɵɵelementEnd();
688
- i0.ɵɵelementStart(41, "span", 147);
706
+ i0.ɵɵelementStart(41, "span", 149);
689
707
  i0.ɵɵtext(42, "Floor for matches against this tag.");
690
708
  i0.ɵɵelementEnd()()()();
691
- i0.ɵɵelementStart(43, "div", 108)(44, "div", 128);
709
+ i0.ɵɵelementStart(43, "div", 110)(44, "div", 130);
692
710
  i0.ɵɵtext(45, "Scope \u2014 who can see and tag with this");
693
711
  i0.ɵɵelementEnd();
694
- i0.ɵɵelementStart(46, "div", 139)(47, "div", 140)(48, "span", 141);
712
+ i0.ɵɵelementStart(46, "div", 141)(47, "div", 142)(48, "span", 143);
695
713
  i0.ɵɵtext(49, "Global tag (visible to all tenants)");
696
714
  i0.ɵɵelementEnd();
697
- i0.ɵɵelementStart(50, "span", 142);
715
+ i0.ɵɵelementStart(50, "span", 144);
698
716
  i0.ɵɵtext(51, " Off = restricted to the scope rows below. ");
699
717
  i0.ɵɵconditionalCreate(52, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_52_Template, 2, 0, "strong");
700
718
  i0.ɵɵelementEnd()();
701
- i0.ɵɵelementStart(53, "div", 143);
719
+ i0.ɵɵelementStart(53, "div", 145);
702
720
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_div_click_53_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.ToggleGovernanceFlag("IsGlobal")); });
703
721
  i0.ɵɵelementEnd()();
704
- i0.ɵɵelementStart(54, "div", 149);
705
- i0.ɵɵrepeaterCreate(55, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_For_56_Template, 2, 2, "span", 150, _forTrack2);
706
- i0.ɵɵconditionalCreate(57, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_57_Template, 2, 1, "span", 151);
707
- i0.ɵɵelementStart(58, "button", 152);
722
+ i0.ɵɵelementStart(54, "div", 151);
723
+ i0.ɵɵrepeaterCreate(55, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_For_56_Template, 2, 2, "span", 152, _forTrack2);
724
+ i0.ɵɵconditionalCreate(57, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_57_Template, 2, 1, "span", 153);
725
+ i0.ɵɵelementStart(58, "button", 154);
708
726
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_button_click_58_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OpenScopeDialog()); });
709
- i0.ɵɵelement(59, "i", 153);
727
+ i0.ɵɵelement(59, "i", 155);
710
728
  i0.ɵɵtext(60, " Edit scope\u2026 ");
711
729
  i0.ɵɵelementEnd()();
712
- i0.ɵɵelementStart(61, "div", 154);
713
- i0.ɵɵelement(62, "i", 155);
730
+ i0.ɵɵelementStart(61, "div", 156);
731
+ i0.ɵɵelement(62, "i", 157);
714
732
  i0.ɵɵtext(63, " Children inherit this scope automatically. Promotion to global requires admin approval. ");
715
733
  i0.ɵɵelementEnd()();
716
- i0.ɵɵelementStart(64, "div", 108)(65, "div", 128);
734
+ i0.ɵɵelementStart(64, "div", 110)(65, "div", 130);
717
735
  i0.ɵɵtext(66, "Synonyms \u2014 alternate names that resolve to this tag");
718
736
  i0.ɵɵelementEnd();
719
- i0.ɵɵelementStart(67, "div", 156)(68, "input", 157);
737
+ i0.ɵɵelementStart(67, "div", 158)(68, "input", 159);
720
738
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_input_ngModelChange_68_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); i0.ɵɵtwoWayBindingSet(ctx_r1.NewSynonymName, $event) || (ctx_r1.NewSynonymName = $event); return i0.ɵɵresetView($event); });
721
739
  i0.ɵɵlistener("keyup.enter", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_input_keyup_enter_68_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.AddSynonym()); });
722
740
  i0.ɵɵelementEnd();
723
- i0.ɵɵelementStart(69, "select", 158);
741
+ i0.ɵɵelementStart(69, "select", 160);
724
742
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_select_ngModelChange_69_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); i0.ɵɵtwoWayBindingSet(ctx_r1.NewSynonymSource, $event) || (ctx_r1.NewSynonymSource = $event); return i0.ɵɵresetView($event); });
725
- i0.ɵɵelementStart(70, "option", 159);
743
+ i0.ɵɵelementStart(70, "option", 161);
726
744
  i0.ɵɵtext(71, "Manual");
727
745
  i0.ɵɵelementEnd();
728
- i0.ɵɵelementStart(72, "option", 160);
746
+ i0.ɵɵelementStart(72, "option", 162);
729
747
  i0.ɵɵtext(73, "Imported");
730
748
  i0.ɵɵelementEnd();
731
- i0.ɵɵelementStart(74, "option", 161);
749
+ i0.ɵɵelementStart(74, "option", 163);
732
750
  i0.ɵɵtext(75, "Merged");
733
751
  i0.ɵɵelementEnd();
734
- i0.ɵɵelementStart(76, "option", 162);
752
+ i0.ɵɵelementStart(76, "option", 164);
735
753
  i0.ɵɵtext(77, "LLM");
736
754
  i0.ɵɵelementEnd()();
737
- i0.ɵɵelementStart(78, "button", 163);
755
+ i0.ɵɵelementStart(78, "button", 165);
738
756
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template_button_click_78_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.AddSynonym()); });
739
757
  i0.ɵɵtext(79, "+ Add");
740
758
  i0.ɵɵelementEnd()();
741
- i0.ɵɵconditionalCreate(80, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_80_Template, 2, 0, "div", 151)(81, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_81_Template, 2, 0);
759
+ i0.ɵɵconditionalCreate(80, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_80_Template, 2, 0, "div", 153)(81, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Conditional_81_Template, 2, 0);
742
760
  i0.ɵɵelementEnd();
743
761
  } if (rf & 2) {
744
762
  const ctx_r1 = i0.ɵɵnextContext(5);
@@ -772,46 +790,46 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
772
790
  i0.ɵɵconditional(ctx_r1.SelectedTagSynonyms.length === 0 ? 80 : 81);
773
791
  } }
774
792
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
775
- i0.ɵɵelementStart(0, "div", 98)(1, "div", 99);
793
+ i0.ɵɵelementStart(0, "div", 100)(1, "div", 101);
776
794
  i0.ɵɵrepeaterCreate(2, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_For_3_Template, 4, 1, null, null, _forTrack2);
777
- i0.ɵɵelementStart(4, "span", 100);
795
+ i0.ɵɵelementStart(4, "span", 102);
778
796
  i0.ɵɵtext(5);
779
797
  i0.ɵɵelementEnd()();
780
- i0.ɵɵconditionalCreate(6, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_6_Template, 5, 2)(7, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_7_Template, 14, 2, "div", 101);
798
+ i0.ɵɵconditionalCreate(6, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_6_Template, 5, 2)(7, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_7_Template, 14, 2, "div", 103);
781
799
  i0.ɵɵelementEnd();
782
- i0.ɵɵelementStart(8, "div", 102)(9, "div", 103)(10, "div", 104);
800
+ i0.ɵɵelementStart(8, "div", 104)(9, "div", 105)(10, "div", 106);
783
801
  i0.ɵɵtext(11);
784
802
  i0.ɵɵelementEnd();
785
- i0.ɵɵelementStart(12, "div", 105);
803
+ i0.ɵɵelementStart(12, "div", 107);
786
804
  i0.ɵɵtext(13, "Items Tagged");
787
805
  i0.ɵɵelementEnd()();
788
- i0.ɵɵelementStart(14, "div", 103)(15, "div", 104);
806
+ i0.ɵɵelementStart(14, "div", 105)(15, "div", 106);
789
807
  i0.ɵɵtext(16);
790
808
  i0.ɵɵelementEnd();
791
- i0.ɵɵelementStart(17, "div", 105);
809
+ i0.ɵɵelementStart(17, "div", 107);
792
810
  i0.ɵɵtext(18, "Avg Weight");
793
811
  i0.ɵɵelementEnd()();
794
- i0.ɵɵelementStart(19, "div", 103)(20, "div", 104);
812
+ i0.ɵɵelementStart(19, "div", 105)(20, "div", 106);
795
813
  i0.ɵɵtext(21);
796
814
  i0.ɵɵelementEnd();
797
- i0.ɵɵelementStart(22, "div", 105);
815
+ i0.ɵɵelementStart(22, "div", 107);
798
816
  i0.ɵɵtext(23, "Children");
799
817
  i0.ɵɵelementEnd()();
800
- i0.ɵɵelementStart(24, "div", 103)(25, "div", 104);
818
+ i0.ɵɵelementStart(24, "div", 105)(25, "div", 106);
801
819
  i0.ɵɵtext(26);
802
820
  i0.ɵɵelementEnd();
803
- i0.ɵɵelementStart(27, "div", 105);
821
+ i0.ɵɵelementStart(27, "div", 107);
804
822
  i0.ɵɵtext(28, "Depth");
805
823
  i0.ɵɵelementEnd()();
806
- i0.ɵɵelementStart(29, "div", 103)(30, "div", 106);
824
+ i0.ɵɵelementStart(29, "div", 105)(30, "div", 108);
807
825
  i0.ɵɵtext(31);
808
826
  i0.ɵɵelementEnd();
809
- i0.ɵɵelementStart(32, "div", 105);
827
+ i0.ɵɵelementStart(32, "div", 107);
810
828
  i0.ɵɵtext(33, "First Seen");
811
829
  i0.ɵɵelementEnd()()();
812
- i0.ɵɵconditionalCreate(34, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template, 19, 0, "div", 107);
813
- i0.ɵɵconditionalCreate(35, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_35_Template, 6, 0, "div", 108);
814
- i0.ɵɵconditionalCreate(36, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_36_Template, 6, 0, "div", 108);
830
+ i0.ɵɵconditionalCreate(34, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_34_Template, 19, 0, "div", 109);
831
+ i0.ɵɵconditionalCreate(35, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_35_Template, 6, 0, "div", 110);
832
+ i0.ɵɵconditionalCreate(36, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_36_Template, 6, 0, "div", 110);
815
833
  i0.ɵɵconditionalCreate(37, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Conditional_37_Template, 82, 25);
816
834
  } if (rf & 2) {
817
835
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -841,77 +859,77 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Condit
841
859
  i0.ɵɵconditional(ctx_r1.SelectedTagFull ? 37 : -1);
842
860
  } }
843
861
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
844
- i0.ɵɵelementStart(0, "div", 73);
845
- i0.ɵɵelement(1, "i", 169);
862
+ i0.ɵɵelementStart(0, "div", 75);
863
+ i0.ɵɵelement(1, "i", 171);
846
864
  i0.ɵɵelementStart(2, "p");
847
865
  i0.ɵɵtext(3, "Select a tag from the tree to view details");
848
866
  i0.ɵɵelementEnd()();
849
867
  } }
850
868
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
851
869
  const _r13 = i0.ɵɵgetCurrentView();
852
- i0.ɵɵelementStart(0, "div", 61)(1, "div", 62)(2, "div", 63)(3, "input", 64);
870
+ i0.ɵɵelementStart(0, "div", 63)(1, "div", 64)(2, "div", 65)(3, "input", 66);
853
871
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.TaxTreeSearch, $event) || (ctx_r1.TaxTreeSearch = $event); return i0.ɵɵresetView($event); });
854
872
  i0.ɵɵlistener("input", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.FilterTaxTree()); });
855
873
  i0.ɵɵelementEnd();
856
- i0.ɵɵelementStart(4, "button", 65);
874
+ i0.ɵɵelementStart(4, "button", 67);
857
875
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCreateRootTag()); });
858
- i0.ɵɵelement(5, "i", 66);
876
+ i0.ɵɵelement(5, "i", 68);
859
877
  i0.ɵɵelementEnd();
860
- i0.ɵɵelementStart(6, "button", 67);
878
+ i0.ɵɵelementStart(6, "button", 69);
861
879
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleMultiSelectMode()); });
862
- i0.ɵɵelement(7, "i", 68);
880
+ i0.ɵɵelement(7, "i", 70);
863
881
  i0.ɵɵelementEnd()();
864
- i0.ɵɵelementStart(8, "div", 69);
882
+ i0.ɵɵelementStart(8, "div", 71);
865
883
  i0.ɵɵlistener("dragover", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template_div_dragover_8_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.preventDefault()); })("drop", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template_div_drop_8_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnDropToRoot($event)); });
866
- i0.ɵɵconditionalCreate(9, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_9_Template, 4, 0, "div", 59);
867
- i0.ɵɵrepeaterCreate(10, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template, 10, 22, "div", 70, _forTrack2);
884
+ i0.ɵɵconditionalCreate(9, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_9_Template, 4, 0, "div", 61);
885
+ i0.ɵɵrepeaterCreate(10, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_For_11_Template, 10, 22, "div", 72, _forTrack2);
868
886
  i0.ɵɵelementEnd();
869
- i0.ɵɵconditionalCreate(12, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_12_Template, 2, 0, "div", 71);
887
+ i0.ɵɵconditionalCreate(12, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_12_Template, 2, 0, "div", 73);
870
888
  i0.ɵɵelementEnd();
871
- i0.ɵɵelementStart(13, "div", 72);
872
- i0.ɵɵconditionalCreate(14, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Template, 38, 11)(15, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_15_Template, 4, 0, "div", 73);
889
+ i0.ɵɵelementStart(13, "div", 74);
890
+ i0.ɵɵconditionalCreate(14, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_14_Template, 38, 11)(15, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Conditional_15_Template, 4, 0, "div", 75);
873
891
  i0.ɵɵelementEnd()();
874
- i0.ɵɵelementStart(16, "div", 74)(17, "span", 75);
892
+ i0.ɵɵelementStart(16, "div", 76)(17, "span", 77);
875
893
  i0.ɵɵtext(18, "Taxonomy Health");
876
894
  i0.ɵɵelementEnd();
877
- i0.ɵɵelementStart(19, "div", 76);
878
- i0.ɵɵelement(20, "span", 77);
879
- i0.ɵɵelementStart(21, "span", 78);
895
+ i0.ɵɵelementStart(19, "div", 78);
896
+ i0.ɵɵelement(20, "span", 79);
897
+ i0.ɵɵelementStart(21, "span", 80);
880
898
  i0.ɵɵtext(22);
881
899
  i0.ɵɵelementEnd();
882
- i0.ɵɵelementStart(23, "span", 79);
900
+ i0.ɵɵelementStart(23, "span", 81);
883
901
  i0.ɵɵtext(24, "Total");
884
902
  i0.ɵɵelementEnd()();
885
- i0.ɵɵelementStart(25, "div", 76);
886
- i0.ɵɵelement(26, "span", 80);
887
- i0.ɵɵelementStart(27, "span", 81);
903
+ i0.ɵɵelementStart(25, "div", 78);
904
+ i0.ɵɵelement(26, "span", 82);
905
+ i0.ɵɵelementStart(27, "span", 83);
888
906
  i0.ɵɵtext(28);
889
907
  i0.ɵɵelementEnd();
890
- i0.ɵɵelementStart(29, "span", 79);
908
+ i0.ɵɵelementStart(29, "span", 81);
891
909
  i0.ɵɵtext(30, "Healthy");
892
910
  i0.ɵɵelementEnd()();
893
- i0.ɵɵelementStart(31, "div", 76);
894
- i0.ɵɵelement(32, "span", 82);
895
- i0.ɵɵelementStart(33, "span", 83);
911
+ i0.ɵɵelementStart(31, "div", 78);
912
+ i0.ɵɵelement(32, "span", 84);
913
+ i0.ɵɵelementStart(33, "span", 85);
896
914
  i0.ɵɵtext(34);
897
915
  i0.ɵɵelementEnd();
898
- i0.ɵɵelementStart(35, "span", 79);
916
+ i0.ɵɵelementStart(35, "span", 81);
899
917
  i0.ɵɵtext(36, "Need Attention");
900
918
  i0.ɵɵelementEnd()();
901
- i0.ɵɵelementStart(37, "div", 76);
902
- i0.ɵɵelement(38, "span", 84);
903
- i0.ɵɵelementStart(39, "span", 85);
919
+ i0.ɵɵelementStart(37, "div", 78);
920
+ i0.ɵɵelement(38, "span", 86);
921
+ i0.ɵɵelementStart(39, "span", 87);
904
922
  i0.ɵɵtext(40);
905
923
  i0.ɵɵelementEnd();
906
- i0.ɵɵelementStart(41, "span", 79);
924
+ i0.ɵɵelementStart(41, "span", 81);
907
925
  i0.ɵɵtext(42, "Orphaned");
908
926
  i0.ɵɵelementEnd()();
909
- i0.ɵɵelementStart(43, "div", 76);
910
- i0.ɵɵelement(44, "span", 86);
911
- i0.ɵɵelementStart(45, "span", 87);
927
+ i0.ɵɵelementStart(43, "div", 78);
928
+ i0.ɵɵelement(44, "span", 88);
929
+ i0.ɵɵelementStart(45, "span", 89);
912
930
  i0.ɵɵtext(46);
913
931
  i0.ɵɵelementEnd();
914
- i0.ɵɵelementStart(47, "span", 79);
932
+ i0.ɵɵelementStart(47, "span", 81);
915
933
  i0.ɵɵtext(48, "Duplicate Candidates");
916
934
  i0.ɵɵelementEnd()()();
917
935
  } if (rf & 2) {
@@ -940,8 +958,8 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Templa
940
958
  i0.ɵɵtextInterpolate(ctx_r1.TaxHealth.Duplicates);
941
959
  } }
942
960
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
943
- i0.ɵɵelementStart(0, "div", 59);
944
- i0.ɵɵelement(1, "i", 176);
961
+ i0.ɵɵelementStart(0, "div", 61);
962
+ i0.ɵɵelement(1, "i", 178);
945
963
  i0.ɵɵelementStart(2, "p");
946
964
  i0.ɵɵtext(3, "No duplicate tags detected");
947
965
  i0.ɵɵelementEnd()();
@@ -955,18 +973,18 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16
955
973
  } }
956
974
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_1_Template(rf, ctx) { if (rf & 1) {
957
975
  const _r29 = i0.ɵɵgetCurrentView();
958
- i0.ɵɵelementStart(0, "div", 178);
976
+ i0.ɵɵelementStart(0, "div", 180);
959
977
  i0.ɵɵtext(1);
960
978
  i0.ɵɵelementEnd();
961
- i0.ɵɵelementStart(2, "div", 179)(3, "span", 180);
962
- i0.ɵɵelement(4, "i", 181);
979
+ i0.ɵɵelementStart(2, "div", 181)(3, "span", 182);
980
+ i0.ɵɵelement(4, "i", 183);
963
981
  i0.ɵɵtext(5);
964
982
  i0.ɵɵelementEnd()();
965
- i0.ɵɵelementStart(6, "div", 182)(7, "button", 183);
983
+ i0.ɵɵelementStart(6, "div", 184)(7, "button", 185);
966
984
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_1_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r29); const pair_r30 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.MergeTags(pair_r30.TagAID, pair_r30.TagBID, pair_r30.TagA, pair_r30.TagB)); });
967
985
  i0.ɵɵconditionalCreate(8, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_1_Conditional_8_Template, 2, 0)(9, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_1_Conditional_9_Template, 1, 0);
968
986
  i0.ɵɵelementEnd();
969
- i0.ɵɵelementStart(10, "button", 184);
987
+ i0.ɵɵelementStart(10, "button", 186);
970
988
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_1_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r29); const pair_r30 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DismissDuplicate(pair_r30)); });
971
989
  i0.ɵɵtext(11, "Dismiss");
972
990
  i0.ɵɵelementEnd()();
@@ -991,33 +1009,33 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16
991
1009
  } }
992
1010
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_2_Template(rf, ctx) { if (rf & 1) {
993
1011
  const _r31 = i0.ɵɵgetCurrentView();
994
- i0.ɵɵelementStart(0, "div", 178);
1012
+ i0.ɵɵelementStart(0, "div", 180);
995
1013
  i0.ɵɵtext(1);
996
1014
  i0.ɵɵelementEnd();
997
- i0.ɵɵelementStart(2, "div", 185);
998
- i0.ɵɵelement(3, "i", 186);
1015
+ i0.ɵɵelementStart(2, "div", 187);
1016
+ i0.ɵɵelement(3, "i", 188);
999
1017
  i0.ɵɵelementEnd();
1000
- i0.ɵɵelementStart(4, "div", 179)(5, "div", 187);
1001
- i0.ɵɵelement(6, "div", 188);
1018
+ i0.ɵɵelementStart(4, "div", 181)(5, "div", 189);
1019
+ i0.ɵɵelement(6, "div", 190);
1002
1020
  i0.ɵɵelementEnd();
1003
- i0.ɵɵelementStart(7, "span", 189);
1021
+ i0.ɵɵelementStart(7, "span", 191);
1004
1022
  i0.ɵɵtext(8);
1005
1023
  i0.ɵɵelementEnd()();
1006
- i0.ɵɵelementStart(9, "div", 185);
1007
- i0.ɵɵelement(10, "i", 186);
1024
+ i0.ɵɵelementStart(9, "div", 187);
1025
+ i0.ɵɵelement(10, "i", 188);
1008
1026
  i0.ɵɵelementEnd();
1009
- i0.ɵɵelementStart(11, "div", 178);
1027
+ i0.ɵɵelementStart(11, "div", 180);
1010
1028
  i0.ɵɵtext(12);
1011
1029
  i0.ɵɵelementEnd();
1012
- i0.ɵɵelementStart(13, "div", 182)(14, "button", 183);
1030
+ i0.ɵɵelementStart(13, "div", 184)(14, "button", 185);
1013
1031
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r31); const pair_r30 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.MergeTags(pair_r30.TagAID, pair_r30.TagBID, pair_r30.TagA, pair_r30.TagB)); });
1014
1032
  i0.ɵɵconditionalCreate(15, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_2_Conditional_15_Template, 2, 0)(16, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_2_Conditional_16_Template, 1, 0);
1015
1033
  i0.ɵɵelementEnd();
1016
- i0.ɵɵelementStart(17, "button", 184);
1034
+ i0.ɵɵelementStart(17, "button", 186);
1017
1035
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r31); const pair_r30 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.MakeChildTag(pair_r30.TagAID, pair_r30.TagBID)); });
1018
1036
  i0.ɵɵtext(18, "Make Child");
1019
1037
  i0.ɵɵelementEnd();
1020
- i0.ɵɵelementStart(19, "button", 184);
1038
+ i0.ɵɵelementStart(19, "button", 186);
1021
1039
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_2_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r31); const pair_r30 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DismissDuplicate(pair_r30)); });
1022
1040
  i0.ɵɵtext(20, "Dismiss");
1023
1041
  i0.ɵɵelementEnd()();
@@ -1041,7 +1059,7 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16
1041
1059
  i0.ɵɵconditional(ctx_r1.IsMerging ? 15 : 16);
1042
1060
  } }
1043
1061
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Template(rf, ctx) { if (rf & 1) {
1044
- i0.ɵɵelementStart(0, "div", 177);
1062
+ i0.ɵɵelementStart(0, "div", 179);
1045
1063
  i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_1_Template, 12, 4)(2, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Conditional_2_Template, 21, 11);
1046
1064
  i0.ɵɵelementEnd();
1047
1065
  } if (rf & 2) {
@@ -1051,24 +1069,24 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16
1051
1069
  i0.ɵɵconditional(pair_r30.IsExactDuplicate ? 1 : 2);
1052
1070
  } }
1053
1071
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1054
- i0.ɵɵelementStart(0, "div", 170)(1, "div", 171)(2, "strong");
1072
+ i0.ɵɵelementStart(0, "div", 172)(1, "div", 173)(2, "strong");
1055
1073
  i0.ɵɵtext(3);
1056
1074
  i0.ɵɵelementEnd();
1057
1075
  i0.ɵɵtext(4, " candidates found");
1058
1076
  i0.ɵɵelementEnd();
1059
- i0.ɵɵelementStart(5, "div", 172)(6, "strong");
1077
+ i0.ɵɵelementStart(5, "div", 174)(6, "strong");
1060
1078
  i0.ɵɵtext(7);
1061
1079
  i0.ɵɵelementEnd();
1062
1080
  i0.ɵɵtext(8, " high confidence (>85%)");
1063
1081
  i0.ɵɵelementEnd();
1064
- i0.ɵɵelementStart(9, "div", 173)(10, "strong");
1082
+ i0.ɵɵelementStart(9, "div", 175)(10, "strong");
1065
1083
  i0.ɵɵtext(11);
1066
1084
  i0.ɵɵelementEnd();
1067
1085
  i0.ɵɵtext(12, " moderate (70-85%)");
1068
1086
  i0.ɵɵelementEnd()();
1069
- i0.ɵɵconditionalCreate(13, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_Conditional_13_Template, 4, 0, "div", 59);
1070
- i0.ɵɵelementStart(14, "div", 174);
1071
- i0.ɵɵrepeaterCreate(15, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Template, 3, 5, "div", 175, i0.ɵɵrepeaterTrackByIndex);
1087
+ i0.ɵɵconditionalCreate(13, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_Conditional_13_Template, 4, 0, "div", 61);
1088
+ i0.ɵɵelementStart(14, "div", 176);
1089
+ i0.ɵɵrepeaterCreate(15, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_For_16_Template, 3, 5, "div", 177, i0.ɵɵrepeaterTrackByIndex);
1072
1090
  i0.ɵɵelementEnd();
1073
1091
  } if (rf & 2) {
1074
1092
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1084,27 +1102,27 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_Templa
1084
1102
  i0.ɵɵrepeater(ctx_r1.TaxDuplicates);
1085
1103
  } }
1086
1104
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1087
- i0.ɵɵelement(0, "i", 195);
1105
+ i0.ɵɵelement(0, "i", 197);
1088
1106
  } }
1089
1107
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1090
- i0.ɵɵelement(0, "i", 196);
1108
+ i0.ɵɵelement(0, "i", 198);
1091
1109
  } }
1092
1110
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_16_Template(rf, ctx) { if (rf & 1) {
1093
- i0.ɵɵelementStart(0, "div", 59);
1094
- i0.ɵɵelement(1, "i", 176);
1111
+ i0.ɵɵelementStart(0, "div", 61);
1112
+ i0.ɵɵelement(1, "i", 178);
1095
1113
  i0.ɵɵelementStart(2, "p");
1096
1114
  i0.ɵɵtext(3, "No orphaned tags");
1097
1115
  i0.ɵɵelementEnd()();
1098
1116
  } }
1099
1117
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19_Template(rf, ctx) { if (rf & 1) {
1100
1118
  const _r33 = i0.ɵɵgetCurrentView();
1101
- i0.ɵɵelementStart(0, "div", 200)(1, "div", 201)(2, "span", 202);
1119
+ i0.ɵɵelementStart(0, "div", 202)(1, "div", 203)(2, "span", 204);
1102
1120
  i0.ɵɵtext(3);
1103
1121
  i0.ɵɵelementEnd();
1104
- i0.ɵɵelementStart(4, "input", 203);
1122
+ i0.ɵɵelementStart(4, "input", 205);
1105
1123
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19_Template_input_change_4_listener() { const orphan_r34 = i0.ɵɵrestoreView(_r33).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ToggleOrphanSelection(orphan_r34)); })("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19_Template_input_click_4_listener($event) { i0.ɵɵrestoreView(_r33); return i0.ɵɵresetView($event.stopPropagation()); });
1106
1124
  i0.ɵɵelementEnd()();
1107
- i0.ɵɵelementStart(5, "div", 204)(6, "span");
1125
+ i0.ɵɵelementStart(5, "div", 206)(6, "span");
1108
1126
  i0.ɵɵtext(7, "Usage: ");
1109
1127
  i0.ɵɵelementStart(8, "strong");
1110
1128
  i0.ɵɵtext(9);
@@ -1114,17 +1132,17 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19
1114
1132
  i0.ɵɵelementStart(12, "strong");
1115
1133
  i0.ɵɵtext(13);
1116
1134
  i0.ɵɵelementEnd()()();
1117
- i0.ɵɵelementStart(14, "div", 205)(15, "span");
1135
+ i0.ɵɵelementStart(14, "div", 207)(15, "span");
1118
1136
  i0.ɵɵtext(16);
1119
1137
  i0.ɵɵelementEnd();
1120
1138
  i0.ɵɵelementStart(17, "span");
1121
1139
  i0.ɵɵtext(18);
1122
1140
  i0.ɵɵelementEnd()();
1123
- i0.ɵɵelementStart(19, "div", 206)(20, "button", 207);
1141
+ i0.ɵɵelementStart(19, "div", 208)(20, "button", 209);
1124
1142
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19_Template_button_click_20_listener() { const orphan_r34 = i0.ɵɵrestoreView(_r33).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteOrphan(orphan_r34)); });
1125
1143
  i0.ɵɵtext(21, "Delete");
1126
1144
  i0.ɵɵelementEnd();
1127
- i0.ɵɵelementStart(22, "button", 208);
1145
+ i0.ɵɵelementStart(22, "button", 210);
1128
1146
  i0.ɵɵtext(23, "Ignore");
1129
1147
  i0.ɵɵelementEnd()()();
1130
1148
  } if (rf & 2) {
@@ -1144,30 +1162,30 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19
1144
1162
  } }
1145
1163
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1146
1164
  const _r32 = i0.ɵɵgetCurrentView();
1147
- i0.ɵɵelementStart(0, "div", 190)(1, "span", 191);
1165
+ i0.ɵɵelementStart(0, "div", 192)(1, "span", 193);
1148
1166
  i0.ɵɵtext(2);
1149
1167
  i0.ɵɵelementEnd();
1150
- i0.ɵɵelementStart(3, "span", 192);
1168
+ i0.ɵɵelementStart(3, "span", 194);
1151
1169
  i0.ɵɵtext(4, "\u2014 no parent, no children, low usage");
1152
1170
  i0.ɵɵelementEnd();
1153
- i0.ɵɵelementStart(5, "div", 193)(6, "button", 194);
1171
+ i0.ɵɵelementStart(5, "div", 195)(6, "button", 196);
1154
1172
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleAllOrphans()); });
1155
- i0.ɵɵconditionalCreate(7, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_7_Template, 1, 0, "i", 195)(8, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_8_Template, 1, 0, "i", 196);
1173
+ i0.ɵɵconditionalCreate(7, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_7_Template, 1, 0, "i", 197)(8, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_8_Template, 1, 0, "i", 198);
1156
1174
  i0.ɵɵtext(9, " Select All ");
1157
1175
  i0.ɵɵelementEnd();
1158
- i0.ɵɵelementStart(10, "button", 197);
1176
+ i0.ɵɵelementStart(10, "button", 199);
1159
1177
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.BulkDeleteOrphans()); });
1160
- i0.ɵɵelement(11, "i", 127);
1178
+ i0.ɵɵelement(11, "i", 129);
1161
1179
  i0.ɵɵtext(12, " Bulk Delete ");
1162
1180
  i0.ɵɵelementEnd();
1163
- i0.ɵɵelementStart(13, "button", 197);
1181
+ i0.ɵɵelementStart(13, "button", 199);
1164
1182
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.DeleteAllOrphans()); });
1165
- i0.ɵɵelement(14, "i", 198);
1183
+ i0.ɵɵelement(14, "i", 200);
1166
1184
  i0.ɵɵtext(15);
1167
1185
  i0.ɵɵelementEnd()()();
1168
- i0.ɵɵconditionalCreate(16, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_16_Template, 4, 0, "div", 59);
1169
- i0.ɵɵelementStart(17, "div", 199);
1170
- i0.ɵɵrepeaterCreate(18, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19_Template, 24, 6, "div", 200, _forTrack2);
1186
+ i0.ɵɵconditionalCreate(16, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Conditional_16_Template, 4, 0, "div", 61);
1187
+ i0.ɵɵelementStart(17, "div", 201);
1188
+ i0.ɵɵrepeaterCreate(18, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_For_19_Template, 24, 6, "div", 202, _forTrack2);
1171
1189
  i0.ɵɵelementEnd();
1172
1190
  } if (rf & 2) {
1173
1191
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1183,10 +1201,10 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Templa
1183
1201
  i0.ɵɵrepeater(ctx_r1.TaxOrphans);
1184
1202
  } }
1185
1203
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
1186
- i0.ɵɵelementStart(0, "div", 210)(1, "div", 213);
1204
+ i0.ɵɵelementStart(0, "div", 212)(1, "div", 215);
1187
1205
  i0.ɵɵtext(2);
1188
1206
  i0.ɵɵelementEnd();
1189
- i0.ɵɵelementStart(3, "div", 214);
1207
+ i0.ɵɵelementStart(3, "div", 216);
1190
1208
  i0.ɵɵtext(4);
1191
1209
  i0.ɵɵelementEnd()();
1192
1210
  } if (rf & 2) {
@@ -1197,20 +1215,20 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_For_2_
1197
1215
  i0.ɵɵtextInterpolate(kpi_r35.Label);
1198
1216
  } }
1199
1217
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1200
- i0.ɵɵelementStart(0, "div", 59);
1201
- i0.ɵɵelement(1, "i", 215);
1218
+ i0.ɵɵelementStart(0, "div", 61);
1219
+ i0.ɵɵelement(1, "i", 217);
1202
1220
  i0.ɵɵelementStart(2, "p");
1203
1221
  i0.ɵɵtext(3, "No taxonomy data to visualize");
1204
1222
  i0.ɵɵelementEnd()();
1205
1223
  } }
1206
1224
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
1207
1225
  const _r36 = i0.ɵɵgetCurrentView();
1208
- i0.ɵɵelementStart(0, "div", 217);
1226
+ i0.ɵɵelementStart(0, "div", 219);
1209
1227
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_4_For_2_Template_div_click_0_listener() { const cell_r37 = i0.ɵɵrestoreView(_r36).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OpenTreemapDrillIn(cell_r37)); });
1210
- i0.ɵɵelementStart(1, "span", 218);
1228
+ i0.ɵɵelementStart(1, "span", 220);
1211
1229
  i0.ɵɵtext(2);
1212
1230
  i0.ɵɵelementEnd();
1213
- i0.ɵɵelementStart(3, "span", 219);
1231
+ i0.ɵɵelementStart(3, "span", 221);
1214
1232
  i0.ɵɵtext(4);
1215
1233
  i0.ɵɵelementEnd()();
1216
1234
  } if (rf & 2) {
@@ -1223,8 +1241,8 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Condit
1223
1241
  i0.ɵɵtextInterpolate1("", cell_r37.ItemCount, " items");
1224
1242
  } }
1225
1243
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1226
- i0.ɵɵelementStart(0, "div", 211);
1227
- i0.ɵɵrepeaterCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_4_For_2_Template, 5, 6, "div", 216, i0.ɵɵrepeaterTrackByIndex);
1244
+ i0.ɵɵelementStart(0, "div", 213);
1245
+ i0.ɵɵrepeaterCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_4_For_2_Template, 5, 6, "div", 218, i0.ɵɵrepeaterTrackByIndex);
1228
1246
  i0.ɵɵelementEnd();
1229
1247
  } if (rf & 2) {
1230
1248
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -1232,9 +1250,9 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Condit
1232
1250
  i0.ɵɵrepeater(ctx_r1.TaxTreemapCells);
1233
1251
  } }
1234
1252
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_25_For_5_Template(rf, ctx) { if (rf & 1) {
1235
- i0.ɵɵelementStart(0, "span", 130);
1253
+ i0.ɵɵelementStart(0, "span", 132);
1236
1254
  i0.ɵɵtext(1);
1237
- i0.ɵɵelementStart(2, "span", 132);
1255
+ i0.ɵɵelementStart(2, "span", 134);
1238
1256
  i0.ɵɵtext(3);
1239
1257
  i0.ɵɵelementEnd()();
1240
1258
  } if (rf & 2) {
@@ -1245,11 +1263,11 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Condit
1245
1263
  i0.ɵɵtextInterpolate(child_r39.ItemCount);
1246
1264
  } }
1247
1265
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_25_Template(rf, ctx) { if (rf & 1) {
1248
- i0.ɵɵelementStart(0, "div", 108)(1, "div", 128);
1266
+ i0.ɵɵelementStart(0, "div", 110)(1, "div", 130);
1249
1267
  i0.ɵɵtext(2, "Child Tags");
1250
1268
  i0.ɵɵelementEnd();
1251
- i0.ɵɵelementStart(3, "div", 129);
1252
- i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_25_For_5_Template, 4, 2, "span", 130, _forTrack2);
1269
+ i0.ɵɵelementStart(3, "div", 131);
1270
+ i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_25_For_5_Template, 4, 2, "span", 132, _forTrack2);
1253
1271
  i0.ɵɵelementEnd()();
1254
1272
  } if (rf & 2) {
1255
1273
  const ctx_r1 = i0.ɵɵnextContext(5);
@@ -1257,16 +1275,16 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Condit
1257
1275
  i0.ɵɵrepeater(ctx_r1.TreemapDrillInNode.Children);
1258
1276
  } }
1259
1277
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_26_For_5_Template(rf, ctx) { if (rf & 1) {
1260
- i0.ɵɵelementStart(0, "div", 134)(1, "div", 135);
1278
+ i0.ɵɵelementStart(0, "div", 136)(1, "div", 137);
1261
1279
  i0.ɵɵelement(2, "i");
1262
1280
  i0.ɵɵelementEnd();
1263
- i0.ɵɵelementStart(3, "div", 136);
1281
+ i0.ɵɵelementStart(3, "div", 138);
1264
1282
  i0.ɵɵtext(4);
1265
1283
  i0.ɵɵelementEnd();
1266
- i0.ɵɵelementStart(5, "div", 137);
1284
+ i0.ɵɵelementStart(5, "div", 139);
1267
1285
  i0.ɵɵtext(6);
1268
1286
  i0.ɵɵelementEnd();
1269
- i0.ɵɵelementStart(7, "div", 138);
1287
+ i0.ɵɵelementStart(7, "div", 140);
1270
1288
  i0.ɵɵtext(8);
1271
1289
  i0.ɵɵelementEnd()();
1272
1290
  } if (rf & 2) {
@@ -1281,11 +1299,11 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Condit
1281
1299
  i0.ɵɵtextInterpolate(item_r40.Date);
1282
1300
  } }
1283
1301
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_26_Template(rf, ctx) { if (rf & 1) {
1284
- i0.ɵɵelementStart(0, "div", 108)(1, "div", 128);
1302
+ i0.ɵɵelementStart(0, "div", 110)(1, "div", 130);
1285
1303
  i0.ɵɵtext(2, "Recently Tagged Items");
1286
1304
  i0.ɵɵelementEnd();
1287
- i0.ɵɵelementStart(3, "div", 133);
1288
- i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_26_For_5_Template, 9, 5, "div", 134, i0.ɵɵrepeaterTrackByIndex);
1305
+ i0.ɵɵelementStart(3, "div", 135);
1306
+ i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_26_For_5_Template, 9, 5, "div", 136, i0.ɵɵrepeaterTrackByIndex);
1289
1307
  i0.ɵɵelementEnd()();
1290
1308
  } if (rf & 2) {
1291
1309
  const ctx_r1 = i0.ɵɵnextContext(5);
@@ -1294,42 +1312,42 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Condit
1294
1312
  } }
1295
1313
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1296
1314
  const _r38 = i0.ɵɵgetCurrentView();
1297
- i0.ɵɵelementStart(0, "div", 220);
1315
+ i0.ɵɵelementStart(0, "div", 222);
1298
1316
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CloseTreemapDrillIn()); });
1299
- i0.ɵɵelementStart(1, "div", 221);
1317
+ i0.ɵɵelementStart(1, "div", 223);
1300
1318
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r38); return i0.ɵɵresetView($event.stopPropagation()); });
1301
- i0.ɵɵelementStart(2, "div", 222)(3, "h3");
1302
- i0.ɵɵelement(4, "i", 55);
1319
+ i0.ɵɵelementStart(2, "div", 224)(3, "h3");
1320
+ i0.ɵɵelement(4, "i", 57);
1303
1321
  i0.ɵɵtext(5);
1304
1322
  i0.ɵɵelementEnd();
1305
- i0.ɵɵelementStart(6, "button", 223);
1323
+ i0.ɵɵelementStart(6, "button", 225);
1306
1324
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CloseTreemapDrillIn()); });
1307
- i0.ɵɵelement(7, "i", 57);
1325
+ i0.ɵɵelement(7, "i", 59);
1308
1326
  i0.ɵɵelementEnd()();
1309
- i0.ɵɵelementStart(8, "div", 224)(9, "div", 102)(10, "div", 103)(11, "div", 104);
1327
+ i0.ɵɵelementStart(8, "div", 226)(9, "div", 104)(10, "div", 105)(11, "div", 106);
1310
1328
  i0.ɵɵtext(12);
1311
1329
  i0.ɵɵelementEnd();
1312
- i0.ɵɵelementStart(13, "div", 105);
1330
+ i0.ɵɵelementStart(13, "div", 107);
1313
1331
  i0.ɵɵtext(14, "Items Tagged");
1314
1332
  i0.ɵɵelementEnd()();
1315
- i0.ɵɵelementStart(15, "div", 103)(16, "div", 104);
1333
+ i0.ɵɵelementStart(15, "div", 105)(16, "div", 106);
1316
1334
  i0.ɵɵtext(17);
1317
1335
  i0.ɵɵelementEnd();
1318
- i0.ɵɵelementStart(18, "div", 105);
1336
+ i0.ɵɵelementStart(18, "div", 107);
1319
1337
  i0.ɵɵtext(19, "Avg Weight");
1320
1338
  i0.ɵɵelementEnd()();
1321
- i0.ɵɵelementStart(20, "div", 103)(21, "div", 104);
1339
+ i0.ɵɵelementStart(20, "div", 105)(21, "div", 106);
1322
1340
  i0.ɵɵtext(22);
1323
1341
  i0.ɵɵelementEnd();
1324
- i0.ɵɵelementStart(23, "div", 105);
1342
+ i0.ɵɵelementStart(23, "div", 107);
1325
1343
  i0.ɵɵtext(24, "Children");
1326
1344
  i0.ɵɵelementEnd()()();
1327
- i0.ɵɵconditionalCreate(25, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_25_Template, 6, 0, "div", 108);
1328
- i0.ɵɵconditionalCreate(26, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_26_Template, 6, 0, "div", 108);
1345
+ i0.ɵɵconditionalCreate(25, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_25_Template, 6, 0, "div", 110);
1346
+ i0.ɵɵconditionalCreate(26, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Conditional_26_Template, 6, 0, "div", 110);
1329
1347
  i0.ɵɵelementEnd();
1330
- i0.ɵɵelementStart(27, "div", 225)(28, "button", 121);
1348
+ i0.ɵɵelementStart(27, "div", 227)(28, "button", 123);
1331
1349
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DrillInToTreeView(ctx_r1.TreemapDrillInNode)); });
1332
- i0.ɵɵelement(29, "i", 88);
1350
+ i0.ɵɵelement(29, "i", 90);
1333
1351
  i0.ɵɵtext(30, " View in Tree ");
1334
1352
  i0.ɵɵelementEnd()()()();
1335
1353
  } if (rf & 2) {
@@ -1348,11 +1366,11 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Condit
1348
1366
  i0.ɵɵconditional(ctx_r1.TaxRecentItems.length > 0 ? 26 : -1);
1349
1367
  } }
1350
1368
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1351
- i0.ɵɵelementStart(0, "div", 209);
1352
- i0.ɵɵrepeaterCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_For_2_Template, 5, 2, "div", 210, _forTrack3);
1369
+ i0.ɵɵelementStart(0, "div", 211);
1370
+ i0.ɵɵrepeaterCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_For_2_Template, 5, 2, "div", 212, _forTrack3);
1353
1371
  i0.ɵɵelementEnd();
1354
- i0.ɵɵconditionalCreate(3, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_3_Template, 4, 0, "div", 59)(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_4_Template, 3, 0, "div", 211);
1355
- i0.ɵɵconditionalCreate(5, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Template, 31, 6, "div", 212);
1372
+ i0.ɵɵconditionalCreate(3, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_3_Template, 4, 0, "div", 61)(4, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_4_Template, 3, 0, "div", 213);
1373
+ i0.ɵɵconditionalCreate(5, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Conditional_5_Template, 31, 6, "div", 214);
1356
1374
  } if (rf & 2) {
1357
1375
  const ctx_r1 = i0.ɵɵnextContext(3);
1358
1376
  i0.ɵɵadvance();
@@ -1363,22 +1381,22 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_4_Templa
1363
1381
  i0.ɵɵconditional(ctx_r1.ShowTreemapDrillIn && ctx_r1.TreemapDrillInNode ? 5 : -1);
1364
1382
  } }
1365
1383
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Conditional_28_Template(rf, ctx) { if (rf & 1) {
1366
- i0.ɵɵelementStart(0, "div", 59);
1367
- i0.ɵɵelement(1, "i", 233);
1384
+ i0.ɵɵelementStart(0, "div", 61);
1385
+ i0.ɵɵelement(1, "i", 235);
1368
1386
  i0.ɵɵelementStart(2, "p");
1369
1387
  i0.ɵɵtext(3, "No audit events match the current filters");
1370
1388
  i0.ɵɵelementEnd()();
1371
1389
  } }
1372
1390
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_For_31_Template(rf, ctx) { if (rf & 1) {
1373
- i0.ɵɵelementStart(0, "div", 232)(1, "div", 234);
1391
+ i0.ɵɵelementStart(0, "div", 234)(1, "div", 236);
1374
1392
  i0.ɵɵelement(2, "i");
1375
1393
  i0.ɵɵelementEnd();
1376
- i0.ɵɵelementStart(3, "div", 235)(4, "div", 236);
1394
+ i0.ɵɵelementStart(3, "div", 237)(4, "div", 238);
1377
1395
  i0.ɵɵtext(5);
1378
- i0.ɵɵelementStart(6, "span", 237);
1396
+ i0.ɵɵelementStart(6, "span", 239);
1379
1397
  i0.ɵɵtext(7);
1380
1398
  i0.ɵɵelementEnd()();
1381
- i0.ɵɵelementStart(8, "div", 238)(9, "span");
1399
+ i0.ɵɵelementStart(8, "div", 240)(9, "span");
1382
1400
  i0.ɵɵtext(10);
1383
1401
  i0.ɵɵelementEnd();
1384
1402
  i0.ɵɵelementStart(11, "span");
@@ -1402,52 +1420,52 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_For_31
1402
1420
  } }
1403
1421
  function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1404
1422
  const _r41 = i0.ɵɵgetCurrentView();
1405
- i0.ɵɵelementStart(0, "div", 226)(1, "span", 227);
1423
+ i0.ɵɵelementStart(0, "div", 228)(1, "span", 229);
1406
1424
  i0.ɵɵtext(2, "Filter");
1407
1425
  i0.ɵɵelementEnd();
1408
- i0.ɵɵelementStart(3, "div", 228)(4, "label", 229)(5, "input", 230);
1426
+ i0.ɵɵelementStart(3, "div", 230)(4, "label", 231)(5, "input", 232);
1409
1427
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_5_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("created")); });
1410
1428
  i0.ɵɵelementEnd();
1411
1429
  i0.ɵɵtext(6, " Created ");
1412
1430
  i0.ɵɵelementEnd();
1413
- i0.ɵɵelementStart(7, "label", 229)(8, "input", 230);
1431
+ i0.ɵɵelementStart(7, "label", 231)(8, "input", 232);
1414
1432
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("merged")); });
1415
1433
  i0.ɵɵelementEnd();
1416
1434
  i0.ɵɵtext(9, " Merged ");
1417
1435
  i0.ɵɵelementEnd();
1418
- i0.ɵɵelementStart(10, "label", 229)(11, "input", 230);
1436
+ i0.ɵɵelementStart(10, "label", 231)(11, "input", 232);
1419
1437
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_11_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("moved")); });
1420
1438
  i0.ɵɵelementEnd();
1421
1439
  i0.ɵɵtext(12, " Moved ");
1422
1440
  i0.ɵɵelementEnd();
1423
- i0.ɵɵelementStart(13, "label", 229)(14, "input", 230);
1441
+ i0.ɵɵelementStart(13, "label", 231)(14, "input", 232);
1424
1442
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_14_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("deleted")); });
1425
1443
  i0.ɵɵelementEnd();
1426
1444
  i0.ɵɵtext(15, " Deleted ");
1427
1445
  i0.ɵɵelementEnd();
1428
- i0.ɵɵelementStart(16, "label", 229)(17, "input", 230);
1446
+ i0.ɵɵelementStart(16, "label", 231)(17, "input", 232);
1429
1447
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_17_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("renamed")); });
1430
1448
  i0.ɵɵelementEnd();
1431
1449
  i0.ɵɵtext(18, " Renamed ");
1432
1450
  i0.ɵɵelementEnd();
1433
- i0.ɵɵelementStart(19, "label", 229)(20, "input", 230);
1451
+ i0.ɵɵelementStart(19, "label", 231)(20, "input", 232);
1434
1452
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_20_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("deprecated")); });
1435
1453
  i0.ɵɵelementEnd();
1436
1454
  i0.ɵɵtext(21, " Deprecated ");
1437
1455
  i0.ɵɵelementEnd();
1438
- i0.ɵɵelementStart(22, "label", 229)(23, "input", 230);
1456
+ i0.ɵɵelementStart(22, "label", 231)(23, "input", 232);
1439
1457
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_23_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("split")); });
1440
1458
  i0.ɵɵelementEnd();
1441
1459
  i0.ɵɵtext(24, " Split ");
1442
1460
  i0.ɵɵelementEnd();
1443
- i0.ɵɵelementStart(25, "label", 229)(26, "input", 230);
1461
+ i0.ɵɵelementStart(25, "label", 231)(26, "input", 232);
1444
1462
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Template_input_change_26_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleTaxAuditFilter("reactivated")); });
1445
1463
  i0.ɵɵelementEnd();
1446
1464
  i0.ɵɵtext(27, " Reactivated ");
1447
1465
  i0.ɵɵelementEnd()()();
1448
- i0.ɵɵconditionalCreate(28, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Conditional_28_Template, 4, 0, "div", 59);
1449
- i0.ɵɵelementStart(29, "div", 231);
1450
- i0.ɵɵrepeaterCreate(30, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_For_31_Template, 13, 8, "div", 232, i0.ɵɵrepeaterTrackByIndex);
1466
+ i0.ɵɵconditionalCreate(28, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Conditional_28_Template, 4, 0, "div", 61);
1467
+ i0.ɵɵelementStart(29, "div", 233);
1468
+ i0.ɵɵrepeaterCreate(30, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_For_31_Template, 13, 8, "div", 234, i0.ɵɵrepeaterTrackByIndex);
1451
1469
  i0.ɵɵelementEnd();
1452
1470
  } if (rf & 2) {
1453
1471
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1473,7 +1491,7 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Conditional_5_Templa
1473
1491
  i0.ɵɵrepeater(ctx_r1.GetFilteredAuditEvents());
1474
1492
  } }
1475
1493
  function TagsResourceComponent_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1476
- i0.ɵɵelementStart(0, "div", 25);
1494
+ i0.ɵɵelementStart(0, "div", 27);
1477
1495
  i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_1_Template, 49, 11);
1478
1496
  i0.ɵɵconditionalCreate(2, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_2_Template, 17, 4);
1479
1497
  i0.ɵɵconditionalCreate(3, TagsResourceComponent_Conditional_19_Conditional_1_Conditional_3_Template, 20, 4);
@@ -1494,7 +1512,7 @@ function TagsResourceComponent_Conditional_19_Conditional_1_Template(rf, ctx) {
1494
1512
  i0.ɵɵconditional(ctx_r1.TaxSubTab === "audit" ? 5 : -1);
1495
1513
  } }
1496
1514
  function TagsResourceComponent_Conditional_19_Conditional_2_For_9_Template(rf, ctx) { if (rf & 1) {
1497
- i0.ɵɵelementStart(0, "option", 245);
1515
+ i0.ɵɵelementStart(0, "option", 247);
1498
1516
  i0.ɵɵtext(1);
1499
1517
  i0.ɵɵelementEnd();
1500
1518
  } if (rf & 2) {
@@ -1505,18 +1523,18 @@ function TagsResourceComponent_Conditional_19_Conditional_2_For_9_Template(rf, c
1505
1523
  } }
1506
1524
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
1507
1525
  const _r45 = i0.ɵɵgetCurrentView();
1508
- i0.ɵɵelementStart(0, "div", 249)(1, "strong");
1526
+ i0.ɵɵelementStart(0, "div", 251)(1, "strong");
1509
1527
  i0.ɵɵtext(2);
1510
1528
  i0.ɵɵelementEnd();
1511
- i0.ɵɵelement(3, "span", 247);
1512
- i0.ɵɵelementStart(4, "button", 253);
1529
+ i0.ɵɵelement(3, "span", 249);
1530
+ i0.ɵɵelementStart(4, "button", 255);
1513
1531
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_16_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r45); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.BulkApprove()); });
1514
- i0.ɵɵelement(5, "i", 254);
1532
+ i0.ɵɵelement(5, "i", 256);
1515
1533
  i0.ɵɵtext(6, " Approve all (auto-pick best) ");
1516
1534
  i0.ɵɵelementEnd();
1517
- i0.ɵɵelementStart(7, "button", 255);
1535
+ i0.ɵɵelementStart(7, "button", 257);
1518
1536
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_16_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r45); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.BulkReject()); });
1519
- i0.ɵɵelement(8, "i", 168);
1537
+ i0.ɵɵelement(8, "i", 170);
1520
1538
  i0.ɵɵtext(9, " Reject ");
1521
1539
  i0.ɵɵelementEnd()();
1522
1540
  } if (rf & 2) {
@@ -1529,15 +1547,15 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_16_Templ
1529
1547
  i0.ɵɵproperty("disabled", ctx_r1.SuggestionBulkInProgress);
1530
1548
  } }
1531
1549
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1532
- i0.ɵɵelementStart(0, "div", 59);
1533
- i0.ɵɵelement(1, "i", 256);
1550
+ i0.ɵɵelementStart(0, "div", 61);
1551
+ i0.ɵɵelement(1, "i", 258);
1534
1552
  i0.ɵɵelementStart(2, "p");
1535
1553
  i0.ɵɵtext(3, "No pending suggestions.");
1536
1554
  i0.ɵɵelementEnd()();
1537
1555
  } }
1538
1556
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_10_Template(rf, ctx) { if (rf & 1) {
1539
1557
  i0.ɵɵtext(0);
1540
- i0.ɵɵelementStart(1, "span", 263);
1558
+ i0.ɵɵelementStart(1, "span", 265);
1541
1559
  i0.ɵɵtext(2);
1542
1560
  i0.ɵɵelementEnd();
1543
1561
  } if (rf & 2) {
@@ -1547,12 +1565,12 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_1
1547
1565
  i0.ɵɵtextInterpolate(row_r48.BestMatchPath);
1548
1566
  } }
1549
1567
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_11_Template(rf, ctx) { if (rf & 1) {
1550
- i0.ɵɵelementStart(0, "span", 261);
1568
+ i0.ɵɵelementStart(0, "span", 263);
1551
1569
  i0.ɵɵtext(1, "\u2014 no match \u2014");
1552
1570
  i0.ɵɵelementEnd();
1553
1571
  } }
1554
1572
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_13_Template(rf, ctx) { if (rf & 1) {
1555
- i0.ɵɵelementStart(0, "span", 265);
1573
+ i0.ɵɵelementStart(0, "span", 267);
1556
1574
  i0.ɵɵelement(1, "span");
1557
1575
  i0.ɵɵelementEnd();
1558
1576
  i0.ɵɵtext(2);
@@ -1565,12 +1583,12 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_1
1565
1583
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(3, 3, row_r48.BestMatchScore, "1.3-3"), " ");
1566
1584
  } }
1567
1585
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_14_Template(rf, ctx) { if (rf & 1) {
1568
- i0.ɵɵelementStart(0, "span", 261);
1586
+ i0.ɵɵelementStart(0, "span", 263);
1569
1587
  i0.ɵɵtext(1, "\u2014");
1570
1588
  i0.ɵɵelementEnd();
1571
1589
  } }
1572
1590
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1573
- i0.ɵɵelementStart(0, "span", 263);
1591
+ i0.ɵɵelementStart(0, "span", 265);
1574
1592
  i0.ɵɵelement(1, "i", 13);
1575
1593
  i0.ɵɵtext(2);
1576
1594
  i0.ɵɵelementEnd();
@@ -1581,21 +1599,21 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_1
1581
1599
  } }
1582
1600
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1583
1601
  const _r50 = i0.ɵɵgetCurrentView();
1584
- i0.ɵɵelementStart(0, "button", 269);
1602
+ i0.ɵɵelementStart(0, "button", 271);
1585
1603
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Conditional_3_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r50); const row_r48 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.DispositionSuggestion(row_r48, "merge"); return i0.ɵɵresetView($event.stopPropagation()); });
1586
- i0.ɵɵelement(1, "i", 270);
1604
+ i0.ɵɵelement(1, "i", 272);
1587
1605
  i0.ɵɵelementEnd();
1588
1606
  } }
1589
1607
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1590
1608
  const _r49 = i0.ɵɵgetCurrentView();
1591
- i0.ɵɵelementStart(0, "div", 264)(1, "button", 266);
1609
+ i0.ɵɵelementStart(0, "div", 266)(1, "button", 268);
1592
1610
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r49); const row_r48 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.DispositionSuggestion(row_r48, "create-new"); return i0.ɵɵresetView($event.stopPropagation()); });
1593
- i0.ɵɵelement(2, "i", 66);
1611
+ i0.ɵɵelement(2, "i", 68);
1594
1612
  i0.ɵɵelementEnd();
1595
- i0.ɵɵconditionalCreate(3, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Conditional_3_Template, 2, 0, "button", 267);
1596
- i0.ɵɵelementStart(4, "button", 268);
1613
+ i0.ɵɵconditionalCreate(3, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Conditional_3_Template, 2, 0, "button", 269);
1614
+ i0.ɵɵelementStart(4, "button", 270);
1597
1615
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Template_button_click_4_listener($event) { i0.ɵɵrestoreView(_r49); const row_r48 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.DispositionSuggestion(row_r48, "reject"); return i0.ɵɵresetView($event.stopPropagation()); });
1598
- i0.ɵɵelement(5, "i", 168);
1616
+ i0.ɵɵelement(5, "i", 170);
1599
1617
  i0.ɵɵelementEnd()();
1600
1618
  } if (rf & 2) {
1601
1619
  const row_r48 = i0.ɵɵnextContext().$implicit;
@@ -1604,9 +1622,9 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_1
1604
1622
  } }
1605
1623
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Template(rf, ctx) { if (rf & 1) {
1606
1624
  const _r47 = i0.ɵɵgetCurrentView();
1607
- i0.ɵɵelementStart(0, "tr", 259);
1625
+ i0.ɵɵelementStart(0, "tr", 261);
1608
1626
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Template_tr_click_0_listener() { const row_r48 = i0.ɵɵrestoreView(_r47).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectSuggestion(row_r48)); });
1609
- i0.ɵɵelementStart(1, "td")(2, "input", 260);
1627
+ i0.ɵɵelementStart(1, "td")(2, "input", 262);
1610
1628
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Template_input_click_2_listener($event) { const row_r48 = i0.ɵɵrestoreView(_r47).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ToggleSuggestionSelected(row_r48, $event)); });
1611
1629
  i0.ɵɵelementEnd()();
1612
1630
  i0.ɵɵelementStart(3, "td")(4, "strong");
@@ -1616,17 +1634,17 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_1
1616
1634
  i0.ɵɵtext(8);
1617
1635
  i0.ɵɵelementEnd()();
1618
1636
  i0.ɵɵelementStart(9, "td");
1619
- i0.ɵɵconditionalCreate(10, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_10_Template, 3, 2)(11, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_11_Template, 2, 0, "span", 261);
1637
+ i0.ɵɵconditionalCreate(10, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_10_Template, 3, 2)(11, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_11_Template, 2, 0, "span", 263);
1620
1638
  i0.ɵɵelementEnd();
1621
- i0.ɵɵelementStart(12, "td", 262);
1622
- i0.ɵɵconditionalCreate(13, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_13_Template, 4, 6)(14, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_14_Template, 2, 0, "span", 261);
1639
+ i0.ɵɵelementStart(12, "td", 264);
1640
+ i0.ɵɵconditionalCreate(13, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_13_Template, 4, 6)(14, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_14_Template, 2, 0, "span", 263);
1623
1641
  i0.ɵɵelementEnd();
1624
- i0.ɵɵelementStart(15, "td", 261);
1642
+ i0.ɵɵelementStart(15, "td", 263);
1625
1643
  i0.ɵɵtext(16);
1626
1644
  i0.ɵɵpipe(17, "date");
1627
1645
  i0.ɵɵelementEnd();
1628
1646
  i0.ɵɵelementStart(18, "td");
1629
- i0.ɵɵconditionalCreate(19, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_19_Template, 3, 1, "span", 263)(20, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Template, 6, 1, "div", 264);
1647
+ i0.ɵɵconditionalCreate(19, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_19_Template, 3, 1, "span", 265)(20, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Conditional_20_Template, 6, 1, "div", 266);
1630
1648
  i0.ɵɵelementEnd()();
1631
1649
  } if (rf & 2) {
1632
1650
  const row_r48 = ctx.$implicit;
@@ -1651,7 +1669,7 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_1
1651
1669
  } }
1652
1670
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1653
1671
  const _r46 = i0.ɵɵgetCurrentView();
1654
- i0.ɵɵelementStart(0, "table", 251)(1, "thead")(2, "tr")(3, "th", 257)(4, "input", 230);
1672
+ i0.ɵɵelementStart(0, "table", 253)(1, "thead")(2, "tr")(3, "th", 259)(4, "input", 232);
1655
1673
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_Template_input_change_4_listener($event) { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleAllSuggestions($event.target.checked)); });
1656
1674
  i0.ɵɵelementEnd()();
1657
1675
  i0.ɵɵelementStart(5, "th");
@@ -1672,7 +1690,7 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_Templ
1672
1690
  i0.ɵɵelement(15, "th");
1673
1691
  i0.ɵɵelementEnd()();
1674
1692
  i0.ɵɵelementStart(16, "tbody");
1675
- i0.ɵɵrepeaterCreate(17, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Template, 21, 17, "tr", 258, _forTrack2);
1693
+ i0.ɵɵrepeaterCreate(17, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_For_18_Template, 21, 17, "tr", 260, _forTrack2);
1676
1694
  i0.ɵɵelementEnd()();
1677
1695
  } if (rf & 2) {
1678
1696
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1692,10 +1710,10 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Condi
1692
1710
  i0.ɵɵelementStart(0, "h4");
1693
1711
  i0.ɵɵtext(1, "Proposes merge into");
1694
1712
  i0.ɵɵelementEnd();
1695
- i0.ɵɵelementStart(2, "div", 280)(3, "div", 247)(4, "div", 272);
1713
+ i0.ɵɵelementStart(2, "div", 282)(3, "div", 249)(4, "div", 274);
1696
1714
  i0.ɵɵtext(5);
1697
1715
  i0.ɵɵelementEnd();
1698
- i0.ɵɵelementStart(6, "div", 263);
1716
+ i0.ɵɵelementStart(6, "div", 265);
1699
1717
  i0.ɵɵtext(7);
1700
1718
  i0.ɵɵelementEnd()()();
1701
1719
  } if (rf & 2) {
@@ -1709,7 +1727,7 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Condi
1709
1727
  i0.ɵɵelementStart(0, "h4");
1710
1728
  i0.ɵɵtext(1, "Source text");
1711
1729
  i0.ɵɵelementEnd();
1712
- i0.ɵɵelementStart(2, "p", 275);
1730
+ i0.ɵɵelementStart(2, "p", 277);
1713
1731
  i0.ɵɵtext(3);
1714
1732
  i0.ɵɵelementEnd();
1715
1733
  } if (rf & 2) {
@@ -1747,9 +1765,9 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Condi
1747
1765
  } }
1748
1766
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Conditional_22_Template(rf, ctx) { if (rf & 1) {
1749
1767
  const _r52 = i0.ɵɵgetCurrentView();
1750
- i0.ɵɵelementStart(0, "button", 163);
1768
+ i0.ɵɵelementStart(0, "button", 165);
1751
1769
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Conditional_22_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r52); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DispositionSuggestion(ctx_r1.SuggestionSelected, "merge")); });
1752
- i0.ɵɵelement(1, "i", 270);
1770
+ i0.ɵɵelement(1, "i", 272);
1753
1771
  i0.ɵɵtext(2, " Merge ");
1754
1772
  i0.ɵɵelementEnd();
1755
1773
  } if (rf & 2) {
@@ -1758,18 +1776,18 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Condi
1758
1776
  } }
1759
1777
  function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1760
1778
  const _r51 = i0.ɵɵgetCurrentView();
1761
- i0.ɵɵelementStart(0, "aside", 252)(1, "div", 271)(2, "div")(3, "div", 272);
1779
+ i0.ɵɵelementStart(0, "aside", 254)(1, "div", 273)(2, "div")(3, "div", 274);
1762
1780
  i0.ɵɵtext(4);
1763
1781
  i0.ɵɵelementEnd();
1764
- i0.ɵɵelementStart(5, "div", 263);
1782
+ i0.ɵɵelementStart(5, "div", 265);
1765
1783
  i0.ɵɵtext(6);
1766
1784
  i0.ɵɵpipe(7, "date");
1767
1785
  i0.ɵɵelementEnd()();
1768
- i0.ɵɵelementStart(8, "button", 273);
1786
+ i0.ɵɵelementStart(8, "button", 275);
1769
1787
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r51); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseDrawer()); });
1770
- i0.ɵɵelement(9, "i", 168);
1788
+ i0.ɵɵelement(9, "i", 170);
1771
1789
  i0.ɵɵelementEnd()();
1772
- i0.ɵɵelementStart(10, "div", 274)(11, "span");
1790
+ i0.ɵɵelementStart(10, "div", 276)(11, "span");
1773
1791
  i0.ɵɵtext(12);
1774
1792
  i0.ɵɵconditionalCreate(13, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Conditional_13_Template, 2, 4);
1775
1793
  i0.ɵɵelementEnd();
@@ -1778,19 +1796,19 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Templ
1778
1796
  i0.ɵɵelementStart(16, "h4");
1779
1797
  i0.ɵɵtext(17, "If approved");
1780
1798
  i0.ɵɵelementEnd();
1781
- i0.ɵɵelementStart(18, "p", 275);
1799
+ i0.ɵɵelementStart(18, "p", 277);
1782
1800
  i0.ɵɵconditionalCreate(19, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Conditional_19_Template, 7, 2)(20, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Conditional_20_Template, 4, 1);
1783
1801
  i0.ɵɵelementEnd()();
1784
- i0.ɵɵelementStart(21, "div", 276);
1785
- i0.ɵɵconditionalCreate(22, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Conditional_22_Template, 3, 1, "button", 277);
1786
- i0.ɵɵelementStart(23, "button", 278);
1802
+ i0.ɵɵelementStart(21, "div", 278);
1803
+ i0.ɵɵconditionalCreate(22, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Conditional_22_Template, 3, 1, "button", 279);
1804
+ i0.ɵɵelementStart(23, "button", 280);
1787
1805
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r51); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.DispositionSuggestion(ctx_r1.SuggestionSelected, "create-new")); });
1788
- i0.ɵɵelement(24, "i", 66);
1806
+ i0.ɵɵelement(24, "i", 68);
1789
1807
  i0.ɵɵtext(25, " Create as new ");
1790
1808
  i0.ɵɵelementEnd();
1791
- i0.ɵɵelementStart(26, "button", 279);
1809
+ i0.ɵɵelementStart(26, "button", 281);
1792
1810
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r51); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.DispositionSuggestion(ctx_r1.SuggestionSelected, "reject")); });
1793
- i0.ɵɵelement(27, "i", 168);
1811
+ i0.ɵɵelement(27, "i", 170);
1794
1812
  i0.ɵɵtext(28, " Reject ");
1795
1813
  i0.ɵɵelementEnd()()();
1796
1814
  } if (rf & 2) {
@@ -1820,32 +1838,32 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Templ
1820
1838
  } }
1821
1839
  function TagsResourceComponent_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1822
1840
  const _r43 = i0.ɵɵgetCurrentView();
1823
- i0.ɵɵelementStart(0, "div", 25)(1, "div", 239)(2, "div", 240)(3, "div", 241)(4, "input", 242);
1841
+ i0.ɵɵelementStart(0, "div", 27)(1, "div", 241)(2, "div", 242)(3, "div", 243)(4, "input", 244);
1824
1842
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_2_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SuggestionSearch, $event) || (ctx_r1.SuggestionSearch = $event); return i0.ɵɵresetView($event); });
1825
1843
  i0.ɵɵlistener("input", function TagsResourceComponent_Conditional_19_Conditional_2_Template_input_input_4_listener() { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySuggestionFilters()); });
1826
1844
  i0.ɵɵelementEnd();
1827
- i0.ɵɵelementStart(5, "select", 243);
1845
+ i0.ɵɵelementStart(5, "select", 245);
1828
1846
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_2_Template_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SuggestionFilterReason, $event) || (ctx_r1.SuggestionFilterReason = $event); return i0.ɵɵresetView($event); });
1829
1847
  i0.ɵɵlistener("change", function TagsResourceComponent_Conditional_19_Conditional_2_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySuggestionFilters()); });
1830
- i0.ɵɵelementStart(6, "option", 244);
1848
+ i0.ɵɵelementStart(6, "option", 246);
1831
1849
  i0.ɵɵtext(7, "All reasons");
1832
1850
  i0.ɵɵelementEnd();
1833
- i0.ɵɵrepeaterCreate(8, TagsResourceComponent_Conditional_19_Conditional_2_For_9_Template, 2, 2, "option", 245, i0.ɵɵrepeaterTrackByIdentity);
1851
+ i0.ɵɵrepeaterCreate(8, TagsResourceComponent_Conditional_19_Conditional_2_For_9_Template, 2, 2, "option", 247, i0.ɵɵrepeaterTrackByIdentity);
1834
1852
  i0.ɵɵelementEnd();
1835
- i0.ɵɵelementStart(10, "input", 246);
1853
+ i0.ɵɵelementStart(10, "input", 248);
1836
1854
  i0.ɵɵlistener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_2_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnMinScoreChange($event)); });
1837
1855
  i0.ɵɵelementEnd();
1838
- i0.ɵɵelement(11, "span", 247);
1839
- i0.ɵɵelementStart(12, "span", 248);
1856
+ i0.ɵɵelement(11, "span", 249);
1857
+ i0.ɵɵelementStart(12, "span", 250);
1840
1858
  i0.ɵɵtext(13, " Showing ");
1841
1859
  i0.ɵɵelementStart(14, "strong");
1842
1860
  i0.ɵɵtext(15);
1843
1861
  i0.ɵɵelementEnd()()();
1844
- i0.ɵɵconditionalCreate(16, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_16_Template, 10, 3, "div", 249);
1845
- i0.ɵɵelementStart(17, "div", 250);
1846
- i0.ɵɵconditionalCreate(18, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_18_Template, 4, 0, "div", 59)(19, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_Template, 19, 1, "table", 251);
1862
+ i0.ɵɵconditionalCreate(16, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_16_Template, 10, 3, "div", 251);
1863
+ i0.ɵɵelementStart(17, "div", 252);
1864
+ i0.ɵɵconditionalCreate(18, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_18_Template, 4, 0, "div", 61)(19, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_19_Template, 19, 1, "table", 253);
1847
1865
  i0.ɵɵelementEnd()();
1848
- i0.ɵɵconditionalCreate(20, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Template, 29, 16, "aside", 252);
1866
+ i0.ɵɵconditionalCreate(20, TagsResourceComponent_Conditional_19_Conditional_2_Conditional_20_Template, 29, 16, "aside", 254);
1849
1867
  i0.ɵɵelementEnd()();
1850
1868
  } if (rf & 2) {
1851
1869
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1867,14 +1885,14 @@ function TagsResourceComponent_Conditional_19_Conditional_2_Template(rf, ctx) {
1867
1885
  i0.ɵɵconditional(ctx_r1.SuggestionSelected ? 20 : -1);
1868
1886
  } }
1869
1887
  function TagsResourceComponent_Conditional_19_Conditional_3_Conditional_117_Template(rf, ctx) { if (rf & 1) {
1870
- i0.ɵɵelementStart(0, "div", 308);
1871
- i0.ɵɵelement(1, "i", 309);
1888
+ i0.ɵɵelementStart(0, "div", 310);
1889
+ i0.ɵɵelement(1, "i", 311);
1872
1890
  i0.ɵɵelementStart(2, "p");
1873
1891
  i0.ɵɵtext(3, "No runs yet.");
1874
1892
  i0.ɵɵelementEnd()();
1875
1893
  } }
1876
1894
  function TagsResourceComponent_Conditional_19_Conditional_3_Conditional_118_For_21_Template(rf, ctx) { if (rf & 1) {
1877
- i0.ɵɵelementStart(0, "tr")(1, "td", 261);
1895
+ i0.ɵɵelementStart(0, "tr")(1, "td", 263);
1878
1896
  i0.ɵɵtext(2);
1879
1897
  i0.ɵɵpipe(3, "date");
1880
1898
  i0.ɵɵelementEnd();
@@ -1953,148 +1971,148 @@ function TagsResourceComponent_Conditional_19_Conditional_3_Conditional_118_Temp
1953
1971
  } }
1954
1972
  function TagsResourceComponent_Conditional_19_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1955
1973
  const _r53 = i0.ɵɵgetCurrentView();
1956
- i0.ɵɵelementStart(0, "div", 26)(1, "div", 281)(2, "div", 282)(3, "div", 283);
1974
+ i0.ɵɵelementStart(0, "div", 28)(1, "div", 283)(2, "div", 284)(3, "div", 285);
1957
1975
  i0.ɵɵtext(4, "Last run");
1958
1976
  i0.ɵɵelementEnd();
1959
- i0.ɵɵelementStart(5, "div", 284);
1977
+ i0.ɵɵelementStart(5, "div", 286);
1960
1978
  i0.ɵɵtext(6);
1961
1979
  i0.ɵɵpipe(7, "date");
1962
1980
  i0.ɵɵelementEnd()();
1963
- i0.ɵɵelementStart(8, "div", 282)(9, "div", 283);
1981
+ i0.ɵɵelementStart(8, "div", 284)(9, "div", 285);
1964
1982
  i0.ɵɵtext(10, "Tags scanned");
1965
1983
  i0.ɵɵelementEnd();
1966
- i0.ɵɵelementStart(11, "div", 284);
1984
+ i0.ɵɵelementStart(11, "div", 286);
1967
1985
  i0.ɵɵtext(12);
1968
1986
  i0.ɵɵelementEnd()();
1969
- i0.ɵɵelementStart(13, "div", 282)(14, "div", 283);
1987
+ i0.ɵɵelementStart(13, "div", 284)(14, "div", 285);
1970
1988
  i0.ɵɵtext(15, "Issues enqueued (last run)");
1971
1989
  i0.ɵɵelementEnd();
1972
- i0.ɵɵelementStart(16, "div", 284);
1990
+ i0.ɵɵelementStart(16, "div", 286);
1973
1991
  i0.ɵɵtext(17);
1974
1992
  i0.ɵɵelementEnd()();
1975
- i0.ɵɵelementStart(18, "div", 282)(19, "div", 283);
1993
+ i0.ɵɵelementStart(18, "div", 284)(19, "div", 285);
1976
1994
  i0.ɵɵtext(20, "Pending suggestions");
1977
1995
  i0.ɵɵelementEnd();
1978
- i0.ɵɵelementStart(21, "div", 284);
1996
+ i0.ɵɵelementStart(21, "div", 286);
1979
1997
  i0.ɵɵtext(22);
1980
1998
  i0.ɵɵelementEnd()();
1981
- i0.ɵɵelement(23, "span", 285);
1982
- i0.ɵɵelementStart(24, "div", 282)(25, "div", 283);
1999
+ i0.ɵɵelement(23, "span", 287);
2000
+ i0.ɵɵelementStart(24, "div", 284)(25, "div", 285);
1983
2001
  i0.ɵɵtext(26, "Last duration");
1984
2002
  i0.ɵɵelementEnd();
1985
- i0.ɵɵelementStart(27, "div", 284);
2003
+ i0.ɵɵelementStart(27, "div", 286);
1986
2004
  i0.ɵɵtext(28);
1987
2005
  i0.ɵɵelementEnd()()();
1988
- i0.ɵɵelementStart(29, "div", 286)(30, "div", 287)(31, "div", 288)(32, "div", 289);
1989
- i0.ɵɵelement(33, "i", 270);
2006
+ i0.ɵɵelementStart(29, "div", 288)(30, "div", 289)(31, "div", 290)(32, "div", 291);
2007
+ i0.ɵɵelement(33, "i", 272);
1990
2008
  i0.ɵɵelementEnd();
1991
- i0.ɵɵelementStart(34, "div")(35, "div", 290);
2009
+ i0.ɵɵelementStart(34, "div")(35, "div", 292);
1992
2010
  i0.ɵɵtext(36, "Merge candidates");
1993
2011
  i0.ɵɵelementEnd();
1994
2012
  i0.ɵɵelementStart(37, "h3");
1995
2013
  i0.ɵɵtext(38, "Likely duplicate tags");
1996
2014
  i0.ɵɵelementEnd()()();
1997
- i0.ɵɵelementStart(39, "div", 291);
2015
+ i0.ɵɵelementStart(39, "div", 293);
1998
2016
  i0.ɵɵtext(40);
1999
2017
  i0.ɵɵelementEnd();
2000
- i0.ɵɵelementStart(41, "p", 292);
2018
+ i0.ɵɵelementStart(41, "p", 294);
2001
2019
  i0.ɵɵtext(42, "Pairs with high embedding cosine + name similarity. Approving merges the source into the target and re-points existing ContentItemTag rows.");
2002
2020
  i0.ɵɵelementEnd();
2003
- i0.ɵɵelementStart(43, "div", 293)(44, "button", 294);
2021
+ i0.ɵɵelementStart(43, "div", 295)(44, "button", 296);
2004
2022
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_3_Template_button_click_44_listener() { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.SwitchTab("suggestions"); ctx_r1.SuggestionFilterReason = "MergeCandidate"; return i0.ɵɵresetView(ctx_r1.applySuggestionFilters()); });
2005
2023
  i0.ɵɵtext(45, " Open in Suggestions ");
2006
2024
  i0.ɵɵelementEnd()()();
2007
- i0.ɵɵelementStart(46, "div", 295)(47, "div", 288)(48, "div", 289);
2008
- i0.ɵɵelement(49, "i", 296);
2025
+ i0.ɵɵelementStart(46, "div", 297)(47, "div", 290)(48, "div", 291);
2026
+ i0.ɵɵelement(49, "i", 298);
2009
2027
  i0.ɵɵelementEnd();
2010
- i0.ɵɵelementStart(50, "div")(51, "div", 290);
2028
+ i0.ɵɵelementStart(50, "div")(51, "div", 292);
2011
2029
  i0.ɵɵtext(52, "Low usage");
2012
2030
  i0.ɵɵelementEnd();
2013
2031
  i0.ɵɵelementStart(53, "h3");
2014
2032
  i0.ɵɵtext(54, "Deprecation candidates");
2015
2033
  i0.ɵɵelementEnd()()();
2016
- i0.ɵɵelementStart(55, "div", 291);
2034
+ i0.ɵɵelementStart(55, "div", 293);
2017
2035
  i0.ɵɵtext(56);
2018
2036
  i0.ɵɵelementEnd();
2019
- i0.ɵɵelementStart(57, "p", 292);
2037
+ i0.ɵɵelementStart(57, "p", 294);
2020
2038
  i0.ɵɵtext(58, "Active tags used fewer than the threshold over the lookback window. Often abandoned imports or finished-project tags.");
2021
2039
  i0.ɵɵelementEnd();
2022
- i0.ɵɵelementStart(59, "div", 293)(60, "button", 294);
2040
+ i0.ɵɵelementStart(59, "div", 295)(60, "button", 296);
2023
2041
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_3_Template_button_click_60_listener() { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.SwitchTab("suggestions"); ctx_r1.SuggestionFilterReason = "LowUsage"; return i0.ɵɵresetView(ctx_r1.applySuggestionFilters()); });
2024
2042
  i0.ɵɵtext(61, " Review ");
2025
2043
  i0.ɵɵelementEnd()()();
2026
- i0.ɵɵelementStart(62, "div", 297)(63, "div", 288)(64, "div", 289);
2027
- i0.ɵɵelement(65, "i", 298);
2044
+ i0.ɵɵelementStart(62, "div", 299)(63, "div", 290)(64, "div", 291);
2045
+ i0.ɵɵelement(65, "i", 300);
2028
2046
  i0.ɵɵelementEnd();
2029
- i0.ɵɵelementStart(66, "div")(67, "div", 290);
2047
+ i0.ɵɵelementStart(66, "div")(67, "div", 292);
2030
2048
  i0.ɵɵtext(68, "Wide nodes");
2031
2049
  i0.ɵɵelementEnd();
2032
2050
  i0.ɵɵelementStart(69, "h3");
2033
2051
  i0.ɵɵtext(70, "Parents with too many children");
2034
2052
  i0.ɵɵelementEnd()()();
2035
- i0.ɵɵelementStart(71, "div", 291);
2053
+ i0.ɵɵelementStart(71, "div", 293);
2036
2054
  i0.ɵɵtext(72);
2037
2055
  i0.ɵɵelementEnd();
2038
- i0.ɵɵelementStart(73, "p", 292);
2056
+ i0.ɵɵelementStart(73, "p", 294);
2039
2057
  i0.ɵɵtext(74, "Parents whose direct-child count exceeds ");
2040
2058
  i0.ɵɵelementStart(75, "strong");
2041
2059
  i0.ɵɵtext(76, "MaxChildren");
2042
2060
  i0.ɵɵelementEnd();
2043
2061
  i0.ɵɵtext(77);
2044
2062
  i0.ɵɵelementEnd();
2045
- i0.ɵɵelementStart(78, "div", 293)(79, "button", 294);
2063
+ i0.ɵɵelementStart(78, "div", 295)(79, "button", 296);
2046
2064
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_19_Conditional_3_Template_button_click_79_listener() { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.SwitchTab("suggestions"); ctx_r1.SuggestionFilterReason = "WideNode"; return i0.ɵɵresetView(ctx_r1.applySuggestionFilters()); });
2047
2065
  i0.ɵɵtext(80, " Review ");
2048
2066
  i0.ɵɵelementEnd()()()();
2049
- i0.ɵɵelementStart(81, "div", 299)(82, "h3");
2067
+ i0.ɵɵelementStart(81, "div", 301)(82, "h3");
2050
2068
  i0.ɵɵtext(83, "Health-job thresholds");
2051
2069
  i0.ɵɵelementEnd();
2052
- i0.ɵɵelementStart(84, "div", 300)(85, "div", 301)(86, "label");
2070
+ i0.ɵɵelementStart(84, "div", 302)(85, "div", 303)(86, "label");
2053
2071
  i0.ɵɵtext(87, "Merge: min co-occurrence");
2054
2072
  i0.ɵɵelementEnd();
2055
- i0.ɵɵelementStart(88, "input", 302);
2073
+ i0.ɵɵelementStart(88, "input", 304);
2056
2074
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_3_Template_input_ngModelChange_88_listener($event) { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.HealthThresholds.minCoOccurrence, $event) || (ctx_r1.HealthThresholds.minCoOccurrence = $event); return i0.ɵɵresetView($event); });
2057
2075
  i0.ɵɵelementEnd();
2058
- i0.ɵɵelementStart(89, "span", 303);
2076
+ i0.ɵɵelementStart(89, "span", 305);
2059
2077
  i0.ɵɵtext(90, "Pairs must appear together in \u2265 this many items.");
2060
2078
  i0.ɵɵelementEnd()();
2061
- i0.ɵɵelementStart(91, "div", 301)(92, "label");
2079
+ i0.ɵɵelementStart(91, "div", 303)(92, "label");
2062
2080
  i0.ɵɵtext(93, "Merge: min embedding cosine");
2063
2081
  i0.ɵɵelementEnd();
2064
- i0.ɵɵelementStart(94, "input", 304);
2082
+ i0.ɵɵelementStart(94, "input", 306);
2065
2083
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_3_Template_input_ngModelChange_94_listener($event) { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.HealthThresholds.minEmbeddingSimilarity, $event) || (ctx_r1.HealthThresholds.minEmbeddingSimilarity = $event); return i0.ɵɵresetView($event); });
2066
2084
  i0.ɵɵelementEnd()();
2067
- i0.ɵɵelementStart(95, "div", 301)(96, "label");
2085
+ i0.ɵɵelementStart(95, "div", 303)(96, "label");
2068
2086
  i0.ɵɵtext(97, "Merge: min name similarity");
2069
2087
  i0.ɵɵelementEnd();
2070
- i0.ɵɵelementStart(98, "input", 305);
2088
+ i0.ɵɵelementStart(98, "input", 307);
2071
2089
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_3_Template_input_ngModelChange_98_listener($event) { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.HealthThresholds.minNameSimilarity, $event) || (ctx_r1.HealthThresholds.minNameSimilarity = $event); return i0.ɵɵresetView($event); });
2072
2090
  i0.ɵɵelementEnd();
2073
- i0.ɵɵelementStart(99, "span", 303);
2091
+ i0.ɵɵelementStart(99, "span", 305);
2074
2092
  i0.ɵɵtext(100, "Dice's-coefficient bigram similarity.");
2075
2093
  i0.ɵɵelementEnd()();
2076
- i0.ɵɵelementStart(101, "div", 301)(102, "label");
2094
+ i0.ɵɵelementStart(101, "div", 303)(102, "label");
2077
2095
  i0.ɵɵtext(103, "Low usage: max usage");
2078
2096
  i0.ɵɵelementEnd();
2079
- i0.ɵɵelementStart(104, "input", 302);
2097
+ i0.ɵɵelementStart(104, "input", 304);
2080
2098
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_3_Template_input_ngModelChange_104_listener($event) { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.HealthThresholds.maxUsage, $event) || (ctx_r1.HealthThresholds.maxUsage = $event); return i0.ɵɵresetView($event); });
2081
2099
  i0.ɵɵelementEnd()();
2082
- i0.ɵɵelementStart(105, "div", 301)(106, "label");
2100
+ i0.ɵɵelementStart(105, "div", 303)(106, "label");
2083
2101
  i0.ɵɵtext(107, "Wide node: max implicit children");
2084
2102
  i0.ɵɵelementEnd();
2085
- i0.ɵɵelementStart(108, "input", 302);
2103
+ i0.ɵɵelementStart(108, "input", 304);
2086
2104
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_19_Conditional_3_Template_input_ngModelChange_108_listener($event) { i0.ɵɵrestoreView(_r53); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.HealthThresholds.maxImplicitChildren, $event) || (ctx_r1.HealthThresholds.maxImplicitChildren = $event); return i0.ɵɵresetView($event); });
2087
2105
  i0.ɵɵelementEnd();
2088
- i0.ɵɵelementStart(109, "span", 303);
2106
+ i0.ɵɵelementStart(109, "span", 305);
2089
2107
  i0.ɵɵtext(110, "Used when a tag has no explicit MaxChildren cap.");
2090
2108
  i0.ɵɵelementEnd()()()();
2091
- i0.ɵɵelementStart(111, "div", 306)(112, "div", 307)(113, "h3");
2109
+ i0.ɵɵelementStart(111, "div", 308)(112, "div", 309)(113, "h3");
2092
2110
  i0.ɵɵtext(114, "Run history");
2093
2111
  i0.ɵɵelementEnd();
2094
- i0.ɵɵelementStart(115, "span", 263);
2112
+ i0.ɵɵelementStart(115, "span", 265);
2095
2113
  i0.ɵɵtext(116);
2096
2114
  i0.ɵɵelementEnd()();
2097
- i0.ɵɵconditionalCreate(117, TagsResourceComponent_Conditional_19_Conditional_3_Conditional_117_Template, 4, 0, "div", 308)(118, TagsResourceComponent_Conditional_19_Conditional_3_Conditional_118_Template, 22, 0, "table");
2115
+ i0.ɵɵconditionalCreate(117, TagsResourceComponent_Conditional_19_Conditional_3_Conditional_117_Template, 4, 0, "div", 310)(118, TagsResourceComponent_Conditional_19_Conditional_3_Conditional_118_Template, 22, 0, "table");
2098
2116
  i0.ɵɵelementEnd()();
2099
2117
  } if (rf & 2) {
2100
2118
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -2132,10 +2150,10 @@ function TagsResourceComponent_Conditional_19_Conditional_3_Template(rf, ctx) {
2132
2150
  i0.ɵɵconditional(ctx_r1.HealthRunHistory.length === 0 ? 117 : 118);
2133
2151
  } }
2134
2152
  function TagsResourceComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
2135
- i0.ɵɵconditionalCreate(0, TagsResourceComponent_Conditional_19_Conditional_0_Template, 38, 2, "div", 25);
2136
- i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Template, 6, 5, "div", 25);
2137
- i0.ɵɵconditionalCreate(2, TagsResourceComponent_Conditional_19_Conditional_2_Template, 21, 8, "div", 25);
2138
- i0.ɵɵconditionalCreate(3, TagsResourceComponent_Conditional_19_Conditional_3_Template, 119, 19, "div", 26);
2153
+ i0.ɵɵconditionalCreate(0, TagsResourceComponent_Conditional_19_Conditional_0_Template, 38, 2, "div", 27);
2154
+ i0.ɵɵconditionalCreate(1, TagsResourceComponent_Conditional_19_Conditional_1_Template, 6, 5, "div", 27);
2155
+ i0.ɵɵconditionalCreate(2, TagsResourceComponent_Conditional_19_Conditional_2_Template, 21, 8, "div", 27);
2156
+ i0.ɵɵconditionalCreate(3, TagsResourceComponent_Conditional_19_Conditional_3_Template, 119, 19, "div", 28);
2139
2157
  } if (rf & 2) {
2140
2158
  const ctx_r1 = i0.ɵɵnextContext();
2141
2159
  i0.ɵɵconditional(ctx_r1.ActiveTab === "tags" ? 0 : -1);
@@ -2147,8 +2165,8 @@ function TagsResourceComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
2147
2165
  i0.ɵɵconditional(ctx_r1.ActiveTab === "health" ? 3 : -1);
2148
2166
  } }
2149
2167
  function TagsResourceComponent_Conditional_20_Conditional_15_Conditional_2_Template(rf, ctx) { if (rf & 1) {
2150
- i0.ɵɵelementStart(0, "span", 331);
2151
- i0.ɵɵelement(1, "i", 332);
2168
+ i0.ɵɵelementStart(0, "span", 333);
2169
+ i0.ɵɵelement(1, "i", 334);
2152
2170
  i0.ɵɵtext(2);
2153
2171
  i0.ɵɵelementEnd();
2154
2172
  } if (rf & 2) {
@@ -2157,10 +2175,10 @@ function TagsResourceComponent_Conditional_20_Conditional_15_Conditional_2_Templ
2157
2175
  i0.ɵɵtextInterpolate1(" ", ctx_r1.SelectedFeedItem.FileTypeName);
2158
2176
  } }
2159
2177
  function TagsResourceComponent_Conditional_20_Conditional_15_Template(rf, ctx) { if (rf & 1) {
2160
- i0.ɵɵelementStart(0, "span", 330);
2178
+ i0.ɵɵelementStart(0, "span", 332);
2161
2179
  i0.ɵɵtext(1);
2162
2180
  i0.ɵɵelementEnd();
2163
- i0.ɵɵconditionalCreate(2, TagsResourceComponent_Conditional_20_Conditional_15_Conditional_2_Template, 3, 1, "span", 331);
2181
+ i0.ɵɵconditionalCreate(2, TagsResourceComponent_Conditional_20_Conditional_15_Conditional_2_Template, 3, 1, "span", 333);
2164
2182
  } if (rf & 2) {
2165
2183
  const ctx_r1 = i0.ɵɵnextContext(2);
2166
2184
  i0.ɵɵadvance();
@@ -2169,12 +2187,12 @@ function TagsResourceComponent_Conditional_20_Conditional_15_Template(rf, ctx) {
2169
2187
  i0.ɵɵconditional(ctx_r1.SelectedFeedItem.FileTypeName ? 2 : -1);
2170
2188
  } }
2171
2189
  function TagsResourceComponent_Conditional_20_Conditional_16_Template(rf, ctx) { if (rf & 1) {
2172
- i0.ɵɵelementStart(0, "div", 320)(1, "div", 321);
2190
+ i0.ɵɵelementStart(0, "div", 322)(1, "div", 323);
2173
2191
  i0.ɵɵtext(2, "URL");
2174
2192
  i0.ɵɵelementEnd();
2175
- i0.ɵɵelementStart(3, "a", 333);
2193
+ i0.ɵɵelementStart(3, "a", 335);
2176
2194
  i0.ɵɵtext(4);
2177
- i0.ɵɵelement(5, "i", 334);
2195
+ i0.ɵɵelement(5, "i", 336);
2178
2196
  i0.ɵɵelementEnd()();
2179
2197
  } if (rf & 2) {
2180
2198
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -2184,10 +2202,10 @@ function TagsResourceComponent_Conditional_20_Conditional_16_Template(rf, ctx) {
2184
2202
  i0.ɵɵtextInterpolate1(" ", ctx_r1.SelectedFeedItem.URL, " ");
2185
2203
  } }
2186
2204
  function TagsResourceComponent_Conditional_20_Conditional_17_Template(rf, ctx) { if (rf & 1) {
2187
- i0.ɵɵelementStart(0, "div", 320)(1, "div", 321);
2205
+ i0.ɵɵelementStart(0, "div", 322)(1, "div", 323);
2188
2206
  i0.ɵɵtext(2, "Content Preview");
2189
2207
  i0.ɵɵelementEnd();
2190
- i0.ɵɵelementStart(3, "div", 335);
2208
+ i0.ɵɵelementStart(3, "div", 337);
2191
2209
  i0.ɵɵtext(4);
2192
2210
  i0.ɵɵelementEnd()();
2193
2211
  } if (rf & 2) {
@@ -2196,9 +2214,9 @@ function TagsResourceComponent_Conditional_20_Conditional_17_Template(rf, ctx) {
2196
2214
  i0.ɵɵtextInterpolate(ctx_r1.SelectedFeedItem.TextContent);
2197
2215
  } }
2198
2216
  function TagsResourceComponent_Conditional_20_Conditional_18_For_5_Template(rf, ctx) { if (rf & 1) {
2199
- i0.ɵɵelementStart(0, "span", 338);
2217
+ i0.ɵɵelementStart(0, "span", 340);
2200
2218
  i0.ɵɵtext(1);
2201
- i0.ɵɵelementStart(2, "span", 339);
2219
+ i0.ɵɵelementStart(2, "span", 341);
2202
2220
  i0.ɵɵtext(3);
2203
2221
  i0.ɵɵelementEnd()();
2204
2222
  } if (rf & 2) {
@@ -2211,11 +2229,11 @@ function TagsResourceComponent_Conditional_20_Conditional_18_For_5_Template(rf,
2211
2229
  i0.ɵɵtextInterpolate(ctx_r1.FormatWeight(wt_r56.Weight));
2212
2230
  } }
2213
2231
  function TagsResourceComponent_Conditional_20_Conditional_18_Template(rf, ctx) { if (rf & 1) {
2214
- i0.ɵɵelementStart(0, "div", 320)(1, "div", 321);
2232
+ i0.ɵɵelementStart(0, "div", 322)(1, "div", 323);
2215
2233
  i0.ɵɵtext(2);
2216
2234
  i0.ɵɵelementEnd();
2217
- i0.ɵɵelementStart(3, "div", 336);
2218
- i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_20_Conditional_18_For_5_Template, 4, 4, "span", 337, _forTrack0);
2235
+ i0.ɵɵelementStart(3, "div", 338);
2236
+ i0.ɵɵrepeaterCreate(4, TagsResourceComponent_Conditional_20_Conditional_18_For_5_Template, 4, 4, "span", 339, _forTrack0);
2219
2237
  i0.ɵɵelementEnd()();
2220
2238
  } if (rf & 2) {
2221
2239
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -2225,10 +2243,10 @@ function TagsResourceComponent_Conditional_20_Conditional_18_Template(rf, ctx) {
2225
2243
  i0.ɵɵrepeater(ctx_r1.SelectedFeedItem.Tags);
2226
2244
  } }
2227
2245
  function TagsResourceComponent_Conditional_20_Conditional_23_Template(rf, ctx) { if (rf & 1) {
2228
- i0.ɵɵelementStart(0, "div", 323)(1, "span", 324);
2246
+ i0.ɵɵelementStart(0, "div", 325)(1, "span", 326);
2229
2247
  i0.ɵɵtext(2, "Checksum");
2230
2248
  i0.ɵɵelementEnd();
2231
- i0.ɵɵelementStart(3, "span", 340);
2249
+ i0.ɵɵelementStart(3, "span", 342);
2232
2250
  i0.ɵɵtext(4);
2233
2251
  i0.ɵɵelementEnd()();
2234
2252
  } if (rf & 2) {
@@ -2238,52 +2256,52 @@ function TagsResourceComponent_Conditional_20_Conditional_23_Template(rf, ctx) {
2238
2256
  } }
2239
2257
  function TagsResourceComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
2240
2258
  const _r55 = i0.ɵɵgetCurrentView();
2241
- i0.ɵɵelementStart(0, "div", 310);
2259
+ i0.ɵɵelementStart(0, "div", 312);
2242
2260
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_20_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r55); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseItemDetail()); });
2243
2261
  i0.ɵɵelementEnd();
2244
- i0.ɵɵelementStart(1, "div", 311)(2, "div", 312)(3, "h3");
2245
- i0.ɵɵelement(4, "i", 313);
2262
+ i0.ɵɵelementStart(1, "div", 313)(2, "div", 314)(3, "h3");
2263
+ i0.ɵɵelement(4, "i", 315);
2246
2264
  i0.ɵɵtext(5, " Content Item");
2247
2265
  i0.ɵɵelementEnd();
2248
- i0.ɵɵelementStart(6, "button", 314);
2266
+ i0.ɵɵelementStart(6, "button", 316);
2249
2267
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_20_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r55); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseItemDetail()); });
2250
- i0.ɵɵelement(7, "i", 57);
2268
+ i0.ɵɵelement(7, "i", 59);
2251
2269
  i0.ɵɵelementEnd()();
2252
- i0.ɵɵelementStart(8, "div", 315)(9, "div", 316)(10, "h4", 317);
2270
+ i0.ɵɵelementStart(8, "div", 317)(9, "div", 318)(10, "h4", 319);
2253
2271
  i0.ɵɵtext(11);
2254
2272
  i0.ɵɵelementEnd();
2255
- i0.ɵɵelementStart(12, "div", 318)(13, "span", 319);
2273
+ i0.ɵɵelementStart(12, "div", 320)(13, "span", 321);
2256
2274
  i0.ɵɵtext(14);
2257
2275
  i0.ɵɵelementEnd();
2258
2276
  i0.ɵɵconditionalCreate(15, TagsResourceComponent_Conditional_20_Conditional_15_Template, 3, 2);
2259
2277
  i0.ɵɵelementEnd()();
2260
- i0.ɵɵconditionalCreate(16, TagsResourceComponent_Conditional_20_Conditional_16_Template, 6, 2, "div", 320);
2261
- i0.ɵɵconditionalCreate(17, TagsResourceComponent_Conditional_20_Conditional_17_Template, 5, 1, "div", 320);
2262
- i0.ɵɵconditionalCreate(18, TagsResourceComponent_Conditional_20_Conditional_18_Template, 6, 1, "div", 320);
2263
- i0.ɵɵelementStart(19, "div", 320)(20, "div", 321);
2278
+ i0.ɵɵconditionalCreate(16, TagsResourceComponent_Conditional_20_Conditional_16_Template, 6, 2, "div", 322);
2279
+ i0.ɵɵconditionalCreate(17, TagsResourceComponent_Conditional_20_Conditional_17_Template, 5, 1, "div", 322);
2280
+ i0.ɵɵconditionalCreate(18, TagsResourceComponent_Conditional_20_Conditional_18_Template, 6, 1, "div", 322);
2281
+ i0.ɵɵelementStart(19, "div", 322)(20, "div", 323);
2264
2282
  i0.ɵɵtext(21, "Metadata");
2265
2283
  i0.ɵɵelementEnd();
2266
- i0.ɵɵelementStart(22, "div", 322);
2267
- i0.ɵɵconditionalCreate(23, TagsResourceComponent_Conditional_20_Conditional_23_Template, 5, 1, "div", 323);
2268
- i0.ɵɵelementStart(24, "div", 323)(25, "span", 324);
2284
+ i0.ɵɵelementStart(22, "div", 324);
2285
+ i0.ɵɵconditionalCreate(23, TagsResourceComponent_Conditional_20_Conditional_23_Template, 5, 1, "div", 325);
2286
+ i0.ɵɵelementStart(24, "div", 325)(25, "span", 326);
2269
2287
  i0.ɵɵtext(26, "Created");
2270
2288
  i0.ɵɵelementEnd();
2271
- i0.ɵɵelementStart(27, "span", 325);
2289
+ i0.ɵɵelementStart(27, "span", 327);
2272
2290
  i0.ɵɵtext(28);
2273
2291
  i0.ɵɵelementEnd()();
2274
- i0.ɵɵelementStart(29, "div", 323)(30, "span", 324);
2292
+ i0.ɵɵelementStart(29, "div", 325)(30, "span", 326);
2275
2293
  i0.ɵɵtext(31, "Updated");
2276
2294
  i0.ɵɵelementEnd();
2277
- i0.ɵɵelementStart(32, "span", 325);
2295
+ i0.ɵɵelementStart(32, "span", 327);
2278
2296
  i0.ɵɵtext(33);
2279
2297
  i0.ɵɵelementEnd()()()();
2280
- i0.ɵɵelementStart(34, "div", 326)(35, "button", 120);
2298
+ i0.ɵɵelementStart(34, "div", 328)(35, "button", 122);
2281
2299
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_20_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r55); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenRecordFromItem(ctx_r1.SelectedFeedItem)); });
2282
- i0.ɵɵelement(36, "i", 327);
2300
+ i0.ɵɵelement(36, "i", 329);
2283
2301
  i0.ɵɵtext(37, " Open Record ");
2284
2302
  i0.ɵɵelementEnd();
2285
- i0.ɵɵelementStart(38, "button", 328);
2286
- i0.ɵɵelement(39, "i", 329);
2303
+ i0.ɵɵelementStart(38, "button", 330);
2304
+ i0.ɵɵelement(39, "i", 331);
2287
2305
  i0.ɵɵtext(40, " See Similar Items ");
2288
2306
  i0.ɵɵelementEnd()()()();
2289
2307
  } if (rf & 2) {
@@ -2309,27 +2327,27 @@ function TagsResourceComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
2309
2327
  } }
2310
2328
  function TagsResourceComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
2311
2329
  const _r57 = i0.ɵɵgetCurrentView();
2312
- i0.ɵɵelementStart(0, "div", 341);
2330
+ i0.ɵɵelementStart(0, "div", 343);
2313
2331
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_21_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r57); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConfirmDialogCancel()); });
2314
- i0.ɵɵelementStart(1, "div", 342);
2332
+ i0.ɵɵelementStart(1, "div", 344);
2315
2333
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_21_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r57); return i0.ɵɵresetView($event.stopPropagation()); });
2316
- i0.ɵɵelementStart(2, "div", 343)(3, "h3");
2317
- i0.ɵɵelement(4, "i", 344);
2334
+ i0.ɵɵelementStart(2, "div", 345)(3, "h3");
2335
+ i0.ɵɵelement(4, "i", 346);
2318
2336
  i0.ɵɵtext(5);
2319
2337
  i0.ɵɵelementEnd();
2320
- i0.ɵɵelementStart(6, "button", 223);
2338
+ i0.ɵɵelementStart(6, "button", 225);
2321
2339
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_21_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r57); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConfirmDialogCancel()); });
2322
- i0.ɵɵelement(7, "i", 57);
2340
+ i0.ɵɵelement(7, "i", 59);
2323
2341
  i0.ɵɵelementEnd()();
2324
- i0.ɵɵelementStart(8, "div", 345)(9, "p", 346);
2342
+ i0.ɵɵelementStart(8, "div", 347)(9, "p", 348);
2325
2343
  i0.ɵɵtext(10);
2326
2344
  i0.ɵɵelementEnd()();
2327
- i0.ɵɵelementStart(11, "div", 347)(12, "button", 348);
2345
+ i0.ɵɵelementStart(11, "div", 349)(12, "button", 350);
2328
2346
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_21_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r57); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConfirmDialogAccept()); });
2329
- i0.ɵɵelement(13, "i", 254);
2347
+ i0.ɵɵelement(13, "i", 256);
2330
2348
  i0.ɵɵtext(14, " Confirm ");
2331
2349
  i0.ɵɵelementEnd();
2332
- i0.ɵɵelementStart(15, "button", 121);
2350
+ i0.ɵɵelementStart(15, "button", 123);
2333
2351
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_21_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r57); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConfirmDialogCancel()); });
2334
2352
  i0.ɵɵtext(16, "Cancel");
2335
2353
  i0.ɵɵelementEnd()()()();
@@ -2342,33 +2360,33 @@ function TagsResourceComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
2342
2360
  } }
2343
2361
  function TagsResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
2344
2362
  const _r58 = i0.ɵɵgetCurrentView();
2345
- i0.ɵɵelementStart(0, "div", 341);
2363
+ i0.ɵɵelementStart(0, "div", 343);
2346
2364
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_22_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r58); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseSplitDialog()); });
2347
- i0.ɵɵelementStart(1, "div", 342);
2365
+ i0.ɵɵelementStart(1, "div", 344);
2348
2366
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_22_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r58); return i0.ɵɵresetView($event.stopPropagation()); });
2349
- i0.ɵɵelementStart(2, "div", 343)(3, "h3");
2350
- i0.ɵɵelement(4, "i", 125);
2367
+ i0.ɵɵelementStart(2, "div", 345)(3, "h3");
2368
+ i0.ɵɵelement(4, "i", 127);
2351
2369
  i0.ɵɵtext(5, " Split Tag");
2352
2370
  i0.ɵɵelementEnd();
2353
- i0.ɵɵelementStart(6, "button", 223);
2371
+ i0.ɵɵelementStart(6, "button", 225);
2354
2372
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_22_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r58); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseSplitDialog()); });
2355
- i0.ɵɵelement(7, "i", 57);
2373
+ i0.ɵɵelement(7, "i", 59);
2356
2374
  i0.ɵɵelementEnd()();
2357
- i0.ɵɵelementStart(8, "div", 345)(9, "div", 349)(10, "label");
2375
+ i0.ɵɵelementStart(8, "div", 347)(9, "div", 351)(10, "label");
2358
2376
  i0.ɵɵtext(11, "New tag names (comma-separated)");
2359
2377
  i0.ɵɵelementEnd();
2360
- i0.ɵɵelementStart(12, "input", 350);
2378
+ i0.ɵɵelementStart(12, "input", 352);
2361
2379
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_22_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r58); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.SplitChildNames, $event) || (ctx_r1.SplitChildNames = $event); return i0.ɵɵresetView($event); });
2362
2380
  i0.ɵɵelementEnd()();
2363
- i0.ɵɵelementStart(13, "p", 346);
2381
+ i0.ɵɵelementStart(13, "p", 348);
2364
2382
  i0.ɵɵtext(14, "New tags will be created as siblings of the original tag under the same parent.");
2365
2383
  i0.ɵɵelementEnd()();
2366
- i0.ɵɵelementStart(15, "div", 347)(16, "button", 163);
2384
+ i0.ɵɵelementStart(15, "div", 349)(16, "button", 165);
2367
2385
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_22_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r58); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ExecuteSplit()); });
2368
- i0.ɵɵelement(17, "i", 125);
2386
+ i0.ɵɵelement(17, "i", 127);
2369
2387
  i0.ɵɵtext(18, " Create Tags ");
2370
2388
  i0.ɵɵelementEnd();
2371
- i0.ɵɵelementStart(19, "button", 121);
2389
+ i0.ɵɵelementStart(19, "button", 123);
2372
2390
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_22_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r58); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseSplitDialog()); });
2373
2391
  i0.ɵɵtext(20, "Cancel");
2374
2392
  i0.ɵɵelementEnd()()()();
@@ -2381,40 +2399,40 @@ function TagsResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
2381
2399
  } }
2382
2400
  function TagsResourceComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
2383
2401
  const _r59 = i0.ɵɵgetCurrentView();
2384
- i0.ɵɵelementStart(0, "div", 341);
2402
+ i0.ɵɵelementStart(0, "div", 343);
2385
2403
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_23_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r59); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseCreateTagDialog()); });
2386
- i0.ɵɵelementStart(1, "div", 342);
2404
+ i0.ɵɵelementStart(1, "div", 344);
2387
2405
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_23_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r59); return i0.ɵɵresetView($event.stopPropagation()); });
2388
- i0.ɵɵelementStart(2, "div", 343)(3, "h3");
2389
- i0.ɵɵelement(4, "i", 66);
2406
+ i0.ɵɵelementStart(2, "div", 345)(3, "h3");
2407
+ i0.ɵɵelement(4, "i", 68);
2390
2408
  i0.ɵɵtext(5, " Create Tag");
2391
2409
  i0.ɵɵelementEnd();
2392
- i0.ɵɵelementStart(6, "button", 223);
2410
+ i0.ɵɵelementStart(6, "button", 225);
2393
2411
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_23_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r59); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseCreateTagDialog()); });
2394
- i0.ɵɵelement(7, "i", 57);
2412
+ i0.ɵɵelement(7, "i", 59);
2395
2413
  i0.ɵɵelementEnd()();
2396
- i0.ɵɵelementStart(8, "div", 345)(9, "div", 351);
2414
+ i0.ɵɵelementStart(8, "div", 347)(9, "div", 353);
2397
2415
  i0.ɵɵtext(10);
2398
2416
  i0.ɵɵelementEnd();
2399
- i0.ɵɵelementStart(11, "div", 349)(12, "label");
2417
+ i0.ɵɵelementStart(11, "div", 351)(12, "label");
2400
2418
  i0.ɵɵtext(13, "Name");
2401
2419
  i0.ɵɵelementEnd();
2402
- i0.ɵɵelementStart(14, "input", 352);
2420
+ i0.ɵɵelementStart(14, "input", 354);
2403
2421
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_23_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r59); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.CreateTagName, $event) || (ctx_r1.CreateTagName = $event); return i0.ɵɵresetView($event); });
2404
2422
  i0.ɵɵlistener("keydown.enter", function TagsResourceComponent_Conditional_23_Template_input_keydown_enter_14_listener() { i0.ɵɵrestoreView(_r59); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveNewTag()); });
2405
2423
  i0.ɵɵelementEnd()();
2406
- i0.ɵɵelementStart(15, "div", 349)(16, "label");
2424
+ i0.ɵɵelementStart(15, "div", 351)(16, "label");
2407
2425
  i0.ɵɵtext(17, "Description (optional)");
2408
2426
  i0.ɵɵelementEnd();
2409
- i0.ɵɵelementStart(18, "textarea", 353);
2427
+ i0.ɵɵelementStart(18, "textarea", 355);
2410
2428
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_23_Template_textarea_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r59); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.CreateTagDescription, $event) || (ctx_r1.CreateTagDescription = $event); return i0.ɵɵresetView($event); });
2411
2429
  i0.ɵɵelementEnd()()();
2412
- i0.ɵɵelementStart(19, "div", 347)(20, "button", 163);
2430
+ i0.ɵɵelementStart(19, "div", 349)(20, "button", 165);
2413
2431
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_23_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r59); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveNewTag()); });
2414
- i0.ɵɵelement(21, "i", 254);
2432
+ i0.ɵɵelement(21, "i", 256);
2415
2433
  i0.ɵɵtext(22, " Create ");
2416
2434
  i0.ɵɵelementEnd();
2417
- i0.ɵɵelementStart(23, "button", 121);
2435
+ i0.ɵɵelementStart(23, "button", 123);
2418
2436
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_23_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r59); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseCreateTagDialog()); });
2419
2437
  i0.ɵɵtext(24, "Cancel");
2420
2438
  i0.ɵɵelementEnd()()()();
@@ -2430,7 +2448,7 @@ function TagsResourceComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
2430
2448
  i0.ɵɵproperty("disabled", !ctx_r1.CreateTagName.trim());
2431
2449
  } }
2432
2450
  function TagsResourceComponent_Conditional_24_For_16_Template(rf, ctx) { if (rf & 1) {
2433
- i0.ɵɵelementStart(0, "option", 355);
2451
+ i0.ɵɵelementStart(0, "option", 357);
2434
2452
  i0.ɵɵtext(1);
2435
2453
  i0.ɵɵelementEnd();
2436
2454
  } if (rf & 2) {
@@ -2441,34 +2459,34 @@ function TagsResourceComponent_Conditional_24_For_16_Template(rf, ctx) { if (rf
2441
2459
  } }
2442
2460
  function TagsResourceComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
2443
2461
  const _r60 = i0.ɵɵgetCurrentView();
2444
- i0.ɵɵelementStart(0, "div", 341);
2462
+ i0.ɵɵelementStart(0, "div", 343);
2445
2463
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_24_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r60); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMoveDialog()); });
2446
- i0.ɵɵelementStart(1, "div", 342);
2464
+ i0.ɵɵelementStart(1, "div", 344);
2447
2465
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_24_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r60); return i0.ɵɵresetView($event.stopPropagation()); });
2448
- i0.ɵɵelementStart(2, "div", 343)(3, "h3");
2449
- i0.ɵɵelement(4, "i", 123);
2466
+ i0.ɵɵelementStart(2, "div", 345)(3, "h3");
2467
+ i0.ɵɵelement(4, "i", 125);
2450
2468
  i0.ɵɵtext(5, " Move Tag");
2451
2469
  i0.ɵɵelementEnd();
2452
- i0.ɵɵelementStart(6, "button", 223);
2470
+ i0.ɵɵelementStart(6, "button", 225);
2453
2471
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_24_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r60); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMoveDialog()); });
2454
- i0.ɵɵelement(7, "i", 57);
2472
+ i0.ɵɵelement(7, "i", 59);
2455
2473
  i0.ɵɵelementEnd()();
2456
- i0.ɵɵelementStart(8, "div", 345)(9, "div", 349)(10, "label");
2474
+ i0.ɵɵelementStart(8, "div", 347)(9, "div", 351)(10, "label");
2457
2475
  i0.ɵɵtext(11, "New parent tag");
2458
2476
  i0.ɵɵelementEnd();
2459
- i0.ɵɵelementStart(12, "select", 354);
2477
+ i0.ɵɵelementStart(12, "select", 356);
2460
2478
  i0.ɵɵtwoWayListener("ngModelChange", function TagsResourceComponent_Conditional_24_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r60); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.MoveNewParentID, $event) || (ctx_r1.MoveNewParentID = $event); return i0.ɵɵresetView($event); });
2461
- i0.ɵɵelementStart(13, "option", 355);
2479
+ i0.ɵɵelementStart(13, "option", 357);
2462
2480
  i0.ɵɵtext(14, "(Root level \u2014 no parent)");
2463
2481
  i0.ɵɵelementEnd();
2464
- i0.ɵɵrepeaterCreate(15, TagsResourceComponent_Conditional_24_For_16_Template, 2, 3, "option", 355, _forTrack2);
2482
+ i0.ɵɵrepeaterCreate(15, TagsResourceComponent_Conditional_24_For_16_Template, 2, 3, "option", 357, _forTrack2);
2465
2483
  i0.ɵɵelementEnd()()();
2466
- i0.ɵɵelementStart(17, "div", 347)(18, "button", 120);
2484
+ i0.ɵɵelementStart(17, "div", 349)(18, "button", 122);
2467
2485
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_24_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r60); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ExecuteMove()); });
2468
- i0.ɵɵelement(19, "i", 254);
2486
+ i0.ɵɵelement(19, "i", 256);
2469
2487
  i0.ɵɵtext(20, " Move ");
2470
2488
  i0.ɵɵelementEnd();
2471
- i0.ɵɵelementStart(21, "button", 121);
2489
+ i0.ɵɵelementStart(21, "button", 123);
2472
2490
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_24_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r60); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMoveDialog()); });
2473
2491
  i0.ɵɵtext(22, "Cancel");
2474
2492
  i0.ɵɵelementEnd()()()();
@@ -2486,37 +2504,37 @@ function TagsResourceComponent_Conditional_25_Conditional_17_Template(rf, ctx) {
2486
2504
  i0.ɵɵtext(1, " Merging... ");
2487
2505
  } }
2488
2506
  function TagsResourceComponent_Conditional_25_Conditional_18_Template(rf, ctx) { if (rf & 1) {
2489
- i0.ɵɵelement(0, "i", 124);
2507
+ i0.ɵɵelement(0, "i", 126);
2490
2508
  i0.ɵɵtext(1, " Merge ");
2491
2509
  } }
2492
2510
  function TagsResourceComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
2493
2511
  const _r62 = i0.ɵɵgetCurrentView();
2494
- i0.ɵɵelementStart(0, "div", 341);
2512
+ i0.ɵɵelementStart(0, "div", 343);
2495
2513
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_25_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r62); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMergeIntoDialog()); });
2496
- i0.ɵɵelementStart(1, "div", 342);
2514
+ i0.ɵɵelementStart(1, "div", 344);
2497
2515
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_25_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r62); return i0.ɵɵresetView($event.stopPropagation()); });
2498
- i0.ɵɵelementStart(2, "div", 343)(3, "h3");
2499
- i0.ɵɵelement(4, "i", 124);
2516
+ i0.ɵɵelementStart(2, "div", 345)(3, "h3");
2517
+ i0.ɵɵelement(4, "i", 126);
2500
2518
  i0.ɵɵtext(5);
2501
2519
  i0.ɵɵelementEnd();
2502
- i0.ɵɵelementStart(6, "button", 223);
2520
+ i0.ɵɵelementStart(6, "button", 225);
2503
2521
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_25_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r62); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMergeIntoDialog()); });
2504
- i0.ɵɵelement(7, "i", 57);
2522
+ i0.ɵɵelement(7, "i", 59);
2505
2523
  i0.ɵɵelementEnd()();
2506
- i0.ɵɵelementStart(8, "div", 345)(9, "p", 356);
2524
+ i0.ɵɵelementStart(8, "div", 347)(9, "p", 358);
2507
2525
  i0.ɵɵtext(10);
2508
2526
  i0.ɵɵelementEnd();
2509
- i0.ɵɵelementStart(11, "div", 349)(12, "label");
2527
+ i0.ɵɵelementStart(11, "div", 351)(12, "label");
2510
2528
  i0.ɵɵtext(13, "Merge into");
2511
2529
  i0.ɵɵelementEnd();
2512
- i0.ɵɵelementStart(14, "mj-combobox", 357);
2530
+ i0.ɵɵelementStart(14, "mj-combobox", 359);
2513
2531
  i0.ɵɵlistener("ValueChange", function TagsResourceComponent_Conditional_25_Template_mj_combobox_ValueChange_14_listener($event) { i0.ɵɵrestoreView(_r62); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnMergeTargetSelected($event)); });
2514
2532
  i0.ɵɵelementEnd()()();
2515
- i0.ɵɵelementStart(15, "div", 347)(16, "button", 163);
2533
+ i0.ɵɵelementStart(15, "div", 349)(16, "button", 165);
2516
2534
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_25_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r62); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ExecuteMergeInto()); });
2517
2535
  i0.ɵɵconditionalCreate(17, TagsResourceComponent_Conditional_25_Conditional_17_Template, 2, 0)(18, TagsResourceComponent_Conditional_25_Conditional_18_Template, 2, 0);
2518
2536
  i0.ɵɵelementEnd();
2519
- i0.ɵɵelementStart(19, "button", 121);
2537
+ i0.ɵɵelementStart(19, "button", 123);
2520
2538
  i0.ɵɵlistener("click", function TagsResourceComponent_Conditional_25_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r62); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseMergeIntoDialog()); });
2521
2539
  i0.ɵɵtext(20, "Cancel");
2522
2540
  i0.ɵɵelementEnd()()()();
@@ -7292,10 +7310,10 @@ let TagsResourceComponent = class TagsResourceComponent extends BaseResourceComp
7292
7310
  }
7293
7311
  }
7294
7312
  static ɵfac = /*@__PURE__*/ (() => { let ɵTagsResourceComponent_BaseFactory; return function TagsResourceComponent_Factory(__ngFactoryType__) { return (ɵTagsResourceComponent_BaseFactory || (ɵTagsResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(TagsResourceComponent)))(__ngFactoryType__ || TagsResourceComponent); }; })();
7295
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TagsResourceComponent, selectors: [["mj-tags-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 26, vars: 20, consts: [["Title", "Tags", "Icon", "fa-solid fa-sitemap", "Subtitle", "Taxonomy management, health monitoring, and tag library"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], [3, "Flex", "Padding"], [1, "at-dashboard"], [3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], ["toolbar", ""], ["mjButton", "", "variant", "secondary", "size", "sm"], [3, "Padding", "Flex"], [1, "at-main-area"], [1, "at-loading-overlay"], [1, "at-schedule-overlay"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-heart-pulse"], ["type", "text", "placeholder", "Search tags...", 1, "at-search-input", 3, "ngModel"], [3, "Tabs", "ActiveKey"], ["type", "text", "placeholder", "Search tags...", 1, "at-search-input", 3, "ngModelChange", "input", "ngModel"], [3, "TabChange", "Tabs", "ActiveKey"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate"], [1, "fa-solid", "fa-play"], ["text", "Loading tag data\u2026"], [1, "at-page-body"], [1, "health-shell"], [1, "at-tag-lib-layout"], [1, "at-tag-lib-main"], [1, "at-card"], [1, "at-card-body", 2, "max-height", "500px", "overflow-y", "auto"], [1, "at-tag-table"], [1, "at-tag-row-clickable", 3, "at-tag-row-selected"], [1, "at-card", 2, "margin-top", "12px"], [1, "at-tag-lib-sidebar"], [1, "at-card", "at-tag-cloud-card"], [1, "at-card-title", 2, "margin-bottom", "12px"], [1, "fa-solid", "fa-cloud"], ["Layout", "spiral", "ColorMode", "weight-gradient", 3, "Items", "MaxFontSize", "MinFontSize", "MaxItems", "Interactive", "Animate"], [1, "at-tag-cloud-empty"], [1, "at-card", 2, "padding", "16px", "margin-top", "12px"], [1, "at-card-title", 2, "margin-bottom", "10px"], [1, "fa-solid", "fa-chart-pie"], [1, "at-tags-by-source"], [1, "at-tag-source-row"], [1, "at-tag-row-clickable", 3, "click"], [1, "at-tag-name-cell"], [1, "at-weight-indicator"], [1, "at-weight-bar"], [1, "at-weight-bar-fill"], [1, "at-weight-value"], [1, "at-tag-bar"], [1, "at-tag-bar-fill"], [1, "at-card-header"], [1, "at-card-title"], [1, "fa-solid", "fa-tag"], ["aria-label", "Close", 1, "at-slide-close", 2, "background", "none", "border", "none", "cursor", "pointer", "color", "var(--mj-text-muted)", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-card-body", 2, "max-height", "300px", "overflow-y", "auto"], [1, "at-empty-state"], [1, "at-tag-row-clickable"], [1, "at-tax-split-view"], [1, "at-tax-tree-panel", 2, "position", "relative"], [1, "at-tax-tree-toolbar"], ["type", "text", "placeholder", "Search tags...", 1, "at-search-input", 2, "flex", "1", 3, "ngModelChange", "input", "ngModel"], ["title", "Add root tag", 1, "at-tax-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Toggle multi-select for drag reparenting", 1, "at-tax-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-check-double"], [1, "at-tax-tree-body", 3, "dragover", "drop"], [1, "at-tax-tree-node", 3, "at-tax-node-selected", "at-tax-node-drag-over", "at-tax-node-multi-selected", "padding-left"], [1, "at-tax-tree-saving-overlay"], [1, "at-tax-details-panel"], [1, "at-empty-state", 2, "height", "100%"], [1, "at-tax-health-bar"], [1, "at-tax-health-label"], [1, "at-tax-health-stat"], [1, "at-tax-dot", "at-tax-dot-total"], [1, "at-tax-health-value"], [1, "at-tax-health-text"], [1, "at-tax-dot", "at-tax-dot-healthy"], [1, "at-tax-health-value", "at-tax-val-success"], [1, "at-tax-dot", "at-tax-dot-attention"], [1, "at-tax-health-value", "at-tax-val-warning"], [1, "at-tax-dot", "at-tax-dot-orphaned"], [1, "at-tax-health-value", "at-tax-val-error"], [1, "at-tax-dot", "at-tax-dot-duplicates"], [1, "at-tax-health-value", "at-tax-val-info"], [1, "fa-solid", "fa-sitemap"], [1, "at-tax-tree-node", 3, "dragstart", "dragover", "dragleave", "drop", "click"], ["type", "checkbox", 1, "at-tax-tree-checkbox", 3, "checked"], [1, "at-tax-tree-arrow", 3, "click"], [1, "at-tax-health-dot"], [1, "at-tax-tree-label"], [1, "at-tax-tree-count"], ["title", "Add child tag", 1, "at-tax-tree-add-child", 3, "click"], ["type", "checkbox", 1, "at-tax-tree-checkbox", 3, "click", "checked"], ["text", "Moving tags...", "size", "small"], [1, "at-tax-details-header"], [1, "at-tax-breadcrumb"], [1, "at-tax-bc-current"], [1, "at-tax-edit-form"], [1, "at-tax-stats-row"], [1, "at-tax-stat-item"], [1, "at-tax-stat-value"], [1, "at-tax-stat-label"], [1, "at-tax-stat-value", "at-tax-stat-date"], [1, "at-tax-action-toolbar"], [1, "at-tax-detail-section"], [1, "at-tax-bc-link", 3, "click"], [1, "at-tax-bc-sep"], [1, "at-tax-details-title"], ["title", "Edit name", 1, "at-tax-edit-icon", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "at-tax-details-desc"], [1, "at-form-group"], [1, "at-form-label"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["rows", "3", 1, "at-form-textarea", 3, "ngModelChange", "ngModel"], [1, "at-form-actions"], [1, "at-action-btn", "at-primary-btn", 3, "click"], [1, "at-action-btn", "at-secondary-btn", 3, "click"], [1, "at-tax-action-btn", 3, "click"], [1, "fa-solid", "fa-arrows-up-down"], [1, "fa-solid", "fa-compress"], [1, "fa-solid", "fa-code-branch"], [1, "at-tax-action-btn", "at-tax-action-danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "at-tax-section-title"], [1, "at-tax-child-chips"], [1, "at-tax-child-chip"], [1, "at-tax-child-chip", 3, "click"], [1, "at-tax-chip-count"], [1, "at-tax-recent-list"], [1, "at-tax-recent-item"], [1, "at-tax-recent-icon"], [1, "at-tax-recent-name"], [1, "at-tax-recent-weight"], [1, "at-tax-recent-date"], [1, "at-tg-toggle-row"], [1, "at-tg-toggle-label"], [1, "at-tg-toggle-t"], [1, "at-tg-toggle-d"], [1, "at-tg-switch", 3, "click"], [1, "at-tg-grid-3"], [1, "at-tg-field"], ["type", "number", "min", "0", 1, "at-search-input", 3, "change", "value"], [1, "at-tg-hint"], ["type", "number", "min", "0", "max", "1", "step", "0.01", 1, "at-search-input", 3, "change", "value"], [1, "at-tg-chip-list"], [1, "at-tg-chip", "scoped"], [1, "at-tg-hint", 2, "font-style", "italic"], [1, "at-action-btn", "at-btn-sm", 3, "click"], [1, "fa-solid", "fa-pencil"], [1, "at-tg-hint", 2, "margin-top", "8px"], [1, "fa-solid", "fa-info-circle"], [1, "at-tg-syn-add"], ["placeholder", "e.g. \"GenAI\"", 1, "at-search-input", 3, "ngModelChange", "keyup.enter", "ngModel"], [1, "at-search-input", 2, "width", "130px", 3, "ngModelChange", "ngModel"], ["value", "Manual"], ["value", "Imported"], ["value", "Merged"], ["value", "LLM"], [1, "at-action-btn", "at-primary-btn", 3, "click", "disabled"], [1, "at-tg-syn-row", 3, "pending"], [1, "at-tg-syn-row"], [1, "at-tg-syn-name"], ["title", "Remove", 1, "at-tg-syn-x", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-hand-pointer"], [1, "at-tax-dup-stats-bar"], [1, "at-tax-dup-stat"], [1, "at-tax-dup-stat", "at-tax-dup-high"], [1, "at-tax-dup-stat", "at-tax-dup-moderate"], [1, "at-tax-dup-list"], [1, "at-tax-dup-card", 3, "at-tax-dup-high", "at-tax-dup-moderate"], [1, "fa-solid", "fa-check-circle"], [1, "at-tax-dup-card"], [1, "at-tax-dup-tag"], [1, "at-tax-dup-similarity"], [1, "at-tax-sim-percent", "high"], [1, "fa-solid", "fa-clone"], [1, "at-tax-dup-actions"], [1, "at-tax-dup-btn", "at-tax-dup-btn-primary", 3, "click", "disabled"], [1, "at-tax-dup-btn", 3, "click"], [1, "at-tax-dup-arrow"], [1, "fa-solid", "fa-arrows-left-right"], [1, "at-tax-sim-bar-bg"], [1, "at-tax-sim-bar-fill"], [1, "at-tax-sim-percent"], [1, "at-tax-orphan-toolbar"], [1, "at-tax-orphan-count"], [1, "at-tax-orphan-desc"], [1, "at-tax-orphan-bulk"], [1, "at-tax-bulk-btn", 3, "click"], [1, "fa-solid", "fa-square-check"], [1, "fa-regular", "fa-square"], [1, "at-tax-bulk-btn", "at-tax-bulk-danger", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "at-tax-orphan-grid"], [1, "at-tax-orphan-card"], [1, "at-tax-orphan-header"], [1, "at-tax-orphan-name"], ["type", "checkbox", 1, "at-tax-orphan-checkbox", 3, "change", "click", "checked"], [1, "at-tax-orphan-stats"], [1, "at-tax-orphan-dates"], [1, "at-tax-orphan-actions"], [1, "at-tax-orphan-btn", "at-tax-orphan-delete", 3, "click"], [1, "at-tax-orphan-btn"], [1, "at-tax-treemap-kpi-strip"], [1, "at-tax-treemap-kpi"], [1, "at-tax-treemap-container"], [1, "at-tax-drillin-overlay"], [1, "at-tax-treemap-kpi-value"], [1, "at-tax-treemap-kpi-label"], [1, "fa-solid", "fa-chart-tree-map"], [1, "at-tax-treemap-cell", "at-tax-treemap-cell-clickable", 3, "class", "grid-row"], [1, "at-tax-treemap-cell", "at-tax-treemap-cell-clickable", 3, "click"], [1, "at-tax-cell-name"], [1, "at-tax-cell-count"], [1, "at-tax-drillin-overlay", 3, "click"], [1, "at-tax-drillin-panel", 3, "click"], [1, "at-tax-drillin-header"], ["aria-label", "Close", 1, "at-schedule-dialog-close", 3, "click"], [1, "at-tax-drillin-body"], [1, "at-tax-drillin-footer"], [1, "at-tax-audit-filters"], [1, "at-tax-audit-filter-label"], [1, "at-tax-audit-checkbox-group"], [1, "at-tax-audit-checkbox"], ["type", "checkbox", 3, "change", "checked"], [1, "at-tax-audit-timeline"], [1, "at-tax-audit-event"], [1, "fa-solid", "fa-scroll"], [1, "at-tax-audit-event-icon"], [1, "at-tax-audit-event-body"], [1, "at-tax-audit-event-desc"], [1, "at-tax-tag-ref"], [1, "at-tax-audit-event-meta"], [1, "sg-shell"], [1, "sg-main"], [1, "sg-toolbar"], ["placeholder", "Search proposed name, source text\u2026", 1, "at-search-input", 2, "width", "280px", 3, "ngModelChange", "input", "ngModel"], [1, "at-search-input", 2, "width", "200px", 3, "ngModelChange", "change", "ngModel"], ["value", ""], [3, "value"], ["type", "number", "step", "0.05", "min", "0", "max", "1", "placeholder", "Min score", 1, "at-search-input", 2, "width", "100px", 3, "ngModelChange", "ngModel"], [2, "flex", "1"], [1, "at-muted", 2, "font-size", "12px"], [1, "sg-bulk-bar"], [1, "sg-table-body"], [1, "sg-table"], [1, "sg-drawer"], [1, "at-action-btn", "at-success-btn", "at-btn-sm", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "at-action-btn", "at-danger-btn", "at-btn-sm", 3, "click", "disabled"], [1, "fa-solid", "fa-inbox"], [2, "width", "30px"], [3, "sg-row-checked", "sg-row-selected"], [3, "click"], ["type", "checkbox", 3, "click", "checked"], [1, "at-muted"], [1, "sg-score"], [1, "at-muted", 2, "font-size", "11px"], [1, "sg-row-actions"], [1, "sg-score-bar"], ["title", "Create as new tag", 1, "at-action-btn", "at-btn-xs", 3, "click"], ["title", "Merge into best match", 1, "at-action-btn", "at-primary-btn", "at-btn-xs"], ["title", "Reject", 1, "at-action-btn", "at-danger-btn", "at-btn-xs", 3, "click"], ["title", "Merge into best match", 1, "at-action-btn", "at-primary-btn", "at-btn-xs", 3, "click"], [1, "fa-solid", "fa-code-merge"], [1, "sg-drawer-hd"], [2, "font-weight", "600"], ["title", "Close", "aria-label", "Close", 1, "at-action-btn", "at-btn-xs", 3, "click"], [1, "sg-drawer-bd"], [1, "sg-preview"], [1, "sg-drawer-ft"], [1, "at-action-btn", "at-primary-btn", 3, "disabled"], [1, "at-action-btn", 3, "click", "disabled"], [1, "at-action-btn", "at-danger-btn", 3, "click", "disabled"], [1, "sg-candidate"], [1, "runbar"], [1, "stat"], [1, "l"], [1, "v"], [1, "grow"], [1, "health-cards"], [1, "h-card", "merge"], [1, "top"], [1, "ic"], [1, "name"], [1, "big"], [1, "sub"], [1, "ft"], [1, "at-action-btn", "at-primary-btn", "at-btn-sm", 3, "click"], [1, "h-card", "lowusage"], [1, "fa-solid", "fa-leaf"], [1, "h-card", "widenode"], [1, "fa-solid", "fa-tree"], [1, "threshold-form"], [1, "grid"], [1, "field"], ["type", "number", "min", "0", 1, "at-search-input", 3, "ngModelChange", "ngModel"], [1, "at-hint"], ["type", "number", "min", "0", "max", "1", "step", "0.01", 1, "at-search-input", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "0", "max", "1", "step", "0.05", 1, "at-search-input", 3, "ngModelChange", "ngModel"], [1, "run-history"], [1, "run-history-hd"], [1, "at-empty-state", 2, "padding", "32px"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel", "at-detail-panel"], [1, "at-slide-header"], [1, "fa-solid", "fa-file-lines"], ["aria-label", "Close item detail", 1, "at-slide-close", 3, "click"], [1, "at-slide-body"], [1, "at-detail-item-header"], [1, "at-detail-item-name"], [1, "at-detail-badges"], [1, "at-detail-badge", "at-detail-badge-source"], [1, "at-detail-section"], [1, "at-detail-section-label"], [1, "at-detail-meta-grid"], [1, "at-detail-meta-row"], [1, "at-detail-meta-key"], [1, "at-detail-meta-value"], [1, "at-detail-actions"], [1, "fa-solid", "fa-external-link-alt"], ["disabled", "", 1, "at-action-btn", "at-secondary-btn"], [1, "fa-solid", "fa-magnifying-glass"], [1, "at-detail-badge", "at-detail-badge-type"], [1, "at-detail-badge", "at-detail-badge-file"], [1, "fa-solid", "fa-file"], ["target", "_blank", 1, "at-detail-link", 3, "href"], [1, "fa-solid", "fa-external-link-alt", 2, "font-size", "0.65rem", "margin-left", "4px"], [1, "at-detail-text-preview"], [1, "at-detail-tags"], [1, "at-tag-pill", "at-tag-weighted", 3, "font-size"], [1, "at-tag-pill", "at-tag-weighted"], [1, "at-tag-weight"], [1, "at-detail-meta-value", "at-detail-meta-mono"], [1, "at-schedule-overlay", 3, "click"], [1, "at-schedule-dialog", 3, "click"], [1, "at-schedule-dialog-header"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "at-schedule-dialog-body"], [1, "at-confirm-message"], [1, "at-schedule-dialog-footer"], [1, "at-action-btn", "at-danger-btn", 3, "click"], [1, "at-schedule-field"], ["type", "text", "placeholder", "Tag A, Tag B, Tag C", 1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "ngModel"], [1, "at-tax-create-context"], ["type", "text", "placeholder", "Tag name", 1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "keydown.enter", "ngModel"], ["rows", "3", "placeholder", "Brief description of this tag", 1, "mj-textarea", 2, "width", "100%", 3, "ngModelChange", "ngModel"], [1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [2, "font-size", "0.85rem", "color", "var(--mj-text-secondary)", "margin", "0 0 12px"], ["TextField", "Label", "ValueField", "ID", "Placeholder", "Search and select a tag...", 3, "ValueChange", "Data", "Filterable", "ValuePrimitive"]], template: function TagsResourceComponent_Template(rf, ctx) { if (rf & 1) {
7313
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TagsResourceComponent, selectors: [["mj-tags-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 26, vars: 20, consts: [["Title", "Tags", "Icon", "fa-solid fa-sitemap", "Subtitle", "Taxonomy management, health monitoring, and tag library"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], [3, "Flex", "Padding"], [1, "at-dashboard"], ["MobileTitle", "Sections", 3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], ["toolbar", ""], ["mjButton", "", "variant", "secondary", "size", "sm"], [3, "Padding", "Flex"], [1, "at-main-area"], [1, "at-loading-overlay"], [1, "at-schedule-overlay"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "action-btn-label"], [1, "fa-solid", "fa-heart-pulse"], ["type", "text", "placeholder", "Search tags...", 1, "at-search-input", 3, "ngModel"], [3, "Tabs", "ActiveKey"], ["type", "text", "placeholder", "Search tags...", 1, "at-search-input", 3, "ngModelChange", "input", "ngModel"], [3, "TabChange", "Tabs", "ActiveKey"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "mj-action-label"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate"], [1, "fa-solid", "fa-play"], ["text", "Loading tag data\u2026"], [1, "at-page-body"], [1, "health-shell"], [1, "at-tag-lib-layout"], [1, "at-tag-lib-main"], [1, "at-card"], [1, "at-card-body", 2, "max-height", "500px", "overflow-y", "auto"], [1, "at-tag-table"], [1, "at-tag-row-clickable", 3, "at-tag-row-selected"], [1, "at-card", 2, "margin-top", "12px"], [1, "at-tag-lib-sidebar"], [1, "at-card", "at-tag-cloud-card"], [1, "at-card-title", 2, "margin-bottom", "12px"], [1, "fa-solid", "fa-cloud"], ["Layout", "spiral", "ColorMode", "weight-gradient", 3, "Items", "MaxFontSize", "MinFontSize", "MaxItems", "Interactive", "Animate"], [1, "at-tag-cloud-empty"], [1, "at-card", 2, "padding", "16px", "margin-top", "12px"], [1, "at-card-title", 2, "margin-bottom", "10px"], [1, "fa-solid", "fa-chart-pie"], [1, "at-tags-by-source"], [1, "at-tag-source-row"], [1, "at-tag-row-clickable", 3, "click"], [1, "at-tag-name-cell"], [1, "at-weight-indicator"], [1, "at-weight-bar"], [1, "at-weight-bar-fill"], [1, "at-weight-value"], [1, "at-tag-bar"], [1, "at-tag-bar-fill"], [1, "at-card-header"], [1, "at-card-title"], [1, "fa-solid", "fa-tag"], ["aria-label", "Close", 1, "at-slide-close", 2, "background", "none", "border", "none", "cursor", "pointer", "color", "var(--mj-text-muted)", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-card-body", 2, "max-height", "300px", "overflow-y", "auto"], [1, "at-empty-state"], [1, "at-tag-row-clickable"], [1, "at-tax-split-view"], [1, "at-tax-tree-panel", 2, "position", "relative"], [1, "at-tax-tree-toolbar"], ["type", "text", "placeholder", "Search tags...", 1, "at-search-input", 2, "flex", "1", 3, "ngModelChange", "input", "ngModel"], ["title", "Add root tag", 1, "at-tax-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Toggle multi-select for drag reparenting", 1, "at-tax-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-check-double"], [1, "at-tax-tree-body", 3, "dragover", "drop"], [1, "at-tax-tree-node", 3, "at-tax-node-selected", "at-tax-node-drag-over", "at-tax-node-multi-selected", "padding-left"], [1, "at-tax-tree-saving-overlay"], [1, "at-tax-details-panel"], [1, "at-empty-state", 2, "height", "100%"], [1, "at-tax-health-bar"], [1, "at-tax-health-label"], [1, "at-tax-health-stat"], [1, "at-tax-dot", "at-tax-dot-total"], [1, "at-tax-health-value"], [1, "at-tax-health-text"], [1, "at-tax-dot", "at-tax-dot-healthy"], [1, "at-tax-health-value", "at-tax-val-success"], [1, "at-tax-dot", "at-tax-dot-attention"], [1, "at-tax-health-value", "at-tax-val-warning"], [1, "at-tax-dot", "at-tax-dot-orphaned"], [1, "at-tax-health-value", "at-tax-val-error"], [1, "at-tax-dot", "at-tax-dot-duplicates"], [1, "at-tax-health-value", "at-tax-val-info"], [1, "fa-solid", "fa-sitemap"], [1, "at-tax-tree-node", 3, "dragstart", "dragover", "dragleave", "drop", "click"], ["type", "checkbox", 1, "at-tax-tree-checkbox", 3, "checked"], [1, "at-tax-tree-arrow", 3, "click"], [1, "at-tax-health-dot"], [1, "at-tax-tree-label"], [1, "at-tax-tree-count"], ["title", "Add child tag", 1, "at-tax-tree-add-child", 3, "click"], ["type", "checkbox", 1, "at-tax-tree-checkbox", 3, "click", "checked"], ["text", "Moving tags...", "size", "small"], [1, "at-tax-details-header"], [1, "at-tax-breadcrumb"], [1, "at-tax-bc-current"], [1, "at-tax-edit-form"], [1, "at-tax-stats-row"], [1, "at-tax-stat-item"], [1, "at-tax-stat-value"], [1, "at-tax-stat-label"], [1, "at-tax-stat-value", "at-tax-stat-date"], [1, "at-tax-action-toolbar"], [1, "at-tax-detail-section"], [1, "at-tax-bc-link", 3, "click"], [1, "at-tax-bc-sep"], [1, "at-tax-details-title"], ["title", "Edit name", 1, "at-tax-edit-icon", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "at-tax-details-desc"], [1, "at-form-group"], [1, "at-form-label"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["rows", "3", 1, "at-form-textarea", 3, "ngModelChange", "ngModel"], [1, "at-form-actions"], [1, "at-action-btn", "at-primary-btn", 3, "click"], [1, "at-action-btn", "at-secondary-btn", 3, "click"], [1, "at-tax-action-btn", 3, "click"], [1, "fa-solid", "fa-arrows-up-down"], [1, "fa-solid", "fa-compress"], [1, "fa-solid", "fa-code-branch"], [1, "at-tax-action-btn", "at-tax-action-danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "at-tax-section-title"], [1, "at-tax-child-chips"], [1, "at-tax-child-chip"], [1, "at-tax-child-chip", 3, "click"], [1, "at-tax-chip-count"], [1, "at-tax-recent-list"], [1, "at-tax-recent-item"], [1, "at-tax-recent-icon"], [1, "at-tax-recent-name"], [1, "at-tax-recent-weight"], [1, "at-tax-recent-date"], [1, "at-tg-toggle-row"], [1, "at-tg-toggle-label"], [1, "at-tg-toggle-t"], [1, "at-tg-toggle-d"], [1, "at-tg-switch", 3, "click"], [1, "at-tg-grid-3"], [1, "at-tg-field"], ["type", "number", "min", "0", 1, "at-search-input", 3, "change", "value"], [1, "at-tg-hint"], ["type", "number", "min", "0", "max", "1", "step", "0.01", 1, "at-search-input", 3, "change", "value"], [1, "at-tg-chip-list"], [1, "at-tg-chip", "scoped"], [1, "at-tg-hint", 2, "font-style", "italic"], [1, "at-action-btn", "at-btn-sm", 3, "click"], [1, "fa-solid", "fa-pencil"], [1, "at-tg-hint", 2, "margin-top", "8px"], [1, "fa-solid", "fa-info-circle"], [1, "at-tg-syn-add"], ["placeholder", "e.g. \"GenAI\"", 1, "at-search-input", 3, "ngModelChange", "keyup.enter", "ngModel"], [1, "at-search-input", 2, "width", "130px", 3, "ngModelChange", "ngModel"], ["value", "Manual"], ["value", "Imported"], ["value", "Merged"], ["value", "LLM"], [1, "at-action-btn", "at-primary-btn", 3, "click", "disabled"], [1, "at-tg-syn-row", 3, "pending"], [1, "at-tg-syn-row"], [1, "at-tg-syn-name"], ["title", "Remove", 1, "at-tg-syn-x", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-hand-pointer"], [1, "at-tax-dup-stats-bar"], [1, "at-tax-dup-stat"], [1, "at-tax-dup-stat", "at-tax-dup-high"], [1, "at-tax-dup-stat", "at-tax-dup-moderate"], [1, "at-tax-dup-list"], [1, "at-tax-dup-card", 3, "at-tax-dup-high", "at-tax-dup-moderate"], [1, "fa-solid", "fa-check-circle"], [1, "at-tax-dup-card"], [1, "at-tax-dup-tag"], [1, "at-tax-dup-similarity"], [1, "at-tax-sim-percent", "high"], [1, "fa-solid", "fa-clone"], [1, "at-tax-dup-actions"], [1, "at-tax-dup-btn", "at-tax-dup-btn-primary", 3, "click", "disabled"], [1, "at-tax-dup-btn", 3, "click"], [1, "at-tax-dup-arrow"], [1, "fa-solid", "fa-arrows-left-right"], [1, "at-tax-sim-bar-bg"], [1, "at-tax-sim-bar-fill"], [1, "at-tax-sim-percent"], [1, "at-tax-orphan-toolbar"], [1, "at-tax-orphan-count"], [1, "at-tax-orphan-desc"], [1, "at-tax-orphan-bulk"], [1, "at-tax-bulk-btn", 3, "click"], [1, "fa-solid", "fa-square-check"], [1, "fa-regular", "fa-square"], [1, "at-tax-bulk-btn", "at-tax-bulk-danger", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "at-tax-orphan-grid"], [1, "at-tax-orphan-card"], [1, "at-tax-orphan-header"], [1, "at-tax-orphan-name"], ["type", "checkbox", 1, "at-tax-orphan-checkbox", 3, "change", "click", "checked"], [1, "at-tax-orphan-stats"], [1, "at-tax-orphan-dates"], [1, "at-tax-orphan-actions"], [1, "at-tax-orphan-btn", "at-tax-orphan-delete", 3, "click"], [1, "at-tax-orphan-btn"], [1, "at-tax-treemap-kpi-strip"], [1, "at-tax-treemap-kpi"], [1, "at-tax-treemap-container"], [1, "at-tax-drillin-overlay"], [1, "at-tax-treemap-kpi-value"], [1, "at-tax-treemap-kpi-label"], [1, "fa-solid", "fa-chart-tree-map"], [1, "at-tax-treemap-cell", "at-tax-treemap-cell-clickable", 3, "class", "grid-row"], [1, "at-tax-treemap-cell", "at-tax-treemap-cell-clickable", 3, "click"], [1, "at-tax-cell-name"], [1, "at-tax-cell-count"], [1, "at-tax-drillin-overlay", 3, "click"], [1, "at-tax-drillin-panel", 3, "click"], [1, "at-tax-drillin-header"], ["aria-label", "Close", 1, "at-schedule-dialog-close", 3, "click"], [1, "at-tax-drillin-body"], [1, "at-tax-drillin-footer"], [1, "at-tax-audit-filters"], [1, "at-tax-audit-filter-label"], [1, "at-tax-audit-checkbox-group"], [1, "at-tax-audit-checkbox"], ["type", "checkbox", 3, "change", "checked"], [1, "at-tax-audit-timeline"], [1, "at-tax-audit-event"], [1, "fa-solid", "fa-scroll"], [1, "at-tax-audit-event-icon"], [1, "at-tax-audit-event-body"], [1, "at-tax-audit-event-desc"], [1, "at-tax-tag-ref"], [1, "at-tax-audit-event-meta"], [1, "sg-shell"], [1, "sg-main"], [1, "sg-toolbar"], ["placeholder", "Search proposed name, source text\u2026", 1, "at-search-input", 2, "width", "280px", 3, "ngModelChange", "input", "ngModel"], [1, "at-search-input", 2, "width", "200px", 3, "ngModelChange", "change", "ngModel"], ["value", ""], [3, "value"], ["type", "number", "step", "0.05", "min", "0", "max", "1", "placeholder", "Min score", 1, "at-search-input", 2, "width", "100px", 3, "ngModelChange", "ngModel"], [2, "flex", "1"], [1, "at-muted", 2, "font-size", "12px"], [1, "sg-bulk-bar"], [1, "sg-table-body"], [1, "sg-table"], [1, "sg-drawer"], [1, "at-action-btn", "at-success-btn", "at-btn-sm", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "at-action-btn", "at-danger-btn", "at-btn-sm", 3, "click", "disabled"], [1, "fa-solid", "fa-inbox"], [2, "width", "30px"], [3, "sg-row-checked", "sg-row-selected"], [3, "click"], ["type", "checkbox", 3, "click", "checked"], [1, "at-muted"], [1, "sg-score"], [1, "at-muted", 2, "font-size", "11px"], [1, "sg-row-actions"], [1, "sg-score-bar"], ["title", "Create as new tag", 1, "at-action-btn", "at-btn-xs", 3, "click"], ["title", "Merge into best match", 1, "at-action-btn", "at-primary-btn", "at-btn-xs"], ["title", "Reject", 1, "at-action-btn", "at-danger-btn", "at-btn-xs", 3, "click"], ["title", "Merge into best match", 1, "at-action-btn", "at-primary-btn", "at-btn-xs", 3, "click"], [1, "fa-solid", "fa-code-merge"], [1, "sg-drawer-hd"], [2, "font-weight", "600"], ["title", "Close", "aria-label", "Close", 1, "at-action-btn", "at-btn-xs", 3, "click"], [1, "sg-drawer-bd"], [1, "sg-preview"], [1, "sg-drawer-ft"], [1, "at-action-btn", "at-primary-btn", 3, "disabled"], [1, "at-action-btn", 3, "click", "disabled"], [1, "at-action-btn", "at-danger-btn", 3, "click", "disabled"], [1, "sg-candidate"], [1, "runbar"], [1, "stat"], [1, "l"], [1, "v"], [1, "grow"], [1, "health-cards"], [1, "h-card", "merge"], [1, "top"], [1, "ic"], [1, "name"], [1, "big"], [1, "sub"], [1, "ft"], [1, "at-action-btn", "at-primary-btn", "at-btn-sm", 3, "click"], [1, "h-card", "lowusage"], [1, "fa-solid", "fa-leaf"], [1, "h-card", "widenode"], [1, "fa-solid", "fa-tree"], [1, "threshold-form"], [1, "grid"], [1, "field"], ["type", "number", "min", "0", 1, "at-search-input", 3, "ngModelChange", "ngModel"], [1, "at-hint"], ["type", "number", "min", "0", "max", "1", "step", "0.01", 1, "at-search-input", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "0", "max", "1", "step", "0.05", 1, "at-search-input", 3, "ngModelChange", "ngModel"], [1, "run-history"], [1, "run-history-hd"], [1, "at-empty-state", 2, "padding", "32px"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel", "at-detail-panel"], [1, "at-slide-header"], [1, "fa-solid", "fa-file-lines"], ["aria-label", "Close item detail", 1, "at-slide-close", 3, "click"], [1, "at-slide-body"], [1, "at-detail-item-header"], [1, "at-detail-item-name"], [1, "at-detail-badges"], [1, "at-detail-badge", "at-detail-badge-source"], [1, "at-detail-section"], [1, "at-detail-section-label"], [1, "at-detail-meta-grid"], [1, "at-detail-meta-row"], [1, "at-detail-meta-key"], [1, "at-detail-meta-value"], [1, "at-detail-actions"], [1, "fa-solid", "fa-external-link-alt"], ["disabled", "", 1, "at-action-btn", "at-secondary-btn"], [1, "fa-solid", "fa-magnifying-glass"], [1, "at-detail-badge", "at-detail-badge-type"], [1, "at-detail-badge", "at-detail-badge-file"], [1, "fa-solid", "fa-file"], ["target", "_blank", 1, "at-detail-link", 3, "href"], [1, "fa-solid", "fa-external-link-alt", 2, "font-size", "0.65rem", "margin-left", "4px"], [1, "at-detail-text-preview"], [1, "at-detail-tags"], [1, "at-tag-pill", "at-tag-weighted", 3, "font-size"], [1, "at-tag-pill", "at-tag-weighted"], [1, "at-tag-weight"], [1, "at-detail-meta-value", "at-detail-meta-mono"], [1, "at-schedule-overlay", 3, "click"], [1, "at-schedule-dialog", 3, "click"], [1, "at-schedule-dialog-header"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "at-schedule-dialog-body"], [1, "at-confirm-message"], [1, "at-schedule-dialog-footer"], [1, "at-action-btn", "at-danger-btn", 3, "click"], [1, "at-schedule-field"], ["type", "text", "placeholder", "Tag A, Tag B, Tag C", 1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "ngModel"], [1, "at-tax-create-context"], ["type", "text", "placeholder", "Tag name", 1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "keydown.enter", "ngModel"], ["rows", "3", "placeholder", "Brief description of this tag", 1, "mj-textarea", 2, "width", "100%", 3, "ngModelChange", "ngModel"], [1, "mj-input", 2, "width", "100%", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [2, "font-size", "0.85rem", "color", "var(--mj-text-secondary)", "margin", "0 0 12px"], ["TextField", "Label", "ValueField", "ID", "Placeholder", "Search and select a tag...", 3, "ValueChange", "Data", "Filterable", "ValuePrimitive"]], template: function TagsResourceComponent_Template(rf, ctx) { if (rf & 1) {
7296
7314
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1)(3, "button", 2);
7297
7315
  i0.ɵɵlistener("click", function TagsResourceComponent_Template_button_click_3_listener() { return ctx.RunHealthNow(); });
7298
- i0.ɵɵconditionalCreate(4, TagsResourceComponent_Conditional_4_Template, 2, 0)(5, TagsResourceComponent_Conditional_5_Template, 2, 0);
7316
+ i0.ɵɵconditionalCreate(4, TagsResourceComponent_Conditional_4_Template, 3, 0)(5, TagsResourceComponent_Conditional_5_Template, 3, 0);
7299
7317
  i0.ɵɵelementEnd()()();
7300
7318
  i0.ɵɵelementStart(6, "mj-page-body", 3)(7, "div", 4)(8, "mj-left-nav", 5);
7301
7319
  i0.ɵɵlistener("ItemClicked", function TagsResourceComponent_Template_mj_left_nav_ItemClicked_8_listener($event) { return ctx.onNavItemClicked($event); });
@@ -7303,7 +7321,7 @@ let TagsResourceComponent = class TagsResourceComponent extends BaseResourceComp
7303
7321
  i0.ɵɵelementStart(9, "mj-left-nav-content")(10, "mj-page-header-interior", 6);
7304
7322
  i0.ɵɵconditionalCreate(11, TagsResourceComponent_Conditional_11_Template, 3, 1, "div", 7);
7305
7323
  i0.ɵɵelementStart(12, "div", 1);
7306
- i0.ɵɵconditionalCreate(13, TagsResourceComponent_Case_13_Template, 3, 0, "button", 8)(14, TagsResourceComponent_Case_14_Template, 6, 2)(15, TagsResourceComponent_Case_15_Template, 6, 4);
7324
+ i0.ɵɵconditionalCreate(13, TagsResourceComponent_Case_13_Template, 4, 0, "button", 8)(14, TagsResourceComponent_Case_14_Template, 7, 2)(15, TagsResourceComponent_Case_15_Template, 6, 4);
7307
7325
  i0.ɵɵelementEnd()();
7308
7326
  i0.ɵɵelementStart(16, "mj-page-body-interior", 9)(17, "div", 10);
7309
7327
  i0.ɵɵconditionalCreate(18, TagsResourceComponent_Conditional_18_Template, 2, 0, "div", 11);
@@ -7350,7 +7368,7 @@ let TagsResourceComponent = class TagsResourceComponent extends BaseResourceComp
7350
7368
  i0.ɵɵconditional(ctx.ShowMoveDialog ? 24 : -1);
7351
7369
  i0.ɵɵadvance();
7352
7370
  i0.ɵɵconditional(ctx.ShowMergeIntoDialog ? 25 : -1);
7353
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.MJButtonDirective, i3.MJComboboxComponent, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageBodyComponent, i3.MJPageHeaderInteriorComponent, i3.MJPageBodyInteriorComponent, i3.MJLeftNavComponent, i3.MJLeftNavContentComponent, i3.MJTabNavComponent, i4.MJWordCloudComponent, i5.DecimalPipe, i5.DatePipe], styles: ["/* ============================================================\n Content Autotagging Dashboard\n All colors use MJ design tokens \u2014 no hardcoded hex values.\n All classes prefixed with at- to prevent leaking (ViewEncapsulation.None).\n ============================================================ */\n\n/* \u2500\u2500 Root layout \u2500\u2500 */\n\n.at-dashboard {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/*\n Left rail now owned by <mj-left-nav> (~50 lines of bespoke .at-left-nav-items\n / .at-nav-item / .at-nav-badge / .at-nav-divider styles retired). The footer\n stayed bespoke since it's \"Run Pipeline\" CTA content, not nav chrome.\n*/\n\n.at-left-nav-footer {\n padding: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-run-pipeline-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.at-run-pipeline-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-run-pipeline-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 MAIN CONTENT AREA \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-main-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.at-loading-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n/* .at-page-header / .at-page-title / .at-page-subtitle / .at-page-actions\n retired \u2014 section identity + actions now live in <mj-page-header-interior>\n (one shared instance at the top of <mj-left-nav-content>, with Title/Subtitle\n driven by currentTabTitle/currentTabSubtitle getters and per-section action\n buttons projected via an @switch into the chrome's [actions] slot). */\n\n.at-page-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding: 16px 20px;\n min-height: 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SHARED COMPONENTS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n border: 1px solid;\n border-radius: 7px;\n cursor: pointer;\n font-size: 0.78rem;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.at-primary-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-primary-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-primary-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.at-secondary-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.at-secondary-btn:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.at-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-card-title {\n font-size: 0.82rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-primary);\n}\n\n.at-card-title i {\n color: var(--mj-brand-primary);\n font-size: 0.75rem;\n}\n\n.at-card-body {\n padding: 0;\n}\n\n.at-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-disabled);\n}\n\n.at-empty-state i {\n font-size: 28px;\n}\n\n.at-empty-state p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 KPI STRIP \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-kpi-strip {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.at-kpi-card {\n flex: 1;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.at-kpi-value {\n font-size: 1.4rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-kpi-error-value {\n color: var(--mj-status-error-text);\n}\n\n.at-kpi-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-kpi-trend {\n font-size: 0.68rem;\n margin-top: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-text-muted);\n}\n\n.at-kpi-trend.up {\n color: var(--mj-status-success-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 PIPELINE TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-layout {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n}\n\n.at-pipeline-center {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n}\n\n.at-pipeline-right {\n width: 320px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Pipeline Stages */\n\n.at-pipeline-stages {\n display: flex;\n gap: 0;\n align-items: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 16px;\n}\n\n.at-pipeline-stage {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n}\n\n.at-pipeline-stage-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n font-size: 0.85rem;\n}\n\n.stage-idle .at-pipeline-stage-icon {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.stage-active .at-pipeline-stage-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.stage-complete .at-pipeline-stage-icon {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n@keyframes at-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 30%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent); }\n}\n\n.at-pipeline-stage-name {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.at-pipeline-stage-count {\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.at-pipeline-arrow {\n width: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 0.6rem;\n}\n\n.at-stage-connector {\n width: 32px;\n height: 2px;\n background: var(--mj-border-default);\n transition: background 0.4s ease;\n}\n\n.at-stage-connector.connector-complete {\n background: var(--mj-status-success);\n}\n\n/* Progress section */\n\n.at-progress-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 10px 16px;\n}\n\n.at-progress-header {\n display: flex;\n justify-content: space-between;\n font-size: 0.75rem;\n margin-bottom: 4px;\n}\n\n.at-progress-stage-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.at-progress-pct {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.at-progress-bar {\n height: 4px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.at-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 2px;\n transition: width 0.3s ease;\n}\n\n.at-progress-current {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n margin-top: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-progress-fill-paused {\n background: var(--mj-status-warning);\n animation: pulse-paused 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-paused {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n\n.at-pipeline-controls {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n justify-content: flex-end;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n.at-danger-btn:hover:not(:disabled) {\n background: var(--mj-status-error-text);\n border-color: var(--mj-status-error-text);\n}\n\n/* Feed items */\n\n.at-feed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-feed-item:last-child {\n border-bottom: none;\n}\n\n.at-feed-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-feed-status-dot.complete {\n background: var(--mj-status-success);\n}\n\n.at-feed-status-dot.processing {\n background: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.at-feed-status-dot.error {\n background: var(--mj-status-error);\n}\n\n.at-feed-item-name {\n flex: 1;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-feed-item-source {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n min-width: 100px;\n}\n\n.at-feed-item-tags {\n display: flex;\n gap: 4px;\n}\n\n.at-feed-tag {\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 0.62rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-feed-item-time {\n color: var(--mj-text-muted);\n font-size: 0.68rem;\n white-space: nowrap;\n min-width: 60px;\n text-align: right;\n}\n\n/* Source mini cards (right panel) */\n\n.at-source-mini {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-source-mini:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-source-mini:last-child {\n border-bottom: none;\n}\n\n.at-source-mini-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-source-mini-info {\n flex: 1;\n min-width: 0;\n}\n\n.at-source-mini-name {\n font-size: 0.78rem;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-source-mini-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-mini-status {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-source-mini-status.active {\n background: var(--mj-status-success);\n}\n\n.at-source-mini-status.error {\n background: var(--mj-status-error);\n}\n\n.at-source-mini-status.inactive {\n background: var(--mj-text-disabled);\n}\n\n/* Tag cloud card */\n\n.at-tag-cloud-card {\n padding: 16px;\n}\n\n.at-tag-cloud {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n.at-tag-pill {\n padding: 4px 12px;\n border-radius: 14px;\n font-size: 0.72rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-tag-pill:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tag-weighted {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tag-weight {\n font-size: 0.6rem;\n opacity: 0.6;\n font-weight: 400;\n}\n\n.at-tag-row-clickable {\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-tag-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.at-tag-pill.large {\n font-size: 0.85rem;\n padding: 5px 14px;\n}\n\n.at-tag-pill.small {\n font-size: 0.65rem;\n padding: 3px 8px;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SOURCES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-sources-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 12px;\n}\n\n.at-source-card-full {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n transition: border-color 0.15s ease;\n}\n\n.at-source-card-full:hover {\n border-color: var(--mj-border-default);\n}\n\n.at-source-card-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 12px;\n}\n\n.at-source-card-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.at-source-card-title {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-card-type {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-status {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.7rem;\n font-weight: 500;\n}\n\n.at-source-card-status.active {\n color: var(--mj-status-success-text);\n}\n\n.at-source-card-status.error {\n color: var(--mj-status-error-text);\n}\n\n.at-source-card-status.inactive {\n color: var(--mj-text-disabled);\n}\n\n.at-source-card-url {\n font-size: 0.7rem;\n color: var(--mj-brand-primary);\n margin-bottom: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-source-card-stats {\n display: flex;\n gap: 16px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-source-stat {\n display: flex;\n flex-direction: column;\n}\n\n.at-source-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-stat-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-actions {\n display: flex;\n gap: 6px;\n margin-top: 10px;\n}\n\n.at-source-action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.7rem;\n cursor: pointer;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n transition: all 0.12s ease;\n}\n\n.at-source-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-source-delete-btn:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error-text);\n}\n\n.at-add-source-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-source-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-source-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CONTENT TYPES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-ct-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.at-ct-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n}\n\n.at-ct-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n\n.at-ct-card-name {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-ct-card-model {\n font-size: 0.68rem;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-ct-field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-ct-field:last-child {\n border-bottom: none;\n}\n\n.at-ct-field-label {\n color: var(--mj-text-muted);\n}\n\n.at-ct-field-value {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 0.75rem;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range i {\n color: var(--mj-brand-primary);\n}\n\n.at-ct-tag-range-bar {\n flex: 1;\n height: 6px;\n background: var(--mj-bg-surface);\n border-radius: 3px;\n position: relative;\n}\n\n.at-ct-tag-range-fill {\n position: absolute;\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n.at-ct-range-suffix {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 TAG LIBRARY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tag-lib-layout {\n display: flex;\n gap: 16px;\n}\n\n.at-tag-lib-main {\n flex: 1;\n}\n\n.at-tag-lib-sidebar {\n width: 280px;\n flex-shrink: 0;\n}\n\n.at-tag-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-tag-table th {\n text-align: left;\n padding: 8px 12px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-tag-table td {\n padding: 10px 12px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-name-cell {\n font-weight: 600;\n}\n\n.at-tag-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n display: inline-block;\n vertical-align: middle;\n}\n\n.at-tag-bar-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n/* Weight indicator in tag table */\n.at-weight-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-weight-bar {\n width: 50px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-weight-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.2s ease;\n}\n\n.at-weight-bar-fill.at-weight-high {\n background: var(--mj-status-success);\n}\n\n.at-weight-bar-fill.at-weight-medium {\n background: var(--mj-status-warning);\n}\n\n.at-weight-bar-fill.at-weight-low {\n background: var(--mj-status-error);\n}\n\n.at-weight-value {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n min-width: 28px;\n}\n\n.at-tags-by-source {\n font-size: 0.78rem;\n}\n\n.at-tag-source-row {\n display: flex;\n justify-content: space-between;\n padding: 5px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-source-row:last-child {\n border-bottom: none;\n}\n\n.at-search-input {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n width: 200px;\n outline: none;\n}\n\n.at-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-search-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RUN HISTORY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-run-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-run-table th {\n text-align: left;\n padding: 10px 14px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-run-table td {\n padding: 12px 14px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-run-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n cursor: pointer;\n}\n\n.at-run-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-run-status-badge.complete {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-run-status-badge.failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-run-status-badge.running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-run-duration {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n}\n\n.at-run-source-name {\n font-weight: 500;\n}\n\n.at-run-error-text {\n color: var(--mj-status-error-text);\n}\n\n.at-filter-select {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.78rem;\n outline: none;\n}\n\n.at-filter-select:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM PANEL \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.at-slide-panel {\n position: fixed;\n right: 0;\n top: 0;\n bottom: 0;\n width: 420px;\n max-width: 100vw;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n}\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-slide-header h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n background: none;\n border: none;\n font-size: 1.1rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n}\n\n.at-slide-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-form-group {\n margin-bottom: 16px;\n}\n\n.at-form-label {\n display: block;\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n font-size: 0.82rem;\n outline: none;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.at-form-input::placeholder,\n.at-form-textarea::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-form-textarea {\n resize: vertical;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n margin-top: 24px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RESPONSIVE \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n@media (max-width: 1100px) {\n .at-pipeline-layout {\n flex-direction: column;\n }\n\n .at-pipeline-right {\n width: 100%;\n flex-direction: row;\n }\n\n .at-tag-lib-layout {\n flex-direction: column;\n }\n\n .at-tag-lib-sidebar {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-left-nav {\n width: 180px;\n }\n\n .at-kpi-strip {\n flex-wrap: wrap;\n }\n\n .at-kpi-card {\n min-width: 140px;\n }\n\n .at-sources-grid {\n grid-template-columns: 1fr;\n }\n\n .at-ct-grid {\n grid-template-columns: 1fr;\n }\n\n .at-slide-panel {\n width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .at-left-nav {\n width: 56px;\n }\n\n .at-left-nav-header h2 {\n font-size: 0;\n }\n\n .at-left-nav-header h2 i {\n font-size: 1rem;\n }\n\n .at-nav-item {\n justify-content: center;\n padding: 10px;\n font-size: 0;\n }\n\n .at-nav-item i {\n font-size: 1rem;\n }\n\n .at-nav-badge {\n display: none;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Slide-in Form Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 9999;\n animation: at-fade-in 0.2s ease;\n}\n\n@keyframes at-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n.at-slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 420px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0, 0, 0, 0.4);\n z-index: 10000;\n display: flex;\n flex-direction: column;\n animation: at-slide-in 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes at-slide-in { from { transform: translateX(100%); } to { transform: translateX(0); } }\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.at-slide-header h3 {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.at-slide-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.at-form-label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n transition: border-color 0.15s ease;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.at-form-select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M3 5l3 3 3-3'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 30px;\n}\n\n.at-form-textarea {\n resize: vertical;\n min-height: 70px;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-form-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* Also add empty state for Content Types (matching Sources) */\n.at-add-type-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-type-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-type-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORKED PIPELINE STAGES \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-stages-forked {\n display: flex;\n align-items: center;\n gap: 0;\n}\n\n.at-pipeline-fork {\n display: flex;\n align-items: center;\n gap: 0;\n flex: 2;\n}\n\n.at-pipeline-fork-lines {\n width: 28px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n position: relative;\n flex-shrink: 0;\n}\n\n.at-pipeline-fork-line {\n height: 2px;\n background: var(--mj-border-default);\n width: 100%;\n position: relative;\n}\n\n.at-pipeline-fork-line::before {\n content: '';\n position: absolute;\n width: 2px;\n height: 12px;\n background: var(--mj-border-default);\n left: 0;\n}\n\n.at-fork-top::before {\n bottom: 0;\n left: 0;\n}\n\n.at-fork-bottom::before {\n top: 0;\n left: 0;\n}\n\n.at-pipeline-fork-branches {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n}\n\n.at-pipeline-fork-branches .at-pipeline-stage {\n flex: none;\n padding: 6px 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE FEED ITEMS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-item-clickable {\n cursor: pointer;\n}\n\n.at-feed-item-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FEED SEARCH & PAGINATION \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.at-feed-header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-left: auto;\n}\n\n.at-feed-sort-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.68rem;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-feed-sort-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-feed-count {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.at-feed-search-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-search-icon {\n color: var(--mj-text-disabled);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-feed-search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n outline: none;\n padding: 4px 0;\n min-width: 0;\n}\n\n.at-feed-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-feed-search-clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 9px;\n flex-shrink: 0;\n}\n\n.at-feed-search-clear:hover {\n background: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.at-feed-scroll-body {\n overflow-y: auto;\n min-height: 0;\n flex: 1;\n}\n\n.at-feed-item-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n overflow: hidden;\n}\n\n.at-feed-item-content .at-feed-item-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-feed-item-source-label {\n font-size: 0.7rem;\n font-weight: 500;\n color: var(--mj-brand-primary);\n}\n\n.at-feed-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-pagination-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE SOURCE CARDS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-source-card-clickable {\n cursor: pointer;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORM HINT \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-form-hint {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n font-style: italic;\n margin-top: 2px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 DETAIL PANEL (wider) \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-panel {\n width: 500px;\n}\n\n/* \u2500\u2500 Detail: Item header \u2500\u2500 */\n\n.at-detail-item-header {\n margin-bottom: 8px;\n}\n\n.at-detail-item-name {\n font-size: 1.05rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0 0 6px 0;\n word-break: break-word;\n}\n\n.at-detail-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-detail-badge {\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-detail-badge-source {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-detail-badge-type {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.at-detail-badge-file {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.at-detail-badge-status-active {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-detail-badge-status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-detail-badge-status-inactive {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500 Detail: Sections \u2500\u2500 */\n\n.at-detail-section {\n margin-bottom: 4px;\n}\n\n.at-detail-section-label {\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.at-detail-link {\n font-size: 0.8rem;\n color: var(--mj-brand-primary);\n text-decoration: none;\n word-break: break-all;\n}\n\n.at-detail-link:hover {\n text-decoration: underline;\n}\n\n/* \u2500\u2500 Detail: Text preview \u2500\u2500 */\n\n.at-detail-text-preview {\n max-height: 200px;\n overflow-y: auto;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n font-size: 0.78rem;\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n}\n\n/* \u2500\u2500 Detail: Tags \u2500\u2500 */\n\n.at-detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n/* \u2500\u2500 Detail: Meta grid \u2500\u2500 */\n\n.at-detail-meta-grid {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.at-detail-meta-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-detail-meta-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-meta-key {\n color: var(--mj-text-muted);\n font-weight: 500;\n flex-shrink: 0;\n margin-right: 12px;\n}\n\n.at-detail-meta-value {\n color: var(--mj-text-primary);\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-meta-mono {\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n font-size: 0.72rem;\n}\n\n/* \u2500\u2500 Detail: Actions \u2500\u2500 */\n\n.at-detail-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-detail-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* \u2500\u2500 Detail: Source header \u2500\u2500 */\n\n.at-detail-source-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n/* \u2500\u2500 Detail: Stats strip \u2500\u2500 */\n\n.at-detail-stats-strip {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-detail-stat {\n flex: 1;\n min-width: 60px;\n text-align: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 8px 6px;\n}\n\n.at-detail-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-detail-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Detail: Content Library \u2500\u2500 */\n\n.at-detail-content-list {\n max-height: 250px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.at-detail-content-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-detail-content-item:last-child {\n border-bottom: none;\n}\n\n.at-detail-content-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-detail-content-item-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-content-item-tags {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.at-detail-content-item-time {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n/* \u2500\u2500 Detail: Run history \u2500\u2500 */\n\n.at-detail-run-history {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.at-detail-run-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.75rem;\n}\n\n.at-detail-run-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-run-time {\n color: var(--mj-text-secondary);\n flex: 1;\n}\n\n.at-detail-run-duration {\n color: var(--mj-text-muted);\n}\n\n.at-detail-run-items {\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 600px) {\n .at-slide-panel {\n width: 100%;\n }\n\n .at-detail-panel {\n width: 100%;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n TAXONOMY GOVERNANCE TAB\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n/* Sub-tab strip + badges retired \u2014 taxonomy sub-tabs now driven by <mj-tab-nav>\n in the [toolbar] slot of the taxonomy section, with TabConfig badges\n (warning variant for duplicates, error variant for orphans). */\n\n/* \u2500\u2500 Tree View: Split layout \u2500\u2500 */\n\n.at-tax-split-view {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n height: calc(100vh - 320px);\n min-height: 400px;\n overflow: hidden;\n}\n\n.at-tax-tree-panel {\n width: 40%;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n}\n\n.at-tax-tree-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 0.8rem;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-tax-toolbar-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-tax-toolbar-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-tree-body {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.at-tax-tree-node {\n padding: 6px 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s;\n line-height: 1.4;\n}\n\n.at-tax-tree-node:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-node-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.at-tax-node-drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n outline: 2px dashed var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.at-tax-node-multi-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.at-tax-tree-add-child {\n margin-left: auto;\n opacity: 0;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px 6px;\n border-radius: 4px;\n transition: opacity 0.15s, color 0.15s, background 0.15s;\n}\n\n.at-tax-tree-node:hover .at-tax-tree-add-child {\n opacity: 1;\n}\n\n.at-tax-tree-add-child:hover {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.at-tax-tree-checkbox {\n width: 14px;\n height: 14px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.at-tax-tree-saving-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 75%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n backdrop-filter: blur(1px);\n}\n\n.at-tax-create-context {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n margin-bottom: 12px;\n padding: 6px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.at-tax-tree-arrow {\n width: 16px;\n font-size: 0.55rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n text-align: center;\n cursor: pointer;\n}\n\n.at-tax-arrow-collapsed::before {\n content: \"\\25B6\";\n}\n\n.at-tax-arrow-expanded::before {\n content: \"\\25BC\";\n}\n\n.at-tax-arrow-leaf {\n visibility: hidden;\n}\n\n.at-tax-health-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-tax-health-dot.green {\n background: var(--mj-status-success);\n}\n\n.at-tax-health-dot.yellow {\n background: var(--mj-status-warning);\n}\n\n.at-tax-health-dot.red {\n background: var(--mj-status-error);\n}\n\n.at-tax-tree-label {\n flex: 1;\n color: var(--mj-text-primary);\n}\n\n.at-tax-tree-label-selected {\n font-weight: 700;\n}\n\n.at-tax-tree-count {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n/* \u2500\u2500 Details panel \u2500\u2500 */\n\n.at-tax-details-panel {\n width: 60%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.at-tax-details-header {\n padding: 20px 24px 0;\n}\n\n.at-tax-breadcrumb {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tax-bc-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.at-tax-bc-link:hover {\n text-decoration: underline;\n}\n\n.at-tax-bc-sep {\n color: var(--mj-border-default);\n}\n\n.at-tax-bc-current {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.at-tax-details-title {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.at-tax-edit-icon {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.at-tax-edit-icon:hover {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-details-desc {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin-bottom: 16px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-tax-edit-form {\n margin-bottom: 16px;\n}\n\n/* \u2500\u2500 Stats row \u2500\u2500 */\n\n.at-tax-stats-row {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 16px;\n padding: 0 24px;\n}\n\n.at-tax-stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n min-width: 72px;\n}\n\n.at-tax-stat-value {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-stat-date {\n font-size: 0.8rem;\n}\n\n.at-tax-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Action toolbar \u2500\u2500 */\n\n.at-tax-action-toolbar {\n display: flex;\n gap: 8px;\n padding: 0 24px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.at-tax-action-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-action-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n/* \u2500\u2500 Detail sections \u2500\u2500 */\n\n.at-tax-detail-section {\n padding: 0 24px 20px;\n}\n\n.at-tax-section-title {\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n margin-bottom: 10px;\n}\n\n.at-tax-child-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-tax-child-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.at-tax-child-chip:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.at-tax-chip-count {\n font-size: 0.6rem;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n padding: 0 5px;\n border-radius: 8px;\n}\n\n/* \u2500\u2500 Recent items \u2500\u2500 */\n\n.at-tax-recent-list {\n list-style: none;\n}\n\n.at-tax-recent-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-tax-recent-item:last-child {\n border-bottom: none;\n}\n\n.at-tax-recent-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-tax-recent-name {\n flex: 1;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-tax-recent-weight {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-tax-recent-date {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Health bar \u2500\u2500 */\n\n.at-tax-health-bar {\n display: flex;\n align-items: center;\n gap: 20px;\n padding: 12px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin-top: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-health-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-health-stat {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n}\n\n.at-tax-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n}\n\n.at-tax-dot-total {\n background: var(--mj-text-secondary);\n}\n\n.at-tax-dot-healthy {\n background: var(--mj-status-success);\n}\n\n.at-tax-dot-attention {\n background: var(--mj-status-warning);\n}\n\n.at-tax-dot-orphaned {\n background: var(--mj-status-error);\n}\n\n.at-tax-dot-duplicates {\n background: var(--mj-status-info);\n}\n\n.at-tax-health-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-val-success {\n color: var(--mj-status-success);\n}\n\n.at-tax-val-warning {\n color: var(--mj-status-warning);\n}\n\n.at-tax-val-error {\n color: var(--mj-status-error);\n}\n\n.at-tax-val-info {\n color: var(--mj-status-info);\n}\n\n.at-tax-health-text {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550 Duplicates sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-dup-stats-bar {\n display: flex;\n gap: 24px;\n margin-bottom: 16px;\n align-items: center;\n}\n\n.at-tax-dup-stat {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n}\n\n.at-tax-dup-stat strong {\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n margin-right: 4px;\n}\n\n.at-tax-dup-high strong {\n color: var(--mj-status-error);\n}\n\n.at-tax-dup-moderate strong {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-tax-dup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.at-tax-dup-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-card.at-tax-dup-high {\n border-left: 3px solid var(--mj-status-error);\n}\n\n.at-tax-dup-card.at-tax-dup-moderate {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.at-tax-dup-tag {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 120px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n text-align: center;\n}\n\n.at-tax-dup-arrow {\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.at-tax-dup-similarity {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n min-width: 100px;\n}\n\n.at-tax-sim-bar-bg {\n width: 100%;\n height: 6px;\n background: var(--mj-border-default);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-tax-sim-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s;\n}\n\n.at-tax-sim-bar-fill.high {\n background: var(--mj-status-error);\n}\n\n.at-tax-sim-bar-fill.moderate {\n background: var(--mj-status-warning);\n}\n\n.at-tax-sim-percent {\n font-size: 0.78rem;\n font-weight: 700;\n}\n\n.at-tax-sim-percent.high {\n color: var(--mj-status-error);\n}\n\n.at-tax-sim-percent.moderate {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-tax-dup-btn {\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n white-space: nowrap;\n}\n\n.at-tax-dup-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n/* \u2550\u2550\u2550\u2550 Orphans sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-orphan-toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-orphan-count {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-desc {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-bulk {\n margin-left: auto;\n display: flex;\n gap: 8px;\n}\n\n.at-tax-bulk-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-bulk-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-bulk-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.at-tax-orphan-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: 12px;\n}\n\n.at-tax-orphan-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 16px;\n transition: all 0.15s;\n display: flex;\n flex-direction: column;\n gap: 10px;\n border-top: 3px solid var(--mj-status-error);\n}\n\n.at-tax-orphan-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.at-tax-orphan-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-checkbox {\n width: 16px;\n height: 16px;\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-stats {\n display: flex;\n gap: 12px;\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-stats strong {\n color: var(--mj-text-secondary);\n}\n\n.at-tax-orphan-dates {\n display: flex;\n justify-content: space-between;\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-actions {\n display: flex;\n gap: 6px;\n margin-top: 4px;\n}\n\n.at-tax-orphan-btn {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: center;\n transition: all 0.15s;\n}\n\n.at-tax-orphan-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-delete:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n/* \u2550\u2550\u2550\u2550 Treemap sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-kpi-strip {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-treemap-kpi {\n padding: 10px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 120px;\n}\n\n.at-tax-treemap-kpi-value {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-treemap-kpi-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-tax-treemap-container {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 8px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n grid-auto-rows: 80px;\n gap: 4px;\n min-height: 340px;\n}\n\n.at-tax-treemap-cell {\n border-radius: 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n overflow: hidden;\n}\n\n.at-tax-treemap-cell:hover {\n transform: scale(1.02);\n z-index: 2;\n}\n\n.at-tax-cell-name {\n font-size: 0.78rem;\n}\n\n.at-tax-cell-count {\n font-size: 0.65rem;\n opacity: 0.85;\n font-weight: 400;\n}\n\n/* Treemap color families */\n.at-tm-blue-1 { background: color-mix(in srgb, var(--mj-brand-primary) 90%, black); }\n.at-tm-blue-2 { background: var(--mj-brand-primary); }\n.at-tm-blue-3 { background: color-mix(in srgb, var(--mj-brand-primary) 75%, white); }\n.at-tm-blue-4 { background: color-mix(in srgb, var(--mj-brand-primary) 55%, white); }\n\n.at-tm-green-1 { background: color-mix(in srgb, var(--mj-status-success) 90%, black); }\n.at-tm-green-2 { background: var(--mj-status-success); }\n.at-tm-green-3 { background: color-mix(in srgb, var(--mj-status-success) 60%, white); color: var(--mj-text-primary); }\n\n.at-tm-purple-1 { background: color-mix(in srgb, var(--mj-status-info) 90%, black); }\n.at-tm-purple-2 { background: var(--mj-status-info); }\n.at-tm-purple-3 { background: color-mix(in srgb, var(--mj-status-info) 65%, white); }\n\n.at-tm-orange-1 { background: color-mix(in srgb, var(--mj-status-warning) 90%, black); }\n.at-tm-orange-2 { background: var(--mj-status-warning); }\n.at-tm-orange-3 { background: color-mix(in srgb, var(--mj-status-warning) 60%, white); color: var(--mj-text-primary); }\n\n/* \u2550\u2550\u2550\u2550 Audit Log sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-audit-filters {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-filter-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-audit-checkbox-group {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-checkbox {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.at-tax-audit-checkbox input {\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-audit-timeline {\n position: relative;\n padding-left: 32px;\n}\n\n.at-tax-audit-timeline::before {\n content: '';\n position: absolute;\n left: 14px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.at-tax-audit-event {\n position: relative;\n padding: 10px 16px;\n margin-bottom: 4px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n border-radius: 8px;\n transition: background 0.1s;\n}\n\n.at-tax-audit-event:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-audit-event-icon {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.68rem;\n flex-shrink: 0;\n position: absolute;\n left: -32px;\n top: 10px;\n z-index: 1;\n}\n\n.at-tax-audit-event-icon.created {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.at-tax-audit-event-icon.merged {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.moved {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.deleted {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.at-tax-audit-event-icon.renamed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.at-tax-audit-event-body {\n flex: 1;\n}\n\n.at-tax-audit-event-desc {\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n line-height: 1.5;\n}\n\n.at-tax-tag-ref {\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n font-weight: 600;\n font-size: 0.72rem;\n border: 1px solid var(--mj-border-default);\n}\n\n.at-tax-audit-event-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n display: flex;\n gap: 12px;\n}\n\n/* \u2500\u2500 Taxonomy responsive \u2500\u2500 */\n\n@media (max-width: 1100px) {\n .at-tax-split-view {\n flex-direction: column;\n }\n\n .at-tax-tree-panel {\n width: 100%;\n max-height: 300px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .at-tax-details-panel {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-tax-dup-card {\n flex-wrap: wrap;\n }\n\n .at-tax-orphan-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* \u2500\u2500 Pipeline Config Widget \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-config-card {\n margin-top: 12px;\n}\n\n.at-config-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px !important;\n}\n\n.at-config-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.at-config-label {\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n min-width: 90px;\n flex-shrink: 0;\n}\n\n.at-config-control {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n justify-content: flex-end;\n}\n\n.at-config-input {\n width: 70px;\n padding: 3px 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 0.75rem;\n text-align: right;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.at-config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.at-config-slider {\n flex: 1;\n max-width: 100px;\n accent-color: var(--mj-brand-primary);\n height: 4px;\n}\n\n.at-config-value {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n min-width: 40px;\n text-align: right;\n}\n\n.at-config-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n}\n\n.at-config-section-label {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n/* Toggle Switch */\n.at-config-toggle {\n position: relative;\n display: inline-block;\n cursor: pointer;\n}\n\n.at-config-toggle input {\n display: none;\n}\n\n.at-toggle-track {\n display: block;\n width: 32px;\n height: 18px;\n background: var(--mj-border-strong);\n border-radius: 9px;\n transition: background 0.2s ease;\n position: relative;\n}\n\n.at-config-toggle input:checked + .at-toggle-track {\n background: var(--mj-brand-primary);\n}\n\n.at-toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0,0,0,0.15);\n}\n\n.at-config-toggle input:checked + .at-toggle-track .at-toggle-thumb {\n transform: translateX(14px);\n}\n\n/* \u2500\u2500 Schedule Indicator on Source Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-indicator {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 10px;\n margin-top: 6px;\n border-radius: 12px;\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n cursor: pointer;\n transition: all 0.15s ease;\n width: fit-content;\n}\n\n.at-schedule-indicator i {\n font-size: 0.62rem;\n}\n\n.at-schedule-indicator:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n/* Schedule button in source card actions */\n.at-source-schedule-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500 Schedule Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-schedule-dialog {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n width: 420px;\n max-width: 90vw;\n}\n\n.at-schedule-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-schedule-dialog-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-dialog-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 16px;\n padding: 4px;\n line-height: 1;\n transition: color 0.15s;\n}\n\n.at-schedule-dialog-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-body {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-schedule-field label {\n display: block;\n font-size: 11.5px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 6px;\n}\n\n.at-schedule-source-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-source-name i {\n color: var(--mj-text-muted);\n}\n\n.at-schedule-action-name {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-cron-input {\n width: 100%;\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n letter-spacing: 0.02em;\n}\n\n.at-schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.at-schedule-cron-preview i {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n}\n\n.at-schedule-toggle-row label {\n margin-bottom: 0;\n}\n\n.at-schedule-dialog-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4: Status Badges for Content Items \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-status-badge {\n display: inline-block;\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 0.6rem;\n font-weight: 600;\n white-space: nowrap;\n letter-spacing: 0.02em;\n}\n\n.at-status-badge-complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.at-status-badge-processing {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.at-status-badge-failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.at-status-badge-pending {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4/D7: Source Detail Controls \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-section-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.at-detail-section-controls {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-detail-filter-select {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.72rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n.at-retry-btn {\n font-size: 0.7rem !important;\n padding: 4px 8px !important;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface)) !important;\n color: var(--mj-status-error-text) !important;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-border-default)) !important;\n}\n\n.at-retry-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 18%, var(--mj-bg-surface)) !important;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D7: Pagination \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 10px 0 4px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.at-page-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.72rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-page-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-page-btn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.at-page-info {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Confirmation Dialog \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-confirm-message {\n font-size: 13.5px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: var(--mj-radius-sm, 6px);\n padding: 7px 14px;\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.at-danger-btn:hover {\n background: var(--mj-status-error-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Treemap Drill-In \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-cell-clickable {\n cursor: pointer;\n transition: transform 0.15s, box-shadow 0.15s;\n}\n\n.at-tax-treemap-cell-clickable:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n z-index: 1;\n}\n\n.at-tax-drillin-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: flex-start;\n justify-content: flex-end;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-tax-drillin-panel {\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n width: 420px;\n max-width: 90vw;\n height: 100vh;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n.at-tax-drillin-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-drillin-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-tax-drillin-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-drillin-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-tax-drillin-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* D3/D8: Clickable run history rows */\n.at-run-row-clickable {\n cursor: pointer;\n transition: background 0.12s ease;\n}\n\n.at-run-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-run-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* D2: Error text in detail tables */\n.run-error-text {\n color: var(--mj-status-error);\n font-weight: 600;\n}\n\n/* \u2500\u2500 Content Item Duplicates Section (G3) \u2500\u2500 */\n\n.at-dedup-section {\n margin-top: 24px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.at-dedup-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 16px;\n}\n\n.at-dedup-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.at-dedup-subtitle {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-dedup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s;\n}\n\n.at-dedup-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.at-dedup-pair {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.at-dedup-item {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1;\n}\n\n.at-dedup-item-name {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-dedup-item-source {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-vs {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n flex-shrink: 0;\n}\n\n.at-dedup-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.at-dedup-score {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-dedup-method {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-dedup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-dedup-confirm {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-dismiss {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-empty {\n text-align: center;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-empty i {\n font-size: 1.5rem;\n margin-bottom: 8px;\n color: var(--mj-status-success);\n}\n\n.at-dedup-empty p {\n margin: 8px 0 0;\n font-size: 0.82rem;\n}\n\n/* =============================================================================\n * Tags-only additions: governance toggles, scope chips, inline synonyms,\n * Suggestions inbox table+drawer, Tag Health 3-card layout. All colors flow\n * through MJ design tokens with `color-mix()` for tinted variants.\n * ============================================================================= */\n\n/* ---------- Governance toggle rows ---------- */\n\n.at-tg-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 10px 0;\n border-bottom: 1px dashed var(--mj-border-subtle);\n}\n.at-tg-toggle-row:last-child { border-bottom: 0; }\n.at-tg-toggle-label { display: flex; flex-direction: column; gap: 2px; max-width: 70%; }\n.at-tg-toggle-t { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.at-tg-toggle-d { font-size: 11px; color: var(--mj-text-muted); line-height: 1.4; }\n\n.at-tg-switch {\n position: relative;\n width: 36px;\n height: 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s;\n flex-shrink: 0;\n}\n.at-tg-switch::after {\n content: \"\";\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n transition: left 0.15s;\n box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n.at-tg-switch.on { background: var(--mj-brand-primary); }\n.at-tg-switch.on::after { left: 18px; }\n.at-tg-switch.disabled { opacity: 0.5; pointer-events: none; }\n\n.at-tg-grid-3 {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 14px 16px;\n margin-top: 14px;\n}\n.at-tg-field { display: flex; flex-direction: column; gap: 4px; }\n.at-tg-field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n.at-tg-hint { font-size: 11px; color: var(--mj-text-muted); }\n\n/* ---------- Scope chips ---------- */\n\n.at-tg-chip-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n margin-top: 8px;\n}\n.at-tg-chip {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n.at-tg-chip.scoped {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ---------- Inline synonyms ---------- */\n\n.at-tg-syn-add {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n align-items: stretch;\n}\n.at-tg-syn-add .at-search-input { flex: 1; }\n.at-tg-syn-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 5px;\n border: 1px solid var(--mj-border-subtle);\n margin-bottom: 6px;\n background: var(--mj-bg-surface);\n}\n.at-tg-syn-row.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n.at-tg-syn-name { font-weight: 600; flex: 1; color: var(--mj-text-primary); }\n.at-tg-syn-src {\n font-size: 10px;\n padding: 2px 7px;\n border-radius: 3px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n}\n.at-tg-syn-src.manual { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.at-tg-syn-src.imported { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.at-tg-syn-src.merged { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.at-tg-syn-src.llm { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.at-tg-syn-x {\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 2px 6px;\n}\n.at-tg-syn-x:hover { color: var(--mj-status-error-text, var(--mj-status-error)); }\n\n/* ---------- Suggestions inbox table + drawer ---------- */\n\n.sg-shell {\n display: flex;\n height: 100%;\n min-height: 600px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n.sg-main { flex: 1; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }\n.sg-toolbar {\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 10px;\n align-items: center;\n background: var(--mj-bg-surface-card);\n flex-wrap: wrap;\n}\n.sg-bulk-bar {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n padding: 9px 14px;\n display: flex;\n gap: 10px;\n align-items: center;\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 500;\n}\n.sg-table-body { flex: 1; overflow: auto; }\n.sg-table { width: 100%; border-collapse: collapse; font-size: 13px; color: var(--mj-text-primary); }\n.sg-table thead { position: sticky; top: 0; background: var(--mj-bg-surface-card); z-index: 1; }\n.sg-table th {\n text-align: left;\n padding: 9px 12px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n white-space: nowrap;\n}\n.sg-table td {\n padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n.sg-table tr { cursor: pointer; }\n.sg-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.sg-table tr.sg-row-selected td { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); }\n.sg-table tr.sg-row-checked td { background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent); }\n.sg-score { font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-weight: 600; }\n.sg-score-bar {\n display: inline-block;\n width: 70px;\n height: 5px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n vertical-align: middle;\n margin-right: 6px;\n}\n.sg-score-bar > span {\n display: block;\n height: 100%;\n background: var(--mj-brand-primary);\n}\n.sg-reason {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.sg-reason.merge { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.sg-reason.below { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 12%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.constrained { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.sg-reason.frozen { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.review { background: color-mix(in srgb, var(--mj-status-error) 12%, transparent); color: var(--mj-status-error-text, var(--mj-status-error)); }\n.sg-reason.lowusage { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.widenode { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.autogrow { background: color-mix(in srgb, var(--mj-status-warning) 12%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-row-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n.sg-table tr:hover .sg-row-actions {\n opacity: 1;\n}\n\n.sg-drawer {\n width: 460px;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n}\n.sg-drawer-hd {\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface);\n}\n.sg-drawer-bd { padding: 16px 18px; flex: 1; overflow-y: auto; }\n.sg-drawer-ft {\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 8px;\n background: var(--mj-bg-surface);\n flex-wrap: wrap;\n}\n.sg-drawer h4 {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin: 16px 0 8px;\n font-weight: 700;\n}\n.sg-candidate {\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n display: flex;\n gap: 12px;\n align-items: center;\n}\n.sg-preview {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n/* ---------- Tag Health cards ---------- */\n\n.health-shell { padding: 18px 22px; }\n.runbar {\n display: flex;\n gap: 22px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 18px;\n align-items: center;\n font-size: 13px;\n}\n.runbar .stat .l { font-size: 11px; color: var(--mj-text-muted); }\n.runbar .stat .v { font-size: 16px; font-weight: 600; color: var(--mj-text-primary); }\n.runbar .grow { flex: 1; }\n\n.health-cards {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 16px;\n margin-bottom: 22px;\n}\n.h-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 240px;\n}\n.h-card.merge { border-top: 4px solid var(--mj-brand-primary); }\n.h-card.lowusage { border-top: 4px solid var(--mj-status-warning); }\n.h-card.widenode { border-top: 4px solid var(--mj-status-error, var(--mj-status-warning)); }\n.h-card .top { display: flex; align-items: flex-start; gap: 10px; }\n.h-card .top .ic {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n}\n.h-card .name {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.h-card h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n.h-card .big {\n font-size: 36px;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n.h-card .sub { font-size: 12px; color: var(--mj-text-secondary); line-height: 1.4; margin: 0; }\n.h-card .ft { margin-top: auto; display: flex; gap: 6px; flex-wrap: wrap; }\n\n.threshold-form {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 18px;\n margin-top: 18px;\n}\n.threshold-form h3 { margin: 0 0 12px; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.threshold-form .grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n.threshold-form .field { display: flex; flex-direction: column; gap: 4px; }\n.threshold-form .field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n\n.run-history {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-top: 18px;\n overflow: hidden;\n}\n.run-history-hd {\n padding: 12px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-card);\n}\n.run-history-hd h3 { margin: 0; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.run-history table { width: 100%; border-collapse: collapse; font-size: 12px; }\n.run-history th {\n text-align: left;\n padding: 8px 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n font-weight: 600;\n}\n.run-history td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n/* Generic helpers used by new sections */\n.at-muted { color: var(--mj-text-muted); }\n.at-success-btn { color: var(--mj-status-success-text, var(--mj-status-success)); border-color: var(--mj-status-success-border, var(--mj-status-success)); }\n.at-btn-sm { font-size: 12px; padding: 4px 9px; }\n.at-btn-xs { font-size: 11px; padding: 2px 7px; }\n"], encapsulation: 2 });
7371
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.MJButtonDirective, i3.MJComboboxComponent, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageBodyComponent, i3.MJPageHeaderInteriorComponent, i3.MJPageBodyInteriorComponent, i3.MJLeftNavComponent, i3.MJLeftNavContentComponent, i3.MJTabNavComponent, i4.MJWordCloudComponent, i5.DecimalPipe, i5.DatePipe], styles: ["/* ============================================================\n Content Autotagging Dashboard\n All colors use MJ design tokens \u2014 no hardcoded hex values.\n All classes prefixed with at- to prevent leaking (ViewEncapsulation.None).\n ============================================================ */\n\n/* \u2500\u2500 Root layout \u2500\u2500 */\n\n.at-dashboard {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/*\n Left rail now owned by <mj-left-nav> (~50 lines of bespoke .at-left-nav-items\n / .at-nav-item / .at-nav-badge / .at-nav-divider styles retired). The footer\n stayed bespoke since it's \"Run Pipeline\" CTA content, not nav chrome.\n*/\n\n.at-left-nav-footer {\n padding: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-run-pipeline-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.at-run-pipeline-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-run-pipeline-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 MAIN CONTENT AREA \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-main-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.at-loading-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n/* .at-page-header / .at-page-title / .at-page-subtitle / .at-page-actions\n retired \u2014 section identity + actions now live in <mj-page-header-interior>\n (one shared instance at the top of <mj-left-nav-content>, with Title/Subtitle\n driven by currentTabTitle/currentTabSubtitle getters and per-section action\n buttons projected via an @switch into the chrome's [actions] slot). */\n\n.at-page-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding: 16px 20px;\n min-height: 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SHARED COMPONENTS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n border: 1px solid;\n border-radius: 7px;\n cursor: pointer;\n font-size: 0.78rem;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.at-primary-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-primary-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-primary-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.at-secondary-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.at-secondary-btn:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.at-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-card-title {\n font-size: 0.82rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-primary);\n}\n\n.at-card-title i {\n color: var(--mj-brand-primary);\n font-size: 0.75rem;\n}\n\n.at-card-body {\n padding: 0;\n}\n\n.at-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-disabled);\n}\n\n.at-empty-state i {\n font-size: 28px;\n}\n\n.at-empty-state p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 KPI STRIP \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-kpi-strip {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.at-kpi-card {\n flex: 1;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.at-kpi-value {\n font-size: 1.4rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-kpi-error-value {\n color: var(--mj-status-error-text);\n}\n\n.at-kpi-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-kpi-trend {\n font-size: 0.68rem;\n margin-top: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-text-muted);\n}\n\n.at-kpi-trend.up {\n color: var(--mj-status-success-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 PIPELINE TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-layout {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n}\n\n.at-pipeline-center {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n}\n\n.at-pipeline-right {\n width: 320px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Pipeline Stages */\n\n.at-pipeline-stages {\n display: flex;\n gap: 0;\n align-items: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 16px;\n}\n\n.at-pipeline-stage {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n}\n\n.at-pipeline-stage-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n font-size: 0.85rem;\n}\n\n.stage-idle .at-pipeline-stage-icon {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.stage-active .at-pipeline-stage-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.stage-complete .at-pipeline-stage-icon {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n@keyframes at-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 30%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent); }\n}\n\n.at-pipeline-stage-name {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.at-pipeline-stage-count {\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.at-pipeline-arrow {\n width: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 0.6rem;\n}\n\n.at-stage-connector {\n width: 32px;\n height: 2px;\n background: var(--mj-border-default);\n transition: background 0.4s ease;\n}\n\n.at-stage-connector.connector-complete {\n background: var(--mj-status-success);\n}\n\n/* Progress section */\n\n.at-progress-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 10px 16px;\n}\n\n.at-progress-header {\n display: flex;\n justify-content: space-between;\n font-size: 0.75rem;\n margin-bottom: 4px;\n}\n\n.at-progress-stage-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.at-progress-pct {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.at-progress-bar {\n height: 4px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.at-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 2px;\n transition: width 0.3s ease;\n}\n\n.at-progress-current {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n margin-top: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-progress-fill-paused {\n background: var(--mj-status-warning);\n animation: pulse-paused 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-paused {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n\n.at-pipeline-controls {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n justify-content: flex-end;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n.at-danger-btn:hover:not(:disabled) {\n background: var(--mj-status-error-text);\n border-color: var(--mj-status-error-text);\n}\n\n/* Feed items */\n\n.at-feed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-feed-item:last-child {\n border-bottom: none;\n}\n\n.at-feed-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-feed-status-dot.complete {\n background: var(--mj-status-success);\n}\n\n.at-feed-status-dot.processing {\n background: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.at-feed-status-dot.error {\n background: var(--mj-status-error);\n}\n\n.at-feed-item-name {\n flex: 1;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-feed-item-source {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n min-width: 100px;\n}\n\n.at-feed-item-tags {\n display: flex;\n gap: 4px;\n}\n\n.at-feed-tag {\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 0.62rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-feed-item-time {\n color: var(--mj-text-muted);\n font-size: 0.68rem;\n white-space: nowrap;\n min-width: 60px;\n text-align: right;\n}\n\n/* Source mini cards (right panel) */\n\n.at-source-mini {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-source-mini:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-source-mini:last-child {\n border-bottom: none;\n}\n\n.at-source-mini-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-source-mini-info {\n flex: 1;\n min-width: 0;\n}\n\n.at-source-mini-name {\n font-size: 0.78rem;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-source-mini-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-mini-status {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-source-mini-status.active {\n background: var(--mj-status-success);\n}\n\n.at-source-mini-status.error {\n background: var(--mj-status-error);\n}\n\n.at-source-mini-status.inactive {\n background: var(--mj-text-disabled);\n}\n\n/* Tag cloud card */\n\n.at-tag-cloud-card {\n padding: 16px;\n}\n\n.at-tag-cloud {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n.at-tag-pill {\n padding: 4px 12px;\n border-radius: 14px;\n font-size: 0.72rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-tag-pill:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tag-weighted {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tag-weight {\n font-size: 0.6rem;\n opacity: 0.6;\n font-weight: 400;\n}\n\n.at-tag-row-clickable {\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-tag-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.at-tag-pill.large {\n font-size: 0.85rem;\n padding: 5px 14px;\n}\n\n.at-tag-pill.small {\n font-size: 0.65rem;\n padding: 3px 8px;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SOURCES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-sources-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 12px;\n}\n\n.at-source-card-full {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n transition: border-color 0.15s ease;\n}\n\n.at-source-card-full:hover {\n border-color: var(--mj-border-default);\n}\n\n.at-source-card-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 12px;\n}\n\n.at-source-card-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.at-source-card-title {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-card-type {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-status {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.7rem;\n font-weight: 500;\n}\n\n.at-source-card-status.active {\n color: var(--mj-status-success-text);\n}\n\n.at-source-card-status.error {\n color: var(--mj-status-error-text);\n}\n\n.at-source-card-status.inactive {\n color: var(--mj-text-disabled);\n}\n\n.at-source-card-url {\n font-size: 0.7rem;\n color: var(--mj-brand-primary);\n margin-bottom: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-source-card-stats {\n display: flex;\n gap: 16px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-source-stat {\n display: flex;\n flex-direction: column;\n}\n\n.at-source-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-stat-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-actions {\n display: flex;\n gap: 6px;\n margin-top: 10px;\n}\n\n.at-source-action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.7rem;\n cursor: pointer;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n transition: all 0.12s ease;\n}\n\n.at-source-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-source-delete-btn:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error-text);\n}\n\n.at-add-source-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-source-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-source-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CONTENT TYPES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-ct-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.at-ct-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n}\n\n.at-ct-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n\n.at-ct-card-name {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-ct-card-model {\n font-size: 0.68rem;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-ct-field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-ct-field:last-child {\n border-bottom: none;\n}\n\n.at-ct-field-label {\n color: var(--mj-text-muted);\n}\n\n.at-ct-field-value {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 0.75rem;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range i {\n color: var(--mj-brand-primary);\n}\n\n.at-ct-tag-range-bar {\n flex: 1;\n height: 6px;\n background: var(--mj-bg-surface);\n border-radius: 3px;\n position: relative;\n}\n\n.at-ct-tag-range-fill {\n position: absolute;\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n.at-ct-range-suffix {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 TAG LIBRARY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tag-lib-layout {\n display: flex;\n gap: 16px;\n}\n\n.at-tag-lib-main {\n flex: 1;\n}\n\n.at-tag-lib-sidebar {\n width: 280px;\n flex-shrink: 0;\n}\n\n.at-tag-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-tag-table th {\n text-align: left;\n padding: 8px 12px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-tag-table td {\n padding: 10px 12px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-name-cell {\n font-weight: 600;\n}\n\n.at-tag-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n display: inline-block;\n vertical-align: middle;\n}\n\n.at-tag-bar-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n/* Weight indicator in tag table */\n.at-weight-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-weight-bar {\n width: 50px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-weight-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.2s ease;\n}\n\n.at-weight-bar-fill.at-weight-high {\n background: var(--mj-status-success);\n}\n\n.at-weight-bar-fill.at-weight-medium {\n background: var(--mj-status-warning);\n}\n\n.at-weight-bar-fill.at-weight-low {\n background: var(--mj-status-error);\n}\n\n.at-weight-value {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n min-width: 28px;\n}\n\n.at-tags-by-source {\n font-size: 0.78rem;\n}\n\n.at-tag-source-row {\n display: flex;\n justify-content: space-between;\n padding: 5px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-source-row:last-child {\n border-bottom: none;\n}\n\n.at-search-input {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n width: 200px;\n outline: none;\n}\n\n.at-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-search-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RUN HISTORY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-run-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-run-table th {\n text-align: left;\n padding: 10px 14px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-run-table td {\n padding: 12px 14px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-run-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n cursor: pointer;\n}\n\n.at-run-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-run-status-badge.complete {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-run-status-badge.failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-run-status-badge.running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-run-duration {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n}\n\n.at-run-source-name {\n font-weight: 500;\n}\n\n.at-run-error-text {\n color: var(--mj-status-error-text);\n}\n\n.at-filter-select {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.78rem;\n outline: none;\n}\n\n.at-filter-select:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM PANEL \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.at-slide-panel {\n position: fixed;\n right: 0;\n top: 0;\n bottom: 0;\n width: 420px;\n max-width: 100vw;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n}\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-slide-header h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n background: none;\n border: none;\n font-size: 1.1rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n}\n\n.at-slide-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-form-group {\n margin-bottom: 16px;\n}\n\n.at-form-label {\n display: block;\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n font-size: 0.82rem;\n outline: none;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.at-form-input::placeholder,\n.at-form-textarea::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-form-textarea {\n resize: vertical;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n margin-top: 24px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RESPONSIVE \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n/* <mj-left-nav> collapses to a full-width top bar at \u2264700px; stack the root\n layout vertically so the content pane sits below it instead of being\n squeezed to zero width in the flex row. */\n@media (max-width: 700px) {\n .at-dashboard {\n flex-direction: column;\n }\n}\n\n@media (max-width: 1100px) {\n .at-pipeline-layout {\n flex-direction: column;\n }\n\n .at-pipeline-right {\n width: 100%;\n flex-direction: row;\n }\n\n .at-tag-lib-layout {\n flex-direction: column;\n }\n\n .at-tag-lib-sidebar {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-left-nav {\n width: 180px;\n }\n\n .at-kpi-strip {\n flex-wrap: wrap;\n }\n\n .at-kpi-card {\n min-width: 140px;\n }\n\n .at-sources-grid {\n grid-template-columns: 1fr;\n }\n\n .at-ct-grid {\n grid-template-columns: 1fr;\n }\n\n .at-slide-panel {\n width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .at-left-nav {\n width: 56px;\n }\n\n .at-left-nav-header h2 {\n font-size: 0;\n }\n\n .at-left-nav-header h2 i {\n font-size: 1rem;\n }\n\n .at-nav-item {\n justify-content: center;\n padding: 10px;\n font-size: 0;\n }\n\n .at-nav-item i {\n font-size: 1rem;\n }\n\n .at-nav-badge {\n display: none;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Slide-in Form Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 9999;\n animation: at-fade-in 0.2s ease;\n}\n\n@keyframes at-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n.at-slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 420px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0, 0, 0, 0.4);\n z-index: 10000;\n display: flex;\n flex-direction: column;\n animation: at-slide-in 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes at-slide-in { from { transform: translateX(100%); } to { transform: translateX(0); } }\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.at-slide-header h3 {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.at-slide-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.at-form-label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n transition: border-color 0.15s ease;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.at-form-select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M3 5l3 3 3-3'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 30px;\n}\n\n.at-form-textarea {\n resize: vertical;\n min-height: 70px;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-form-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* Also add empty state for Content Types (matching Sources) */\n.at-add-type-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-type-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-type-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORKED PIPELINE STAGES \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-stages-forked {\n display: flex;\n align-items: center;\n gap: 0;\n}\n\n.at-pipeline-fork {\n display: flex;\n align-items: center;\n gap: 0;\n flex: 2;\n}\n\n.at-pipeline-fork-lines {\n width: 28px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n position: relative;\n flex-shrink: 0;\n}\n\n.at-pipeline-fork-line {\n height: 2px;\n background: var(--mj-border-default);\n width: 100%;\n position: relative;\n}\n\n.at-pipeline-fork-line::before {\n content: '';\n position: absolute;\n width: 2px;\n height: 12px;\n background: var(--mj-border-default);\n left: 0;\n}\n\n.at-fork-top::before {\n bottom: 0;\n left: 0;\n}\n\n.at-fork-bottom::before {\n top: 0;\n left: 0;\n}\n\n.at-pipeline-fork-branches {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n}\n\n.at-pipeline-fork-branches .at-pipeline-stage {\n flex: none;\n padding: 6px 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE FEED ITEMS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-item-clickable {\n cursor: pointer;\n}\n\n.at-feed-item-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FEED SEARCH & PAGINATION \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.at-feed-header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-left: auto;\n}\n\n.at-feed-sort-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.68rem;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-feed-sort-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-feed-count {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.at-feed-search-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-search-icon {\n color: var(--mj-text-disabled);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-feed-search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n outline: none;\n padding: 4px 0;\n min-width: 0;\n}\n\n.at-feed-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-feed-search-clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 9px;\n flex-shrink: 0;\n}\n\n.at-feed-search-clear:hover {\n background: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.at-feed-scroll-body {\n overflow-y: auto;\n min-height: 0;\n flex: 1;\n}\n\n.at-feed-item-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n overflow: hidden;\n}\n\n.at-feed-item-content .at-feed-item-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-feed-item-source-label {\n font-size: 0.7rem;\n font-weight: 500;\n color: var(--mj-brand-primary);\n}\n\n.at-feed-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-pagination-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE SOURCE CARDS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-source-card-clickable {\n cursor: pointer;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORM HINT \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-form-hint {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n font-style: italic;\n margin-top: 2px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 DETAIL PANEL (wider) \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-panel {\n width: 500px;\n}\n\n/* \u2500\u2500 Detail: Item header \u2500\u2500 */\n\n.at-detail-item-header {\n margin-bottom: 8px;\n}\n\n.at-detail-item-name {\n font-size: 1.05rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0 0 6px 0;\n word-break: break-word;\n}\n\n.at-detail-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-detail-badge {\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-detail-badge-source {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-detail-badge-type {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.at-detail-badge-file {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.at-detail-badge-status-active {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-detail-badge-status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-detail-badge-status-inactive {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500 Detail: Sections \u2500\u2500 */\n\n.at-detail-section {\n margin-bottom: 4px;\n}\n\n.at-detail-section-label {\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.at-detail-link {\n font-size: 0.8rem;\n color: var(--mj-brand-primary);\n text-decoration: none;\n word-break: break-all;\n}\n\n.at-detail-link:hover {\n text-decoration: underline;\n}\n\n/* \u2500\u2500 Detail: Text preview \u2500\u2500 */\n\n.at-detail-text-preview {\n max-height: 200px;\n overflow-y: auto;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n font-size: 0.78rem;\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n}\n\n/* \u2500\u2500 Detail: Tags \u2500\u2500 */\n\n.at-detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n/* \u2500\u2500 Detail: Meta grid \u2500\u2500 */\n\n.at-detail-meta-grid {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.at-detail-meta-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-detail-meta-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-meta-key {\n color: var(--mj-text-muted);\n font-weight: 500;\n flex-shrink: 0;\n margin-right: 12px;\n}\n\n.at-detail-meta-value {\n color: var(--mj-text-primary);\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-meta-mono {\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n font-size: 0.72rem;\n}\n\n/* \u2500\u2500 Detail: Actions \u2500\u2500 */\n\n.at-detail-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-detail-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* \u2500\u2500 Detail: Source header \u2500\u2500 */\n\n.at-detail-source-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n/* \u2500\u2500 Detail: Stats strip \u2500\u2500 */\n\n.at-detail-stats-strip {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-detail-stat {\n flex: 1;\n min-width: 60px;\n text-align: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 8px 6px;\n}\n\n.at-detail-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-detail-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Detail: Content Library \u2500\u2500 */\n\n.at-detail-content-list {\n max-height: 250px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.at-detail-content-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-detail-content-item:last-child {\n border-bottom: none;\n}\n\n.at-detail-content-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-detail-content-item-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-content-item-tags {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.at-detail-content-item-time {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n/* \u2500\u2500 Detail: Run history \u2500\u2500 */\n\n.at-detail-run-history {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.at-detail-run-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.75rem;\n}\n\n.at-detail-run-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-run-time {\n color: var(--mj-text-secondary);\n flex: 1;\n}\n\n.at-detail-run-duration {\n color: var(--mj-text-muted);\n}\n\n.at-detail-run-items {\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 600px) {\n .at-slide-panel {\n width: 100%;\n }\n\n .at-detail-panel {\n width: 100%;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n TAXONOMY GOVERNANCE TAB\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n/* Sub-tab strip + badges retired \u2014 taxonomy sub-tabs now driven by <mj-tab-nav>\n in the [toolbar] slot of the taxonomy section, with TabConfig badges\n (warning variant for duplicates, error variant for orphans). */\n\n/* \u2500\u2500 Tree View: Split layout \u2500\u2500 */\n\n.at-tax-split-view {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n height: calc(100vh - 320px);\n min-height: 400px;\n overflow: hidden;\n}\n\n.at-tax-tree-panel {\n width: 40%;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n}\n\n.at-tax-tree-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 0.8rem;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-tax-toolbar-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-tax-toolbar-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-tree-body {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.at-tax-tree-node {\n padding: 6px 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s;\n line-height: 1.4;\n}\n\n.at-tax-tree-node:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-node-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.at-tax-node-drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n outline: 2px dashed var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.at-tax-node-multi-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.at-tax-tree-add-child {\n margin-left: auto;\n opacity: 0;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px 6px;\n border-radius: 4px;\n transition: opacity 0.15s, color 0.15s, background 0.15s;\n}\n\n.at-tax-tree-node:hover .at-tax-tree-add-child {\n opacity: 1;\n}\n\n.at-tax-tree-add-child:hover {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.at-tax-tree-checkbox {\n width: 14px;\n height: 14px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.at-tax-tree-saving-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 75%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n backdrop-filter: blur(1px);\n}\n\n.at-tax-create-context {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n margin-bottom: 12px;\n padding: 6px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.at-tax-tree-arrow {\n width: 16px;\n font-size: 0.55rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n text-align: center;\n cursor: pointer;\n}\n\n.at-tax-arrow-collapsed::before {\n content: \"\\25B6\";\n}\n\n.at-tax-arrow-expanded::before {\n content: \"\\25BC\";\n}\n\n.at-tax-arrow-leaf {\n visibility: hidden;\n}\n\n.at-tax-health-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-tax-health-dot.green {\n background: var(--mj-status-success);\n}\n\n.at-tax-health-dot.yellow {\n background: var(--mj-status-warning);\n}\n\n.at-tax-health-dot.red {\n background: var(--mj-status-error);\n}\n\n.at-tax-tree-label {\n flex: 1;\n color: var(--mj-text-primary);\n}\n\n.at-tax-tree-label-selected {\n font-weight: 700;\n}\n\n.at-tax-tree-count {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n/* \u2500\u2500 Details panel \u2500\u2500 */\n\n.at-tax-details-panel {\n width: 60%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.at-tax-details-header {\n padding: 20px 24px 0;\n}\n\n.at-tax-breadcrumb {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tax-bc-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.at-tax-bc-link:hover {\n text-decoration: underline;\n}\n\n.at-tax-bc-sep {\n color: var(--mj-border-default);\n}\n\n.at-tax-bc-current {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.at-tax-details-title {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.at-tax-edit-icon {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.at-tax-edit-icon:hover {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-details-desc {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin-bottom: 16px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-tax-edit-form {\n margin-bottom: 16px;\n}\n\n/* \u2500\u2500 Stats row \u2500\u2500 */\n\n.at-tax-stats-row {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 16px;\n padding: 0 24px;\n}\n\n.at-tax-stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n min-width: 72px;\n}\n\n.at-tax-stat-value {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-stat-date {\n font-size: 0.8rem;\n}\n\n.at-tax-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Action toolbar \u2500\u2500 */\n\n.at-tax-action-toolbar {\n display: flex;\n gap: 8px;\n padding: 0 24px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.at-tax-action-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-action-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n/* \u2500\u2500 Detail sections \u2500\u2500 */\n\n.at-tax-detail-section {\n padding: 0 24px 20px;\n}\n\n.at-tax-section-title {\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n margin-bottom: 10px;\n}\n\n.at-tax-child-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-tax-child-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.at-tax-child-chip:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.at-tax-chip-count {\n font-size: 0.6rem;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n padding: 0 5px;\n border-radius: 8px;\n}\n\n/* \u2500\u2500 Recent items \u2500\u2500 */\n\n.at-tax-recent-list {\n list-style: none;\n}\n\n.at-tax-recent-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-tax-recent-item:last-child {\n border-bottom: none;\n}\n\n.at-tax-recent-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-tax-recent-name {\n flex: 1;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-tax-recent-weight {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-tax-recent-date {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Health bar \u2500\u2500 */\n\n.at-tax-health-bar {\n display: flex;\n align-items: center;\n gap: 20px;\n padding: 12px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin-top: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-health-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-health-stat {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n}\n\n.at-tax-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n}\n\n.at-tax-dot-total {\n background: var(--mj-text-secondary);\n}\n\n.at-tax-dot-healthy {\n background: var(--mj-status-success);\n}\n\n.at-tax-dot-attention {\n background: var(--mj-status-warning);\n}\n\n.at-tax-dot-orphaned {\n background: var(--mj-status-error);\n}\n\n.at-tax-dot-duplicates {\n background: var(--mj-status-info);\n}\n\n.at-tax-health-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-val-success {\n color: var(--mj-status-success);\n}\n\n.at-tax-val-warning {\n color: var(--mj-status-warning);\n}\n\n.at-tax-val-error {\n color: var(--mj-status-error);\n}\n\n.at-tax-val-info {\n color: var(--mj-status-info);\n}\n\n.at-tax-health-text {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550 Duplicates sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-dup-stats-bar {\n display: flex;\n gap: 24px;\n margin-bottom: 16px;\n align-items: center;\n}\n\n.at-tax-dup-stat {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n}\n\n.at-tax-dup-stat strong {\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n margin-right: 4px;\n}\n\n.at-tax-dup-high strong {\n color: var(--mj-status-error);\n}\n\n.at-tax-dup-moderate strong {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-tax-dup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.at-tax-dup-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-card.at-tax-dup-high {\n border-left: 3px solid var(--mj-status-error);\n}\n\n.at-tax-dup-card.at-tax-dup-moderate {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.at-tax-dup-tag {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 120px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n text-align: center;\n}\n\n.at-tax-dup-arrow {\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.at-tax-dup-similarity {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n min-width: 100px;\n}\n\n.at-tax-sim-bar-bg {\n width: 100%;\n height: 6px;\n background: var(--mj-border-default);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-tax-sim-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s;\n}\n\n.at-tax-sim-bar-fill.high {\n background: var(--mj-status-error);\n}\n\n.at-tax-sim-bar-fill.moderate {\n background: var(--mj-status-warning);\n}\n\n.at-tax-sim-percent {\n font-size: 0.78rem;\n font-weight: 700;\n}\n\n.at-tax-sim-percent.high {\n color: var(--mj-status-error);\n}\n\n.at-tax-sim-percent.moderate {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-tax-dup-btn {\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n white-space: nowrap;\n}\n\n.at-tax-dup-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n/* \u2550\u2550\u2550\u2550 Orphans sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-orphan-toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-orphan-count {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-desc {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-bulk {\n margin-left: auto;\n display: flex;\n gap: 8px;\n}\n\n.at-tax-bulk-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-bulk-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-bulk-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.at-tax-orphan-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: 12px;\n}\n\n.at-tax-orphan-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 16px;\n transition: all 0.15s;\n display: flex;\n flex-direction: column;\n gap: 10px;\n border-top: 3px solid var(--mj-status-error);\n}\n\n.at-tax-orphan-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.at-tax-orphan-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-checkbox {\n width: 16px;\n height: 16px;\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-stats {\n display: flex;\n gap: 12px;\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-stats strong {\n color: var(--mj-text-secondary);\n}\n\n.at-tax-orphan-dates {\n display: flex;\n justify-content: space-between;\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-actions {\n display: flex;\n gap: 6px;\n margin-top: 4px;\n}\n\n.at-tax-orphan-btn {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: center;\n transition: all 0.15s;\n}\n\n.at-tax-orphan-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-delete:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n/* \u2550\u2550\u2550\u2550 Treemap sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-kpi-strip {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-treemap-kpi {\n padding: 10px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 120px;\n}\n\n.at-tax-treemap-kpi-value {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-treemap-kpi-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-tax-treemap-container {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 8px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n grid-auto-rows: 80px;\n gap: 4px;\n min-height: 340px;\n}\n\n.at-tax-treemap-cell {\n border-radius: 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n overflow: hidden;\n}\n\n.at-tax-treemap-cell:hover {\n transform: scale(1.02);\n z-index: 2;\n}\n\n.at-tax-cell-name {\n font-size: 0.78rem;\n}\n\n.at-tax-cell-count {\n font-size: 0.65rem;\n opacity: 0.85;\n font-weight: 400;\n}\n\n/* Treemap color families */\n.at-tm-blue-1 { background: color-mix(in srgb, var(--mj-brand-primary) 90%, black); }\n.at-tm-blue-2 { background: var(--mj-brand-primary); }\n.at-tm-blue-3 { background: color-mix(in srgb, var(--mj-brand-primary) 75%, white); }\n.at-tm-blue-4 { background: color-mix(in srgb, var(--mj-brand-primary) 55%, white); }\n\n.at-tm-green-1 { background: color-mix(in srgb, var(--mj-status-success) 90%, black); }\n.at-tm-green-2 { background: var(--mj-status-success); }\n.at-tm-green-3 { background: color-mix(in srgb, var(--mj-status-success) 60%, white); color: var(--mj-text-primary); }\n\n.at-tm-purple-1 { background: color-mix(in srgb, var(--mj-status-info) 90%, black); }\n.at-tm-purple-2 { background: var(--mj-status-info); }\n.at-tm-purple-3 { background: color-mix(in srgb, var(--mj-status-info) 65%, white); }\n\n.at-tm-orange-1 { background: color-mix(in srgb, var(--mj-status-warning) 90%, black); }\n.at-tm-orange-2 { background: var(--mj-status-warning); }\n.at-tm-orange-3 { background: color-mix(in srgb, var(--mj-status-warning) 60%, white); color: var(--mj-text-primary); }\n\n/* \u2550\u2550\u2550\u2550 Audit Log sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-audit-filters {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-filter-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-audit-checkbox-group {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-checkbox {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.at-tax-audit-checkbox input {\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-audit-timeline {\n position: relative;\n padding-left: 32px;\n}\n\n.at-tax-audit-timeline::before {\n content: '';\n position: absolute;\n left: 14px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.at-tax-audit-event {\n position: relative;\n padding: 10px 16px;\n margin-bottom: 4px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n border-radius: 8px;\n transition: background 0.1s;\n}\n\n.at-tax-audit-event:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-audit-event-icon {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.68rem;\n flex-shrink: 0;\n position: absolute;\n left: -32px;\n top: 10px;\n z-index: 1;\n}\n\n.at-tax-audit-event-icon.created {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.at-tax-audit-event-icon.merged {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.moved {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.deleted {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.at-tax-audit-event-icon.renamed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.at-tax-audit-event-body {\n flex: 1;\n}\n\n.at-tax-audit-event-desc {\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n line-height: 1.5;\n}\n\n.at-tax-tag-ref {\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n font-weight: 600;\n font-size: 0.72rem;\n border: 1px solid var(--mj-border-default);\n}\n\n.at-tax-audit-event-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n display: flex;\n gap: 12px;\n}\n\n/* \u2500\u2500 Taxonomy responsive \u2500\u2500 */\n\n@media (max-width: 1100px) {\n .at-tax-split-view {\n flex-direction: column;\n }\n\n .at-tax-tree-panel {\n width: 100%;\n max-height: 300px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .at-tax-details-panel {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-tax-dup-card {\n flex-wrap: wrap;\n }\n\n .at-tax-orphan-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* \u2500\u2500 Pipeline Config Widget \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-config-card {\n margin-top: 12px;\n}\n\n.at-config-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px !important;\n}\n\n.at-config-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.at-config-label {\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n min-width: 90px;\n flex-shrink: 0;\n}\n\n.at-config-control {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n justify-content: flex-end;\n}\n\n.at-config-input {\n width: 70px;\n padding: 3px 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 0.75rem;\n text-align: right;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.at-config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.at-config-slider {\n flex: 1;\n max-width: 100px;\n accent-color: var(--mj-brand-primary);\n height: 4px;\n}\n\n.at-config-value {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n min-width: 40px;\n text-align: right;\n}\n\n.at-config-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n}\n\n.at-config-section-label {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n/* Toggle Switch */\n.at-config-toggle {\n position: relative;\n display: inline-block;\n cursor: pointer;\n}\n\n.at-config-toggle input {\n display: none;\n}\n\n.at-toggle-track {\n display: block;\n width: 32px;\n height: 18px;\n background: var(--mj-border-strong);\n border-radius: 9px;\n transition: background 0.2s ease;\n position: relative;\n}\n\n.at-config-toggle input:checked + .at-toggle-track {\n background: var(--mj-brand-primary);\n}\n\n.at-toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0,0,0,0.15);\n}\n\n.at-config-toggle input:checked + .at-toggle-track .at-toggle-thumb {\n transform: translateX(14px);\n}\n\n/* \u2500\u2500 Schedule Indicator on Source Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-indicator {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 10px;\n margin-top: 6px;\n border-radius: 12px;\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n cursor: pointer;\n transition: all 0.15s ease;\n width: fit-content;\n}\n\n.at-schedule-indicator i {\n font-size: 0.62rem;\n}\n\n.at-schedule-indicator:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n/* Schedule button in source card actions */\n.at-source-schedule-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500 Schedule Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-schedule-dialog {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n width: 420px;\n max-width: 90vw;\n}\n\n.at-schedule-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-schedule-dialog-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-dialog-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 16px;\n padding: 4px;\n line-height: 1;\n transition: color 0.15s;\n}\n\n.at-schedule-dialog-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-body {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-schedule-field label {\n display: block;\n font-size: 11.5px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 6px;\n}\n\n.at-schedule-source-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-source-name i {\n color: var(--mj-text-muted);\n}\n\n.at-schedule-action-name {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-cron-input {\n width: 100%;\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n letter-spacing: 0.02em;\n}\n\n.at-schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.at-schedule-cron-preview i {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n}\n\n.at-schedule-toggle-row label {\n margin-bottom: 0;\n}\n\n.at-schedule-dialog-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4: Status Badges for Content Items \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-status-badge {\n display: inline-block;\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 0.6rem;\n font-weight: 600;\n white-space: nowrap;\n letter-spacing: 0.02em;\n}\n\n.at-status-badge-complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.at-status-badge-processing {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.at-status-badge-failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.at-status-badge-pending {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4/D7: Source Detail Controls \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-section-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.at-detail-section-controls {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-detail-filter-select {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.72rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n.at-retry-btn {\n font-size: 0.7rem !important;\n padding: 4px 8px !important;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface)) !important;\n color: var(--mj-status-error-text) !important;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-border-default)) !important;\n}\n\n.at-retry-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 18%, var(--mj-bg-surface)) !important;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D7: Pagination \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 10px 0 4px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.at-page-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.72rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-page-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-page-btn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.at-page-info {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Confirmation Dialog \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-confirm-message {\n font-size: 13.5px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: var(--mj-radius-sm, 6px);\n padding: 7px 14px;\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.at-danger-btn:hover {\n background: var(--mj-status-error-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Treemap Drill-In \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-cell-clickable {\n cursor: pointer;\n transition: transform 0.15s, box-shadow 0.15s;\n}\n\n.at-tax-treemap-cell-clickable:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n z-index: 1;\n}\n\n.at-tax-drillin-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: flex-start;\n justify-content: flex-end;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-tax-drillin-panel {\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n width: 420px;\n max-width: 90vw;\n height: 100vh;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n.at-tax-drillin-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-drillin-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-tax-drillin-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-drillin-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-tax-drillin-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* D3/D8: Clickable run history rows */\n.at-run-row-clickable {\n cursor: pointer;\n transition: background 0.12s ease;\n}\n\n.at-run-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-run-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* D2: Error text in detail tables */\n.run-error-text {\n color: var(--mj-status-error);\n font-weight: 600;\n}\n\n/* \u2500\u2500 Content Item Duplicates Section (G3) \u2500\u2500 */\n\n.at-dedup-section {\n margin-top: 24px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.at-dedup-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 16px;\n}\n\n.at-dedup-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.at-dedup-subtitle {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-dedup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s;\n}\n\n.at-dedup-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.at-dedup-pair {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.at-dedup-item {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1;\n}\n\n.at-dedup-item-name {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-dedup-item-source {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-vs {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n flex-shrink: 0;\n}\n\n.at-dedup-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.at-dedup-score {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-dedup-method {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-dedup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-dedup-confirm {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-dismiss {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-empty {\n text-align: center;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-empty i {\n font-size: 1.5rem;\n margin-bottom: 8px;\n color: var(--mj-status-success);\n}\n\n.at-dedup-empty p {\n margin: 8px 0 0;\n font-size: 0.82rem;\n}\n\n/* =============================================================================\n * Tags-only additions: governance toggles, scope chips, inline synonyms,\n * Suggestions inbox table+drawer, Tag Health 3-card layout. All colors flow\n * through MJ design tokens with `color-mix()` for tinted variants.\n * ============================================================================= */\n\n/* ---------- Governance toggle rows ---------- */\n\n.at-tg-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 10px 0;\n border-bottom: 1px dashed var(--mj-border-subtle);\n}\n.at-tg-toggle-row:last-child { border-bottom: 0; }\n.at-tg-toggle-label { display: flex; flex-direction: column; gap: 2px; max-width: 70%; }\n.at-tg-toggle-t { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.at-tg-toggle-d { font-size: 11px; color: var(--mj-text-muted); line-height: 1.4; }\n\n.at-tg-switch {\n position: relative;\n width: 36px;\n height: 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s;\n flex-shrink: 0;\n}\n.at-tg-switch::after {\n content: \"\";\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n transition: left 0.15s;\n box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n.at-tg-switch.on { background: var(--mj-brand-primary); }\n.at-tg-switch.on::after { left: 18px; }\n.at-tg-switch.disabled { opacity: 0.5; pointer-events: none; }\n\n.at-tg-grid-3 {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 14px 16px;\n margin-top: 14px;\n}\n.at-tg-field { display: flex; flex-direction: column; gap: 4px; }\n.at-tg-field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n.at-tg-hint { font-size: 11px; color: var(--mj-text-muted); }\n\n/* ---------- Scope chips ---------- */\n\n.at-tg-chip-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n margin-top: 8px;\n}\n.at-tg-chip {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n.at-tg-chip.scoped {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ---------- Inline synonyms ---------- */\n\n.at-tg-syn-add {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n align-items: stretch;\n}\n.at-tg-syn-add .at-search-input { flex: 1; }\n.at-tg-syn-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 5px;\n border: 1px solid var(--mj-border-subtle);\n margin-bottom: 6px;\n background: var(--mj-bg-surface);\n}\n.at-tg-syn-row.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n.at-tg-syn-name { font-weight: 600; flex: 1; color: var(--mj-text-primary); }\n.at-tg-syn-src {\n font-size: 10px;\n padding: 2px 7px;\n border-radius: 3px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n}\n.at-tg-syn-src.manual { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.at-tg-syn-src.imported { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.at-tg-syn-src.merged { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.at-tg-syn-src.llm { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.at-tg-syn-x {\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 2px 6px;\n}\n.at-tg-syn-x:hover { color: var(--mj-status-error-text, var(--mj-status-error)); }\n\n/* ---------- Suggestions inbox table + drawer ---------- */\n\n.sg-shell {\n display: flex;\n height: 100%;\n min-height: 600px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n.sg-main { flex: 1; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }\n.sg-toolbar {\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 10px;\n align-items: center;\n background: var(--mj-bg-surface-card);\n flex-wrap: wrap;\n}\n.sg-bulk-bar {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n padding: 9px 14px;\n display: flex;\n gap: 10px;\n align-items: center;\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 500;\n}\n.sg-table-body { flex: 1; overflow: auto; }\n.sg-table { width: 100%; border-collapse: collapse; font-size: 13px; color: var(--mj-text-primary); }\n.sg-table thead { position: sticky; top: 0; background: var(--mj-bg-surface-card); z-index: 1; }\n.sg-table th {\n text-align: left;\n padding: 9px 12px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n white-space: nowrap;\n}\n.sg-table td {\n padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n.sg-table tr { cursor: pointer; }\n.sg-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.sg-table tr.sg-row-selected td { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); }\n.sg-table tr.sg-row-checked td { background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent); }\n.sg-score { font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-weight: 600; }\n.sg-score-bar {\n display: inline-block;\n width: 70px;\n height: 5px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n vertical-align: middle;\n margin-right: 6px;\n}\n.sg-score-bar > span {\n display: block;\n height: 100%;\n background: var(--mj-brand-primary);\n}\n.sg-reason {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.sg-reason.merge { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.sg-reason.below { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 12%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.constrained { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.sg-reason.frozen { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.review { background: color-mix(in srgb, var(--mj-status-error) 12%, transparent); color: var(--mj-status-error-text, var(--mj-status-error)); }\n.sg-reason.lowusage { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.widenode { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.autogrow { background: color-mix(in srgb, var(--mj-status-warning) 12%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-row-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n.sg-table tr:hover .sg-row-actions {\n opacity: 1;\n}\n\n.sg-drawer {\n width: 460px;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n}\n.sg-drawer-hd {\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface);\n}\n.sg-drawer-bd { padding: 16px 18px; flex: 1; overflow-y: auto; }\n.sg-drawer-ft {\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 8px;\n background: var(--mj-bg-surface);\n flex-wrap: wrap;\n}\n.sg-drawer h4 {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin: 16px 0 8px;\n font-weight: 700;\n}\n.sg-candidate {\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n display: flex;\n gap: 12px;\n align-items: center;\n}\n.sg-preview {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n/* ---------- Tag Health cards ---------- */\n\n.health-shell { padding: 18px 22px; }\n.runbar {\n display: flex;\n gap: 22px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 18px;\n align-items: center;\n font-size: 13px;\n}\n.runbar .stat .l { font-size: 11px; color: var(--mj-text-muted); }\n.runbar .stat .v { font-size: 16px; font-weight: 600; color: var(--mj-text-primary); }\n.runbar .grow { flex: 1; }\n\n.health-cards {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 16px;\n margin-bottom: 22px;\n}\n.h-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 240px;\n}\n.h-card.merge { border-top: 4px solid var(--mj-brand-primary); }\n.h-card.lowusage { border-top: 4px solid var(--mj-status-warning); }\n.h-card.widenode { border-top: 4px solid var(--mj-status-error, var(--mj-status-warning)); }\n.h-card .top { display: flex; align-items: flex-start; gap: 10px; }\n.h-card .top .ic {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n}\n.h-card .name {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.h-card h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n.h-card .big {\n font-size: 36px;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n.h-card .sub { font-size: 12px; color: var(--mj-text-secondary); line-height: 1.4; margin: 0; }\n.h-card .ft { margin-top: auto; display: flex; gap: 6px; flex-wrap: wrap; }\n\n.threshold-form {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 18px;\n margin-top: 18px;\n}\n.threshold-form h3 { margin: 0 0 12px; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.threshold-form .grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n.threshold-form .field { display: flex; flex-direction: column; gap: 4px; }\n.threshold-form .field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n\n.run-history {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-top: 18px;\n overflow: hidden;\n}\n.run-history-hd {\n padding: 12px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-card);\n}\n.run-history-hd h3 { margin: 0; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.run-history table { width: 100%; border-collapse: collapse; font-size: 12px; }\n.run-history th {\n text-align: left;\n padding: 8px 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n font-weight: 600;\n}\n.run-history td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n/* Generic helpers used by new sections */\n.at-muted { color: var(--mj-text-muted); }\n.at-success-btn { color: var(--mj-status-success-text, var(--mj-status-success)); border-color: var(--mj-status-success-border, var(--mj-status-success)); }\n.at-btn-sm { font-size: 12px; padding: 4px 9px; }\n.at-btn-xs { font-size: 11px; padding: 2px 7px; }\n"], encapsulation: 2 });
7354
7372
  };
7355
7373
  TagsResourceComponent = TagsResourceComponent_1 = __decorate([
7356
7374
  RegisterClass(BaseResourceComponent, 'Tags')
@@ -7358,7 +7376,7 @@ TagsResourceComponent = TagsResourceComponent_1 = __decorate([
7358
7376
  export { TagsResourceComponent };
7359
7377
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TagsResourceComponent, [{
7360
7378
  type: Component,
7361
- args: [{ standalone: false, selector: 'mj-tags-resource', encapsulation: ViewEncapsulation.None, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Tags\"\n Icon=\"fa-solid fa-sitemap\"\n Subtitle=\"Taxonomy management, health monitoring, and tag library\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running\u2026\n } @else {\n <i class=\"fa-solid fa-heart-pulse\"></i> Run Tag Health\n }\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n <!-- Tags Dashboard -->\n <div class=\"at-dashboard\">\n\n <mj-left-nav\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveTab\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n\n <mj-page-header-interior\n [Title]=\"currentTabTitle\"\n [Subtitle]=\"currentTabSubtitle\">\n @if (ActiveTab === 'tags' || ActiveTab === 'taxonomy') {\n <div toolbar>\n @switch (ActiveTab) {\n @case ('tags') {\n <input type=\"text\" class=\"at-search-input\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TagSearchQuery\" (input)=\"FilterTags()\">\n }\n @case ('taxonomy') {\n <mj-tab-nav\n [Tabs]=\"taxSubTabsConfig\"\n [ActiveKey]=\"TaxSubTab\"\n (TabChange)=\"onTaxSubTabChange($event)\">\n </mj-tab-nav>\n }\n }\n </div>\n }\n <div actions>\n @switch (ActiveTab) {\n @case ('taxonomy') {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"RefreshTaxonomyData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n @case ('suggestions') {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadSuggestions()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Running\u2026 }\n @else { <i class=\"fa-solid fa-heart-pulse\"></i> Run Tag Health }\n </button>\n }\n @case ('health') {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"RebuildEmbeddings()\" [disabled]=\"RebuildEmbeddingsRunning\">\n @if (RebuildEmbeddingsRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Rebuilding\u2026 }\n @else { <i class=\"fa-solid fa-rotate\"></i> Rebuild stale embeddings }\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Running\u2026 }\n @else { <i class=\"fa-solid fa-play\"></i> Run now }\n </button>\n }\n }\n </div>\n </mj-page-header-interior>\n\n <mj-page-body-interior [Padding]=\"false\" [Flex]=\"true\">\n <div class=\"at-main-area\">\n\n @if (IsLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading tag data\u2026\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <!-- TAB 4: TAG LIBRARY -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'tags') {\n <div class=\"at-page-body\">\n <div class=\"at-tag-lib-layout\">\n <div class=\"at-tag-lib-main\">\n <div class=\"at-card\">\n <div class=\"at-card-body\" style=\"max-height: 500px; overflow-y: auto;\">\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Count</th>\n <th>Avg Weight</th>\n <th>Distribution</th>\n <th>Top Source</th>\n <th>First Seen</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredTagRows; track row.Tag) {\n <tr class=\"at-tag-row-clickable\" (click)=\"DrillDownTag(row.Tag)\"\n [class.at-tag-row-selected]=\"SelectedDrillDownTag === row.Tag\">\n <td class=\"at-tag-name-cell\">{{ row.Tag }}</td>\n <td>{{ row.UsageCount }}</td>\n <td>\n <div class=\"at-weight-indicator\">\n <div class=\"at-weight-bar\">\n <div class=\"at-weight-bar-fill\" [style.width.%]=\"row.AvgWeight * 100\"\n [class.at-weight-high]=\"row.AvgWeight >= 0.7\"\n [class.at-weight-medium]=\"row.AvgWeight >= 0.4 && row.AvgWeight < 0.7\"\n [class.at-weight-low]=\"row.AvgWeight < 0.4\"></div>\n </div>\n <span class=\"at-weight-value\">{{ row.AvgWeight.toFixed(2) }}</span>\n </div>\n </td>\n <td>\n <div class=\"at-tag-bar\">\n <div class=\"at-tag-bar-fill\" [style.width.%]=\"row.BarWidthPct\"></div>\n </div>\n </td>\n <td>{{ row.TopSource }}</td>\n <td>{{ row.FirstSeen }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Tag drill-down: content items matching selected tag -->\n @if (SelectedDrillDownTag) {\n <div class=\"at-card\" style=\"margin-top: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\">\n <i class=\"fa-solid fa-tag\"></i>\n Content items tagged \"{{ SelectedDrillDownTag }}\"\n ({{ TagDrillDownItems.length }})\n </span>\n <button class=\"at-slide-close\" (click)=\"CloseDrillDownTag()\" style=\"background:none;border:none;cursor:pointer;color:var(--mj-text-muted)\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-card-body\" style=\"max-height: 300px; overflow-y: auto;\">\n @if (TagDrillDownItems.length === 0) {\n <div class=\"at-empty-state\"><p>No content items found for this tag.</p></div>\n } @else {\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Source</th>\n <th>Weight</th>\n <th>Updated</th>\n </tr>\n </thead>\n <tbody>\n @for (di of TagDrillDownItems; track di.ID) {\n <tr class=\"at-tag-row-clickable\" (click)=\"OpenItemDetailByID(di.ID)\">\n <td>{{ di.Name }}</td>\n <td>{{ di.SourceName }}</td>\n <td>{{ FormatWeight(di.Weight) }}</td>\n <td>{{ di.UpdatedAt }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tag-lib-sidebar\">\n <div class=\"at-card at-tag-cloud-card\">\n <div class=\"at-card-title\" style=\"margin-bottom: 12px;\"><i class=\"fa-solid fa-cloud\"></i> Tag Cloud</div>\n @if (TagCloudWordItems.length > 0) {\n <mj-word-cloud\n [Items]=\"TagCloudWordItems\"\n [MaxFontSize]=\"40\"\n [MinFontSize]=\"12\"\n [MaxItems]=\"20\"\n Layout=\"spiral\"\n ColorMode=\"weight-gradient\"\n [Interactive]=\"true\"\n [Animate]=\"true\">\n </mj-word-cloud>\n } @else {\n <div class=\"at-tag-cloud-empty\">No tags yet</div>\n }\n </div>\n <div class=\"at-card\" style=\"padding: 16px; margin-top: 12px;\">\n <div class=\"at-card-title\" style=\"margin-bottom: 10px;\"><i class=\"fa-solid fa-chart-pie\"></i> By Source</div>\n <div class=\"at-tags-by-source\">\n @for (s of TagsBySource; track s.SourceName) {\n <div class=\"at-tag-source-row\">\n <span>{{ s.SourceName }}</span>\n <strong>{{ s.Count }}</strong>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <!-- TAB 6: TAXONOMY GOVERNANCE -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'taxonomy') {\n\n <div class=\"at-page-body\">\n\n <!-- \u2550\u2550 SUB-TAB 1: TREE VIEW \u2550\u2550 -->\n @if (TaxSubTab === 'tree') {\n <div class=\"at-tax-split-view\">\n <!-- Tree panel -->\n <div class=\"at-tax-tree-panel\" style=\"position: relative;\">\n <div class=\"at-tax-tree-toolbar\">\n <input type=\"text\" class=\"at-search-input\" style=\"flex: 1;\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TaxTreeSearch\" (input)=\"FilterTaxTree()\">\n <button class=\"at-tax-toolbar-btn\" title=\"Add root tag\" (click)=\"OpenCreateRootTag()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"at-tax-toolbar-btn\" [class.active]=\"TaxMultiSelectMode\"\n title=\"Toggle multi-select for drag reparenting\" (click)=\"ToggleMultiSelectMode()\">\n <i class=\"fa-solid fa-check-double\"></i>\n </button>\n </div>\n <div class=\"at-tax-tree-body\"\n (dragover)=\"$event.preventDefault()\"\n (drop)=\"OnDropToRoot($event)\">\n @if (TaxFilteredNodes.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <p>No tags found</p>\n </div>\n }\n @for (node of TaxFilteredNodes; track node.ID) {\n <div class=\"at-tax-tree-node\"\n [class.at-tax-node-selected]=\"node.IsSelected\"\n [class.at-tax-node-drag-over]=\"TaxDragOverNodeID === node.ID\"\n [class.at-tax-node-multi-selected]=\"IsNodeMultiSelected(node.ID)\"\n [style.padding-left.px]=\"16 + node.Depth * 20\"\n [attr.draggable]=\"true\"\n (dragstart)=\"OnTreeNodeDragStart($event, node)\"\n (dragover)=\"OnTreeNodeDragOver($event, node)\"\n (dragleave)=\"OnTreeNodeDragLeave()\"\n (drop)=\"OnTreeNodeDrop($event, node); $event.stopPropagation()\"\n (click)=\"SelectTaxNode(node)\">\n @if (TaxMultiSelectMode) {\n <input type=\"checkbox\" class=\"at-tax-tree-checkbox\"\n [checked]=\"IsNodeMultiSelected(node.ID)\"\n (click)=\"ToggleNodeSelection(node, $event)\">\n }\n <span class=\"at-tax-tree-arrow\"\n [class.at-tax-arrow-expanded]=\"node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-collapsed]=\"!node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-leaf]=\"node.Children.length === 0\"\n (click)=\"ToggleTaxNode(node); $event.stopPropagation()\"></span>\n <span class=\"at-tax-health-dot\" [class]=\"node.HealthColor\"></span>\n <span class=\"at-tax-tree-label\" [class.at-tax-tree-label-selected]=\"node.IsSelected\">{{ node.Name }}</span>\n <span class=\"at-tax-tree-count\">({{ node.ItemCount }})</span>\n <span class=\"at-tax-tree-add-child\" title=\"Add child tag\"\n (click)=\"OpenCreateChildTagFor(node); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n </div>\n }\n </div>\n @if (TaxTreeSaving) {\n <div class=\"at-tax-tree-saving-overlay\">\n <mj-loading text=\"Moving tags...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n\n <!-- Details panel -->\n <div class=\"at-tax-details-panel\">\n @if (TaxSelectedNode) {\n <div class=\"at-tax-details-header\">\n <!-- Breadcrumb -->\n <div class=\"at-tax-breadcrumb\">\n @for (bc of GetTaxBreadcrumb(TaxSelectedNode); track bc.ID) {\n <span class=\"at-tax-bc-link\" (click)=\"NavigateToBreadcrumb(bc.ID)\">{{ bc.Name }}</span>\n <span class=\"at-tax-bc-sep\">&rsaquo;</span>\n }\n <span class=\"at-tax-bc-current\">{{ TaxSelectedNode.Name }}</span>\n </div>\n\n @if (!TaxIsEditing) {\n <div class=\"at-tax-details-title\">\n {{ TaxSelectedNode.DisplayName }}\n <span class=\"at-tax-edit-icon\" (click)=\"StartEditTag()\" title=\"Edit name\">\n <i class=\"fa-solid fa-pen\"></i>\n </span>\n </div>\n @if (TaxSelectedNode.Description) {\n <div class=\"at-tax-details-desc\">{{ TaxSelectedNode.Description }}</div>\n }\n } @else {\n <div class=\"at-tax-edit-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"TaxEditName\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" rows=\"3\" [(ngModel)]=\"TaxEditDescription\"></textarea>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveEditTag()\">Save</button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CancelEditTag()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Stats row -->\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Depth }}</div>\n <div class=\"at-tax-stat-label\">Depth</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value at-tax-stat-date\">{{ TaxSelectedNode.FirstSeen }}</div>\n <div class=\"at-tax-stat-label\">First Seen</div>\n </div>\n </div>\n\n <!-- Action toolbar -->\n @if (!TaxIsEditing) {\n <div class=\"at-tax-action-toolbar\">\n <button class=\"at-tax-action-btn\" (click)=\"OpenCreateChildTag()\"><i class=\"fa-solid fa-plus\"></i> Add Child</button>\n <button class=\"at-tax-action-btn\" (click)=\"StartEditTag()\"><i class=\"fa-solid fa-pen\"></i> Rename</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMoveDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-arrows-up-down\"></i> Move</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMergeIntoDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-compress\"></i> Merge Into...</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenSplitDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-code-branch\"></i> Split</button>\n <button class=\"at-tax-action-btn at-tax-action-danger\" (click)=\"DeleteTag(TaxSelectedNode)\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n }\n\n <!-- Child tags -->\n @if (TaxSelectedNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TaxSelectedNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\" (click)=\"SelectTaxNode(child)\">\n {{ child.Name }}\n <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Recently tagged items -->\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- \u2500\u2500\u2500 Governance \u2014 per-node controls for the autotagger \u2500\u2500\u2500 -->\n @if (SelectedTagFull) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Governance \u2014 how the autotagger may grow this subtree</div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Allow auto-grow under this tag</span>\n <span class=\"at-tg-toggle-d\">Lets the classifier create child tags below this one. Off = constrained subtree.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.AllowAutoGrow\"\n [class.disabled]=\"SelectedTagSavingField['AllowAutoGrow']\"\n (click)=\"ToggleGovernanceFlag('AllowAutoGrow')\"></div>\n </div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Freeze this subtree</span>\n <span class=\"at-tg-toggle-d\">Locks this entire subtree against auto-creation, regardless of mode.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.IsFrozen\"\n [class.disabled]=\"SelectedTagSavingField['IsFrozen']\"\n (click)=\"ToggleGovernanceFlag('IsFrozen')\"></div>\n </div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Requires review for matches</span>\n <span class=\"at-tg-toggle-d\">High-confidence matches against this tag are routed to the suggestion queue first.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.RequiresReview\"\n [class.disabled]=\"SelectedTagSavingField['RequiresReview']\"\n (click)=\"ToggleGovernanceFlag('RequiresReview')\"></div>\n </div>\n\n <div class=\"at-tg-grid-3\">\n <div class=\"at-tg-field\">\n <label>Max children</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\"\n [value]=\"SelectedTagFull.MaxChildren ?? ''\"\n (change)=\"SaveSelectedTagNumber('MaxChildren', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">Hard cap on direct children. Blank = unlimited.</span>\n </div>\n <div class=\"at-tg-field\">\n <label>Max descendant depth</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\"\n [value]=\"SelectedTagFull.MaxDescendantDepth ?? ''\"\n (change)=\"SaveSelectedTagNumber('MaxDescendantDepth', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">From this node down. 0 = leaf-only.</span>\n </div>\n <div class=\"at-tg-field\">\n <label>Min confidence</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.01\"\n [value]=\"SelectedTagFull.MinWeight ?? ''\"\n (change)=\"SaveSelectedTagNumber('MinWeight', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">Floor for matches against this tag.</span>\n </div>\n </div>\n </div>\n\n <!-- \u2500\u2500\u2500 Scope \u2014 who can see this tag \u2500\u2500\u2500 -->\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Scope \u2014 who can see and tag with this</div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Global tag (visible to all tenants)</span>\n <span class=\"at-tg-toggle-d\">\n Off = restricted to the scope rows below.\n @if (IsGlobalLocked()) { <strong>Locked while scope rows exist.</strong> }\n </span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.IsGlobal\"\n [class.disabled]=\"IsGlobalLocked() || SelectedTagSavingField['IsGlobal']\"\n (click)=\"ToggleGovernanceFlag('IsGlobal')\"></div>\n </div>\n\n <div class=\"at-tg-chip-list\">\n @for (s of SelectedTagScopes; track s.ID) {\n <span class=\"at-tg-chip scoped\">{{ s.EntityName }} \u00B7 {{ s.DisplayName }}</span>\n }\n @if (SelectedTagScopes.length === 0) {\n <span class=\"at-tg-hint\" style=\"font-style: italic;\">\n No scope rows. {{ SelectedTagFull.IsGlobal ? 'Tag is global.' : 'Tag is non-global with no scope \u2014 currently unreachable.' }}\n </span>\n }\n <button class=\"at-action-btn at-btn-sm\" (click)=\"OpenScopeDialog()\">\n <i class=\"fa-solid fa-pencil\"></i> Edit scope\u2026\n </button>\n </div>\n <div class=\"at-tg-hint\" style=\"margin-top: 8px;\">\n <i class=\"fa-solid fa-info-circle\"></i> Children inherit this scope automatically. Promotion to global requires admin approval.\n </div>\n </div>\n\n <!-- \u2500\u2500\u2500 Synonyms \u2014 alternate names that resolve to this tag \u2500\u2500\u2500 -->\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Synonyms \u2014 alternate names that resolve to this tag</div>\n\n <div class=\"at-tg-syn-add\">\n <input class=\"at-search-input\" placeholder='e.g. \"GenAI\"'\n [(ngModel)]=\"NewSynonymName\"\n (keyup.enter)=\"AddSynonym()\" />\n <select class=\"at-search-input\" style=\"width: 130px;\"\n [(ngModel)]=\"NewSynonymSource\">\n <option value=\"Manual\">Manual</option>\n <option value=\"Imported\">Imported</option>\n <option value=\"Merged\">Merged</option>\n <option value=\"LLM\">LLM</option>\n </select>\n <button class=\"at-action-btn at-primary-btn\" (click)=\"AddSynonym()\" [disabled]=\"!NewSynonymName.trim()\">+ Add</button>\n </div>\n\n @if (SelectedTagSynonyms.length === 0) {\n <div class=\"at-tg-hint\" style=\"font-style: italic;\">No synonyms yet.</div>\n } @else {\n @for (s of SelectedTagSynonyms; track s.ID) {\n <div class=\"at-tg-syn-row\" [class.pending]=\"s.Source === 'LLM'\">\n <div class=\"at-tg-syn-name\">{{ s.Synonym }}</div>\n <span class=\"at-tg-syn-src {{ s.Source.toLowerCase() }}\">{{ s.Source }}</span>\n <span class=\"at-tg-syn-x\" title=\"Remove\" (click)=\"RemoveSynonym(s)\"><i class=\"fa-solid fa-xmark\"></i></span>\n </div>\n }\n }\n </div>\n }\n } @else {\n <div class=\"at-empty-state\" style=\"height: 100%;\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a tag from the tree to view details</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Health bar -->\n <div class=\"at-tax-health-bar\">\n <span class=\"at-tax-health-label\">Taxonomy Health</span>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-total\"></span>\n <span class=\"at-tax-health-value\">{{ TaxHealth.Total }}</span>\n <span class=\"at-tax-health-text\">Total</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-healthy\"></span>\n <span class=\"at-tax-health-value at-tax-val-success\">{{ TaxHealth.Healthy }}</span>\n <span class=\"at-tax-health-text\">Healthy</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-attention\"></span>\n <span class=\"at-tax-health-value at-tax-val-warning\">{{ TaxHealth.NeedAttention }}</span>\n <span class=\"at-tax-health-text\">Need Attention</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-orphaned\"></span>\n <span class=\"at-tax-health-value at-tax-val-error\">{{ TaxHealth.Orphaned }}</span>\n <span class=\"at-tax-health-text\">Orphaned</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-duplicates\"></span>\n <span class=\"at-tax-health-value at-tax-val-info\">{{ TaxHealth.Duplicates }}</span>\n <span class=\"at-tax-health-text\">Duplicate Candidates</span>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550 SUB-TAB 2: DUPLICATES \u2550\u2550 -->\n @if (TaxSubTab === 'duplicates') {\n <div class=\"at-tax-dup-stats-bar\">\n <div class=\"at-tax-dup-stat\"><strong>{{ TaxDuplicates.length }}</strong> candidates found</div>\n <div class=\"at-tax-dup-stat at-tax-dup-high\"><strong>{{ TaxHighConfidenceDupeCount }}</strong> high confidence (&gt;85%)</div>\n <div class=\"at-tax-dup-stat at-tax-dup-moderate\"><strong>{{ TaxModerateDupeCount }}</strong> moderate (70-85%)</div>\n </div>\n\n @if (TaxDuplicates.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No duplicate tags detected</p>\n </div>\n }\n\n <div class=\"at-tax-dup-list\">\n @for (pair of TaxDuplicates; track $index) {\n <div class=\"at-tax-dup-card\" [class.at-tax-dup-high]=\"pair.SeverityClass === 'high'\" [class.at-tax-dup-moderate]=\"pair.SeverityClass === 'moderate'\">\n @if (pair.IsExactDuplicate) {\n <!-- Exact-name duplicates: show single tag name with count -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-similarity\">\n <span class=\"at-tax-sim-percent high\">\n <i class=\"fa-solid fa-clone\"></i>&nbsp;{{ pair.ExactDuplicateCount }} identical records\n </span>\n </div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n } @else {\n <!-- Similar (non-exact) pairs: show both tags with similarity -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-similarity\">\n <div class=\"at-tax-sim-bar-bg\">\n <div class=\"at-tax-sim-bar-fill\" [class]=\"pair.SeverityClass\" [style.width.%]=\"pair.Similarity\"></div>\n </div>\n <span class=\"at-tax-sim-percent\" [class]=\"pair.SeverityClass\">{{ pair.Similarity }}%</span>\n </div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-tag\">{{ pair.TagB }}</div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"MakeChildTag(pair.TagAID, pair.TagBID)\">Make Child</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- \u2550\u2550 SUB-TAB 3: ORPHANS \u2550\u2550 -->\n @if (TaxSubTab === 'orphans') {\n <div class=\"at-tax-orphan-toolbar\">\n <span class=\"at-tax-orphan-count\">{{ TaxOrphans.length }} orphaned tags</span>\n <span class=\"at-tax-orphan-desc\">&mdash; no parent, no children, low usage</span>\n <div class=\"at-tax-orphan-bulk\">\n <button class=\"at-tax-bulk-btn\" (click)=\"ToggleAllOrphans()\">\n @if (TaxAllOrphansSelected) { <i class=\"fa-solid fa-square-check\"></i> } @else { <i class=\"fa-regular fa-square\"></i> }\n Select All\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"BulkDeleteOrphans()\">\n <i class=\"fa-solid fa-trash\"></i> Bulk Delete\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"DeleteAllOrphans()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete All ({{ TaxOrphans.length }})\n </button>\n </div>\n </div>\n\n @if (TaxOrphans.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No orphaned tags</p>\n </div>\n }\n\n <div class=\"at-tax-orphan-grid\">\n @for (orphan of TaxOrphans; track orphan.ID) {\n <div class=\"at-tax-orphan-card\">\n <div class=\"at-tax-orphan-header\">\n <span class=\"at-tax-orphan-name\">{{ orphan.Name }}</span>\n <input type=\"checkbox\" class=\"at-tax-orphan-checkbox\" [checked]=\"orphan.IsSelected\"\n (change)=\"ToggleOrphanSelection(orphan)\" (click)=\"$event.stopPropagation()\">\n </div>\n <div class=\"at-tax-orphan-stats\">\n <span>Usage: <strong>{{ orphan.UsageCount }}</strong></span>\n <span>Avg Weight: <strong>{{ orphan.AvgWeight.toFixed(2) }}</strong></span>\n </div>\n <div class=\"at-tax-orphan-dates\">\n <span>First: {{ orphan.FirstSeen }}</span>\n <span>Last: {{ orphan.LastSeen }}</span>\n </div>\n <div class=\"at-tax-orphan-actions\">\n <button class=\"at-tax-orphan-btn at-tax-orphan-delete\" (click)=\"DeleteOrphan(orphan)\">Delete</button>\n <button class=\"at-tax-orphan-btn\">Ignore</button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- \u2550\u2550 SUB-TAB 4: TREEMAP \u2550\u2550 -->\n @if (TaxSubTab === 'treemap') {\n <div class=\"at-tax-treemap-kpi-strip\">\n @for (kpi of TaxTreemapKPIs; track kpi.Label) {\n <div class=\"at-tax-treemap-kpi\">\n <div class=\"at-tax-treemap-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"at-tax-treemap-kpi-label\">{{ kpi.Label }}</div>\n </div>\n }\n </div>\n\n @if (TaxTreemapCells.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-chart-tree-map\"></i>\n <p>No taxonomy data to visualize</p>\n </div>\n } @else {\n <div class=\"at-tax-treemap-container\">\n @for (cell of TaxTreemapCells; track $index) {\n <div class=\"at-tax-treemap-cell at-tax-treemap-cell-clickable\" [class]=\"cell.ColorClass\"\n [style.grid-row]=\"cell.RowSpan > 1 ? 'span ' + cell.RowSpan : ''\"\n (click)=\"OpenTreemapDrillIn(cell)\">\n <span class=\"at-tax-cell-name\">{{ cell.Name }}</span>\n <span class=\"at-tax-cell-count\">{{ cell.ItemCount }} items</span>\n </div>\n }\n </div>\n }\n\n <!-- Treemap Drill-In Panel -->\n @if (ShowTreemapDrillIn && TreemapDrillInNode) {\n <div class=\"at-tax-drillin-overlay\" (click)=\"CloseTreemapDrillIn()\">\n <div class=\"at-tax-drillin-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-tax-drillin-header\">\n <h3><i class=\"fa-solid fa-tag\"></i> {{ TreemapDrillInNode.Name }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseTreemapDrillIn()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-tax-drillin-body\">\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n </div>\n\n @if (TreemapDrillInNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TreemapDrillInNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\">{{ child.Name }} <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span></span>\n }\n </div>\n </div>\n }\n\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tax-drillin-footer\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"DrillInToTreeView(TreemapDrillInNode)\">\n <i class=\"fa-solid fa-sitemap\"></i> View in Tree\n </button>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- \u2550\u2550 SUB-TAB 5: AUDIT LOG \u2550\u2550 -->\n @if (TaxSubTab === 'audit') {\n <div class=\"at-tax-audit-filters\">\n <span class=\"at-tax-audit-filter-label\">Filter</span>\n <div class=\"at-tax-audit-checkbox-group\">\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('created')\" (change)=\"ToggleTaxAuditFilter('created')\"> Created\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('merged')\" (change)=\"ToggleTaxAuditFilter('merged')\"> Merged\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('moved')\" (change)=\"ToggleTaxAuditFilter('moved')\"> Moved\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deleted')\" (change)=\"ToggleTaxAuditFilter('deleted')\"> Deleted\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('renamed')\" (change)=\"ToggleTaxAuditFilter('renamed')\"> Renamed\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deprecated')\" (change)=\"ToggleTaxAuditFilter('deprecated')\"> Deprecated\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('split')\" (change)=\"ToggleTaxAuditFilter('split')\"> Split\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('reactivated')\" (change)=\"ToggleTaxAuditFilter('reactivated')\"> Reactivated\n </label>\n </div>\n </div>\n\n @if (GetFilteredAuditEvents().length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-scroll\"></i>\n <p>No audit events match the current filters</p>\n </div>\n }\n\n <div class=\"at-tax-audit-timeline\">\n @for (event of GetFilteredAuditEvents(); track $index) {\n <div class=\"at-tax-audit-event\">\n <div class=\"at-tax-audit-event-icon\" [class]=\"event.Type\">\n <i [class]=\"GetTaxAuditIcon(event.Type)\"></i>\n </div>\n <div class=\"at-tax-audit-event-body\">\n <div class=\"at-tax-audit-event-desc\">\n {{ event.Description }} <span class=\"at-tax-tag-ref\">{{ event.TagRef }}</span>\n </div>\n <div class=\"at-tax-audit-event-meta\">\n <span>{{ event.User }}</span>\n <span>{{ event.Timestamp }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <!-- TAB: SUGGESTIONS \u2014 server-driven inbox -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'suggestions') {\n <div class=\"at-page-body\">\n <div class=\"sg-shell\">\n <div class=\"sg-main\">\n <div class=\"sg-toolbar\">\n <input class=\"at-search-input\" style=\"width: 280px;\" placeholder=\"Search proposed name, source text\u2026\"\n [(ngModel)]=\"SuggestionSearch\" (input)=\"applySuggestionFilters()\" />\n <select class=\"at-search-input\" style=\"width: 200px;\"\n [(ngModel)]=\"SuggestionFilterReason\" (change)=\"applySuggestionFilters()\">\n <option value=\"\">All reasons</option>\n @for (r of ReasonOptions; track r) { <option [value]=\"r\">{{ r }}</option> }\n </select>\n <input class=\"at-search-input\" type=\"number\" step=\"0.05\" min=\"0\" max=\"1\"\n style=\"width: 100px;\" placeholder=\"Min score\"\n [ngModel]=\"SuggestionFilterMinScore\"\n (ngModelChange)=\"OnMinScoreChange($event)\" />\n <span style=\"flex: 1;\"></span>\n <span class=\"at-muted\" style=\"font-size: 12px;\">\n Showing <strong>{{ SuggestionRowsFiltered.length }} of {{ SuggestionRows.length }}</strong>\n </span>\n </div>\n\n @if (SelectedSuggestionCount() > 0) {\n <div class=\"sg-bulk-bar\">\n <strong>{{ SelectedSuggestionCount() }} selected</strong>\n <span style=\"flex: 1;\"></span>\n <button class=\"at-action-btn at-success-btn at-btn-sm\" (click)=\"BulkApprove()\" [disabled]=\"SuggestionBulkInProgress\">\n <i class=\"fa-solid fa-check\"></i> Approve all (auto-pick best)\n </button>\n <button class=\"at-action-btn at-danger-btn at-btn-sm\" (click)=\"BulkReject()\" [disabled]=\"SuggestionBulkInProgress\">\n <i class=\"fa-solid fa-xmark\"></i> Reject\n </button>\n </div>\n }\n\n <div class=\"sg-table-body\">\n @if (SuggestionRowsFiltered.length === 0) {\n <div class=\"at-empty-state\"><i class=\"fa-solid fa-inbox\"></i><p>No pending suggestions.</p></div>\n } @else {\n <table class=\"sg-table\">\n <thead>\n <tr>\n <th style=\"width: 30px;\">\n <input type=\"checkbox\"\n [checked]=\"SelectedSuggestionCount() === SuggestionRowsFiltered.length && SuggestionRowsFiltered.length > 0\"\n (change)=\"ToggleAllSuggestions($any($event.target).checked)\" />\n </th>\n <th>Proposed name</th>\n <th>Reason</th>\n <th>Best match</th>\n <th>Score</th>\n <th>Created</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (row of SuggestionRowsFiltered; track row.ID) {\n <tr [class.sg-row-checked]=\"row.selected\"\n [class.sg-row-selected]=\"SuggestionSelected && SuggestionSelected.ID === row.ID\"\n (click)=\"SelectSuggestion(row)\">\n <td><input type=\"checkbox\" [checked]=\"row.selected\" (click)=\"ToggleSuggestionSelected(row, $event)\" /></td>\n <td><strong>{{ row.ProposedName }}</strong></td>\n <td><span class=\"sg-reason {{ ReasonClass(row.Reason) }}\">{{ row.Reason }}</span></td>\n <td>\n @if (row.BestMatchName) {\n {{ row.BestMatchName }}\n <span class=\"at-muted\" style=\"font-size: 11px;\">{{ row.BestMatchPath }}</span>\n } @else {\n <span class=\"at-muted\">\u2014 no match \u2014</span>\n }\n </td>\n <td class=\"sg-score\">\n @if (row.BestMatchScore != null) {\n <span class=\"sg-score-bar\"><span [style.width.%]=\"row.BestMatchScore * 100\"></span></span>\n {{ row.BestMatchScore | number: '1.3-3' }}\n } @else {\n <span class=\"at-muted\">\u2014</span>\n }\n </td>\n <td class=\"at-muted\">{{ row.CreatedAt | date: 'short' }}</td>\n <td>\n @if (row.dispositionInProgress) {\n <span class=\"at-muted\" style=\"font-size: 11px;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> {{ row.dispositionInProgress }}\u2026\n </span>\n } @else {\n <div class=\"sg-row-actions\">\n <button class=\"at-action-btn at-btn-xs\" title=\"Create as new tag\"\n (click)=\"DispositionSuggestion(row, 'create-new'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n @if (row.BestMatchTagID) {\n <button class=\"at-action-btn at-primary-btn at-btn-xs\" title=\"Merge into best match\"\n (click)=\"DispositionSuggestion(row, 'merge'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-code-merge\"></i>\n </button>\n }\n <button class=\"at-action-btn at-danger-btn at-btn-xs\" title=\"Reject\"\n (click)=\"DispositionSuggestion(row, 'reject'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n @if (SuggestionSelected) {\n <aside class=\"sg-drawer\">\n <div class=\"sg-drawer-hd\">\n <div>\n <div style=\"font-weight: 600;\">\"{{ SuggestionSelected.ProposedName }}\"</div>\n <div class=\"at-muted\" style=\"font-size: 11px;\">{{ SuggestionSelected.CreatedAt | date: 'short' }}</div>\n </div>\n <button class=\"at-action-btn at-btn-xs\" (click)=\"CloseDrawer()\" title=\"Close\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div class=\"sg-drawer-bd\">\n <span class=\"sg-reason {{ ReasonClass(SuggestionSelected.Reason) }}\">\n {{ SuggestionSelected.Reason }}\n @if (SuggestionSelected.BestMatchScore != null) { \u00B7 {{ SuggestionSelected.BestMatchScore | number: '1.3-3' }} }\n </span>\n\n @if (SuggestionSelected.BestMatchTagID) {\n <h4>Proposes merge into</h4>\n <div class=\"sg-candidate\">\n <div style=\"flex: 1;\">\n <div style=\"font-weight: 600;\">{{ SuggestionSelected.BestMatchName }}</div>\n <div class=\"at-muted\" style=\"font-size: 11px;\">{{ SuggestionSelected.BestMatchPath }}</div>\n </div>\n </div>\n }\n\n @if (SuggestionSelected.SourceText) {\n <h4>Source text</h4>\n <p class=\"sg-preview\">\"{{ SuggestionSelected.SourceText }}\"</p>\n }\n\n <h4>If approved</h4>\n <p class=\"sg-preview\">\n @if (SuggestionSelected.BestMatchTagID) {\n Re-point any free-text ContentItemTag rows whose Tag matches \"<strong>{{ SuggestionSelected.ProposedName }}</strong>\" to <strong>{{ SuggestionSelected.BestMatchName }}</strong>, add it as a synonym (Source: Merged), and mark the suggestion as Merged.\n } @else {\n Create a new tag named \"<strong>{{ SuggestionSelected.ProposedName }}</strong>\" (subject to ValidateAutoGrow), inherit parent scope when applicable, and re-point any matching free-text ContentItemTag rows.\n }\n </p>\n </div>\n <div class=\"sg-drawer-ft\">\n @if (SuggestionSelected.BestMatchTagID) {\n <button class=\"at-action-btn at-primary-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'merge')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-code-merge\"></i> Merge\n </button>\n }\n <button class=\"at-action-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'create-new')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-plus\"></i> Create as new\n </button>\n <button class=\"at-action-btn at-danger-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'reject')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-xmark\"></i> Reject\n </button>\n </div>\n </aside>\n }\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <!-- TAB: HEALTH \u2014 Tag Health 3-card summary -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'health') {\n <div class=\"health-shell\">\n <div class=\"runbar\">\n <div class=\"stat\">\n <div class=\"l\">Last run</div>\n <div class=\"v\">{{ LastHealthSummary.runAt ? (LastHealthSummary.runAt | date: 'short') : '\u2014' }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Tags scanned</div>\n <div class=\"v\">{{ tagsRaw.length }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Issues enqueued (last run)</div>\n <div class=\"v\">{{ LastHealthSummary.mergeCount + LastHealthSummary.lowUsageCount + LastHealthSummary.wideNodeCount }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Pending suggestions</div>\n <div class=\"v\">{{ PendingSuggestionCount }}</div>\n </div>\n <span class=\"grow\"></span>\n <div class=\"stat\">\n <div class=\"l\">Last duration</div>\n <div class=\"v\">{{ LastHealthSummary.durationMs ? (LastHealthSummary.durationMs + 'ms') : '\u2014' }}</div>\n </div>\n </div>\n\n <div class=\"health-cards\">\n <div class=\"h-card merge\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-code-merge\"></i></div>\n <div>\n <div class=\"name\">Merge candidates</div>\n <h3>Likely duplicate tags</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.mergeCount }}</div>\n <p class=\"sub\">Pairs with high embedding cosine + name similarity. Approving merges the source into the target and re-points existing ContentItemTag rows.</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'MergeCandidate'; applySuggestionFilters()\">\n Open in Suggestions\n </button>\n </div>\n </div>\n\n <div class=\"h-card lowusage\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-leaf\"></i></div>\n <div>\n <div class=\"name\">Low usage</div>\n <h3>Deprecation candidates</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.lowUsageCount }}</div>\n <p class=\"sub\">Active tags used fewer than the threshold over the lookback window. Often abandoned imports or finished-project tags.</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'LowUsage'; applySuggestionFilters()\">\n Review\n </button>\n </div>\n </div>\n\n <div class=\"h-card widenode\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-tree\"></i></div>\n <div>\n <div class=\"name\">Wide nodes</div>\n <h3>Parents with too many children</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.wideNodeCount }}</div>\n <p class=\"sub\">Parents whose direct-child count exceeds <strong>MaxChildren</strong> (or the implicit threshold {{ HealthThresholds.maxImplicitChildren }} when no cap is set).</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'WideNode'; applySuggestionFilters()\">\n Review\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"threshold-form\">\n <h3>Health-job thresholds</h3>\n <div class=\"grid\">\n <div class=\"field\"><label>Merge: min co-occurrence</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.minCoOccurrence\" />\n <span class=\"at-hint\">Pairs must appear together in \u2265 this many items.</span>\n </div>\n <div class=\"field\"><label>Merge: min embedding cosine</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.01\" [(ngModel)]=\"HealthThresholds.minEmbeddingSimilarity\" />\n </div>\n <div class=\"field\"><label>Merge: min name similarity</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.05\" [(ngModel)]=\"HealthThresholds.minNameSimilarity\" />\n <span class=\"at-hint\">Dice's-coefficient bigram similarity.</span>\n </div>\n <div class=\"field\"><label>Low usage: max usage</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.maxUsage\" />\n </div>\n <div class=\"field\"><label>Wide node: max implicit children</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.maxImplicitChildren\" />\n <span class=\"at-hint\">Used when a tag has no explicit MaxChildren cap.</span>\n </div>\n </div>\n </div>\n\n <div class=\"run-history\">\n <div class=\"run-history-hd\">\n <h3>Run history</h3>\n <span class=\"at-muted\" style=\"font-size: 11px;\">last {{ HealthRunHistory.length }} runs</span>\n </div>\n @if (HealthRunHistory.length === 0) {\n <div class=\"at-empty-state\" style=\"padding: 32px;\"><i class=\"fa-solid fa-clock-rotate-left\"></i><p>No runs yet.</p></div>\n } @else {\n <table>\n <thead>\n <tr>\n <th>When</th><th>Trigger</th><th>Tags scanned</th><th>Merge</th><th>Low usage</th><th>Wide node</th><th>Total</th><th>Duration</th>\n </tr>\n </thead>\n <tbody>\n @for (run of HealthRunHistory; track run.When) {\n <tr>\n <td class=\"at-muted\">{{ run.When | date: 'short' }}</td>\n <td>{{ run.Trigger }}</td>\n <td>{{ run.TagsScanned }}</td>\n <td>{{ run.Merge }}</td>\n <td>{{ run.LowUsage }}</td>\n <td>{{ run.WideNode }}</td>\n <td><strong>{{ run.Merge + run.LowUsage + run.WideNode }}</strong></td>\n <td>{{ run.DurationMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n\n <!-- end @if (!IsLoading) -->\n }\n\n </div>\n <!-- end at-main-area -->\n </mj-page-body-interior>\n </mj-left-nav-content>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 ITEM DETAIL SLIDE-IN \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowItemDetail && SelectedFeedItem) {\n <div class=\"at-slide-overlay\" (click)=\"CloseItemDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Content Item</h3>\n <button class=\"at-slide-close\" aria-label=\"Close item detail\" (click)=\"CloseItemDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n <!-- Header -->\n <div class=\"at-detail-item-header\">\n <h4 class=\"at-detail-item-name\">{{ SelectedFeedItem.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-source\">{{ SelectedFeedItem.SourceName }}</span>\n @if (SelectedFeedItem.RequiresContentType) {\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedFeedItem.ContentTypeName }}</span>\n @if (SelectedFeedItem.FileTypeName) {\n <span class=\"at-detail-badge at-detail-badge-file\"><i class=\"fa-solid fa-file\"></i> {{ SelectedFeedItem.FileTypeName }}</span>\n }\n }\n </div>\n </div>\n\n <!-- URL -->\n @if (SelectedFeedItem.URL) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">URL</div>\n <a [href]=\"SelectedFeedItem.URL\" target=\"_blank\" class=\"at-detail-link\">\n {{ SelectedFeedItem.URL }}\n <i class=\"fa-solid fa-external-link-alt\" style=\"font-size: 0.65rem; margin-left: 4px;\"></i>\n </a>\n </div>\n }\n\n <!-- Text Preview -->\n @if (SelectedFeedItem.TextContent) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Content Preview</div>\n <div class=\"at-detail-text-preview\">{{ SelectedFeedItem.TextContent }}</div>\n </div>\n }\n\n <!-- Tags (weighted) -->\n @if (SelectedFeedItem.Tags.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Tags ({{ SelectedFeedItem.Tags.length }})</div>\n <div class=\"at-detail-tags\">\n @for (wt of SelectedFeedItem.Tags; track wt.Tag) {\n <span class=\"at-tag-pill at-tag-weighted\" [style.font-size]=\"TagFontSize(wt.Weight)\">\n {{ wt.Tag }}\n <span class=\"at-tag-weight\">{{ FormatWeight(wt.Weight) }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Metadata -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Metadata</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedFeedItem.Checksum) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Checksum</span>\n <span class=\"at-detail-meta-value at-detail-meta-mono\">{{ SelectedFeedItem.Checksum }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Created</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.CreatedAt }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Updated</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.UpdatedAt }}</span>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenRecordFromItem(SelectedFeedItem)\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open Record\n </button>\n <button class=\"at-action-btn at-secondary-btn\" disabled>\n <i class=\"fa-solid fa-magnifying-glass\"></i> See Similar Items\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CONFIRMATION DIALOG \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowConfirmDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"ConfirmDialogCancel()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ConfirmDialogTitle }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"ConfirmDialogCancel()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p class=\"at-confirm-message\">{{ ConfirmDialogMessage }}</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-danger-btn\" (click)=\"ConfirmDialogAccept()\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ConfirmDialogCancel()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 SPLIT DIALOG \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowSplitDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseSplitDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-code-branch\"></i> Split Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseSplitDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New tag names (comma-separated)</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\"\n [(ngModel)]=\"SplitChildNames\"\n placeholder=\"Tag A, Tag B, Tag C\" />\n </div>\n <p class=\"at-confirm-message\">New tags will be created as siblings of the original tag under the same parent.</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteSplit()\" [disabled]=\"!SplitChildNames.trim()\">\n <i class=\"fa-solid fa-code-branch\"></i> Create Tags\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseSplitDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 MOVE DIALOG \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowCreateTagDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseCreateTagDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-plus\"></i> Create Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseCreateTagDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-tax-create-context\">{{ CreateTagParentLabel }}</div>\n <div class=\"at-schedule-field\">\n <label>Name</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagName\"\n placeholder=\"Tag name\" (keydown.enter)=\"SaveNewTag()\">\n </div>\n <div class=\"at-schedule-field\">\n <label>Description (optional)</label>\n <textarea class=\"mj-textarea\" rows=\"3\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagDescription\"\n placeholder=\"Brief description of this tag\"></textarea>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveNewTag()\" [disabled]=\"!CreateTagName.trim()\">\n <i class=\"fa-solid fa-check\"></i> Create\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseCreateTagDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMoveDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMoveDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-arrows-up-down\"></i> Move Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMoveDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New parent tag</label>\n <select class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"MoveNewParentID\">\n <option [ngValue]=\"null\">(Root level &mdash; no parent)</option>\n @for (opt of GetMoveTargetOptions(); track opt.ID) {\n <option [ngValue]=\"opt.ID\">{{ '\\u00A0\\u00A0'.repeat(opt.Depth) }}{{ opt.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMove()\">\n <i class=\"fa-solid fa-check\"></i> Move\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMoveDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMergeIntoDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMergeIntoDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-compress\"></i> Merge \"{{ MergeSourceTag?.Name }}\" Into...</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMergeIntoDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p style=\"font-size: 0.85rem; color: var(--mj-text-secondary); margin: 0 0 12px;\">\n All tagged items will be moved to the target tag, then \"{{ MergeSourceTag?.Name }}\" will be deleted.\n </p>\n <div class=\"at-schedule-field\">\n <label>Merge into</label>\n <mj-combobox\n [Data]=\"MergeTargetData\"\n TextField=\"Label\"\n ValueField=\"ID\"\n [Filterable]=\"true\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Search and select a tag...\"\n (ValueChange)=\"OnMergeTargetSelected($event)\">\n </mj-combobox>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMergeInto()\" [disabled]=\"!MergeTargetID || IsMerging\">\n @if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { <i class=\"fa-solid fa-compress\"></i> Merge }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMergeIntoDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n </div>\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ============================================================\n Content Autotagging Dashboard\n All colors use MJ design tokens \u2014 no hardcoded hex values.\n All classes prefixed with at- to prevent leaking (ViewEncapsulation.None).\n ============================================================ */\n\n/* \u2500\u2500 Root layout \u2500\u2500 */\n\n.at-dashboard {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/*\n Left rail now owned by <mj-left-nav> (~50 lines of bespoke .at-left-nav-items\n / .at-nav-item / .at-nav-badge / .at-nav-divider styles retired). The footer\n stayed bespoke since it's \"Run Pipeline\" CTA content, not nav chrome.\n*/\n\n.at-left-nav-footer {\n padding: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-run-pipeline-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.at-run-pipeline-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-run-pipeline-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 MAIN CONTENT AREA \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-main-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.at-loading-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n/* .at-page-header / .at-page-title / .at-page-subtitle / .at-page-actions\n retired \u2014 section identity + actions now live in <mj-page-header-interior>\n (one shared instance at the top of <mj-left-nav-content>, with Title/Subtitle\n driven by currentTabTitle/currentTabSubtitle getters and per-section action\n buttons projected via an @switch into the chrome's [actions] slot). */\n\n.at-page-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding: 16px 20px;\n min-height: 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SHARED COMPONENTS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n border: 1px solid;\n border-radius: 7px;\n cursor: pointer;\n font-size: 0.78rem;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.at-primary-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-primary-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-primary-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.at-secondary-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.at-secondary-btn:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.at-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-card-title {\n font-size: 0.82rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-primary);\n}\n\n.at-card-title i {\n color: var(--mj-brand-primary);\n font-size: 0.75rem;\n}\n\n.at-card-body {\n padding: 0;\n}\n\n.at-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-disabled);\n}\n\n.at-empty-state i {\n font-size: 28px;\n}\n\n.at-empty-state p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 KPI STRIP \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-kpi-strip {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.at-kpi-card {\n flex: 1;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.at-kpi-value {\n font-size: 1.4rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-kpi-error-value {\n color: var(--mj-status-error-text);\n}\n\n.at-kpi-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-kpi-trend {\n font-size: 0.68rem;\n margin-top: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-text-muted);\n}\n\n.at-kpi-trend.up {\n color: var(--mj-status-success-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 PIPELINE TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-layout {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n}\n\n.at-pipeline-center {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n}\n\n.at-pipeline-right {\n width: 320px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Pipeline Stages */\n\n.at-pipeline-stages {\n display: flex;\n gap: 0;\n align-items: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 16px;\n}\n\n.at-pipeline-stage {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n}\n\n.at-pipeline-stage-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n font-size: 0.85rem;\n}\n\n.stage-idle .at-pipeline-stage-icon {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.stage-active .at-pipeline-stage-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.stage-complete .at-pipeline-stage-icon {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n@keyframes at-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 30%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent); }\n}\n\n.at-pipeline-stage-name {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.at-pipeline-stage-count {\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.at-pipeline-arrow {\n width: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 0.6rem;\n}\n\n.at-stage-connector {\n width: 32px;\n height: 2px;\n background: var(--mj-border-default);\n transition: background 0.4s ease;\n}\n\n.at-stage-connector.connector-complete {\n background: var(--mj-status-success);\n}\n\n/* Progress section */\n\n.at-progress-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 10px 16px;\n}\n\n.at-progress-header {\n display: flex;\n justify-content: space-between;\n font-size: 0.75rem;\n margin-bottom: 4px;\n}\n\n.at-progress-stage-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.at-progress-pct {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.at-progress-bar {\n height: 4px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.at-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 2px;\n transition: width 0.3s ease;\n}\n\n.at-progress-current {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n margin-top: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-progress-fill-paused {\n background: var(--mj-status-warning);\n animation: pulse-paused 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-paused {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n\n.at-pipeline-controls {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n justify-content: flex-end;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n.at-danger-btn:hover:not(:disabled) {\n background: var(--mj-status-error-text);\n border-color: var(--mj-status-error-text);\n}\n\n/* Feed items */\n\n.at-feed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-feed-item:last-child {\n border-bottom: none;\n}\n\n.at-feed-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-feed-status-dot.complete {\n background: var(--mj-status-success);\n}\n\n.at-feed-status-dot.processing {\n background: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.at-feed-status-dot.error {\n background: var(--mj-status-error);\n}\n\n.at-feed-item-name {\n flex: 1;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-feed-item-source {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n min-width: 100px;\n}\n\n.at-feed-item-tags {\n display: flex;\n gap: 4px;\n}\n\n.at-feed-tag {\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 0.62rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-feed-item-time {\n color: var(--mj-text-muted);\n font-size: 0.68rem;\n white-space: nowrap;\n min-width: 60px;\n text-align: right;\n}\n\n/* Source mini cards (right panel) */\n\n.at-source-mini {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-source-mini:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-source-mini:last-child {\n border-bottom: none;\n}\n\n.at-source-mini-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-source-mini-info {\n flex: 1;\n min-width: 0;\n}\n\n.at-source-mini-name {\n font-size: 0.78rem;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-source-mini-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-mini-status {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-source-mini-status.active {\n background: var(--mj-status-success);\n}\n\n.at-source-mini-status.error {\n background: var(--mj-status-error);\n}\n\n.at-source-mini-status.inactive {\n background: var(--mj-text-disabled);\n}\n\n/* Tag cloud card */\n\n.at-tag-cloud-card {\n padding: 16px;\n}\n\n.at-tag-cloud {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n.at-tag-pill {\n padding: 4px 12px;\n border-radius: 14px;\n font-size: 0.72rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-tag-pill:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tag-weighted {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tag-weight {\n font-size: 0.6rem;\n opacity: 0.6;\n font-weight: 400;\n}\n\n.at-tag-row-clickable {\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-tag-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.at-tag-pill.large {\n font-size: 0.85rem;\n padding: 5px 14px;\n}\n\n.at-tag-pill.small {\n font-size: 0.65rem;\n padding: 3px 8px;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SOURCES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-sources-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 12px;\n}\n\n.at-source-card-full {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n transition: border-color 0.15s ease;\n}\n\n.at-source-card-full:hover {\n border-color: var(--mj-border-default);\n}\n\n.at-source-card-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 12px;\n}\n\n.at-source-card-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.at-source-card-title {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-card-type {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-status {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.7rem;\n font-weight: 500;\n}\n\n.at-source-card-status.active {\n color: var(--mj-status-success-text);\n}\n\n.at-source-card-status.error {\n color: var(--mj-status-error-text);\n}\n\n.at-source-card-status.inactive {\n color: var(--mj-text-disabled);\n}\n\n.at-source-card-url {\n font-size: 0.7rem;\n color: var(--mj-brand-primary);\n margin-bottom: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-source-card-stats {\n display: flex;\n gap: 16px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-source-stat {\n display: flex;\n flex-direction: column;\n}\n\n.at-source-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-stat-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-actions {\n display: flex;\n gap: 6px;\n margin-top: 10px;\n}\n\n.at-source-action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.7rem;\n cursor: pointer;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n transition: all 0.12s ease;\n}\n\n.at-source-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-source-delete-btn:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error-text);\n}\n\n.at-add-source-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-source-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-source-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CONTENT TYPES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-ct-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.at-ct-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n}\n\n.at-ct-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n\n.at-ct-card-name {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-ct-card-model {\n font-size: 0.68rem;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-ct-field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-ct-field:last-child {\n border-bottom: none;\n}\n\n.at-ct-field-label {\n color: var(--mj-text-muted);\n}\n\n.at-ct-field-value {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 0.75rem;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range i {\n color: var(--mj-brand-primary);\n}\n\n.at-ct-tag-range-bar {\n flex: 1;\n height: 6px;\n background: var(--mj-bg-surface);\n border-radius: 3px;\n position: relative;\n}\n\n.at-ct-tag-range-fill {\n position: absolute;\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n.at-ct-range-suffix {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 TAG LIBRARY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tag-lib-layout {\n display: flex;\n gap: 16px;\n}\n\n.at-tag-lib-main {\n flex: 1;\n}\n\n.at-tag-lib-sidebar {\n width: 280px;\n flex-shrink: 0;\n}\n\n.at-tag-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-tag-table th {\n text-align: left;\n padding: 8px 12px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-tag-table td {\n padding: 10px 12px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-name-cell {\n font-weight: 600;\n}\n\n.at-tag-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n display: inline-block;\n vertical-align: middle;\n}\n\n.at-tag-bar-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n/* Weight indicator in tag table */\n.at-weight-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-weight-bar {\n width: 50px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-weight-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.2s ease;\n}\n\n.at-weight-bar-fill.at-weight-high {\n background: var(--mj-status-success);\n}\n\n.at-weight-bar-fill.at-weight-medium {\n background: var(--mj-status-warning);\n}\n\n.at-weight-bar-fill.at-weight-low {\n background: var(--mj-status-error);\n}\n\n.at-weight-value {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n min-width: 28px;\n}\n\n.at-tags-by-source {\n font-size: 0.78rem;\n}\n\n.at-tag-source-row {\n display: flex;\n justify-content: space-between;\n padding: 5px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-source-row:last-child {\n border-bottom: none;\n}\n\n.at-search-input {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n width: 200px;\n outline: none;\n}\n\n.at-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-search-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RUN HISTORY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-run-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-run-table th {\n text-align: left;\n padding: 10px 14px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-run-table td {\n padding: 12px 14px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-run-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n cursor: pointer;\n}\n\n.at-run-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-run-status-badge.complete {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-run-status-badge.failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-run-status-badge.running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-run-duration {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n}\n\n.at-run-source-name {\n font-weight: 500;\n}\n\n.at-run-error-text {\n color: var(--mj-status-error-text);\n}\n\n.at-filter-select {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.78rem;\n outline: none;\n}\n\n.at-filter-select:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM PANEL \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.at-slide-panel {\n position: fixed;\n right: 0;\n top: 0;\n bottom: 0;\n width: 420px;\n max-width: 100vw;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n}\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-slide-header h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n background: none;\n border: none;\n font-size: 1.1rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n}\n\n.at-slide-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-form-group {\n margin-bottom: 16px;\n}\n\n.at-form-label {\n display: block;\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n font-size: 0.82rem;\n outline: none;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.at-form-input::placeholder,\n.at-form-textarea::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-form-textarea {\n resize: vertical;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n margin-top: 24px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RESPONSIVE \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n@media (max-width: 1100px) {\n .at-pipeline-layout {\n flex-direction: column;\n }\n\n .at-pipeline-right {\n width: 100%;\n flex-direction: row;\n }\n\n .at-tag-lib-layout {\n flex-direction: column;\n }\n\n .at-tag-lib-sidebar {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-left-nav {\n width: 180px;\n }\n\n .at-kpi-strip {\n flex-wrap: wrap;\n }\n\n .at-kpi-card {\n min-width: 140px;\n }\n\n .at-sources-grid {\n grid-template-columns: 1fr;\n }\n\n .at-ct-grid {\n grid-template-columns: 1fr;\n }\n\n .at-slide-panel {\n width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .at-left-nav {\n width: 56px;\n }\n\n .at-left-nav-header h2 {\n font-size: 0;\n }\n\n .at-left-nav-header h2 i {\n font-size: 1rem;\n }\n\n .at-nav-item {\n justify-content: center;\n padding: 10px;\n font-size: 0;\n }\n\n .at-nav-item i {\n font-size: 1rem;\n }\n\n .at-nav-badge {\n display: none;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Slide-in Form Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 9999;\n animation: at-fade-in 0.2s ease;\n}\n\n@keyframes at-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n.at-slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 420px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0, 0, 0, 0.4);\n z-index: 10000;\n display: flex;\n flex-direction: column;\n animation: at-slide-in 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes at-slide-in { from { transform: translateX(100%); } to { transform: translateX(0); } }\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.at-slide-header h3 {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.at-slide-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.at-form-label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n transition: border-color 0.15s ease;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.at-form-select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M3 5l3 3 3-3'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 30px;\n}\n\n.at-form-textarea {\n resize: vertical;\n min-height: 70px;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-form-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* Also add empty state for Content Types (matching Sources) */\n.at-add-type-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-type-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-type-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORKED PIPELINE STAGES \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-stages-forked {\n display: flex;\n align-items: center;\n gap: 0;\n}\n\n.at-pipeline-fork {\n display: flex;\n align-items: center;\n gap: 0;\n flex: 2;\n}\n\n.at-pipeline-fork-lines {\n width: 28px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n position: relative;\n flex-shrink: 0;\n}\n\n.at-pipeline-fork-line {\n height: 2px;\n background: var(--mj-border-default);\n width: 100%;\n position: relative;\n}\n\n.at-pipeline-fork-line::before {\n content: '';\n position: absolute;\n width: 2px;\n height: 12px;\n background: var(--mj-border-default);\n left: 0;\n}\n\n.at-fork-top::before {\n bottom: 0;\n left: 0;\n}\n\n.at-fork-bottom::before {\n top: 0;\n left: 0;\n}\n\n.at-pipeline-fork-branches {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n}\n\n.at-pipeline-fork-branches .at-pipeline-stage {\n flex: none;\n padding: 6px 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE FEED ITEMS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-item-clickable {\n cursor: pointer;\n}\n\n.at-feed-item-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FEED SEARCH & PAGINATION \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.at-feed-header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-left: auto;\n}\n\n.at-feed-sort-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.68rem;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-feed-sort-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-feed-count {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.at-feed-search-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-search-icon {\n color: var(--mj-text-disabled);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-feed-search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n outline: none;\n padding: 4px 0;\n min-width: 0;\n}\n\n.at-feed-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-feed-search-clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 9px;\n flex-shrink: 0;\n}\n\n.at-feed-search-clear:hover {\n background: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.at-feed-scroll-body {\n overflow-y: auto;\n min-height: 0;\n flex: 1;\n}\n\n.at-feed-item-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n overflow: hidden;\n}\n\n.at-feed-item-content .at-feed-item-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-feed-item-source-label {\n font-size: 0.7rem;\n font-weight: 500;\n color: var(--mj-brand-primary);\n}\n\n.at-feed-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-pagination-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE SOURCE CARDS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-source-card-clickable {\n cursor: pointer;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORM HINT \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-form-hint {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n font-style: italic;\n margin-top: 2px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 DETAIL PANEL (wider) \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-panel {\n width: 500px;\n}\n\n/* \u2500\u2500 Detail: Item header \u2500\u2500 */\n\n.at-detail-item-header {\n margin-bottom: 8px;\n}\n\n.at-detail-item-name {\n font-size: 1.05rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0 0 6px 0;\n word-break: break-word;\n}\n\n.at-detail-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-detail-badge {\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-detail-badge-source {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-detail-badge-type {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.at-detail-badge-file {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.at-detail-badge-status-active {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-detail-badge-status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-detail-badge-status-inactive {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500 Detail: Sections \u2500\u2500 */\n\n.at-detail-section {\n margin-bottom: 4px;\n}\n\n.at-detail-section-label {\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.at-detail-link {\n font-size: 0.8rem;\n color: var(--mj-brand-primary);\n text-decoration: none;\n word-break: break-all;\n}\n\n.at-detail-link:hover {\n text-decoration: underline;\n}\n\n/* \u2500\u2500 Detail: Text preview \u2500\u2500 */\n\n.at-detail-text-preview {\n max-height: 200px;\n overflow-y: auto;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n font-size: 0.78rem;\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n}\n\n/* \u2500\u2500 Detail: Tags \u2500\u2500 */\n\n.at-detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n/* \u2500\u2500 Detail: Meta grid \u2500\u2500 */\n\n.at-detail-meta-grid {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.at-detail-meta-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-detail-meta-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-meta-key {\n color: var(--mj-text-muted);\n font-weight: 500;\n flex-shrink: 0;\n margin-right: 12px;\n}\n\n.at-detail-meta-value {\n color: var(--mj-text-primary);\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-meta-mono {\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n font-size: 0.72rem;\n}\n\n/* \u2500\u2500 Detail: Actions \u2500\u2500 */\n\n.at-detail-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-detail-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* \u2500\u2500 Detail: Source header \u2500\u2500 */\n\n.at-detail-source-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n/* \u2500\u2500 Detail: Stats strip \u2500\u2500 */\n\n.at-detail-stats-strip {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-detail-stat {\n flex: 1;\n min-width: 60px;\n text-align: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 8px 6px;\n}\n\n.at-detail-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-detail-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Detail: Content Library \u2500\u2500 */\n\n.at-detail-content-list {\n max-height: 250px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.at-detail-content-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-detail-content-item:last-child {\n border-bottom: none;\n}\n\n.at-detail-content-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-detail-content-item-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-content-item-tags {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.at-detail-content-item-time {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n/* \u2500\u2500 Detail: Run history \u2500\u2500 */\n\n.at-detail-run-history {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.at-detail-run-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.75rem;\n}\n\n.at-detail-run-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-run-time {\n color: var(--mj-text-secondary);\n flex: 1;\n}\n\n.at-detail-run-duration {\n color: var(--mj-text-muted);\n}\n\n.at-detail-run-items {\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 600px) {\n .at-slide-panel {\n width: 100%;\n }\n\n .at-detail-panel {\n width: 100%;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n TAXONOMY GOVERNANCE TAB\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n/* Sub-tab strip + badges retired \u2014 taxonomy sub-tabs now driven by <mj-tab-nav>\n in the [toolbar] slot of the taxonomy section, with TabConfig badges\n (warning variant for duplicates, error variant for orphans). */\n\n/* \u2500\u2500 Tree View: Split layout \u2500\u2500 */\n\n.at-tax-split-view {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n height: calc(100vh - 320px);\n min-height: 400px;\n overflow: hidden;\n}\n\n.at-tax-tree-panel {\n width: 40%;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n}\n\n.at-tax-tree-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 0.8rem;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-tax-toolbar-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-tax-toolbar-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-tree-body {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.at-tax-tree-node {\n padding: 6px 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s;\n line-height: 1.4;\n}\n\n.at-tax-tree-node:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-node-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.at-tax-node-drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n outline: 2px dashed var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.at-tax-node-multi-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.at-tax-tree-add-child {\n margin-left: auto;\n opacity: 0;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px 6px;\n border-radius: 4px;\n transition: opacity 0.15s, color 0.15s, background 0.15s;\n}\n\n.at-tax-tree-node:hover .at-tax-tree-add-child {\n opacity: 1;\n}\n\n.at-tax-tree-add-child:hover {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.at-tax-tree-checkbox {\n width: 14px;\n height: 14px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.at-tax-tree-saving-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 75%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n backdrop-filter: blur(1px);\n}\n\n.at-tax-create-context {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n margin-bottom: 12px;\n padding: 6px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.at-tax-tree-arrow {\n width: 16px;\n font-size: 0.55rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n text-align: center;\n cursor: pointer;\n}\n\n.at-tax-arrow-collapsed::before {\n content: \"\\25B6\";\n}\n\n.at-tax-arrow-expanded::before {\n content: \"\\25BC\";\n}\n\n.at-tax-arrow-leaf {\n visibility: hidden;\n}\n\n.at-tax-health-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-tax-health-dot.green {\n background: var(--mj-status-success);\n}\n\n.at-tax-health-dot.yellow {\n background: var(--mj-status-warning);\n}\n\n.at-tax-health-dot.red {\n background: var(--mj-status-error);\n}\n\n.at-tax-tree-label {\n flex: 1;\n color: var(--mj-text-primary);\n}\n\n.at-tax-tree-label-selected {\n font-weight: 700;\n}\n\n.at-tax-tree-count {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n/* \u2500\u2500 Details panel \u2500\u2500 */\n\n.at-tax-details-panel {\n width: 60%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.at-tax-details-header {\n padding: 20px 24px 0;\n}\n\n.at-tax-breadcrumb {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tax-bc-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.at-tax-bc-link:hover {\n text-decoration: underline;\n}\n\n.at-tax-bc-sep {\n color: var(--mj-border-default);\n}\n\n.at-tax-bc-current {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.at-tax-details-title {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.at-tax-edit-icon {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.at-tax-edit-icon:hover {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-details-desc {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin-bottom: 16px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-tax-edit-form {\n margin-bottom: 16px;\n}\n\n/* \u2500\u2500 Stats row \u2500\u2500 */\n\n.at-tax-stats-row {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 16px;\n padding: 0 24px;\n}\n\n.at-tax-stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n min-width: 72px;\n}\n\n.at-tax-stat-value {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-stat-date {\n font-size: 0.8rem;\n}\n\n.at-tax-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Action toolbar \u2500\u2500 */\n\n.at-tax-action-toolbar {\n display: flex;\n gap: 8px;\n padding: 0 24px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.at-tax-action-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-action-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n/* \u2500\u2500 Detail sections \u2500\u2500 */\n\n.at-tax-detail-section {\n padding: 0 24px 20px;\n}\n\n.at-tax-section-title {\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n margin-bottom: 10px;\n}\n\n.at-tax-child-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-tax-child-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.at-tax-child-chip:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.at-tax-chip-count {\n font-size: 0.6rem;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n padding: 0 5px;\n border-radius: 8px;\n}\n\n/* \u2500\u2500 Recent items \u2500\u2500 */\n\n.at-tax-recent-list {\n list-style: none;\n}\n\n.at-tax-recent-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-tax-recent-item:last-child {\n border-bottom: none;\n}\n\n.at-tax-recent-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-tax-recent-name {\n flex: 1;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-tax-recent-weight {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-tax-recent-date {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Health bar \u2500\u2500 */\n\n.at-tax-health-bar {\n display: flex;\n align-items: center;\n gap: 20px;\n padding: 12px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin-top: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-health-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-health-stat {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n}\n\n.at-tax-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n}\n\n.at-tax-dot-total {\n background: var(--mj-text-secondary);\n}\n\n.at-tax-dot-healthy {\n background: var(--mj-status-success);\n}\n\n.at-tax-dot-attention {\n background: var(--mj-status-warning);\n}\n\n.at-tax-dot-orphaned {\n background: var(--mj-status-error);\n}\n\n.at-tax-dot-duplicates {\n background: var(--mj-status-info);\n}\n\n.at-tax-health-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-val-success {\n color: var(--mj-status-success);\n}\n\n.at-tax-val-warning {\n color: var(--mj-status-warning);\n}\n\n.at-tax-val-error {\n color: var(--mj-status-error);\n}\n\n.at-tax-val-info {\n color: var(--mj-status-info);\n}\n\n.at-tax-health-text {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550 Duplicates sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-dup-stats-bar {\n display: flex;\n gap: 24px;\n margin-bottom: 16px;\n align-items: center;\n}\n\n.at-tax-dup-stat {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n}\n\n.at-tax-dup-stat strong {\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n margin-right: 4px;\n}\n\n.at-tax-dup-high strong {\n color: var(--mj-status-error);\n}\n\n.at-tax-dup-moderate strong {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-tax-dup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.at-tax-dup-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-card.at-tax-dup-high {\n border-left: 3px solid var(--mj-status-error);\n}\n\n.at-tax-dup-card.at-tax-dup-moderate {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.at-tax-dup-tag {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 120px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n text-align: center;\n}\n\n.at-tax-dup-arrow {\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.at-tax-dup-similarity {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n min-width: 100px;\n}\n\n.at-tax-sim-bar-bg {\n width: 100%;\n height: 6px;\n background: var(--mj-border-default);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-tax-sim-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s;\n}\n\n.at-tax-sim-bar-fill.high {\n background: var(--mj-status-error);\n}\n\n.at-tax-sim-bar-fill.moderate {\n background: var(--mj-status-warning);\n}\n\n.at-tax-sim-percent {\n font-size: 0.78rem;\n font-weight: 700;\n}\n\n.at-tax-sim-percent.high {\n color: var(--mj-status-error);\n}\n\n.at-tax-sim-percent.moderate {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-tax-dup-btn {\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n white-space: nowrap;\n}\n\n.at-tax-dup-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n/* \u2550\u2550\u2550\u2550 Orphans sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-orphan-toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-orphan-count {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-desc {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-bulk {\n margin-left: auto;\n display: flex;\n gap: 8px;\n}\n\n.at-tax-bulk-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-bulk-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-bulk-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.at-tax-orphan-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: 12px;\n}\n\n.at-tax-orphan-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 16px;\n transition: all 0.15s;\n display: flex;\n flex-direction: column;\n gap: 10px;\n border-top: 3px solid var(--mj-status-error);\n}\n\n.at-tax-orphan-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.at-tax-orphan-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-checkbox {\n width: 16px;\n height: 16px;\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-stats {\n display: flex;\n gap: 12px;\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-stats strong {\n color: var(--mj-text-secondary);\n}\n\n.at-tax-orphan-dates {\n display: flex;\n justify-content: space-between;\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-actions {\n display: flex;\n gap: 6px;\n margin-top: 4px;\n}\n\n.at-tax-orphan-btn {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: center;\n transition: all 0.15s;\n}\n\n.at-tax-orphan-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-delete:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n/* \u2550\u2550\u2550\u2550 Treemap sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-kpi-strip {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-treemap-kpi {\n padding: 10px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 120px;\n}\n\n.at-tax-treemap-kpi-value {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-treemap-kpi-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-tax-treemap-container {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 8px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n grid-auto-rows: 80px;\n gap: 4px;\n min-height: 340px;\n}\n\n.at-tax-treemap-cell {\n border-radius: 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n overflow: hidden;\n}\n\n.at-tax-treemap-cell:hover {\n transform: scale(1.02);\n z-index: 2;\n}\n\n.at-tax-cell-name {\n font-size: 0.78rem;\n}\n\n.at-tax-cell-count {\n font-size: 0.65rem;\n opacity: 0.85;\n font-weight: 400;\n}\n\n/* Treemap color families */\n.at-tm-blue-1 { background: color-mix(in srgb, var(--mj-brand-primary) 90%, black); }\n.at-tm-blue-2 { background: var(--mj-brand-primary); }\n.at-tm-blue-3 { background: color-mix(in srgb, var(--mj-brand-primary) 75%, white); }\n.at-tm-blue-4 { background: color-mix(in srgb, var(--mj-brand-primary) 55%, white); }\n\n.at-tm-green-1 { background: color-mix(in srgb, var(--mj-status-success) 90%, black); }\n.at-tm-green-2 { background: var(--mj-status-success); }\n.at-tm-green-3 { background: color-mix(in srgb, var(--mj-status-success) 60%, white); color: var(--mj-text-primary); }\n\n.at-tm-purple-1 { background: color-mix(in srgb, var(--mj-status-info) 90%, black); }\n.at-tm-purple-2 { background: var(--mj-status-info); }\n.at-tm-purple-3 { background: color-mix(in srgb, var(--mj-status-info) 65%, white); }\n\n.at-tm-orange-1 { background: color-mix(in srgb, var(--mj-status-warning) 90%, black); }\n.at-tm-orange-2 { background: var(--mj-status-warning); }\n.at-tm-orange-3 { background: color-mix(in srgb, var(--mj-status-warning) 60%, white); color: var(--mj-text-primary); }\n\n/* \u2550\u2550\u2550\u2550 Audit Log sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-audit-filters {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-filter-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-audit-checkbox-group {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-checkbox {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.at-tax-audit-checkbox input {\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-audit-timeline {\n position: relative;\n padding-left: 32px;\n}\n\n.at-tax-audit-timeline::before {\n content: '';\n position: absolute;\n left: 14px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.at-tax-audit-event {\n position: relative;\n padding: 10px 16px;\n margin-bottom: 4px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n border-radius: 8px;\n transition: background 0.1s;\n}\n\n.at-tax-audit-event:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-audit-event-icon {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.68rem;\n flex-shrink: 0;\n position: absolute;\n left: -32px;\n top: 10px;\n z-index: 1;\n}\n\n.at-tax-audit-event-icon.created {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.at-tax-audit-event-icon.merged {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.moved {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.deleted {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.at-tax-audit-event-icon.renamed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.at-tax-audit-event-body {\n flex: 1;\n}\n\n.at-tax-audit-event-desc {\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n line-height: 1.5;\n}\n\n.at-tax-tag-ref {\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n font-weight: 600;\n font-size: 0.72rem;\n border: 1px solid var(--mj-border-default);\n}\n\n.at-tax-audit-event-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n display: flex;\n gap: 12px;\n}\n\n/* \u2500\u2500 Taxonomy responsive \u2500\u2500 */\n\n@media (max-width: 1100px) {\n .at-tax-split-view {\n flex-direction: column;\n }\n\n .at-tax-tree-panel {\n width: 100%;\n max-height: 300px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .at-tax-details-panel {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-tax-dup-card {\n flex-wrap: wrap;\n }\n\n .at-tax-orphan-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* \u2500\u2500 Pipeline Config Widget \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-config-card {\n margin-top: 12px;\n}\n\n.at-config-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px !important;\n}\n\n.at-config-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.at-config-label {\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n min-width: 90px;\n flex-shrink: 0;\n}\n\n.at-config-control {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n justify-content: flex-end;\n}\n\n.at-config-input {\n width: 70px;\n padding: 3px 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 0.75rem;\n text-align: right;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.at-config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.at-config-slider {\n flex: 1;\n max-width: 100px;\n accent-color: var(--mj-brand-primary);\n height: 4px;\n}\n\n.at-config-value {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n min-width: 40px;\n text-align: right;\n}\n\n.at-config-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n}\n\n.at-config-section-label {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n/* Toggle Switch */\n.at-config-toggle {\n position: relative;\n display: inline-block;\n cursor: pointer;\n}\n\n.at-config-toggle input {\n display: none;\n}\n\n.at-toggle-track {\n display: block;\n width: 32px;\n height: 18px;\n background: var(--mj-border-strong);\n border-radius: 9px;\n transition: background 0.2s ease;\n position: relative;\n}\n\n.at-config-toggle input:checked + .at-toggle-track {\n background: var(--mj-brand-primary);\n}\n\n.at-toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0,0,0,0.15);\n}\n\n.at-config-toggle input:checked + .at-toggle-track .at-toggle-thumb {\n transform: translateX(14px);\n}\n\n/* \u2500\u2500 Schedule Indicator on Source Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-indicator {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 10px;\n margin-top: 6px;\n border-radius: 12px;\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n cursor: pointer;\n transition: all 0.15s ease;\n width: fit-content;\n}\n\n.at-schedule-indicator i {\n font-size: 0.62rem;\n}\n\n.at-schedule-indicator:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n/* Schedule button in source card actions */\n.at-source-schedule-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500 Schedule Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-schedule-dialog {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n width: 420px;\n max-width: 90vw;\n}\n\n.at-schedule-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-schedule-dialog-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-dialog-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 16px;\n padding: 4px;\n line-height: 1;\n transition: color 0.15s;\n}\n\n.at-schedule-dialog-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-body {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-schedule-field label {\n display: block;\n font-size: 11.5px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 6px;\n}\n\n.at-schedule-source-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-source-name i {\n color: var(--mj-text-muted);\n}\n\n.at-schedule-action-name {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-cron-input {\n width: 100%;\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n letter-spacing: 0.02em;\n}\n\n.at-schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.at-schedule-cron-preview i {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n}\n\n.at-schedule-toggle-row label {\n margin-bottom: 0;\n}\n\n.at-schedule-dialog-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4: Status Badges for Content Items \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-status-badge {\n display: inline-block;\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 0.6rem;\n font-weight: 600;\n white-space: nowrap;\n letter-spacing: 0.02em;\n}\n\n.at-status-badge-complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.at-status-badge-processing {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.at-status-badge-failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.at-status-badge-pending {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4/D7: Source Detail Controls \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-section-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.at-detail-section-controls {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-detail-filter-select {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.72rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n.at-retry-btn {\n font-size: 0.7rem !important;\n padding: 4px 8px !important;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface)) !important;\n color: var(--mj-status-error-text) !important;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-border-default)) !important;\n}\n\n.at-retry-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 18%, var(--mj-bg-surface)) !important;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D7: Pagination \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 10px 0 4px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.at-page-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.72rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-page-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-page-btn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.at-page-info {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Confirmation Dialog \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-confirm-message {\n font-size: 13.5px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: var(--mj-radius-sm, 6px);\n padding: 7px 14px;\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.at-danger-btn:hover {\n background: var(--mj-status-error-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Treemap Drill-In \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-cell-clickable {\n cursor: pointer;\n transition: transform 0.15s, box-shadow 0.15s;\n}\n\n.at-tax-treemap-cell-clickable:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n z-index: 1;\n}\n\n.at-tax-drillin-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: flex-start;\n justify-content: flex-end;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-tax-drillin-panel {\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n width: 420px;\n max-width: 90vw;\n height: 100vh;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n.at-tax-drillin-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-drillin-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-tax-drillin-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-drillin-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-tax-drillin-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* D3/D8: Clickable run history rows */\n.at-run-row-clickable {\n cursor: pointer;\n transition: background 0.12s ease;\n}\n\n.at-run-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-run-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* D2: Error text in detail tables */\n.run-error-text {\n color: var(--mj-status-error);\n font-weight: 600;\n}\n\n/* \u2500\u2500 Content Item Duplicates Section (G3) \u2500\u2500 */\n\n.at-dedup-section {\n margin-top: 24px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.at-dedup-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 16px;\n}\n\n.at-dedup-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.at-dedup-subtitle {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-dedup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s;\n}\n\n.at-dedup-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.at-dedup-pair {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.at-dedup-item {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1;\n}\n\n.at-dedup-item-name {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-dedup-item-source {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-vs {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n flex-shrink: 0;\n}\n\n.at-dedup-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.at-dedup-score {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-dedup-method {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-dedup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-dedup-confirm {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-dismiss {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-empty {\n text-align: center;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-empty i {\n font-size: 1.5rem;\n margin-bottom: 8px;\n color: var(--mj-status-success);\n}\n\n.at-dedup-empty p {\n margin: 8px 0 0;\n font-size: 0.82rem;\n}\n\n/* =============================================================================\n * Tags-only additions: governance toggles, scope chips, inline synonyms,\n * Suggestions inbox table+drawer, Tag Health 3-card layout. All colors flow\n * through MJ design tokens with `color-mix()` for tinted variants.\n * ============================================================================= */\n\n/* ---------- Governance toggle rows ---------- */\n\n.at-tg-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 10px 0;\n border-bottom: 1px dashed var(--mj-border-subtle);\n}\n.at-tg-toggle-row:last-child { border-bottom: 0; }\n.at-tg-toggle-label { display: flex; flex-direction: column; gap: 2px; max-width: 70%; }\n.at-tg-toggle-t { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.at-tg-toggle-d { font-size: 11px; color: var(--mj-text-muted); line-height: 1.4; }\n\n.at-tg-switch {\n position: relative;\n width: 36px;\n height: 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s;\n flex-shrink: 0;\n}\n.at-tg-switch::after {\n content: \"\";\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n transition: left 0.15s;\n box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n.at-tg-switch.on { background: var(--mj-brand-primary); }\n.at-tg-switch.on::after { left: 18px; }\n.at-tg-switch.disabled { opacity: 0.5; pointer-events: none; }\n\n.at-tg-grid-3 {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 14px 16px;\n margin-top: 14px;\n}\n.at-tg-field { display: flex; flex-direction: column; gap: 4px; }\n.at-tg-field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n.at-tg-hint { font-size: 11px; color: var(--mj-text-muted); }\n\n/* ---------- Scope chips ---------- */\n\n.at-tg-chip-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n margin-top: 8px;\n}\n.at-tg-chip {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n.at-tg-chip.scoped {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ---------- Inline synonyms ---------- */\n\n.at-tg-syn-add {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n align-items: stretch;\n}\n.at-tg-syn-add .at-search-input { flex: 1; }\n.at-tg-syn-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 5px;\n border: 1px solid var(--mj-border-subtle);\n margin-bottom: 6px;\n background: var(--mj-bg-surface);\n}\n.at-tg-syn-row.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n.at-tg-syn-name { font-weight: 600; flex: 1; color: var(--mj-text-primary); }\n.at-tg-syn-src {\n font-size: 10px;\n padding: 2px 7px;\n border-radius: 3px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n}\n.at-tg-syn-src.manual { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.at-tg-syn-src.imported { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.at-tg-syn-src.merged { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.at-tg-syn-src.llm { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.at-tg-syn-x {\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 2px 6px;\n}\n.at-tg-syn-x:hover { color: var(--mj-status-error-text, var(--mj-status-error)); }\n\n/* ---------- Suggestions inbox table + drawer ---------- */\n\n.sg-shell {\n display: flex;\n height: 100%;\n min-height: 600px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n.sg-main { flex: 1; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }\n.sg-toolbar {\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 10px;\n align-items: center;\n background: var(--mj-bg-surface-card);\n flex-wrap: wrap;\n}\n.sg-bulk-bar {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n padding: 9px 14px;\n display: flex;\n gap: 10px;\n align-items: center;\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 500;\n}\n.sg-table-body { flex: 1; overflow: auto; }\n.sg-table { width: 100%; border-collapse: collapse; font-size: 13px; color: var(--mj-text-primary); }\n.sg-table thead { position: sticky; top: 0; background: var(--mj-bg-surface-card); z-index: 1; }\n.sg-table th {\n text-align: left;\n padding: 9px 12px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n white-space: nowrap;\n}\n.sg-table td {\n padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n.sg-table tr { cursor: pointer; }\n.sg-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.sg-table tr.sg-row-selected td { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); }\n.sg-table tr.sg-row-checked td { background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent); }\n.sg-score { font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-weight: 600; }\n.sg-score-bar {\n display: inline-block;\n width: 70px;\n height: 5px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n vertical-align: middle;\n margin-right: 6px;\n}\n.sg-score-bar > span {\n display: block;\n height: 100%;\n background: var(--mj-brand-primary);\n}\n.sg-reason {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.sg-reason.merge { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.sg-reason.below { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 12%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.constrained { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.sg-reason.frozen { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.review { background: color-mix(in srgb, var(--mj-status-error) 12%, transparent); color: var(--mj-status-error-text, var(--mj-status-error)); }\n.sg-reason.lowusage { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.widenode { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.autogrow { background: color-mix(in srgb, var(--mj-status-warning) 12%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-row-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n.sg-table tr:hover .sg-row-actions {\n opacity: 1;\n}\n\n.sg-drawer {\n width: 460px;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n}\n.sg-drawer-hd {\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface);\n}\n.sg-drawer-bd { padding: 16px 18px; flex: 1; overflow-y: auto; }\n.sg-drawer-ft {\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 8px;\n background: var(--mj-bg-surface);\n flex-wrap: wrap;\n}\n.sg-drawer h4 {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin: 16px 0 8px;\n font-weight: 700;\n}\n.sg-candidate {\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n display: flex;\n gap: 12px;\n align-items: center;\n}\n.sg-preview {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n/* ---------- Tag Health cards ---------- */\n\n.health-shell { padding: 18px 22px; }\n.runbar {\n display: flex;\n gap: 22px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 18px;\n align-items: center;\n font-size: 13px;\n}\n.runbar .stat .l { font-size: 11px; color: var(--mj-text-muted); }\n.runbar .stat .v { font-size: 16px; font-weight: 600; color: var(--mj-text-primary); }\n.runbar .grow { flex: 1; }\n\n.health-cards {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 16px;\n margin-bottom: 22px;\n}\n.h-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 240px;\n}\n.h-card.merge { border-top: 4px solid var(--mj-brand-primary); }\n.h-card.lowusage { border-top: 4px solid var(--mj-status-warning); }\n.h-card.widenode { border-top: 4px solid var(--mj-status-error, var(--mj-status-warning)); }\n.h-card .top { display: flex; align-items: flex-start; gap: 10px; }\n.h-card .top .ic {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n}\n.h-card .name {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.h-card h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n.h-card .big {\n font-size: 36px;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n.h-card .sub { font-size: 12px; color: var(--mj-text-secondary); line-height: 1.4; margin: 0; }\n.h-card .ft { margin-top: auto; display: flex; gap: 6px; flex-wrap: wrap; }\n\n.threshold-form {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 18px;\n margin-top: 18px;\n}\n.threshold-form h3 { margin: 0 0 12px; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.threshold-form .grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n.threshold-form .field { display: flex; flex-direction: column; gap: 4px; }\n.threshold-form .field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n\n.run-history {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-top: 18px;\n overflow: hidden;\n}\n.run-history-hd {\n padding: 12px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-card);\n}\n.run-history-hd h3 { margin: 0; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.run-history table { width: 100%; border-collapse: collapse; font-size: 12px; }\n.run-history th {\n text-align: left;\n padding: 8px 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n font-weight: 600;\n}\n.run-history td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n/* Generic helpers used by new sections */\n.at-muted { color: var(--mj-text-muted); }\n.at-success-btn { color: var(--mj-status-success-text, var(--mj-status-success)); border-color: var(--mj-status-success-border, var(--mj-status-success)); }\n.at-btn-sm { font-size: 12px; padding: 4px 9px; }\n.at-btn-xs { font-size: 11px; padding: 2px 7px; }\n"] }]
7379
+ args: [{ standalone: false, selector: 'mj-tags-resource', encapsulation: ViewEncapsulation.None, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Tags\"\n Icon=\"fa-solid fa-sitemap\"\n Subtitle=\"Taxonomy management, health monitoring, and tag library\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"action-btn-label\">Running\u2026</span>\n } @else {\n <i class=\"fa-solid fa-heart-pulse\"></i> <span class=\"action-btn-label\">Run Tag Health</span>\n }\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n <!-- Tags Dashboard -->\n <div class=\"at-dashboard\">\n\n <mj-left-nav\n MobileTitle=\"Sections\"\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveTab\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n\n <mj-page-header-interior\n [Title]=\"currentTabTitle\"\n [Subtitle]=\"currentTabSubtitle\">\n @if (ActiveTab === 'tags' || ActiveTab === 'taxonomy') {\n <div toolbar>\n @switch (ActiveTab) {\n @case ('tags') {\n <input type=\"text\" class=\"at-search-input\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TagSearchQuery\" (input)=\"FilterTags()\">\n }\n @case ('taxonomy') {\n <mj-tab-nav\n [Tabs]=\"taxSubTabsConfig\"\n [ActiveKey]=\"TaxSubTab\"\n (TabChange)=\"onTaxSubTabChange($event)\">\n </mj-tab-nav>\n }\n }\n </div>\n }\n <div actions>\n @switch (ActiveTab) {\n @case ('taxonomy') {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"RefreshTaxonomyData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> <span class=\"mj-action-label\">Refresh</span>\n </button>\n }\n @case ('suggestions') {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadSuggestions()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> <span class=\"mj-action-label\">Refresh</span>\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"mj-action-label\">Running\u2026</span> }\n @else { <i class=\"fa-solid fa-heart-pulse\"></i> <span class=\"mj-action-label\">Run Tag Health</span> }\n </button>\n }\n @case ('health') {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"RebuildEmbeddings()\" [disabled]=\"RebuildEmbeddingsRunning\">\n @if (RebuildEmbeddingsRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"mj-action-label\">Rebuilding\u2026</span> }\n @else { <i class=\"fa-solid fa-rotate\"></i> <span class=\"mj-action-label\">Rebuild stale embeddings</span> }\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RunHealthNow()\" [disabled]=\"HealthRunning\">\n @if (HealthRunning) { <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"mj-action-label\">Running\u2026</span> }\n @else { <i class=\"fa-solid fa-play\"></i> <span class=\"mj-action-label\">Run now</span> }\n </button>\n }\n }\n </div>\n </mj-page-header-interior>\n\n <mj-page-body-interior [Padding]=\"false\" [Flex]=\"true\">\n <div class=\"at-main-area\">\n\n @if (IsLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading tag data\u2026\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <!-- TAB 4: TAG LIBRARY -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'tags') {\n <div class=\"at-page-body\">\n <div class=\"at-tag-lib-layout\">\n <div class=\"at-tag-lib-main\">\n <div class=\"at-card\">\n <div class=\"at-card-body\" style=\"max-height: 500px; overflow-y: auto;\">\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Count</th>\n <th>Avg Weight</th>\n <th>Distribution</th>\n <th>Top Source</th>\n <th>First Seen</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredTagRows; track row.Tag) {\n <tr class=\"at-tag-row-clickable\" (click)=\"DrillDownTag(row.Tag)\"\n [class.at-tag-row-selected]=\"SelectedDrillDownTag === row.Tag\">\n <td class=\"at-tag-name-cell\">{{ row.Tag }}</td>\n <td>{{ row.UsageCount }}</td>\n <td>\n <div class=\"at-weight-indicator\">\n <div class=\"at-weight-bar\">\n <div class=\"at-weight-bar-fill\" [style.width.%]=\"row.AvgWeight * 100\"\n [class.at-weight-high]=\"row.AvgWeight >= 0.7\"\n [class.at-weight-medium]=\"row.AvgWeight >= 0.4 && row.AvgWeight < 0.7\"\n [class.at-weight-low]=\"row.AvgWeight < 0.4\"></div>\n </div>\n <span class=\"at-weight-value\">{{ row.AvgWeight.toFixed(2) }}</span>\n </div>\n </td>\n <td>\n <div class=\"at-tag-bar\">\n <div class=\"at-tag-bar-fill\" [style.width.%]=\"row.BarWidthPct\"></div>\n </div>\n </td>\n <td>{{ row.TopSource }}</td>\n <td>{{ row.FirstSeen }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Tag drill-down: content items matching selected tag -->\n @if (SelectedDrillDownTag) {\n <div class=\"at-card\" style=\"margin-top: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\">\n <i class=\"fa-solid fa-tag\"></i>\n Content items tagged \"{{ SelectedDrillDownTag }}\"\n ({{ TagDrillDownItems.length }})\n </span>\n <button class=\"at-slide-close\" (click)=\"CloseDrillDownTag()\" style=\"background:none;border:none;cursor:pointer;color:var(--mj-text-muted)\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-card-body\" style=\"max-height: 300px; overflow-y: auto;\">\n @if (TagDrillDownItems.length === 0) {\n <div class=\"at-empty-state\"><p>No content items found for this tag.</p></div>\n } @else {\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Source</th>\n <th>Weight</th>\n <th>Updated</th>\n </tr>\n </thead>\n <tbody>\n @for (di of TagDrillDownItems; track di.ID) {\n <tr class=\"at-tag-row-clickable\" (click)=\"OpenItemDetailByID(di.ID)\">\n <td>{{ di.Name }}</td>\n <td>{{ di.SourceName }}</td>\n <td>{{ FormatWeight(di.Weight) }}</td>\n <td>{{ di.UpdatedAt }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tag-lib-sidebar\">\n <div class=\"at-card at-tag-cloud-card\">\n <div class=\"at-card-title\" style=\"margin-bottom: 12px;\"><i class=\"fa-solid fa-cloud\"></i> Tag Cloud</div>\n @if (TagCloudWordItems.length > 0) {\n <mj-word-cloud\n [Items]=\"TagCloudWordItems\"\n [MaxFontSize]=\"40\"\n [MinFontSize]=\"12\"\n [MaxItems]=\"20\"\n Layout=\"spiral\"\n ColorMode=\"weight-gradient\"\n [Interactive]=\"true\"\n [Animate]=\"true\">\n </mj-word-cloud>\n } @else {\n <div class=\"at-tag-cloud-empty\">No tags yet</div>\n }\n </div>\n <div class=\"at-card\" style=\"padding: 16px; margin-top: 12px;\">\n <div class=\"at-card-title\" style=\"margin-bottom: 10px;\"><i class=\"fa-solid fa-chart-pie\"></i> By Source</div>\n <div class=\"at-tags-by-source\">\n @for (s of TagsBySource; track s.SourceName) {\n <div class=\"at-tag-source-row\">\n <span>{{ s.SourceName }}</span>\n <strong>{{ s.Count }}</strong>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <!-- TAB 6: TAXONOMY GOVERNANCE -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'taxonomy') {\n\n <div class=\"at-page-body\">\n\n <!-- \u2550\u2550 SUB-TAB 1: TREE VIEW \u2550\u2550 -->\n @if (TaxSubTab === 'tree') {\n <div class=\"at-tax-split-view\">\n <!-- Tree panel -->\n <div class=\"at-tax-tree-panel\" style=\"position: relative;\">\n <div class=\"at-tax-tree-toolbar\">\n <input type=\"text\" class=\"at-search-input\" style=\"flex: 1;\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TaxTreeSearch\" (input)=\"FilterTaxTree()\">\n <button class=\"at-tax-toolbar-btn\" title=\"Add root tag\" (click)=\"OpenCreateRootTag()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"at-tax-toolbar-btn\" [class.active]=\"TaxMultiSelectMode\"\n title=\"Toggle multi-select for drag reparenting\" (click)=\"ToggleMultiSelectMode()\">\n <i class=\"fa-solid fa-check-double\"></i>\n </button>\n </div>\n <div class=\"at-tax-tree-body\"\n (dragover)=\"$event.preventDefault()\"\n (drop)=\"OnDropToRoot($event)\">\n @if (TaxFilteredNodes.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <p>No tags found</p>\n </div>\n }\n @for (node of TaxFilteredNodes; track node.ID) {\n <div class=\"at-tax-tree-node\"\n [class.at-tax-node-selected]=\"node.IsSelected\"\n [class.at-tax-node-drag-over]=\"TaxDragOverNodeID === node.ID\"\n [class.at-tax-node-multi-selected]=\"IsNodeMultiSelected(node.ID)\"\n [style.padding-left.px]=\"16 + node.Depth * 20\"\n [attr.draggable]=\"true\"\n (dragstart)=\"OnTreeNodeDragStart($event, node)\"\n (dragover)=\"OnTreeNodeDragOver($event, node)\"\n (dragleave)=\"OnTreeNodeDragLeave()\"\n (drop)=\"OnTreeNodeDrop($event, node); $event.stopPropagation()\"\n (click)=\"SelectTaxNode(node)\">\n @if (TaxMultiSelectMode) {\n <input type=\"checkbox\" class=\"at-tax-tree-checkbox\"\n [checked]=\"IsNodeMultiSelected(node.ID)\"\n (click)=\"ToggleNodeSelection(node, $event)\">\n }\n <span class=\"at-tax-tree-arrow\"\n [class.at-tax-arrow-expanded]=\"node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-collapsed]=\"!node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-leaf]=\"node.Children.length === 0\"\n (click)=\"ToggleTaxNode(node); $event.stopPropagation()\"></span>\n <span class=\"at-tax-health-dot\" [class]=\"node.HealthColor\"></span>\n <span class=\"at-tax-tree-label\" [class.at-tax-tree-label-selected]=\"node.IsSelected\">{{ node.Name }}</span>\n <span class=\"at-tax-tree-count\">({{ node.ItemCount }})</span>\n <span class=\"at-tax-tree-add-child\" title=\"Add child tag\"\n (click)=\"OpenCreateChildTagFor(node); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n </div>\n }\n </div>\n @if (TaxTreeSaving) {\n <div class=\"at-tax-tree-saving-overlay\">\n <mj-loading text=\"Moving tags...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n\n <!-- Details panel -->\n <div class=\"at-tax-details-panel\">\n @if (TaxSelectedNode) {\n <div class=\"at-tax-details-header\">\n <!-- Breadcrumb -->\n <div class=\"at-tax-breadcrumb\">\n @for (bc of GetTaxBreadcrumb(TaxSelectedNode); track bc.ID) {\n <span class=\"at-tax-bc-link\" (click)=\"NavigateToBreadcrumb(bc.ID)\">{{ bc.Name }}</span>\n <span class=\"at-tax-bc-sep\">&rsaquo;</span>\n }\n <span class=\"at-tax-bc-current\">{{ TaxSelectedNode.Name }}</span>\n </div>\n\n @if (!TaxIsEditing) {\n <div class=\"at-tax-details-title\">\n {{ TaxSelectedNode.DisplayName }}\n <span class=\"at-tax-edit-icon\" (click)=\"StartEditTag()\" title=\"Edit name\">\n <i class=\"fa-solid fa-pen\"></i>\n </span>\n </div>\n @if (TaxSelectedNode.Description) {\n <div class=\"at-tax-details-desc\">{{ TaxSelectedNode.Description }}</div>\n }\n } @else {\n <div class=\"at-tax-edit-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"TaxEditName\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" rows=\"3\" [(ngModel)]=\"TaxEditDescription\"></textarea>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveEditTag()\">Save</button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CancelEditTag()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Stats row -->\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Depth }}</div>\n <div class=\"at-tax-stat-label\">Depth</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value at-tax-stat-date\">{{ TaxSelectedNode.FirstSeen }}</div>\n <div class=\"at-tax-stat-label\">First Seen</div>\n </div>\n </div>\n\n <!-- Action toolbar -->\n @if (!TaxIsEditing) {\n <div class=\"at-tax-action-toolbar\">\n <button class=\"at-tax-action-btn\" (click)=\"OpenCreateChildTag()\"><i class=\"fa-solid fa-plus\"></i> Add Child</button>\n <button class=\"at-tax-action-btn\" (click)=\"StartEditTag()\"><i class=\"fa-solid fa-pen\"></i> Rename</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMoveDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-arrows-up-down\"></i> Move</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMergeIntoDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-compress\"></i> Merge Into...</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenSplitDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-code-branch\"></i> Split</button>\n <button class=\"at-tax-action-btn at-tax-action-danger\" (click)=\"DeleteTag(TaxSelectedNode)\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n }\n\n <!-- Child tags -->\n @if (TaxSelectedNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TaxSelectedNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\" (click)=\"SelectTaxNode(child)\">\n {{ child.Name }}\n <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Recently tagged items -->\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- \u2500\u2500\u2500 Governance \u2014 per-node controls for the autotagger \u2500\u2500\u2500 -->\n @if (SelectedTagFull) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Governance \u2014 how the autotagger may grow this subtree</div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Allow auto-grow under this tag</span>\n <span class=\"at-tg-toggle-d\">Lets the classifier create child tags below this one. Off = constrained subtree.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.AllowAutoGrow\"\n [class.disabled]=\"SelectedTagSavingField['AllowAutoGrow']\"\n (click)=\"ToggleGovernanceFlag('AllowAutoGrow')\"></div>\n </div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Freeze this subtree</span>\n <span class=\"at-tg-toggle-d\">Locks this entire subtree against auto-creation, regardless of mode.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.IsFrozen\"\n [class.disabled]=\"SelectedTagSavingField['IsFrozen']\"\n (click)=\"ToggleGovernanceFlag('IsFrozen')\"></div>\n </div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Requires review for matches</span>\n <span class=\"at-tg-toggle-d\">High-confidence matches against this tag are routed to the suggestion queue first.</span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.RequiresReview\"\n [class.disabled]=\"SelectedTagSavingField['RequiresReview']\"\n (click)=\"ToggleGovernanceFlag('RequiresReview')\"></div>\n </div>\n\n <div class=\"at-tg-grid-3\">\n <div class=\"at-tg-field\">\n <label>Max children</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\"\n [value]=\"SelectedTagFull.MaxChildren ?? ''\"\n (change)=\"SaveSelectedTagNumber('MaxChildren', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">Hard cap on direct children. Blank = unlimited.</span>\n </div>\n <div class=\"at-tg-field\">\n <label>Max descendant depth</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\"\n [value]=\"SelectedTagFull.MaxDescendantDepth ?? ''\"\n (change)=\"SaveSelectedTagNumber('MaxDescendantDepth', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">From this node down. 0 = leaf-only.</span>\n </div>\n <div class=\"at-tg-field\">\n <label>Min confidence</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.01\"\n [value]=\"SelectedTagFull.MinWeight ?? ''\"\n (change)=\"SaveSelectedTagNumber('MinWeight', $any($event.target).value)\" />\n <span class=\"at-tg-hint\">Floor for matches against this tag.</span>\n </div>\n </div>\n </div>\n\n <!-- \u2500\u2500\u2500 Scope \u2014 who can see this tag \u2500\u2500\u2500 -->\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Scope \u2014 who can see and tag with this</div>\n\n <div class=\"at-tg-toggle-row\">\n <div class=\"at-tg-toggle-label\">\n <span class=\"at-tg-toggle-t\">Global tag (visible to all tenants)</span>\n <span class=\"at-tg-toggle-d\">\n Off = restricted to the scope rows below.\n @if (IsGlobalLocked()) { <strong>Locked while scope rows exist.</strong> }\n </span>\n </div>\n <div class=\"at-tg-switch\" [class.on]=\"SelectedTagFull.IsGlobal\"\n [class.disabled]=\"IsGlobalLocked() || SelectedTagSavingField['IsGlobal']\"\n (click)=\"ToggleGovernanceFlag('IsGlobal')\"></div>\n </div>\n\n <div class=\"at-tg-chip-list\">\n @for (s of SelectedTagScopes; track s.ID) {\n <span class=\"at-tg-chip scoped\">{{ s.EntityName }} \u00B7 {{ s.DisplayName }}</span>\n }\n @if (SelectedTagScopes.length === 0) {\n <span class=\"at-tg-hint\" style=\"font-style: italic;\">\n No scope rows. {{ SelectedTagFull.IsGlobal ? 'Tag is global.' : 'Tag is non-global with no scope \u2014 currently unreachable.' }}\n </span>\n }\n <button class=\"at-action-btn at-btn-sm\" (click)=\"OpenScopeDialog()\">\n <i class=\"fa-solid fa-pencil\"></i> Edit scope\u2026\n </button>\n </div>\n <div class=\"at-tg-hint\" style=\"margin-top: 8px;\">\n <i class=\"fa-solid fa-info-circle\"></i> Children inherit this scope automatically. Promotion to global requires admin approval.\n </div>\n </div>\n\n <!-- \u2500\u2500\u2500 Synonyms \u2014 alternate names that resolve to this tag \u2500\u2500\u2500 -->\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Synonyms \u2014 alternate names that resolve to this tag</div>\n\n <div class=\"at-tg-syn-add\">\n <input class=\"at-search-input\" placeholder='e.g. \"GenAI\"'\n [(ngModel)]=\"NewSynonymName\"\n (keyup.enter)=\"AddSynonym()\" />\n <select class=\"at-search-input\" style=\"width: 130px;\"\n [(ngModel)]=\"NewSynonymSource\">\n <option value=\"Manual\">Manual</option>\n <option value=\"Imported\">Imported</option>\n <option value=\"Merged\">Merged</option>\n <option value=\"LLM\">LLM</option>\n </select>\n <button class=\"at-action-btn at-primary-btn\" (click)=\"AddSynonym()\" [disabled]=\"!NewSynonymName.trim()\">+ Add</button>\n </div>\n\n @if (SelectedTagSynonyms.length === 0) {\n <div class=\"at-tg-hint\" style=\"font-style: italic;\">No synonyms yet.</div>\n } @else {\n @for (s of SelectedTagSynonyms; track s.ID) {\n <div class=\"at-tg-syn-row\" [class.pending]=\"s.Source === 'LLM'\">\n <div class=\"at-tg-syn-name\">{{ s.Synonym }}</div>\n <span class=\"at-tg-syn-src {{ s.Source.toLowerCase() }}\">{{ s.Source }}</span>\n <span class=\"at-tg-syn-x\" title=\"Remove\" (click)=\"RemoveSynonym(s)\"><i class=\"fa-solid fa-xmark\"></i></span>\n </div>\n }\n }\n </div>\n }\n } @else {\n <div class=\"at-empty-state\" style=\"height: 100%;\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a tag from the tree to view details</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Health bar -->\n <div class=\"at-tax-health-bar\">\n <span class=\"at-tax-health-label\">Taxonomy Health</span>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-total\"></span>\n <span class=\"at-tax-health-value\">{{ TaxHealth.Total }}</span>\n <span class=\"at-tax-health-text\">Total</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-healthy\"></span>\n <span class=\"at-tax-health-value at-tax-val-success\">{{ TaxHealth.Healthy }}</span>\n <span class=\"at-tax-health-text\">Healthy</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-attention\"></span>\n <span class=\"at-tax-health-value at-tax-val-warning\">{{ TaxHealth.NeedAttention }}</span>\n <span class=\"at-tax-health-text\">Need Attention</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-orphaned\"></span>\n <span class=\"at-tax-health-value at-tax-val-error\">{{ TaxHealth.Orphaned }}</span>\n <span class=\"at-tax-health-text\">Orphaned</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-duplicates\"></span>\n <span class=\"at-tax-health-value at-tax-val-info\">{{ TaxHealth.Duplicates }}</span>\n <span class=\"at-tax-health-text\">Duplicate Candidates</span>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550 SUB-TAB 2: DUPLICATES \u2550\u2550 -->\n @if (TaxSubTab === 'duplicates') {\n <div class=\"at-tax-dup-stats-bar\">\n <div class=\"at-tax-dup-stat\"><strong>{{ TaxDuplicates.length }}</strong> candidates found</div>\n <div class=\"at-tax-dup-stat at-tax-dup-high\"><strong>{{ TaxHighConfidenceDupeCount }}</strong> high confidence (&gt;85%)</div>\n <div class=\"at-tax-dup-stat at-tax-dup-moderate\"><strong>{{ TaxModerateDupeCount }}</strong> moderate (70-85%)</div>\n </div>\n\n @if (TaxDuplicates.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No duplicate tags detected</p>\n </div>\n }\n\n <div class=\"at-tax-dup-list\">\n @for (pair of TaxDuplicates; track $index) {\n <div class=\"at-tax-dup-card\" [class.at-tax-dup-high]=\"pair.SeverityClass === 'high'\" [class.at-tax-dup-moderate]=\"pair.SeverityClass === 'moderate'\">\n @if (pair.IsExactDuplicate) {\n <!-- Exact-name duplicates: show single tag name with count -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-similarity\">\n <span class=\"at-tax-sim-percent high\">\n <i class=\"fa-solid fa-clone\"></i>&nbsp;{{ pair.ExactDuplicateCount }} identical records\n </span>\n </div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n } @else {\n <!-- Similar (non-exact) pairs: show both tags with similarity -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-similarity\">\n <div class=\"at-tax-sim-bar-bg\">\n <div class=\"at-tax-sim-bar-fill\" [class]=\"pair.SeverityClass\" [style.width.%]=\"pair.Similarity\"></div>\n </div>\n <span class=\"at-tax-sim-percent\" [class]=\"pair.SeverityClass\">{{ pair.Similarity }}%</span>\n </div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-tag\">{{ pair.TagB }}</div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"MakeChildTag(pair.TagAID, pair.TagBID)\">Make Child</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- \u2550\u2550 SUB-TAB 3: ORPHANS \u2550\u2550 -->\n @if (TaxSubTab === 'orphans') {\n <div class=\"at-tax-orphan-toolbar\">\n <span class=\"at-tax-orphan-count\">{{ TaxOrphans.length }} orphaned tags</span>\n <span class=\"at-tax-orphan-desc\">&mdash; no parent, no children, low usage</span>\n <div class=\"at-tax-orphan-bulk\">\n <button class=\"at-tax-bulk-btn\" (click)=\"ToggleAllOrphans()\">\n @if (TaxAllOrphansSelected) { <i class=\"fa-solid fa-square-check\"></i> } @else { <i class=\"fa-regular fa-square\"></i> }\n Select All\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"BulkDeleteOrphans()\">\n <i class=\"fa-solid fa-trash\"></i> Bulk Delete\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"DeleteAllOrphans()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete All ({{ TaxOrphans.length }})\n </button>\n </div>\n </div>\n\n @if (TaxOrphans.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No orphaned tags</p>\n </div>\n }\n\n <div class=\"at-tax-orphan-grid\">\n @for (orphan of TaxOrphans; track orphan.ID) {\n <div class=\"at-tax-orphan-card\">\n <div class=\"at-tax-orphan-header\">\n <span class=\"at-tax-orphan-name\">{{ orphan.Name }}</span>\n <input type=\"checkbox\" class=\"at-tax-orphan-checkbox\" [checked]=\"orphan.IsSelected\"\n (change)=\"ToggleOrphanSelection(orphan)\" (click)=\"$event.stopPropagation()\">\n </div>\n <div class=\"at-tax-orphan-stats\">\n <span>Usage: <strong>{{ orphan.UsageCount }}</strong></span>\n <span>Avg Weight: <strong>{{ orphan.AvgWeight.toFixed(2) }}</strong></span>\n </div>\n <div class=\"at-tax-orphan-dates\">\n <span>First: {{ orphan.FirstSeen }}</span>\n <span>Last: {{ orphan.LastSeen }}</span>\n </div>\n <div class=\"at-tax-orphan-actions\">\n <button class=\"at-tax-orphan-btn at-tax-orphan-delete\" (click)=\"DeleteOrphan(orphan)\">Delete</button>\n <button class=\"at-tax-orphan-btn\">Ignore</button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- \u2550\u2550 SUB-TAB 4: TREEMAP \u2550\u2550 -->\n @if (TaxSubTab === 'treemap') {\n <div class=\"at-tax-treemap-kpi-strip\">\n @for (kpi of TaxTreemapKPIs; track kpi.Label) {\n <div class=\"at-tax-treemap-kpi\">\n <div class=\"at-tax-treemap-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"at-tax-treemap-kpi-label\">{{ kpi.Label }}</div>\n </div>\n }\n </div>\n\n @if (TaxTreemapCells.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-chart-tree-map\"></i>\n <p>No taxonomy data to visualize</p>\n </div>\n } @else {\n <div class=\"at-tax-treemap-container\">\n @for (cell of TaxTreemapCells; track $index) {\n <div class=\"at-tax-treemap-cell at-tax-treemap-cell-clickable\" [class]=\"cell.ColorClass\"\n [style.grid-row]=\"cell.RowSpan > 1 ? 'span ' + cell.RowSpan : ''\"\n (click)=\"OpenTreemapDrillIn(cell)\">\n <span class=\"at-tax-cell-name\">{{ cell.Name }}</span>\n <span class=\"at-tax-cell-count\">{{ cell.ItemCount }} items</span>\n </div>\n }\n </div>\n }\n\n <!-- Treemap Drill-In Panel -->\n @if (ShowTreemapDrillIn && TreemapDrillInNode) {\n <div class=\"at-tax-drillin-overlay\" (click)=\"CloseTreemapDrillIn()\">\n <div class=\"at-tax-drillin-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-tax-drillin-header\">\n <h3><i class=\"fa-solid fa-tag\"></i> {{ TreemapDrillInNode.Name }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseTreemapDrillIn()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-tax-drillin-body\">\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n </div>\n\n @if (TreemapDrillInNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TreemapDrillInNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\">{{ child.Name }} <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span></span>\n }\n </div>\n </div>\n }\n\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tax-drillin-footer\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"DrillInToTreeView(TreemapDrillInNode)\">\n <i class=\"fa-solid fa-sitemap\"></i> View in Tree\n </button>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- \u2550\u2550 SUB-TAB 5: AUDIT LOG \u2550\u2550 -->\n @if (TaxSubTab === 'audit') {\n <div class=\"at-tax-audit-filters\">\n <span class=\"at-tax-audit-filter-label\">Filter</span>\n <div class=\"at-tax-audit-checkbox-group\">\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('created')\" (change)=\"ToggleTaxAuditFilter('created')\"> Created\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('merged')\" (change)=\"ToggleTaxAuditFilter('merged')\"> Merged\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('moved')\" (change)=\"ToggleTaxAuditFilter('moved')\"> Moved\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deleted')\" (change)=\"ToggleTaxAuditFilter('deleted')\"> Deleted\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('renamed')\" (change)=\"ToggleTaxAuditFilter('renamed')\"> Renamed\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deprecated')\" (change)=\"ToggleTaxAuditFilter('deprecated')\"> Deprecated\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('split')\" (change)=\"ToggleTaxAuditFilter('split')\"> Split\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('reactivated')\" (change)=\"ToggleTaxAuditFilter('reactivated')\"> Reactivated\n </label>\n </div>\n </div>\n\n @if (GetFilteredAuditEvents().length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-scroll\"></i>\n <p>No audit events match the current filters</p>\n </div>\n }\n\n <div class=\"at-tax-audit-timeline\">\n @for (event of GetFilteredAuditEvents(); track $index) {\n <div class=\"at-tax-audit-event\">\n <div class=\"at-tax-audit-event-icon\" [class]=\"event.Type\">\n <i [class]=\"GetTaxAuditIcon(event.Type)\"></i>\n </div>\n <div class=\"at-tax-audit-event-body\">\n <div class=\"at-tax-audit-event-desc\">\n {{ event.Description }} <span class=\"at-tax-tag-ref\">{{ event.TagRef }}</span>\n </div>\n <div class=\"at-tax-audit-event-meta\">\n <span>{{ event.User }}</span>\n <span>{{ event.Timestamp }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <!-- TAB: SUGGESTIONS \u2014 server-driven inbox -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'suggestions') {\n <div class=\"at-page-body\">\n <div class=\"sg-shell\">\n <div class=\"sg-main\">\n <div class=\"sg-toolbar\">\n <input class=\"at-search-input\" style=\"width: 280px;\" placeholder=\"Search proposed name, source text\u2026\"\n [(ngModel)]=\"SuggestionSearch\" (input)=\"applySuggestionFilters()\" />\n <select class=\"at-search-input\" style=\"width: 200px;\"\n [(ngModel)]=\"SuggestionFilterReason\" (change)=\"applySuggestionFilters()\">\n <option value=\"\">All reasons</option>\n @for (r of ReasonOptions; track r) { <option [value]=\"r\">{{ r }}</option> }\n </select>\n <input class=\"at-search-input\" type=\"number\" step=\"0.05\" min=\"0\" max=\"1\"\n style=\"width: 100px;\" placeholder=\"Min score\"\n [ngModel]=\"SuggestionFilterMinScore\"\n (ngModelChange)=\"OnMinScoreChange($event)\" />\n <span style=\"flex: 1;\"></span>\n <span class=\"at-muted\" style=\"font-size: 12px;\">\n Showing <strong>{{ SuggestionRowsFiltered.length }} of {{ SuggestionRows.length }}</strong>\n </span>\n </div>\n\n @if (SelectedSuggestionCount() > 0) {\n <div class=\"sg-bulk-bar\">\n <strong>{{ SelectedSuggestionCount() }} selected</strong>\n <span style=\"flex: 1;\"></span>\n <button class=\"at-action-btn at-success-btn at-btn-sm\" (click)=\"BulkApprove()\" [disabled]=\"SuggestionBulkInProgress\">\n <i class=\"fa-solid fa-check\"></i> Approve all (auto-pick best)\n </button>\n <button class=\"at-action-btn at-danger-btn at-btn-sm\" (click)=\"BulkReject()\" [disabled]=\"SuggestionBulkInProgress\">\n <i class=\"fa-solid fa-xmark\"></i> Reject\n </button>\n </div>\n }\n\n <div class=\"sg-table-body\">\n @if (SuggestionRowsFiltered.length === 0) {\n <div class=\"at-empty-state\"><i class=\"fa-solid fa-inbox\"></i><p>No pending suggestions.</p></div>\n } @else {\n <table class=\"sg-table\">\n <thead>\n <tr>\n <th style=\"width: 30px;\">\n <input type=\"checkbox\"\n [checked]=\"SelectedSuggestionCount() === SuggestionRowsFiltered.length && SuggestionRowsFiltered.length > 0\"\n (change)=\"ToggleAllSuggestions($any($event.target).checked)\" />\n </th>\n <th>Proposed name</th>\n <th>Reason</th>\n <th>Best match</th>\n <th>Score</th>\n <th>Created</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (row of SuggestionRowsFiltered; track row.ID) {\n <tr [class.sg-row-checked]=\"row.selected\"\n [class.sg-row-selected]=\"SuggestionSelected && SuggestionSelected.ID === row.ID\"\n (click)=\"SelectSuggestion(row)\">\n <td><input type=\"checkbox\" [checked]=\"row.selected\" (click)=\"ToggleSuggestionSelected(row, $event)\" /></td>\n <td><strong>{{ row.ProposedName }}</strong></td>\n <td><span class=\"sg-reason {{ ReasonClass(row.Reason) }}\">{{ row.Reason }}</span></td>\n <td>\n @if (row.BestMatchName) {\n {{ row.BestMatchName }}\n <span class=\"at-muted\" style=\"font-size: 11px;\">{{ row.BestMatchPath }}</span>\n } @else {\n <span class=\"at-muted\">\u2014 no match \u2014</span>\n }\n </td>\n <td class=\"sg-score\">\n @if (row.BestMatchScore != null) {\n <span class=\"sg-score-bar\"><span [style.width.%]=\"row.BestMatchScore * 100\"></span></span>\n {{ row.BestMatchScore | number: '1.3-3' }}\n } @else {\n <span class=\"at-muted\">\u2014</span>\n }\n </td>\n <td class=\"at-muted\">{{ row.CreatedAt | date: 'short' }}</td>\n <td>\n @if (row.dispositionInProgress) {\n <span class=\"at-muted\" style=\"font-size: 11px;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> {{ row.dispositionInProgress }}\u2026\n </span>\n } @else {\n <div class=\"sg-row-actions\">\n <button class=\"at-action-btn at-btn-xs\" title=\"Create as new tag\"\n (click)=\"DispositionSuggestion(row, 'create-new'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n @if (row.BestMatchTagID) {\n <button class=\"at-action-btn at-primary-btn at-btn-xs\" title=\"Merge into best match\"\n (click)=\"DispositionSuggestion(row, 'merge'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-code-merge\"></i>\n </button>\n }\n <button class=\"at-action-btn at-danger-btn at-btn-xs\" title=\"Reject\"\n (click)=\"DispositionSuggestion(row, 'reject'); $event.stopPropagation()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n @if (SuggestionSelected) {\n <aside class=\"sg-drawer\">\n <div class=\"sg-drawer-hd\">\n <div>\n <div style=\"font-weight: 600;\">\"{{ SuggestionSelected.ProposedName }}\"</div>\n <div class=\"at-muted\" style=\"font-size: 11px;\">{{ SuggestionSelected.CreatedAt | date: 'short' }}</div>\n </div>\n <button class=\"at-action-btn at-btn-xs\" (click)=\"CloseDrawer()\" title=\"Close\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div class=\"sg-drawer-bd\">\n <span class=\"sg-reason {{ ReasonClass(SuggestionSelected.Reason) }}\">\n {{ SuggestionSelected.Reason }}\n @if (SuggestionSelected.BestMatchScore != null) { \u00B7 {{ SuggestionSelected.BestMatchScore | number: '1.3-3' }} }\n </span>\n\n @if (SuggestionSelected.BestMatchTagID) {\n <h4>Proposes merge into</h4>\n <div class=\"sg-candidate\">\n <div style=\"flex: 1;\">\n <div style=\"font-weight: 600;\">{{ SuggestionSelected.BestMatchName }}</div>\n <div class=\"at-muted\" style=\"font-size: 11px;\">{{ SuggestionSelected.BestMatchPath }}</div>\n </div>\n </div>\n }\n\n @if (SuggestionSelected.SourceText) {\n <h4>Source text</h4>\n <p class=\"sg-preview\">\"{{ SuggestionSelected.SourceText }}\"</p>\n }\n\n <h4>If approved</h4>\n <p class=\"sg-preview\">\n @if (SuggestionSelected.BestMatchTagID) {\n Re-point any free-text ContentItemTag rows whose Tag matches \"<strong>{{ SuggestionSelected.ProposedName }}</strong>\" to <strong>{{ SuggestionSelected.BestMatchName }}</strong>, add it as a synonym (Source: Merged), and mark the suggestion as Merged.\n } @else {\n Create a new tag named \"<strong>{{ SuggestionSelected.ProposedName }}</strong>\" (subject to ValidateAutoGrow), inherit parent scope when applicable, and re-point any matching free-text ContentItemTag rows.\n }\n </p>\n </div>\n <div class=\"sg-drawer-ft\">\n @if (SuggestionSelected.BestMatchTagID) {\n <button class=\"at-action-btn at-primary-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'merge')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-code-merge\"></i> Merge\n </button>\n }\n <button class=\"at-action-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'create-new')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-plus\"></i> Create as new\n </button>\n <button class=\"at-action-btn at-danger-btn\" (click)=\"DispositionSuggestion(SuggestionSelected!, 'reject')\"\n [disabled]=\"!!SuggestionSelected.dispositionInProgress\">\n <i class=\"fa-solid fa-xmark\"></i> Reject\n </button>\n </div>\n </aside>\n }\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <!-- TAB: HEALTH \u2014 Tag Health 3-card summary -->\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ActiveTab === 'health') {\n <div class=\"health-shell\">\n <div class=\"runbar\">\n <div class=\"stat\">\n <div class=\"l\">Last run</div>\n <div class=\"v\">{{ LastHealthSummary.runAt ? (LastHealthSummary.runAt | date: 'short') : '\u2014' }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Tags scanned</div>\n <div class=\"v\">{{ tagsRaw.length }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Issues enqueued (last run)</div>\n <div class=\"v\">{{ LastHealthSummary.mergeCount + LastHealthSummary.lowUsageCount + LastHealthSummary.wideNodeCount }}</div>\n </div>\n <div class=\"stat\">\n <div class=\"l\">Pending suggestions</div>\n <div class=\"v\">{{ PendingSuggestionCount }}</div>\n </div>\n <span class=\"grow\"></span>\n <div class=\"stat\">\n <div class=\"l\">Last duration</div>\n <div class=\"v\">{{ LastHealthSummary.durationMs ? (LastHealthSummary.durationMs + 'ms') : '\u2014' }}</div>\n </div>\n </div>\n\n <div class=\"health-cards\">\n <div class=\"h-card merge\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-code-merge\"></i></div>\n <div>\n <div class=\"name\">Merge candidates</div>\n <h3>Likely duplicate tags</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.mergeCount }}</div>\n <p class=\"sub\">Pairs with high embedding cosine + name similarity. Approving merges the source into the target and re-points existing ContentItemTag rows.</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'MergeCandidate'; applySuggestionFilters()\">\n Open in Suggestions\n </button>\n </div>\n </div>\n\n <div class=\"h-card lowusage\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-leaf\"></i></div>\n <div>\n <div class=\"name\">Low usage</div>\n <h3>Deprecation candidates</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.lowUsageCount }}</div>\n <p class=\"sub\">Active tags used fewer than the threshold over the lookback window. Often abandoned imports or finished-project tags.</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'LowUsage'; applySuggestionFilters()\">\n Review\n </button>\n </div>\n </div>\n\n <div class=\"h-card widenode\">\n <div class=\"top\">\n <div class=\"ic\"><i class=\"fa-solid fa-tree\"></i></div>\n <div>\n <div class=\"name\">Wide nodes</div>\n <h3>Parents with too many children</h3>\n </div>\n </div>\n <div class=\"big\">{{ LastHealthSummary.wideNodeCount }}</div>\n <p class=\"sub\">Parents whose direct-child count exceeds <strong>MaxChildren</strong> (or the implicit threshold {{ HealthThresholds.maxImplicitChildren }} when no cap is set).</p>\n <div class=\"ft\">\n <button class=\"at-action-btn at-primary-btn at-btn-sm\" (click)=\"SwitchTab('suggestions'); SuggestionFilterReason = 'WideNode'; applySuggestionFilters()\">\n Review\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"threshold-form\">\n <h3>Health-job thresholds</h3>\n <div class=\"grid\">\n <div class=\"field\"><label>Merge: min co-occurrence</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.minCoOccurrence\" />\n <span class=\"at-hint\">Pairs must appear together in \u2265 this many items.</span>\n </div>\n <div class=\"field\"><label>Merge: min embedding cosine</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.01\" [(ngModel)]=\"HealthThresholds.minEmbeddingSimilarity\" />\n </div>\n <div class=\"field\"><label>Merge: min name similarity</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" max=\"1\" step=\"0.05\" [(ngModel)]=\"HealthThresholds.minNameSimilarity\" />\n <span class=\"at-hint\">Dice's-coefficient bigram similarity.</span>\n </div>\n <div class=\"field\"><label>Low usage: max usage</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.maxUsage\" />\n </div>\n <div class=\"field\"><label>Wide node: max implicit children</label>\n <input class=\"at-search-input\" type=\"number\" min=\"0\" [(ngModel)]=\"HealthThresholds.maxImplicitChildren\" />\n <span class=\"at-hint\">Used when a tag has no explicit MaxChildren cap.</span>\n </div>\n </div>\n </div>\n\n <div class=\"run-history\">\n <div class=\"run-history-hd\">\n <h3>Run history</h3>\n <span class=\"at-muted\" style=\"font-size: 11px;\">last {{ HealthRunHistory.length }} runs</span>\n </div>\n @if (HealthRunHistory.length === 0) {\n <div class=\"at-empty-state\" style=\"padding: 32px;\"><i class=\"fa-solid fa-clock-rotate-left\"></i><p>No runs yet.</p></div>\n } @else {\n <table>\n <thead>\n <tr>\n <th>When</th><th>Trigger</th><th>Tags scanned</th><th>Merge</th><th>Low usage</th><th>Wide node</th><th>Total</th><th>Duration</th>\n </tr>\n </thead>\n <tbody>\n @for (run of HealthRunHistory; track run.When) {\n <tr>\n <td class=\"at-muted\">{{ run.When | date: 'short' }}</td>\n <td>{{ run.Trigger }}</td>\n <td>{{ run.TagsScanned }}</td>\n <td>{{ run.Merge }}</td>\n <td>{{ run.LowUsage }}</td>\n <td>{{ run.WideNode }}</td>\n <td><strong>{{ run.Merge + run.LowUsage + run.WideNode }}</strong></td>\n <td>{{ run.DurationMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n\n <!-- end @if (!IsLoading) -->\n }\n\n </div>\n <!-- end at-main-area -->\n </mj-page-body-interior>\n </mj-left-nav-content>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 ITEM DETAIL SLIDE-IN \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowItemDetail && SelectedFeedItem) {\n <div class=\"at-slide-overlay\" (click)=\"CloseItemDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Content Item</h3>\n <button class=\"at-slide-close\" aria-label=\"Close item detail\" (click)=\"CloseItemDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n <!-- Header -->\n <div class=\"at-detail-item-header\">\n <h4 class=\"at-detail-item-name\">{{ SelectedFeedItem.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-source\">{{ SelectedFeedItem.SourceName }}</span>\n @if (SelectedFeedItem.RequiresContentType) {\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedFeedItem.ContentTypeName }}</span>\n @if (SelectedFeedItem.FileTypeName) {\n <span class=\"at-detail-badge at-detail-badge-file\"><i class=\"fa-solid fa-file\"></i> {{ SelectedFeedItem.FileTypeName }}</span>\n }\n }\n </div>\n </div>\n\n <!-- URL -->\n @if (SelectedFeedItem.URL) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">URL</div>\n <a [href]=\"SelectedFeedItem.URL\" target=\"_blank\" class=\"at-detail-link\">\n {{ SelectedFeedItem.URL }}\n <i class=\"fa-solid fa-external-link-alt\" style=\"font-size: 0.65rem; margin-left: 4px;\"></i>\n </a>\n </div>\n }\n\n <!-- Text Preview -->\n @if (SelectedFeedItem.TextContent) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Content Preview</div>\n <div class=\"at-detail-text-preview\">{{ SelectedFeedItem.TextContent }}</div>\n </div>\n }\n\n <!-- Tags (weighted) -->\n @if (SelectedFeedItem.Tags.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Tags ({{ SelectedFeedItem.Tags.length }})</div>\n <div class=\"at-detail-tags\">\n @for (wt of SelectedFeedItem.Tags; track wt.Tag) {\n <span class=\"at-tag-pill at-tag-weighted\" [style.font-size]=\"TagFontSize(wt.Weight)\">\n {{ wt.Tag }}\n <span class=\"at-tag-weight\">{{ FormatWeight(wt.Weight) }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Metadata -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Metadata</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedFeedItem.Checksum) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Checksum</span>\n <span class=\"at-detail-meta-value at-detail-meta-mono\">{{ SelectedFeedItem.Checksum }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Created</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.CreatedAt }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Updated</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.UpdatedAt }}</span>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenRecordFromItem(SelectedFeedItem)\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open Record\n </button>\n <button class=\"at-action-btn at-secondary-btn\" disabled>\n <i class=\"fa-solid fa-magnifying-glass\"></i> See Similar Items\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CONFIRMATION DIALOG \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowConfirmDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"ConfirmDialogCancel()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ConfirmDialogTitle }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"ConfirmDialogCancel()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p class=\"at-confirm-message\">{{ ConfirmDialogMessage }}</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-danger-btn\" (click)=\"ConfirmDialogAccept()\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ConfirmDialogCancel()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 SPLIT DIALOG \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowSplitDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseSplitDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-code-branch\"></i> Split Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseSplitDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New tag names (comma-separated)</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\"\n [(ngModel)]=\"SplitChildNames\"\n placeholder=\"Tag A, Tag B, Tag C\" />\n </div>\n <p class=\"at-confirm-message\">New tags will be created as siblings of the original tag under the same parent.</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteSplit()\" [disabled]=\"!SplitChildNames.trim()\">\n <i class=\"fa-solid fa-code-branch\"></i> Create Tags\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseSplitDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 MOVE DIALOG \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @if (ShowCreateTagDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseCreateTagDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-plus\"></i> Create Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseCreateTagDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-tax-create-context\">{{ CreateTagParentLabel }}</div>\n <div class=\"at-schedule-field\">\n <label>Name</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagName\"\n placeholder=\"Tag name\" (keydown.enter)=\"SaveNewTag()\">\n </div>\n <div class=\"at-schedule-field\">\n <label>Description (optional)</label>\n <textarea class=\"mj-textarea\" rows=\"3\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagDescription\"\n placeholder=\"Brief description of this tag\"></textarea>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveNewTag()\" [disabled]=\"!CreateTagName.trim()\">\n <i class=\"fa-solid fa-check\"></i> Create\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseCreateTagDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMoveDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMoveDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-arrows-up-down\"></i> Move Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMoveDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New parent tag</label>\n <select class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"MoveNewParentID\">\n <option [ngValue]=\"null\">(Root level &mdash; no parent)</option>\n @for (opt of GetMoveTargetOptions(); track opt.ID) {\n <option [ngValue]=\"opt.ID\">{{ '\\u00A0\\u00A0'.repeat(opt.Depth) }}{{ opt.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMove()\">\n <i class=\"fa-solid fa-check\"></i> Move\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMoveDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMergeIntoDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMergeIntoDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-compress\"></i> Merge \"{{ MergeSourceTag?.Name }}\" Into...</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMergeIntoDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p style=\"font-size: 0.85rem; color: var(--mj-text-secondary); margin: 0 0 12px;\">\n All tagged items will be moved to the target tag, then \"{{ MergeSourceTag?.Name }}\" will be deleted.\n </p>\n <div class=\"at-schedule-field\">\n <label>Merge into</label>\n <mj-combobox\n [Data]=\"MergeTargetData\"\n TextField=\"Label\"\n ValueField=\"ID\"\n [Filterable]=\"true\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Search and select a tag...\"\n (ValueChange)=\"OnMergeTargetSelected($event)\">\n </mj-combobox>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMergeInto()\" [disabled]=\"!MergeTargetID || IsMerging\">\n @if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { <i class=\"fa-solid fa-compress\"></i> Merge }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMergeIntoDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n </div>\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ============================================================\n Content Autotagging Dashboard\n All colors use MJ design tokens \u2014 no hardcoded hex values.\n All classes prefixed with at- to prevent leaking (ViewEncapsulation.None).\n ============================================================ */\n\n/* \u2500\u2500 Root layout \u2500\u2500 */\n\n.at-dashboard {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/*\n Left rail now owned by <mj-left-nav> (~50 lines of bespoke .at-left-nav-items\n / .at-nav-item / .at-nav-badge / .at-nav-divider styles retired). The footer\n stayed bespoke since it's \"Run Pipeline\" CTA content, not nav chrome.\n*/\n\n.at-left-nav-footer {\n padding: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-run-pipeline-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px;\n border: none;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.at-run-pipeline-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-run-pipeline-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 MAIN CONTENT AREA \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-main-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.at-loading-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n/* .at-page-header / .at-page-title / .at-page-subtitle / .at-page-actions\n retired \u2014 section identity + actions now live in <mj-page-header-interior>\n (one shared instance at the top of <mj-left-nav-content>, with Title/Subtitle\n driven by currentTabTitle/currentTabSubtitle getters and per-section action\n buttons projected via an @switch into the chrome's [actions] slot). */\n\n.at-page-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding: 16px 20px;\n min-height: 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SHARED COMPONENTS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n border: 1px solid;\n border-radius: 7px;\n cursor: pointer;\n font-size: 0.78rem;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.at-primary-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-primary-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.at-primary-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.at-secondary-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.at-secondary-btn:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.at-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-card-title {\n font-size: 0.82rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-primary);\n}\n\n.at-card-title i {\n color: var(--mj-brand-primary);\n font-size: 0.75rem;\n}\n\n.at-card-body {\n padding: 0;\n}\n\n.at-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-disabled);\n}\n\n.at-empty-state i {\n font-size: 28px;\n}\n\n.at-empty-state p {\n margin: 0;\n font-size: 13px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 KPI STRIP \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-kpi-strip {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.at-kpi-card {\n flex: 1;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.at-kpi-value {\n font-size: 1.4rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-kpi-error-value {\n color: var(--mj-status-error-text);\n}\n\n.at-kpi-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-kpi-trend {\n font-size: 0.68rem;\n margin-top: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-text-muted);\n}\n\n.at-kpi-trend.up {\n color: var(--mj-status-success-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 PIPELINE TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-layout {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n}\n\n.at-pipeline-center {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n}\n\n.at-pipeline-right {\n width: 320px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Pipeline Stages */\n\n.at-pipeline-stages {\n display: flex;\n gap: 0;\n align-items: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 16px;\n}\n\n.at-pipeline-stage {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n}\n\n.at-pipeline-stage-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n font-size: 0.85rem;\n}\n\n.stage-idle .at-pipeline-stage-icon {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.stage-active .at-pipeline-stage-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.stage-complete .at-pipeline-stage-icon {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n@keyframes at-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 30%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent); }\n}\n\n.at-pipeline-stage-name {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.at-pipeline-stage-count {\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.at-pipeline-arrow {\n width: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 0.6rem;\n}\n\n.at-stage-connector {\n width: 32px;\n height: 2px;\n background: var(--mj-border-default);\n transition: background 0.4s ease;\n}\n\n.at-stage-connector.connector-complete {\n background: var(--mj-status-success);\n}\n\n/* Progress section */\n\n.at-progress-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 10px 16px;\n}\n\n.at-progress-header {\n display: flex;\n justify-content: space-between;\n font-size: 0.75rem;\n margin-bottom: 4px;\n}\n\n.at-progress-stage-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.at-progress-pct {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.at-progress-bar {\n height: 4px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.at-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 2px;\n transition: width 0.3s ease;\n}\n\n.at-progress-current {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n margin-top: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-progress-fill-paused {\n background: var(--mj-status-warning);\n animation: pulse-paused 1.5s ease-in-out infinite;\n}\n\n@keyframes pulse-paused {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n\n.at-pipeline-controls {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n justify-content: flex-end;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n}\n\n.at-danger-btn:hover:not(:disabled) {\n background: var(--mj-status-error-text);\n border-color: var(--mj-status-error-text);\n}\n\n/* Feed items */\n\n.at-feed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-feed-item:last-child {\n border-bottom: none;\n}\n\n.at-feed-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-feed-status-dot.complete {\n background: var(--mj-status-success);\n}\n\n.at-feed-status-dot.processing {\n background: var(--mj-brand-primary);\n animation: at-pulse 1.5s infinite;\n}\n\n.at-feed-status-dot.error {\n background: var(--mj-status-error);\n}\n\n.at-feed-item-name {\n flex: 1;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-feed-item-source {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n min-width: 100px;\n}\n\n.at-feed-item-tags {\n display: flex;\n gap: 4px;\n}\n\n.at-feed-tag {\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 0.62rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-feed-item-time {\n color: var(--mj-text-muted);\n font-size: 0.68rem;\n white-space: nowrap;\n min-width: 60px;\n text-align: right;\n}\n\n/* Source mini cards (right panel) */\n\n.at-source-mini {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-source-mini:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-source-mini:last-child {\n border-bottom: none;\n}\n\n.at-source-mini-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-source-mini-info {\n flex: 1;\n min-width: 0;\n}\n\n.at-source-mini-name {\n font-size: 0.78rem;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.at-source-mini-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-mini-status {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-source-mini-status.active {\n background: var(--mj-status-success);\n}\n\n.at-source-mini-status.error {\n background: var(--mj-status-error);\n}\n\n.at-source-mini-status.inactive {\n background: var(--mj-text-disabled);\n}\n\n/* Tag cloud card */\n\n.at-tag-cloud-card {\n padding: 16px;\n}\n\n.at-tag-cloud {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n.at-tag-pill {\n padding: 4px 12px;\n border-radius: 14px;\n font-size: 0.72rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-tag-pill:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tag-weighted {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tag-weight {\n font-size: 0.6rem;\n opacity: 0.6;\n font-weight: 400;\n}\n\n.at-tag-row-clickable {\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-tag-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.at-tag-pill.large {\n font-size: 0.85rem;\n padding: 5px 14px;\n}\n\n.at-tag-pill.small {\n font-size: 0.65rem;\n padding: 3px 8px;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SOURCES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-sources-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 12px;\n}\n\n.at-source-card-full {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n transition: border-color 0.15s ease;\n}\n\n.at-source-card-full:hover {\n border-color: var(--mj-border-default);\n}\n\n.at-source-card-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 12px;\n}\n\n.at-source-card-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.at-source-card-title {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-card-type {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-status {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.7rem;\n font-weight: 500;\n}\n\n.at-source-card-status.active {\n color: var(--mj-status-success-text);\n}\n\n.at-source-card-status.error {\n color: var(--mj-status-error-text);\n}\n\n.at-source-card-status.inactive {\n color: var(--mj-text-disabled);\n}\n\n.at-source-card-url {\n font-size: 0.7rem;\n color: var(--mj-brand-primary);\n margin-bottom: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-source-card-stats {\n display: flex;\n gap: 16px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.at-source-stat {\n display: flex;\n flex-direction: column;\n}\n\n.at-source-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-source-stat-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-source-card-actions {\n display: flex;\n gap: 6px;\n margin-top: 10px;\n}\n\n.at-source-action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.7rem;\n cursor: pointer;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n transition: all 0.12s ease;\n}\n\n.at-source-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-source-delete-btn:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error-text);\n}\n\n.at-add-source-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-source-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-source-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CONTENT TYPES TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-ct-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.at-ct-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 16px;\n}\n\n.at-ct-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n\n.at-ct-card-name {\n font-size: 0.9rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-ct-card-model {\n font-size: 0.68rem;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-ct-field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-ct-field:last-child {\n border-bottom: none;\n}\n\n.at-ct-field-label {\n color: var(--mj-text-muted);\n}\n\n.at-ct-field-value {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 0.75rem;\n color: var(--mj-text-primary);\n}\n\n.at-ct-tag-range i {\n color: var(--mj-brand-primary);\n}\n\n.at-ct-tag-range-bar {\n flex: 1;\n height: 6px;\n background: var(--mj-bg-surface);\n border-radius: 3px;\n position: relative;\n}\n\n.at-ct-tag-range-fill {\n position: absolute;\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n.at-ct-range-suffix {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 TAG LIBRARY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tag-lib-layout {\n display: flex;\n gap: 16px;\n}\n\n.at-tag-lib-main {\n flex: 1;\n}\n\n.at-tag-lib-sidebar {\n width: 280px;\n flex-shrink: 0;\n}\n\n.at-tag-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-tag-table th {\n text-align: left;\n padding: 8px 12px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-tag-table td {\n padding: 10px 12px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tag-name-cell {\n font-weight: 600;\n}\n\n.at-tag-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n display: inline-block;\n vertical-align: middle;\n}\n\n.at-tag-bar-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n}\n\n/* Weight indicator in tag table */\n.at-weight-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-weight-bar {\n width: 50px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-weight-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.2s ease;\n}\n\n.at-weight-bar-fill.at-weight-high {\n background: var(--mj-status-success);\n}\n\n.at-weight-bar-fill.at-weight-medium {\n background: var(--mj-status-warning);\n}\n\n.at-weight-bar-fill.at-weight-low {\n background: var(--mj-status-error);\n}\n\n.at-weight-value {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n min-width: 28px;\n}\n\n.at-tags-by-source {\n font-size: 0.78rem;\n}\n\n.at-tag-source-row {\n display: flex;\n justify-content: space-between;\n padding: 5px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-tag-source-row:last-child {\n border-bottom: none;\n}\n\n.at-search-input {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n width: 200px;\n outline: none;\n}\n\n.at-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-search-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RUN HISTORY TAB \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-run-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.at-run-table th {\n text-align: left;\n padding: 10px 14px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-elevated);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.at-run-table td {\n padding: 12px 14px;\n font-size: 0.8rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.at-run-table tr:hover td {\n background: var(--mj-bg-surface-hover);\n cursor: pointer;\n}\n\n.at-run-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-run-status-badge.complete {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-run-status-badge.failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-run-status-badge.running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-run-duration {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n}\n\n.at-run-source-name {\n font-weight: 500;\n}\n\n.at-run-error-text {\n color: var(--mj-status-error-text);\n}\n\n.at-filter-select {\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.78rem;\n outline: none;\n}\n\n.at-filter-select:focus {\n border-color: var(--mj-brand-primary);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM PANEL \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.at-slide-panel {\n position: fixed;\n right: 0;\n top: 0;\n bottom: 0;\n width: 420px;\n max-width: 100vw;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n}\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.at-slide-header h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n background: none;\n border: none;\n font-size: 1.1rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n}\n\n.at-slide-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-form-group {\n margin-bottom: 16px;\n}\n\n.at-form-label {\n display: block;\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n font-size: 0.82rem;\n outline: none;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.at-form-input::placeholder,\n.at-form-textarea::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-form-textarea {\n resize: vertical;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n margin-top: 24px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 RESPONSIVE \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n/* <mj-left-nav> collapses to a full-width top bar at \u2264700px; stack the root\n layout vertically so the content pane sits below it instead of being\n squeezed to zero width in the flex row. */\n@media (max-width: 700px) {\n .at-dashboard {\n flex-direction: column;\n }\n}\n\n@media (max-width: 1100px) {\n .at-pipeline-layout {\n flex-direction: column;\n }\n\n .at-pipeline-right {\n width: 100%;\n flex-direction: row;\n }\n\n .at-tag-lib-layout {\n flex-direction: column;\n }\n\n .at-tag-lib-sidebar {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-left-nav {\n width: 180px;\n }\n\n .at-kpi-strip {\n flex-wrap: wrap;\n }\n\n .at-kpi-card {\n min-width: 140px;\n }\n\n .at-sources-grid {\n grid-template-columns: 1fr;\n }\n\n .at-ct-grid {\n grid-template-columns: 1fr;\n }\n\n .at-slide-panel {\n width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .at-left-nav {\n width: 56px;\n }\n\n .at-left-nav-header h2 {\n font-size: 0;\n }\n\n .at-left-nav-header h2 i {\n font-size: 1rem;\n }\n\n .at-nav-item {\n justify-content: center;\n padding: 10px;\n font-size: 0;\n }\n\n .at-nav-item i {\n font-size: 1rem;\n }\n\n .at-nav-badge {\n display: none;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Slide-in Form Panel\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-slide-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 9999;\n animation: at-fade-in 0.2s ease;\n}\n\n@keyframes at-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n.at-slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 420px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 40px rgba(0, 0, 0, 0.4);\n z-index: 10000;\n display: flex;\n flex-direction: column;\n animation: at-slide-in 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes at-slide-in { from { transform: translateX(100%); } to { transform: translateX(0); } }\n\n.at-slide-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.at-slide-header h3 {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-slide-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.at-slide-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-slide-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.at-form-label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-form-input,\n.at-form-select,\n.at-form-textarea {\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 7px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n transition: border-color 0.15s ease;\n font-family: inherit;\n}\n\n.at-form-input:focus,\n.at-form-select:focus,\n.at-form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.at-form-select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M3 5l3 3 3-3'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 30px;\n}\n\n.at-form-textarea {\n resize: vertical;\n min-height: 70px;\n}\n\n.at-form-row {\n display: flex;\n gap: 12px;\n}\n\n.at-form-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-form-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* Also add empty state for Content Types (matching Sources) */\n.at-add-type-card {\n background: none;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px;\n cursor: pointer;\n transition: all 0.15s ease;\n color: var(--mj-text-muted);\n min-height: 200px;\n}\n\n.at-add-type-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-add-type-card i {\n font-size: 1.5rem;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORKED PIPELINE STAGES \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-pipeline-stages-forked {\n display: flex;\n align-items: center;\n gap: 0;\n}\n\n.at-pipeline-fork {\n display: flex;\n align-items: center;\n gap: 0;\n flex: 2;\n}\n\n.at-pipeline-fork-lines {\n width: 28px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n position: relative;\n flex-shrink: 0;\n}\n\n.at-pipeline-fork-line {\n height: 2px;\n background: var(--mj-border-default);\n width: 100%;\n position: relative;\n}\n\n.at-pipeline-fork-line::before {\n content: '';\n position: absolute;\n width: 2px;\n height: 12px;\n background: var(--mj-border-default);\n left: 0;\n}\n\n.at-fork-top::before {\n bottom: 0;\n left: 0;\n}\n\n.at-fork-bottom::before {\n top: 0;\n left: 0;\n}\n\n.at-pipeline-fork-branches {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n}\n\n.at-pipeline-fork-branches .at-pipeline-stage {\n flex: none;\n padding: 6px 0;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE FEED ITEMS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-item-clickable {\n cursor: pointer;\n}\n\n.at-feed-item-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FEED SEARCH & PAGINATION \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-feed-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.at-feed-header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-left: auto;\n}\n\n.at-feed-sort-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.68rem;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-feed-sort-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-feed-count {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.at-feed-search-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-search-icon {\n color: var(--mj-text-disabled);\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-feed-search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n outline: none;\n padding: 4px 0;\n min-width: 0;\n}\n\n.at-feed-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.at-feed-search-clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 9px;\n flex-shrink: 0;\n}\n\n.at-feed-search-clear:hover {\n background: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.at-feed-scroll-body {\n overflow-y: auto;\n min-height: 0;\n flex: 1;\n}\n\n.at-feed-item-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n overflow: hidden;\n}\n\n.at-feed-item-content .at-feed-item-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-feed-item-source-label {\n font-size: 0.7rem;\n font-weight: 500;\n color: var(--mj-brand-primary);\n}\n\n.at-feed-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.at-feed-pagination-label {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 CLICKABLE SOURCE CARDS \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-source-card-clickable {\n cursor: pointer;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 FORM HINT \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-form-hint {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n font-style: italic;\n margin-top: 2px;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 DETAIL PANEL (wider) \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-panel {\n width: 500px;\n}\n\n/* \u2500\u2500 Detail: Item header \u2500\u2500 */\n\n.at-detail-item-header {\n margin-bottom: 8px;\n}\n\n.at-detail-item-name {\n font-size: 1.05rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0 0 6px 0;\n word-break: break-word;\n}\n\n.at-detail-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-detail-badge {\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.at-detail-badge-source {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.at-detail-badge-type {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.at-detail-badge-file {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.at-detail-badge-status-active {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.at-detail-badge-status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.at-detail-badge-status-inactive {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-disabled);\n}\n\n/* \u2500\u2500 Detail: Sections \u2500\u2500 */\n\n.at-detail-section {\n margin-bottom: 4px;\n}\n\n.at-detail-section-label {\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.at-detail-link {\n font-size: 0.8rem;\n color: var(--mj-brand-primary);\n text-decoration: none;\n word-break: break-all;\n}\n\n.at-detail-link:hover {\n text-decoration: underline;\n}\n\n/* \u2500\u2500 Detail: Text preview \u2500\u2500 */\n\n.at-detail-text-preview {\n max-height: 200px;\n overflow-y: auto;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n font-size: 0.78rem;\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n}\n\n/* \u2500\u2500 Detail: Tags \u2500\u2500 */\n\n.at-detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n}\n\n/* \u2500\u2500 Detail: Meta grid \u2500\u2500 */\n\n.at-detail-meta-grid {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.at-detail-meta-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-detail-meta-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-meta-key {\n color: var(--mj-text-muted);\n font-weight: 500;\n flex-shrink: 0;\n margin-right: 12px;\n}\n\n.at-detail-meta-value {\n color: var(--mj-text-primary);\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-meta-mono {\n font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;\n font-size: 0.72rem;\n}\n\n/* \u2500\u2500 Detail: Actions \u2500\u2500 */\n\n.at-detail-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 8px;\n}\n\n.at-detail-actions .at-action-btn {\n flex: 1;\n justify-content: center;\n}\n\n/* \u2500\u2500 Detail: Source header \u2500\u2500 */\n\n.at-detail-source-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n/* \u2500\u2500 Detail: Stats strip \u2500\u2500 */\n\n.at-detail-stats-strip {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-detail-stat {\n flex: 1;\n min-width: 60px;\n text-align: center;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 8px 6px;\n}\n\n.at-detail-stat-value {\n font-size: 1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-detail-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Detail: Content Library \u2500\u2500 */\n\n.at-detail-content-list {\n max-height: 250px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.at-detail-content-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.at-detail-content-item:last-child {\n border-bottom: none;\n}\n\n.at-detail-content-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-detail-content-item-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-detail-content-item-tags {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.at-detail-content-item-time {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n/* \u2500\u2500 Detail: Run history \u2500\u2500 */\n\n.at-detail-run-history {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.at-detail-run-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.75rem;\n}\n\n.at-detail-run-row:last-child {\n border-bottom: none;\n}\n\n.at-detail-run-time {\n color: var(--mj-text-secondary);\n flex: 1;\n}\n\n.at-detail-run-duration {\n color: var(--mj-text-muted);\n}\n\n.at-detail-run-items {\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 600px) {\n .at-slide-panel {\n width: 100%;\n }\n\n .at-detail-panel {\n width: 100%;\n }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n TAXONOMY GOVERNANCE TAB\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n/* Sub-tab strip + badges retired \u2014 taxonomy sub-tabs now driven by <mj-tab-nav>\n in the [toolbar] slot of the taxonomy section, with TabConfig badges\n (warning variant for duplicates, error variant for orphans). */\n\n/* \u2500\u2500 Tree View: Split layout \u2500\u2500 */\n\n.at-tax-split-view {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n height: calc(100vh - 320px);\n min-height: 400px;\n overflow: hidden;\n}\n\n.at-tax-tree-panel {\n width: 40%;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n}\n\n.at-tax-tree-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 0.8rem;\n transition: background 0.15s, color 0.15s;\n}\n\n.at-tax-toolbar-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-tax-toolbar-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-tree-body {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.at-tax-tree-node {\n padding: 6px 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n cursor: pointer;\n transition: background 0.1s;\n line-height: 1.4;\n}\n\n.at-tax-tree-node:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-node-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.at-tax-node-drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n outline: 2px dashed var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.at-tax-node-multi-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.at-tax-tree-add-child {\n margin-left: auto;\n opacity: 0;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px 6px;\n border-radius: 4px;\n transition: opacity 0.15s, color 0.15s, background 0.15s;\n}\n\n.at-tax-tree-node:hover .at-tax-tree-add-child {\n opacity: 1;\n}\n\n.at-tax-tree-add-child:hover {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.at-tax-tree-checkbox {\n width: 14px;\n height: 14px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.at-tax-tree-saving-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 75%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n backdrop-filter: blur(1px);\n}\n\n.at-tax-create-context {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n margin-bottom: 12px;\n padding: 6px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.at-tax-tree-arrow {\n width: 16px;\n font-size: 0.55rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n text-align: center;\n cursor: pointer;\n}\n\n.at-tax-arrow-collapsed::before {\n content: \"\\25B6\";\n}\n\n.at-tax-arrow-expanded::before {\n content: \"\\25BC\";\n}\n\n.at-tax-arrow-leaf {\n visibility: hidden;\n}\n\n.at-tax-health-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.at-tax-health-dot.green {\n background: var(--mj-status-success);\n}\n\n.at-tax-health-dot.yellow {\n background: var(--mj-status-warning);\n}\n\n.at-tax-health-dot.red {\n background: var(--mj-status-error);\n}\n\n.at-tax-tree-label {\n flex: 1;\n color: var(--mj-text-primary);\n}\n\n.at-tax-tree-label-selected {\n font-weight: 700;\n}\n\n.at-tax-tree-count {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n/* \u2500\u2500 Details panel \u2500\u2500 */\n\n.at-tax-details-panel {\n width: 60%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.at-tax-details-header {\n padding: 20px 24px 0;\n}\n\n.at-tax-breadcrumb {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.at-tax-bc-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.at-tax-bc-link:hover {\n text-decoration: underline;\n}\n\n.at-tax-bc-sep {\n color: var(--mj-border-default);\n}\n\n.at-tax-bc-current {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.at-tax-details-title {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.at-tax-edit-icon {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.at-tax-edit-icon:hover {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-details-desc {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin-bottom: 16px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-tax-edit-form {\n margin-bottom: 16px;\n}\n\n/* \u2500\u2500 Stats row \u2500\u2500 */\n\n.at-tax-stats-row {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 16px;\n padding: 0 24px;\n}\n\n.at-tax-stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n min-width: 72px;\n}\n\n.at-tax-stat-value {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-stat-date {\n font-size: 0.8rem;\n}\n\n.at-tax-stat-label {\n font-size: 0.62rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* \u2500\u2500 Action toolbar \u2500\u2500 */\n\n.at-tax-action-toolbar {\n display: flex;\n gap: 8px;\n padding: 0 24px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.at-tax-action-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-action-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n/* \u2500\u2500 Detail sections \u2500\u2500 */\n\n.at-tax-detail-section {\n padding: 0 24px 20px;\n}\n\n.at-tax-section-title {\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n margin-bottom: 10px;\n}\n\n.at-tax-child-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.at-tax-child-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.at-tax-child-chip:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.at-tax-chip-count {\n font-size: 0.6rem;\n background: var(--mj-border-default);\n color: var(--mj-text-muted);\n padding: 0 5px;\n border-radius: 8px;\n}\n\n/* \u2500\u2500 Recent items \u2500\u2500 */\n\n.at-tax-recent-list {\n list-style: none;\n}\n\n.at-tax-recent-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 0.78rem;\n}\n\n.at-tax-recent-item:last-child {\n border-bottom: none;\n}\n\n.at-tax-recent-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.72rem;\n flex-shrink: 0;\n}\n\n.at-tax-recent-name {\n flex: 1;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-tax-recent-weight {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.at-tax-recent-date {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Health bar \u2500\u2500 */\n\n.at-tax-health-bar {\n display: flex;\n align-items: center;\n gap: 20px;\n padding: 12px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin-top: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-health-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-health-stat {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n}\n\n.at-tax-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n}\n\n.at-tax-dot-total {\n background: var(--mj-text-secondary);\n}\n\n.at-tax-dot-healthy {\n background: var(--mj-status-success);\n}\n\n.at-tax-dot-attention {\n background: var(--mj-status-warning);\n}\n\n.at-tax-dot-orphaned {\n background: var(--mj-status-error);\n}\n\n.at-tax-dot-duplicates {\n background: var(--mj-status-info);\n}\n\n.at-tax-health-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-val-success {\n color: var(--mj-status-success);\n}\n\n.at-tax-val-warning {\n color: var(--mj-status-warning);\n}\n\n.at-tax-val-error {\n color: var(--mj-status-error);\n}\n\n.at-tax-val-info {\n color: var(--mj-status-info);\n}\n\n.at-tax-health-text {\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550 Duplicates sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-dup-stats-bar {\n display: flex;\n gap: 24px;\n margin-bottom: 16px;\n align-items: center;\n}\n\n.at-tax-dup-stat {\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n}\n\n.at-tax-dup-stat strong {\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n margin-right: 4px;\n}\n\n.at-tax-dup-high strong {\n color: var(--mj-status-error);\n}\n\n.at-tax-dup-moderate strong {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-tax-dup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 20px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.at-tax-dup-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-card.at-tax-dup-high {\n border-left: 3px solid var(--mj-status-error);\n}\n\n.at-tax-dup-card.at-tax-dup-moderate {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.at-tax-dup-tag {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 120px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n text-align: center;\n}\n\n.at-tax-dup-arrow {\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.at-tax-dup-similarity {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n min-width: 100px;\n}\n\n.at-tax-sim-bar-bg {\n width: 100%;\n height: 6px;\n background: var(--mj-border-default);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.at-tax-sim-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s;\n}\n\n.at-tax-sim-bar-fill.high {\n background: var(--mj-status-error);\n}\n\n.at-tax-sim-bar-fill.moderate {\n background: var(--mj-status-warning);\n}\n\n.at-tax-sim-percent {\n font-size: 0.78rem;\n font-weight: 700;\n}\n\n.at-tax-sim-percent.high {\n color: var(--mj-status-error);\n}\n\n.at-tax-sim-percent.moderate {\n color: var(--mj-status-warning);\n}\n\n.at-tax-dup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-tax-dup-btn {\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n white-space: nowrap;\n}\n\n.at-tax-dup-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-dup-btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n/* \u2550\u2550\u2550\u2550 Orphans sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-orphan-toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-orphan-count {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-desc {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-bulk {\n margin-left: auto;\n display: flex;\n gap: 8px;\n}\n\n.at-tax-bulk-btn {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 0.15s;\n}\n\n.at-tax-bulk-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-bulk-danger:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.at-tax-orphan-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: 12px;\n}\n\n.at-tax-orphan-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 16px;\n transition: all 0.15s;\n display: flex;\n flex-direction: column;\n gap: 10px;\n border-top: 3px solid var(--mj-status-error);\n}\n\n.at-tax-orphan-card:hover {\n border-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.at-tax-orphan-name {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-tax-orphan-checkbox {\n width: 16px;\n height: 16px;\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-stats {\n display: flex;\n gap: 12px;\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-stats strong {\n color: var(--mj-text-secondary);\n}\n\n.at-tax-orphan-dates {\n display: flex;\n justify-content: space-between;\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n}\n\n.at-tax-orphan-actions {\n display: flex;\n gap: 6px;\n margin-top: 4px;\n}\n\n.at-tax-orphan-btn {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n background: var(--mj-bg-surface);\n font-size: 0.68rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: center;\n transition: all 0.15s;\n}\n\n.at-tax-orphan-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.at-tax-orphan-delete:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n/* \u2550\u2550\u2550\u2550 Treemap sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-kpi-strip {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.at-tax-treemap-kpi {\n padding: 10px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 120px;\n}\n\n.at-tax-treemap-kpi-value {\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.at-tax-treemap-kpi-label {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n.at-tax-treemap-container {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 8px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n grid-auto-rows: 80px;\n gap: 4px;\n min-height: 340px;\n}\n\n.at-tax-treemap-cell {\n border-radius: 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n overflow: hidden;\n}\n\n.at-tax-treemap-cell:hover {\n transform: scale(1.02);\n z-index: 2;\n}\n\n.at-tax-cell-name {\n font-size: 0.78rem;\n}\n\n.at-tax-cell-count {\n font-size: 0.65rem;\n opacity: 0.85;\n font-weight: 400;\n}\n\n/* Treemap color families */\n.at-tm-blue-1 { background: color-mix(in srgb, var(--mj-brand-primary) 90%, black); }\n.at-tm-blue-2 { background: var(--mj-brand-primary); }\n.at-tm-blue-3 { background: color-mix(in srgb, var(--mj-brand-primary) 75%, white); }\n.at-tm-blue-4 { background: color-mix(in srgb, var(--mj-brand-primary) 55%, white); }\n\n.at-tm-green-1 { background: color-mix(in srgb, var(--mj-status-success) 90%, black); }\n.at-tm-green-2 { background: var(--mj-status-success); }\n.at-tm-green-3 { background: color-mix(in srgb, var(--mj-status-success) 60%, white); color: var(--mj-text-primary); }\n\n.at-tm-purple-1 { background: color-mix(in srgb, var(--mj-status-info) 90%, black); }\n.at-tm-purple-2 { background: var(--mj-status-info); }\n.at-tm-purple-3 { background: color-mix(in srgb, var(--mj-status-info) 65%, white); }\n\n.at-tm-orange-1 { background: color-mix(in srgb, var(--mj-status-warning) 90%, black); }\n.at-tm-orange-2 { background: var(--mj-status-warning); }\n.at-tm-orange-3 { background: color-mix(in srgb, var(--mj-status-warning) 60%, white); color: var(--mj-text-primary); }\n\n/* \u2550\u2550\u2550\u2550 Audit Log sub-tab \u2550\u2550\u2550\u2550 */\n\n.at-tax-audit-filters {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-filter-label {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.at-tax-audit-checkbox-group {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.at-tax-audit-checkbox {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.at-tax-audit-checkbox input {\n accent-color: var(--mj-brand-primary);\n}\n\n.at-tax-audit-timeline {\n position: relative;\n padding-left: 32px;\n}\n\n.at-tax-audit-timeline::before {\n content: '';\n position: absolute;\n left: 14px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.at-tax-audit-event {\n position: relative;\n padding: 10px 16px;\n margin-bottom: 4px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n border-radius: 8px;\n transition: background 0.1s;\n}\n\n.at-tax-audit-event:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-tax-audit-event-icon {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.68rem;\n flex-shrink: 0;\n position: absolute;\n left: -32px;\n top: 10px;\n z-index: 1;\n}\n\n.at-tax-audit-event-icon.created {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.at-tax-audit-event-icon.merged {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.moved {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.at-tax-audit-event-icon.deleted {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.at-tax-audit-event-icon.renamed {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.at-tax-audit-event-body {\n flex: 1;\n}\n\n.at-tax-audit-event-desc {\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n line-height: 1.5;\n}\n\n.at-tax-tag-ref {\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n font-weight: 600;\n font-size: 0.72rem;\n border: 1px solid var(--mj-border-default);\n}\n\n.at-tax-audit-event-meta {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n margin-top: 2px;\n display: flex;\n gap: 12px;\n}\n\n/* \u2500\u2500 Taxonomy responsive \u2500\u2500 */\n\n@media (max-width: 1100px) {\n .at-tax-split-view {\n flex-direction: column;\n }\n\n .at-tax-tree-panel {\n width: 100%;\n max-height: 300px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .at-tax-details-panel {\n width: 100%;\n }\n}\n\n@media (max-width: 768px) {\n .at-tax-dup-card {\n flex-wrap: wrap;\n }\n\n .at-tax-orphan-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* \u2500\u2500 Pipeline Config Widget \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-config-card {\n margin-top: 12px;\n}\n\n.at-config-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px !important;\n}\n\n.at-config-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.at-config-label {\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n min-width: 90px;\n flex-shrink: 0;\n}\n\n.at-config-control {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n justify-content: flex-end;\n}\n\n.at-config-input {\n width: 70px;\n padding: 3px 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 0.75rem;\n text-align: right;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.at-config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.at-config-slider {\n flex: 1;\n max-width: 100px;\n accent-color: var(--mj-brand-primary);\n height: 4px;\n}\n\n.at-config-value {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n min-width: 40px;\n text-align: right;\n}\n\n.at-config-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n}\n\n.at-config-section-label {\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n/* Toggle Switch */\n.at-config-toggle {\n position: relative;\n display: inline-block;\n cursor: pointer;\n}\n\n.at-config-toggle input {\n display: none;\n}\n\n.at-toggle-track {\n display: block;\n width: 32px;\n height: 18px;\n background: var(--mj-border-strong);\n border-radius: 9px;\n transition: background 0.2s ease;\n position: relative;\n}\n\n.at-config-toggle input:checked + .at-toggle-track {\n background: var(--mj-brand-primary);\n}\n\n.at-toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0,0,0,0.15);\n}\n\n.at-config-toggle input:checked + .at-toggle-track .at-toggle-thumb {\n transform: translateX(14px);\n}\n\n/* \u2500\u2500 Schedule Indicator on Source Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-indicator {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 10px;\n margin-top: 6px;\n border-radius: 12px;\n font-size: 0.68rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n cursor: pointer;\n transition: all 0.15s ease;\n width: fit-content;\n}\n\n.at-schedule-indicator i {\n font-size: 0.62rem;\n}\n\n.at-schedule-indicator:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n/* Schedule button in source card actions */\n.at-source-schedule-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500 Schedule Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.at-schedule-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-schedule-dialog {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n width: 420px;\n max-width: 90vw;\n}\n\n.at-schedule-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-schedule-dialog-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-dialog-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 16px;\n padding: 4px;\n line-height: 1;\n transition: color 0.15s;\n}\n\n.at-schedule-dialog-close:hover {\n color: var(--mj-text-primary);\n}\n\n.at-schedule-dialog-body {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.at-schedule-field label {\n display: block;\n font-size: 11.5px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 6px;\n}\n\n.at-schedule-source-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-source-name i {\n color: var(--mj-text-muted);\n}\n\n.at-schedule-action-name {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.at-schedule-cron-input {\n width: 100%;\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n letter-spacing: 0.02em;\n}\n\n.at-schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.at-schedule-cron-preview i {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.at-schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n}\n\n.at-schedule-toggle-row label {\n margin-bottom: 0;\n}\n\n.at-schedule-dialog-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4: Status Badges for Content Items \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-status-badge {\n display: inline-block;\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 0.6rem;\n font-weight: 600;\n white-space: nowrap;\n letter-spacing: 0.02em;\n}\n\n.at-status-badge-complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.at-status-badge-processing {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.at-status-badge-failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.at-status-badge-pending {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D4/D7: Source Detail Controls \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-section-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.at-detail-section-controls {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.at-detail-filter-select {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 0.72rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n.at-retry-btn {\n font-size: 0.7rem !important;\n padding: 4px 8px !important;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface)) !important;\n color: var(--mj-status-error-text) !important;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-border-default)) !important;\n}\n\n.at-retry-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 18%, var(--mj-bg-surface)) !important;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 D7: Pagination \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-detail-pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 10px 0 4px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.at-page-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n font-size: 0.72rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.at-page-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.at-page-btn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.at-page-info {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Confirmation Dialog \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-confirm-message {\n font-size: 13.5px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n.at-danger-btn {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: var(--mj-radius-sm, 6px);\n padding: 7px 14px;\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.at-danger-btn:hover {\n background: var(--mj-status-error-text);\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550 Treemap Drill-In \u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.at-tax-treemap-cell-clickable {\n cursor: pointer;\n transition: transform 0.15s, box-shadow 0.15s;\n}\n\n.at-tax-treemap-cell-clickable:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n z-index: 1;\n}\n\n.at-tax-drillin-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: flex-start;\n justify-content: flex-end;\n background: var(--mj-bg-overlay, rgba(0, 0, 0, 0.4));\n}\n\n.at-tax-drillin-panel {\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n width: 420px;\n max-width: 90vw;\n height: 100vh;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n.at-tax-drillin-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.at-tax-drillin-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n\n.at-tax-drillin-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.at-tax-drillin-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n.at-tax-drillin-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* D3/D8: Clickable run history rows */\n.at-run-row-clickable {\n cursor: pointer;\n transition: background 0.12s ease;\n}\n\n.at-run-row-clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.at-run-row-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)) !important;\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* D2: Error text in detail tables */\n.run-error-text {\n color: var(--mj-status-error);\n font-weight: 600;\n}\n\n/* \u2500\u2500 Content Item Duplicates Section (G3) \u2500\u2500 */\n\n.at-dedup-section {\n margin-top: 24px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.at-dedup-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 16px;\n}\n\n.at-dedup-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.at-dedup-subtitle {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.at-dedup-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s;\n}\n\n.at-dedup-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.at-dedup-pair {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.at-dedup-item {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1;\n}\n\n.at-dedup-item-name {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.at-dedup-item-source {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-vs {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n flex-shrink: 0;\n}\n\n.at-dedup-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.at-dedup-score {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.at-dedup-method {\n font-size: 0.65rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.at-dedup-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.at-dedup-confirm {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-dismiss {\n font-size: 0.75rem !important;\n padding: 4px 10px !important;\n}\n\n.at-dedup-empty {\n text-align: center;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n\n.at-dedup-empty i {\n font-size: 1.5rem;\n margin-bottom: 8px;\n color: var(--mj-status-success);\n}\n\n.at-dedup-empty p {\n margin: 8px 0 0;\n font-size: 0.82rem;\n}\n\n/* =============================================================================\n * Tags-only additions: governance toggles, scope chips, inline synonyms,\n * Suggestions inbox table+drawer, Tag Health 3-card layout. All colors flow\n * through MJ design tokens with `color-mix()` for tinted variants.\n * ============================================================================= */\n\n/* ---------- Governance toggle rows ---------- */\n\n.at-tg-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 10px 0;\n border-bottom: 1px dashed var(--mj-border-subtle);\n}\n.at-tg-toggle-row:last-child { border-bottom: 0; }\n.at-tg-toggle-label { display: flex; flex-direction: column; gap: 2px; max-width: 70%; }\n.at-tg-toggle-t { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.at-tg-toggle-d { font-size: 11px; color: var(--mj-text-muted); line-height: 1.4; }\n\n.at-tg-switch {\n position: relative;\n width: 36px;\n height: 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s;\n flex-shrink: 0;\n}\n.at-tg-switch::after {\n content: \"\";\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n transition: left 0.15s;\n box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n.at-tg-switch.on { background: var(--mj-brand-primary); }\n.at-tg-switch.on::after { left: 18px; }\n.at-tg-switch.disabled { opacity: 0.5; pointer-events: none; }\n\n.at-tg-grid-3 {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 14px 16px;\n margin-top: 14px;\n}\n.at-tg-field { display: flex; flex-direction: column; gap: 4px; }\n.at-tg-field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n.at-tg-hint { font-size: 11px; color: var(--mj-text-muted); }\n\n/* ---------- Scope chips ---------- */\n\n.at-tg-chip-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n margin-top: 8px;\n}\n.at-tg-chip {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n.at-tg-chip.scoped {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ---------- Inline synonyms ---------- */\n\n.at-tg-syn-add {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n align-items: stretch;\n}\n.at-tg-syn-add .at-search-input { flex: 1; }\n.at-tg-syn-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 5px;\n border: 1px solid var(--mj-border-subtle);\n margin-bottom: 6px;\n background: var(--mj-bg-surface);\n}\n.at-tg-syn-row.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n.at-tg-syn-name { font-weight: 600; flex: 1; color: var(--mj-text-primary); }\n.at-tg-syn-src {\n font-size: 10px;\n padding: 2px 7px;\n border-radius: 3px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n}\n.at-tg-syn-src.manual { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.at-tg-syn-src.imported { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.at-tg-syn-src.merged { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.at-tg-syn-src.llm { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.at-tg-syn-x {\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 2px 6px;\n}\n.at-tg-syn-x:hover { color: var(--mj-status-error-text, var(--mj-status-error)); }\n\n/* ---------- Suggestions inbox table + drawer ---------- */\n\n.sg-shell {\n display: flex;\n height: 100%;\n min-height: 600px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n.sg-main { flex: 1; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }\n.sg-toolbar {\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 10px;\n align-items: center;\n background: var(--mj-bg-surface-card);\n flex-wrap: wrap;\n}\n.sg-bulk-bar {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n padding: 9px 14px;\n display: flex;\n gap: 10px;\n align-items: center;\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 500;\n}\n.sg-table-body { flex: 1; overflow: auto; }\n.sg-table { width: 100%; border-collapse: collapse; font-size: 13px; color: var(--mj-text-primary); }\n.sg-table thead { position: sticky; top: 0; background: var(--mj-bg-surface-card); z-index: 1; }\n.sg-table th {\n text-align: left;\n padding: 9px 12px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n white-space: nowrap;\n}\n.sg-table td {\n padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n.sg-table tr { cursor: pointer; }\n.sg-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.sg-table tr.sg-row-selected td { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); }\n.sg-table tr.sg-row-checked td { background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent); }\n.sg-score { font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-weight: 600; }\n.sg-score-bar {\n display: inline-block;\n width: 70px;\n height: 5px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n vertical-align: middle;\n margin-right: 6px;\n}\n.sg-score-bar > span {\n display: block;\n height: 100%;\n background: var(--mj-brand-primary);\n}\n.sg-reason {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.sg-reason.merge { background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent); color: var(--mj-brand-primary); }\n.sg-reason.below { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 12%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.constrained { background: color-mix(in srgb, var(--mj-text-secondary) 14%, transparent); color: var(--mj-text-secondary); }\n.sg-reason.frozen { background: color-mix(in srgb, var(--mj-status-info, var(--mj-brand-primary)) 14%, transparent); color: var(--mj-status-info-text, var(--mj-brand-primary)); }\n.sg-reason.review { background: color-mix(in srgb, var(--mj-status-error) 12%, transparent); color: var(--mj-status-error-text, var(--mj-status-error)); }\n.sg-reason.lowusage { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.widenode { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-reason.autogrow { background: color-mix(in srgb, var(--mj-status-warning) 12%, transparent); color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.sg-row-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n.sg-table tr:hover .sg-row-actions {\n opacity: 1;\n}\n\n.sg-drawer {\n width: 460px;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n}\n.sg-drawer-hd {\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface);\n}\n.sg-drawer-bd { padding: 16px 18px; flex: 1; overflow-y: auto; }\n.sg-drawer-ft {\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 8px;\n background: var(--mj-bg-surface);\n flex-wrap: wrap;\n}\n.sg-drawer h4 {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin: 16px 0 8px;\n font-weight: 700;\n}\n.sg-candidate {\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n display: flex;\n gap: 12px;\n align-items: center;\n}\n.sg-preview {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n margin: 0;\n}\n\n/* ---------- Tag Health cards ---------- */\n\n.health-shell { padding: 18px 22px; }\n.runbar {\n display: flex;\n gap: 22px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 18px;\n align-items: center;\n font-size: 13px;\n}\n.runbar .stat .l { font-size: 11px; color: var(--mj-text-muted); }\n.runbar .stat .v { font-size: 16px; font-weight: 600; color: var(--mj-text-primary); }\n.runbar .grow { flex: 1; }\n\n.health-cards {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 16px;\n margin-bottom: 22px;\n}\n.h-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 240px;\n}\n.h-card.merge { border-top: 4px solid var(--mj-brand-primary); }\n.h-card.lowusage { border-top: 4px solid var(--mj-status-warning); }\n.h-card.widenode { border-top: 4px solid var(--mj-status-error, var(--mj-status-warning)); }\n.h-card .top { display: flex; align-items: flex-start; gap: 10px; }\n.h-card .top .ic {\n width: 38px;\n height: 38px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n}\n.h-card .name {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.h-card h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n.h-card .big {\n font-size: 36px;\n font-weight: 800;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n.h-card .sub { font-size: 12px; color: var(--mj-text-secondary); line-height: 1.4; margin: 0; }\n.h-card .ft { margin-top: auto; display: flex; gap: 6px; flex-wrap: wrap; }\n\n.threshold-form {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 18px;\n margin-top: 18px;\n}\n.threshold-form h3 { margin: 0 0 12px; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.threshold-form .grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n.threshold-form .field { display: flex; flex-direction: column; gap: 4px; }\n.threshold-form .field label { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n\n.run-history {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-top: 18px;\n overflow: hidden;\n}\n.run-history-hd {\n padding: 12px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-card);\n}\n.run-history-hd h3 { margin: 0; font-size: 13px; font-weight: 700; color: var(--mj-text-primary); }\n.run-history table { width: 100%; border-collapse: collapse; font-size: 12px; }\n.run-history th {\n text-align: left;\n padding: 8px 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n font-weight: 600;\n}\n.run-history td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n/* Generic helpers used by new sections */\n.at-muted { color: var(--mj-text-muted); }\n.at-success-btn { color: var(--mj-status-success-text, var(--mj-status-success)); border-color: var(--mj-status-success-border, var(--mj-status-success)); }\n.at-btn-sm { font-size: 12px; padding: 4px 9px; }\n.at-btn-xs { font-size: 11px; padding: 2px 7px; }\n"] }]
7362
7380
  }], null, null); })();
7363
7381
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TagsResourceComponent, { className: "TagsResourceComponent", filePath: "src/AI/components/tags/tags-resource.component.ts", lineNumber: 391 }); })();
7364
7382
  export function LoadTagsResource() {