datajunction-ui 0.0.1-rc.9 → 0.0.2-3.dev1

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 (238) hide show
  1. package/.env +2 -0
  2. package/.prettierignore +3 -1
  3. package/Makefile +9 -0
  4. package/dj-logo.svg +10 -0
  5. package/package.json +53 -14
  6. package/public/favicon.ico +0 -0
  7. package/public/index.html +1 -1
  8. package/src/__tests__/reportWebVitals.test.jsx +44 -0
  9. package/src/app/__tests__/__snapshots__/index.test.tsx.snap +5 -109
  10. package/src/app/components/AddNodeDropdown.jsx +44 -0
  11. package/src/app/components/ListGroupItem.jsx +9 -1
  12. package/src/app/components/NamespaceHeader.jsx +4 -13
  13. package/src/app/components/NodeListActions.jsx +69 -0
  14. package/src/app/components/NodeMaterializationDelete.jsx +90 -0
  15. package/src/app/components/NotificationBell.tsx +229 -0
  16. package/src/app/components/QueryInfo.jsx +172 -0
  17. package/src/app/components/Search.jsx +94 -0
  18. package/src/app/components/Tab.jsx +8 -1
  19. package/src/app/components/ToggleSwitch.jsx +20 -0
  20. package/src/app/components/UserMenu.tsx +92 -0
  21. package/src/app/components/__tests__/NodeListActions.test.jsx +94 -0
  22. package/src/app/components/__tests__/NodeMaterializationDelete.test.jsx +263 -0
  23. package/src/app/components/__tests__/NotificationBell.test.tsx +313 -0
  24. package/src/app/components/__tests__/QueryInfo.test.jsx +183 -0
  25. package/src/app/components/__tests__/Search.test.jsx +307 -0
  26. package/src/app/components/__tests__/Tab.test.jsx +27 -0
  27. package/src/app/components/__tests__/ToggleSwitch.test.jsx +43 -0
  28. package/src/app/components/__tests__/UserMenu.test.tsx +248 -0
  29. package/src/app/components/__tests__/__snapshots__/ListGroupItem.test.tsx.snap +8 -3
  30. package/src/app/components/__tests__/__snapshots__/NamespaceHeader.test.jsx.snap +2 -18
  31. package/src/app/components/djgraph/Collapse.jsx +47 -0
  32. package/src/app/components/djgraph/DJNode.jsx +61 -83
  33. package/src/app/components/djgraph/DJNodeColumns.jsx +75 -0
  34. package/src/app/components/djgraph/DJNodeDimensions.jsx +75 -0
  35. package/src/app/components/djgraph/LayoutFlow.jsx +106 -0
  36. package/src/app/components/djgraph/__tests__/Collapse.test.jsx +51 -0
  37. package/src/app/components/djgraph/__tests__/DJNodeColumns.test.jsx +83 -0
  38. package/src/app/components/djgraph/__tests__/DJNodeDimensions.test.jsx +118 -0
  39. package/src/app/components/djgraph/__tests__/__snapshots__/DJNode.test.tsx.snap +84 -40
  40. package/src/app/components/forms/Action.jsx +8 -0
  41. package/src/app/components/forms/NodeNameField.jsx +64 -0
  42. package/src/app/components/search.css +17 -0
  43. package/src/app/constants.js +2 -0
  44. package/src/app/icons/AddItemIcon.jsx +16 -0
  45. package/src/app/icons/AlertIcon.jsx +33 -0
  46. package/src/app/icons/CollapsedIcon.jsx +15 -0
  47. package/src/app/icons/CommitIcon.jsx +45 -0
  48. package/src/app/icons/DJLogo.jsx +36 -0
  49. package/src/app/icons/DeleteIcon.jsx +21 -0
  50. package/src/app/icons/DiffIcon.jsx +63 -0
  51. package/src/app/icons/EditIcon.jsx +18 -0
  52. package/src/app/icons/ExpandedIcon.jsx +15 -0
  53. package/src/app/icons/EyeIcon.jsx +20 -0
  54. package/src/app/icons/FilterIcon.jsx +7 -0
  55. package/src/app/icons/HorizontalHierarchyIcon.jsx +15 -0
  56. package/src/app/icons/InvalidIcon.jsx +16 -0
  57. package/src/app/icons/JupyterExportIcon.jsx +25 -0
  58. package/src/app/icons/LoadingIcon.jsx +14 -0
  59. package/src/app/icons/NodeIcon.jsx +49 -0
  60. package/src/app/icons/NotificationIcon.jsx +27 -0
  61. package/src/app/icons/PythonIcon.jsx +14 -0
  62. package/src/app/icons/SettingsIcon.jsx +28 -0
  63. package/src/app/icons/TableIcon.jsx +14 -0
  64. package/src/app/icons/ValidIcon.jsx +16 -0
  65. package/src/app/index.tsx +138 -38
  66. package/src/app/pages/AddEditNodePage/AlertMessage.jsx +10 -0
  67. package/src/app/pages/AddEditNodePage/ColumnsSelect.jsx +84 -0
  68. package/src/app/pages/AddEditNodePage/CustomMetadataField.jsx +144 -0
  69. package/src/app/pages/AddEditNodePage/DescriptionField.jsx +17 -0
  70. package/src/app/pages/AddEditNodePage/DisplayNameField.jsx +16 -0
  71. package/src/app/pages/AddEditNodePage/FormikSelect.jsx +64 -0
  72. package/src/app/pages/AddEditNodePage/FullNameField.jsx +38 -0
  73. package/src/app/pages/AddEditNodePage/Loadable.jsx +20 -0
  74. package/src/app/pages/AddEditNodePage/MetricMetadataFields.jsx +75 -0
  75. package/src/app/pages/AddEditNodePage/MetricQueryField.jsx +71 -0
  76. package/src/app/pages/AddEditNodePage/NamespaceField.jsx +40 -0
  77. package/src/app/pages/AddEditNodePage/NodeModeField.jsx +14 -0
  78. package/src/app/pages/AddEditNodePage/NodeQueryField.jsx +94 -0
  79. package/src/app/pages/AddEditNodePage/OwnersField.jsx +53 -0
  80. package/src/app/pages/AddEditNodePage/RequiredDimensionsSelect.jsx +54 -0
  81. package/src/app/pages/AddEditNodePage/TagsField.jsx +47 -0
  82. package/src/app/pages/AddEditNodePage/UpstreamNodeField.jsx +49 -0
  83. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +110 -0
  84. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +291 -0
  85. package/src/app/pages/AddEditNodePage/__tests__/FormikSelect.test.jsx +75 -0
  86. package/src/app/pages/AddEditNodePage/__tests__/FullNameField.test.jsx +31 -0
  87. package/src/app/pages/AddEditNodePage/__tests__/NodeQueryField.test.jsx +30 -0
  88. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +54 -0
  89. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +3 -0
  90. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/index.test.jsx.snap +3 -0
  91. package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +224 -0
  92. package/src/app/pages/AddEditNodePage/index.jsx +545 -0
  93. package/src/app/pages/AddEditTagPage/Loadable.jsx +16 -0
  94. package/src/app/pages/AddEditTagPage/__tests__/AddEditTagPage.test.jsx +107 -0
  95. package/src/app/pages/AddEditTagPage/index.jsx +132 -0
  96. package/src/app/pages/CubeBuilderPage/DimensionsSelect.jsx +152 -0
  97. package/src/app/pages/CubeBuilderPage/Loadable.jsx +16 -0
  98. package/src/app/pages/CubeBuilderPage/MetricsSelect.jsx +75 -0
  99. package/src/app/pages/CubeBuilderPage/__tests__/index.test.jsx +373 -0
  100. package/src/app/pages/CubeBuilderPage/index.jsx +291 -0
  101. package/src/app/pages/LoginPage/LoginForm.jsx +124 -0
  102. package/src/app/pages/LoginPage/SignupForm.jsx +156 -0
  103. package/src/app/pages/LoginPage/__tests__/index.test.jsx +97 -0
  104. package/src/app/pages/LoginPage/assets/sign-in-with-github.png +0 -0
  105. package/src/app/pages/LoginPage/assets/sign-in-with-google.png +0 -0
  106. package/src/app/pages/LoginPage/index.jsx +17 -0
  107. package/src/app/pages/NamespacePage/AddNamespacePopover.jsx +85 -0
  108. package/src/app/pages/NamespacePage/Explorer.jsx +232 -0
  109. package/src/app/pages/NamespacePage/FieldControl.jsx +21 -0
  110. package/src/app/pages/NamespacePage/NodeModeSelect.jsx +27 -0
  111. package/src/app/pages/NamespacePage/NodeTypeSelect.jsx +30 -0
  112. package/src/app/pages/NamespacePage/TagSelect.jsx +44 -0
  113. package/src/app/pages/NamespacePage/UserSelect.jsx +47 -0
  114. package/src/app/pages/NamespacePage/__tests__/AddNamespacePopover.test.jsx +283 -0
  115. package/src/app/pages/NamespacePage/__tests__/index.test.jsx +331 -0
  116. package/src/app/pages/NamespacePage/index.jsx +354 -42
  117. package/src/app/pages/NodePage/AddBackfillPopover.jsx +165 -0
  118. package/src/app/pages/NodePage/AddComplexDimensionLinkPopover.jsx +367 -0
  119. package/src/app/pages/NodePage/AddMaterializationPopover.jsx +222 -0
  120. package/src/app/pages/NodePage/AvailabilityStateBlock.jsx +67 -0
  121. package/src/app/pages/NodePage/ClientCodePopover.jsx +116 -0
  122. package/src/app/pages/NodePage/DimensionFilter.jsx +86 -0
  123. package/src/app/pages/NodePage/EditColumnDescriptionPopover.jsx +116 -0
  124. package/src/app/pages/NodePage/EditColumnPopover.jsx +116 -0
  125. package/src/app/pages/NodePage/LinkDimensionPopover.jsx +164 -0
  126. package/src/app/pages/NodePage/ManageDimensionLinksDialog.jsx +526 -0
  127. package/src/app/pages/NodePage/MaterializationConfigField.jsx +60 -0
  128. package/src/app/pages/NodePage/NodeColumnTab.jsx +421 -30
  129. package/src/app/pages/NodePage/NodeDependenciesTab.jsx +155 -0
  130. package/src/app/pages/NodePage/NodeGraphTab.jsx +119 -148
  131. package/src/app/pages/NodePage/NodeHistory.jsx +236 -0
  132. package/src/app/pages/NodePage/NodeInfoTab.jsx +404 -49
  133. package/src/app/pages/NodePage/NodeLineageTab.jsx +84 -0
  134. package/src/app/pages/NodePage/NodeMaterializationTab.jsx +585 -0
  135. package/src/app/pages/NodePage/NodeRevisionMaterializationTab.jsx +58 -0
  136. package/src/app/pages/NodePage/NodeStatus.jsx +100 -31
  137. package/src/app/pages/NodePage/NodeValidateTab.jsx +367 -0
  138. package/src/app/pages/NodePage/NodesWithDimension.jsx +42 -0
  139. package/src/app/pages/NodePage/NotebookDownload.jsx +36 -0
  140. package/src/app/pages/NodePage/PartitionColumnPopover.jsx +151 -0
  141. package/src/app/pages/NodePage/PartitionValueForm.jsx +60 -0
  142. package/src/app/pages/NodePage/RevisionDiff.jsx +209 -0
  143. package/src/app/pages/NodePage/WatchNodeButton.jsx +226 -0
  144. package/src/app/pages/NodePage/__tests__/AddBackfillPopover.test.jsx +56 -0
  145. package/src/app/pages/NodePage/__tests__/AddComplexDimensionLinkPopover.test.jsx +459 -0
  146. package/src/app/pages/NodePage/__tests__/AddMaterializationPopover.test.jsx +87 -0
  147. package/src/app/pages/NodePage/__tests__/DimensionFilter.test.jsx +74 -0
  148. package/src/app/pages/NodePage/__tests__/EditColumnDescriptionPopover.test.jsx +149 -0
  149. package/src/app/pages/NodePage/__tests__/EditColumnPopover.test.jsx +144 -0
  150. package/src/app/pages/NodePage/__tests__/LinkDimensionPopover.test.jsx +132 -0
  151. package/src/app/pages/NodePage/__tests__/ManageDimensionLinksDialog.test.jsx +390 -0
  152. package/src/app/pages/NodePage/__tests__/NodeColumnTab.test.jsx +166 -0
  153. package/src/app/pages/NodePage/__tests__/NodeDependenciesTab.test.jsx +157 -0
  154. package/src/app/pages/NodePage/__tests__/NodeGraphTab.test.jsx +595 -0
  155. package/src/app/pages/NodePage/__tests__/NodeLineageTab.test.jsx +58 -0
  156. package/src/app/pages/NodePage/__tests__/NodeMaterializationTab.test.jsx +190 -0
  157. package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +892 -0
  158. package/src/app/pages/NodePage/__tests__/NodeWithDimension.test.jsx +175 -0
  159. package/src/app/pages/NodePage/__tests__/RevisionDiff.test.jsx +164 -0
  160. package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +19 -0
  161. package/src/app/pages/NodePage/index.jsx +186 -45
  162. package/src/app/pages/NotFoundPage/__tests__/index.test.jsx +16 -0
  163. package/src/app/pages/NotificationsPage/Loadable.jsx +6 -0
  164. package/src/app/pages/NotificationsPage/__tests__/index.test.jsx +287 -0
  165. package/src/app/pages/NotificationsPage/index.jsx +136 -0
  166. package/src/app/pages/OverviewPage/ByStatusPanel.jsx +69 -0
  167. package/src/app/pages/OverviewPage/DimensionNodeUsagePanel.jsx +48 -0
  168. package/src/app/pages/OverviewPage/GovernanceWarningsPanel.jsx +107 -0
  169. package/src/app/pages/OverviewPage/Loadable.jsx +16 -0
  170. package/src/app/pages/OverviewPage/NodesByTypePanel.jsx +63 -0
  171. package/src/app/pages/OverviewPage/OverviewPanel.jsx +94 -0
  172. package/src/app/pages/OverviewPage/TrendsPanel.jsx +66 -0
  173. package/src/app/pages/OverviewPage/__tests__/ByStatusPanel.test.jsx +36 -0
  174. package/src/app/pages/OverviewPage/__tests__/DimensionNodeUsagePanel.test.jsx +76 -0
  175. package/src/app/pages/OverviewPage/__tests__/GovernanceWarningsPanel.test.jsx +77 -0
  176. package/src/app/pages/OverviewPage/__tests__/NodesByTypePanel.test.jsx +86 -0
  177. package/src/app/pages/OverviewPage/__tests__/OverviewPanel.test.jsx +78 -0
  178. package/src/app/pages/OverviewPage/__tests__/TrendsPanel.test.jsx +120 -0
  179. package/src/app/pages/OverviewPage/__tests__/index.test.jsx +54 -0
  180. package/src/app/pages/OverviewPage/index.jsx +22 -0
  181. package/src/app/pages/RegisterTablePage/Loadable.jsx +16 -0
  182. package/src/app/pages/RegisterTablePage/__tests__/RegisterTablePage.test.jsx +112 -0
  183. package/src/app/pages/RegisterTablePage/__tests__/__snapshots__/RegisterTablePage.test.jsx.snap +38 -0
  184. package/src/app/pages/RegisterTablePage/index.jsx +142 -0
  185. package/src/app/pages/Root/__tests__/index.test.jsx +44 -0
  186. package/src/app/pages/Root/index.tsx +92 -10
  187. package/src/app/pages/SQLBuilderPage/Loadable.jsx +16 -0
  188. package/src/app/pages/SQLBuilderPage/__tests__/index.test.jsx +173 -0
  189. package/src/app/pages/SQLBuilderPage/index.jsx +390 -0
  190. package/src/app/pages/SettingsPage/CreateServiceAccountModal.jsx +152 -0
  191. package/src/app/pages/SettingsPage/Loadable.jsx +16 -0
  192. package/src/app/pages/SettingsPage/NotificationSubscriptionsSection.jsx +189 -0
  193. package/src/app/pages/SettingsPage/ProfileSection.jsx +41 -0
  194. package/src/app/pages/SettingsPage/ServiceAccountsSection.jsx +95 -0
  195. package/src/app/pages/SettingsPage/__tests__/CreateServiceAccountModal.test.jsx +318 -0
  196. package/src/app/pages/SettingsPage/__tests__/NotificationSubscriptionsSection.test.jsx +233 -0
  197. package/src/app/pages/SettingsPage/__tests__/ProfileSection.test.jsx +65 -0
  198. package/src/app/pages/SettingsPage/__tests__/ServiceAccountsSection.test.jsx +150 -0
  199. package/src/app/pages/SettingsPage/__tests__/index.test.jsx +187 -0
  200. package/src/app/pages/SettingsPage/index.jsx +148 -0
  201. package/src/app/pages/TagPage/Loadable.jsx +16 -0
  202. package/src/app/pages/TagPage/__tests__/TagPage.test.jsx +70 -0
  203. package/src/app/pages/TagPage/index.jsx +79 -0
  204. package/src/app/providers/UserProvider.tsx +78 -0
  205. package/src/app/services/DJService.js +1487 -21
  206. package/src/app/services/__tests__/DJService.test.jsx +2194 -0
  207. package/src/app/utils/__tests__/date.test.js +198 -0
  208. package/src/app/utils/date.js +65 -0
  209. package/src/index.tsx +1 -0
  210. package/src/mocks/mockNodes.jsx +1477 -0
  211. package/src/setupTests.ts +31 -1
  212. package/src/styles/dag.css +117 -5
  213. package/src/styles/index.css +1028 -31
  214. package/src/styles/loading.css +34 -0
  215. package/src/styles/login.css +81 -0
  216. package/src/styles/nav-bar.css +274 -0
  217. package/src/styles/node-creation.scss +276 -0
  218. package/src/styles/node-list.css +4 -0
  219. package/src/styles/overview.css +72 -0
  220. package/src/styles/settings.css +787 -0
  221. package/src/styles/sorted-table.css +15 -0
  222. package/src/styles/styles.scss +44 -0
  223. package/src/styles/styles.scss.d.ts +9 -0
  224. package/src/utils/form.jsx +23 -0
  225. package/webpack.config.js +20 -7
  226. package/.babelrc +0 -4
  227. package/.env.local +0 -4
  228. package/.env.production +0 -1
  229. package/.github/pull_request_template.md +0 -11
  230. package/.github/workflows/ci.yml +0 -33
  231. package/.vscode/extensions.json +0 -7
  232. package/.vscode/launch.json +0 -15
  233. package/.vscode/settings.json +0 -25
  234. package/Dockerfile +0 -7
  235. package/src/app/pages/ListNamespacesPage/Loadable.jsx +0 -14
  236. package/src/app/pages/ListNamespacesPage/index.jsx +0 -62
  237. package/src/app/pages/NamespacePage/__tests__/__snapshots__/index.test.tsx.snap +0 -45
  238. package/src/app/pages/NamespacePage/__tests__/index.test.tsx +0 -14
@@ -0,0 +1,787 @@
1
+ /* Settings Page Styles */
2
+
3
+ .settings-page {
4
+ min-height: calc(100vh - 80px);
5
+ background-color: #f8f9fa;
6
+ padding: 1.5rem 2rem;
7
+ }
8
+
9
+ .settings-container {
10
+ max-width: 1000px;
11
+ margin: 0 auto;
12
+ }
13
+
14
+ .settings-title {
15
+ font-family: 'Raleway', system-ui;
16
+ font-size: 1.75rem;
17
+ font-weight: 600;
18
+ color: #333;
19
+ margin-bottom: 2rem;
20
+ }
21
+
22
+ .settings-section {
23
+ margin-bottom: 2rem;
24
+ }
25
+
26
+ .settings-section-title {
27
+ font-family: 'Jost', sans-serif;
28
+ font-size: 0.8125rem;
29
+ font-weight: 600;
30
+ text-transform: uppercase;
31
+ letter-spacing: 0.08em;
32
+ color: #555;
33
+ margin-bottom: 1rem;
34
+ padding-bottom: 0.5rem;
35
+ border-bottom: 1px solid #e0e0e0;
36
+ }
37
+
38
+ .settings-card {
39
+ background: white;
40
+ border-radius: 8px;
41
+ padding: 0.4rem 1rem;
42
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
43
+ }
44
+
45
+ /* Profile Section */
46
+ .profile-info {
47
+ display: flex;
48
+ align-items: flex-start;
49
+ gap: 1.5rem;
50
+ margin: 1.5rem 0;
51
+ }
52
+
53
+ .profile-avatar {
54
+ width: 64px;
55
+ height: 64px;
56
+ border-radius: 50%;
57
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
58
+ color: white;
59
+ font-size: 1.25rem;
60
+ font-weight: 600;
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ flex-shrink: 0;
65
+ }
66
+
67
+ .profile-details {
68
+ flex: 1;
69
+ }
70
+
71
+ .profile-field {
72
+ margin-bottom: 1rem;
73
+ }
74
+
75
+ .profile-field:last-child {
76
+ margin-bottom: 0;
77
+ }
78
+
79
+ .profile-field label {
80
+ display: block;
81
+ font-family: 'Jost', sans-serif;
82
+ font-size: 0.75rem;
83
+ font-weight: 600;
84
+ color: #888;
85
+ text-transform: uppercase;
86
+ letter-spacing: 0.08em;
87
+ margin-bottom: 0.25rem;
88
+ }
89
+
90
+ .profile-field span {
91
+ font-size: 1rem;
92
+ color: #333;
93
+ }
94
+
95
+ /* Subscriptions List */
96
+ .subscriptions-list {
97
+ display: flex;
98
+ flex-direction: column;
99
+ }
100
+
101
+ .subscription-item {
102
+ padding: 1rem 0;
103
+ border-bottom: 1px solid #eee;
104
+ }
105
+
106
+ .subscription-item:last-child {
107
+ border-bottom: none;
108
+ }
109
+
110
+ .subscription-header {
111
+ display: flex;
112
+ justify-content: space-between;
113
+ align-items: center;
114
+ margin-bottom: 0.75rem;
115
+ }
116
+
117
+ .subscription-entity {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 0.5rem;
121
+ }
122
+
123
+ .subscription-entity a {
124
+ color: #333;
125
+ font-weight: 500;
126
+ text-decoration: none;
127
+ }
128
+
129
+ .subscription-entity a:hover {
130
+ color: #667eea;
131
+ }
132
+
133
+ .entity-type-badge {
134
+ font-size: 10px;
135
+ padding: 2px 6px;
136
+ background: #e8e8e8;
137
+ color: #666;
138
+ border-radius: 3px;
139
+ text-transform: uppercase;
140
+ }
141
+
142
+ .subscription-actions {
143
+ display: flex;
144
+ gap: 0.5rem;
145
+ }
146
+
147
+ .subscription-activity-types {
148
+ display: flex;
149
+ align-items: flex-start;
150
+ gap: 0.75rem;
151
+ }
152
+
153
+ .activity-types-label {
154
+ font-family: 'Jost', sans-serif;
155
+ font-size: 0.75rem;
156
+ font-weight: 600;
157
+ text-transform: uppercase;
158
+ letter-spacing: 0.08em;
159
+ color: #888;
160
+ min-width: 100px;
161
+ }
162
+
163
+ .activity-types-badges {
164
+ display: flex;
165
+ flex-wrap: wrap;
166
+ gap: 0.35rem;
167
+ }
168
+
169
+ .activity-badge {
170
+ font-size: 11px;
171
+ padding: 2px 8px;
172
+ background: transparent;
173
+ border: 1px solid #ccc;
174
+ color: #666;
175
+ border-radius: 3px;
176
+ }
177
+
178
+ /* Color-coded activity types */
179
+ .activity-badge-create {
180
+ border-color: #28a745;
181
+ color: #28a745;
182
+ }
183
+
184
+ .activity-badge-update {
185
+ border-color: #0088fe;
186
+ color: #0088fe;
187
+ }
188
+
189
+ .activity-badge-delete {
190
+ border-color: #dc3545;
191
+ color: #dc3545;
192
+ }
193
+
194
+ .activity-badge-status_change {
195
+ border-color: #fd7e14;
196
+ color: #fd7e14;
197
+ }
198
+
199
+ .activity-badge-refresh {
200
+ border-color: #6f42c1;
201
+ color: #6f42c1;
202
+ }
203
+
204
+ .activity-badge-tag {
205
+ border-color: #6c757d;
206
+ color: #6c757d;
207
+ }
208
+
209
+ .activity-types-checkboxes {
210
+ display: flex;
211
+ flex-wrap: wrap;
212
+ gap: 0.75rem;
213
+ }
214
+
215
+ .checkbox-label {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 0.35rem;
219
+ font-size: 0.85rem;
220
+ color: #444;
221
+ cursor: pointer;
222
+ }
223
+
224
+ .checkbox-label input[type='checkbox'] {
225
+ cursor: pointer;
226
+ }
227
+
228
+ /* Buttons */
229
+ /* Icon buttons */
230
+ .btn-icon {
231
+ width: 28px;
232
+ height: 28px;
233
+ padding: 0;
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: center;
237
+ border-radius: 4px;
238
+ cursor: pointer;
239
+ background: transparent;
240
+ border: none;
241
+ }
242
+
243
+ .btn-icon svg {
244
+ width: 18px;
245
+ height: 18px;
246
+ }
247
+
248
+ .btn-edit {
249
+ color: #aaa;
250
+ transition: color 0.15s ease, background-color 0.15s ease;
251
+ }
252
+
253
+ .btn-edit:hover {
254
+ color: #28a745;
255
+ background-color: #e8f5e9;
256
+ }
257
+
258
+ .btn-save {
259
+ padding: 0.35rem 0.75rem;
260
+ font-size: 0.8rem;
261
+ color: white;
262
+ background: #28a745;
263
+ border: 1px solid #28a745;
264
+ border-radius: 4px;
265
+ cursor: pointer;
266
+ transition: all 0.15s ease;
267
+ }
268
+
269
+ .btn-save:hover {
270
+ background: #218838;
271
+ border-color: #218838;
272
+ }
273
+
274
+ .btn-save:disabled {
275
+ opacity: 0.6;
276
+ cursor: not-allowed;
277
+ }
278
+
279
+ .btn-cancel {
280
+ padding: 0.35rem 0.75rem;
281
+ font-size: 0.8rem;
282
+ color: #666;
283
+ background: transparent;
284
+ border: 1px solid #ccc;
285
+ border-radius: 4px;
286
+ cursor: pointer;
287
+ transition: all 0.15s ease;
288
+ }
289
+
290
+ .btn-cancel:hover {
291
+ background: #f5f5f5;
292
+ }
293
+
294
+ .btn-cancel:disabled {
295
+ opacity: 0.6;
296
+ cursor: not-allowed;
297
+ }
298
+
299
+ .btn-unsubscribe {
300
+ color: #aaa;
301
+ font-size: 25px;
302
+ font-weight: 400;
303
+ line-height: 1;
304
+ transition: color 0.15s ease, background-color 0.15s ease;
305
+ }
306
+
307
+ .btn-unsubscribe:hover {
308
+ color: #dc3545;
309
+ background-color: #ffeaea;
310
+ }
311
+
312
+ .text-muted {
313
+ color: #999;
314
+ font-style: italic;
315
+ }
316
+
317
+ /* Status badges */
318
+ .status-badge {
319
+ font-size: 9px;
320
+ padding: 2px 5px;
321
+ border-radius: 3px;
322
+ font-weight: 600;
323
+ text-transform: uppercase;
324
+ }
325
+
326
+ .status-invalid {
327
+ background-color: #ffeaea;
328
+ color: #dc3545;
329
+ }
330
+
331
+ /* Empty State */
332
+ .empty-state {
333
+ color: #888;
334
+ font-size: 0.95rem;
335
+ text-align: center;
336
+ padding: 1rem 0;
337
+ }
338
+
339
+ /* Service Accounts Section */
340
+ .section-description {
341
+ color: #666;
342
+ font-size: 0.9rem;
343
+ margin-bottom: 1.5rem;
344
+ line-height: 1.5;
345
+ }
346
+
347
+ .credentials-banner {
348
+ background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%);
349
+ border: 1px solid #4caf50;
350
+ border-radius: 8px;
351
+ padding: 1rem;
352
+ margin-bottom: 1.5rem;
353
+ }
354
+
355
+ .credentials-header {
356
+ display: flex;
357
+ justify-content: space-between;
358
+ align-items: center;
359
+ margin-bottom: 0.5rem;
360
+ }
361
+
362
+ .credentials-header strong {
363
+ color: #2e7d32;
364
+ }
365
+
366
+ .btn-dismiss {
367
+ background: none;
368
+ border: none;
369
+ font-size: 1.25rem;
370
+ color: #666;
371
+ cursor: pointer;
372
+ padding: 0 0.25rem;
373
+ }
374
+
375
+ .btn-dismiss:hover {
376
+ color: #333;
377
+ }
378
+
379
+ .credentials-warning {
380
+ color: #c62828;
381
+ font-size: 0.85rem;
382
+ font-weight: 500;
383
+ margin-bottom: 1rem;
384
+ }
385
+
386
+ .credentials-grid {
387
+ display: grid;
388
+ gap: 0.75rem;
389
+ }
390
+
391
+ .credential-item {
392
+ display: flex;
393
+ flex-direction: column;
394
+ gap: 0.25rem;
395
+ }
396
+
397
+ .credential-item label {
398
+ font-size: 0.75rem;
399
+ color: #666;
400
+ text-transform: uppercase;
401
+ letter-spacing: 0.5px;
402
+ }
403
+
404
+ .credential-item code {
405
+ background: #fff;
406
+ padding: 0.5rem;
407
+ border-radius: 4px;
408
+ font-family: 'Source Code Pro', monospace;
409
+ font-size: 0.85rem;
410
+ word-break: break-all;
411
+ }
412
+
413
+ .credential-value {
414
+ display: flex;
415
+ align-items: center;
416
+ gap: 0.5rem;
417
+ }
418
+
419
+ .credential-value code {
420
+ flex: 1;
421
+ }
422
+
423
+ .btn-copy {
424
+ background: #fff;
425
+ border: 1px solid #ddd;
426
+ border-radius: 4px;
427
+ padding: 0.25rem 0.5rem;
428
+ cursor: pointer;
429
+ font-size: 0.9rem;
430
+ }
431
+
432
+ .btn-copy:hover {
433
+ background: #f5f5f5;
434
+ }
435
+
436
+ .create-service-account-form {
437
+ display: flex;
438
+ gap: 0.75rem;
439
+ margin-bottom: 1.5rem;
440
+ }
441
+
442
+ .create-service-account-form input {
443
+ flex: 1;
444
+ padding: 0.5rem 0.75rem;
445
+ border: 1px solid #ddd;
446
+ border-radius: 4px;
447
+ font-size: 0.9rem;
448
+ font-family: 'Jost', sans-serif;
449
+ }
450
+
451
+ .create-service-account-form input:focus {
452
+ outline: none;
453
+ border-color: #4caf50;
454
+ }
455
+
456
+ .btn-create {
457
+ background: #4caf50;
458
+ color: white;
459
+ border: none;
460
+ border-radius: 4px;
461
+ padding: 0.5rem 1rem;
462
+ font-size: 0.9rem;
463
+ font-family: 'Jost', sans-serif;
464
+ cursor: pointer;
465
+ white-space: nowrap;
466
+ }
467
+
468
+ .btn-create:hover:not(:disabled) {
469
+ background: #43a047;
470
+ }
471
+
472
+ .btn-create:disabled {
473
+ background: #ccc;
474
+ cursor: not-allowed;
475
+ }
476
+
477
+ .service-accounts-list h4 {
478
+ font-size: 0.9rem;
479
+ color: #666;
480
+ margin-bottom: 0.75rem;
481
+ font-weight: 500;
482
+ }
483
+
484
+ .service-accounts-table {
485
+ width: 100%;
486
+ border-collapse: collapse;
487
+ font-size: 0.9rem;
488
+ }
489
+
490
+ .service-accounts-table th {
491
+ text-align: left;
492
+ padding: 0.5rem;
493
+ border-bottom: 2px solid #eee;
494
+ color: #666;
495
+ font-weight: 500;
496
+ font-size: 0.8rem;
497
+ text-transform: uppercase;
498
+ letter-spacing: 0.5px;
499
+ }
500
+
501
+ .service-accounts-table td {
502
+ padding: 0.75rem 0.5rem;
503
+ border-bottom: 1px solid #eee;
504
+ }
505
+
506
+ .service-accounts-table .client-id {
507
+ background: #f5f5f5;
508
+ padding: 0.25rem 0.5rem;
509
+ border-radius: 3px;
510
+ font-size: 0.8rem;
511
+ }
512
+
513
+ .service-accounts-table .created-date {
514
+ color: #888;
515
+ font-size: 0.85rem;
516
+ }
517
+
518
+ .service-accounts-table .actions-cell {
519
+ width: 40px;
520
+ text-align: right;
521
+ }
522
+
523
+ .btn-delete-account {
524
+ background: none;
525
+ border: 1px solid transparent;
526
+ color: #999;
527
+ cursor: pointer;
528
+ font-size: 1.25rem;
529
+ padding: 0.25rem 0.5rem;
530
+ border-radius: 4px;
531
+ line-height: 1;
532
+ opacity: 0;
533
+ transition: all 0.15s ease;
534
+ }
535
+
536
+ .service-accounts-table tr:hover .btn-delete-account {
537
+ opacity: 1;
538
+ }
539
+
540
+ .btn-delete-account:hover {
541
+ color: #dc3545;
542
+ background: rgba(220, 53, 69, 0.1);
543
+ border-color: rgba(220, 53, 69, 0.2);
544
+ }
545
+
546
+ .section-title-row {
547
+ display: flex;
548
+ justify-content: space-between;
549
+ align-items: center;
550
+ margin-bottom: 0.75rem;
551
+ padding-bottom: 0.5rem;
552
+ border-bottom: 1px solid #e0e0e0;
553
+ }
554
+
555
+ .section-title-row .settings-section-title {
556
+ margin-bottom: 0;
557
+ padding-bottom: 0;
558
+ border-bottom: none;
559
+ }
560
+
561
+ .section-title-row .btn-create {
562
+ padding: 0.375rem 0.75rem;
563
+ font-size: 0.85rem;
564
+ }
565
+
566
+ /* Modal Styles */
567
+ .modal-overlay {
568
+ position: fixed;
569
+ top: 0;
570
+ left: 0;
571
+ right: 0;
572
+ bottom: 0;
573
+ background: rgba(0, 0, 0, 0.5);
574
+ display: flex;
575
+ align-items: center;
576
+ justify-content: center;
577
+ z-index: 1000;
578
+ animation: fadeIn 0.15s ease-out;
579
+ }
580
+
581
+ @keyframes fadeIn {
582
+ from {
583
+ opacity: 0;
584
+ }
585
+ to {
586
+ opacity: 1;
587
+ }
588
+ }
589
+
590
+ .modal-content {
591
+ background: white;
592
+ border-radius: 8px;
593
+ width: 100%;
594
+ max-width: 480px;
595
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15);
596
+ animation: slideIn 0.15s ease-out;
597
+ }
598
+
599
+ @keyframes slideIn {
600
+ from {
601
+ transform: translateY(-20px);
602
+ opacity: 0;
603
+ }
604
+ to {
605
+ transform: translateY(0);
606
+ opacity: 1;
607
+ }
608
+ }
609
+
610
+ .modal-header {
611
+ display: flex;
612
+ justify-content: space-between;
613
+ align-items: center;
614
+ padding: 1rem 1.25rem;
615
+ border-bottom: 1px solid #eee;
616
+ }
617
+
618
+ .modal-header h3 {
619
+ margin: 0;
620
+ font-size: 1.1rem;
621
+ font-weight: 600;
622
+ font-family: 'Jost', sans-serif;
623
+ color: #333;
624
+ }
625
+
626
+ .btn-close-modal {
627
+ background: none;
628
+ border: none;
629
+ font-size: 1.5rem;
630
+ color: #999;
631
+ cursor: pointer;
632
+ padding: 0;
633
+ line-height: 1;
634
+ width: 28px;
635
+ height: 28px;
636
+ display: flex;
637
+ align-items: center;
638
+ justify-content: center;
639
+ border-radius: 4px;
640
+ }
641
+
642
+ .btn-close-modal:hover {
643
+ background: #f5f5f5;
644
+ color: #333;
645
+ }
646
+
647
+ .modal-body {
648
+ padding: 1.25rem;
649
+ }
650
+
651
+ .form-group {
652
+ margin-bottom: 0;
653
+ }
654
+
655
+ .form-group label {
656
+ display: block;
657
+ font-size: 0.85rem;
658
+ font-weight: 500;
659
+ color: #333;
660
+ margin-bottom: 0.5rem;
661
+ }
662
+
663
+ .form-group input {
664
+ width: 100%;
665
+ padding: 0.625rem 0.75rem;
666
+ border: 1px solid #ddd;
667
+ border-radius: 4px;
668
+ font-size: 0.9rem;
669
+ font-family: 'Jost', sans-serif;
670
+ box-sizing: border-box;
671
+ }
672
+
673
+ .form-group input:focus {
674
+ outline: none;
675
+ border-color: #4caf50;
676
+ box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.1);
677
+ }
678
+
679
+ .form-hint {
680
+ display: block;
681
+ font-size: 0.8rem;
682
+ color: #888;
683
+ margin-top: 0.375rem;
684
+ }
685
+
686
+ .modal-actions {
687
+ display: flex;
688
+ justify-content: flex-end;
689
+ gap: 0.75rem;
690
+ padding: 1rem 1.25rem;
691
+ border-top: 1px solid #eee;
692
+ background: #fafafa;
693
+ border-radius: 0 0 8px 8px;
694
+ }
695
+
696
+ .btn-secondary {
697
+ background: white;
698
+ color: #666;
699
+ border: 1px solid #ddd;
700
+ border-radius: 4px;
701
+ padding: 0.5rem 1rem;
702
+ font-size: 0.9rem;
703
+ font-family: 'Jost', sans-serif;
704
+ cursor: pointer;
705
+ }
706
+
707
+ .btn-secondary:hover:not(:disabled) {
708
+ background: #f5f5f5;
709
+ border-color: #ccc;
710
+ }
711
+
712
+ .btn-primary {
713
+ background: #4caf50;
714
+ color: white;
715
+ border: none;
716
+ border-radius: 4px;
717
+ padding: 0.5rem 1rem;
718
+ font-size: 0.9rem;
719
+ font-family: 'Jost', sans-serif;
720
+ cursor: pointer;
721
+ }
722
+
723
+ .btn-primary:hover:not(:disabled) {
724
+ background: #43a047;
725
+ }
726
+
727
+ .btn-primary:disabled,
728
+ .btn-secondary:disabled {
729
+ opacity: 0.6;
730
+ cursor: not-allowed;
731
+ }
732
+
733
+ /* Credentials in Modal */
734
+ .credentials-success {
735
+ display: flex;
736
+ align-items: center;
737
+ gap: 0.5rem;
738
+ margin-bottom: 0.75rem;
739
+ }
740
+
741
+ .credentials-success .success-icon {
742
+ width: 24px;
743
+ height: 24px;
744
+ background: #4caf50;
745
+ color: white;
746
+ border-radius: 50%;
747
+ display: flex;
748
+ align-items: center;
749
+ justify-content: center;
750
+ font-size: 14px;
751
+ font-weight: bold;
752
+ }
753
+
754
+ .credentials-success h4 {
755
+ margin: 0;
756
+ font-size: 1rem;
757
+ color: #2e7d32;
758
+ }
759
+
760
+ .modal-body .credentials-warning {
761
+ background: #fff3e0;
762
+ border: 1px solid #ffb74d;
763
+ border-radius: 4px;
764
+ padding: 0.75rem;
765
+ margin-bottom: 1rem;
766
+ font-size: 0.85rem;
767
+ color: #e65100;
768
+ }
769
+
770
+ .modal-body .credentials-grid {
771
+ background: #f9f9f9;
772
+ border-radius: 4px;
773
+ padding: 1rem;
774
+ }
775
+
776
+ .modal-body .credential-item {
777
+ margin-bottom: 0.75rem;
778
+ }
779
+
780
+ .modal-body .credential-item:last-child {
781
+ margin-bottom: 0;
782
+ }
783
+
784
+ .modal-body .credential-item code {
785
+ background: white;
786
+ border: 1px solid #eee;
787
+ }