dbdoc_engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +331 -0
  3. data/Rakefile +8 -0
  4. data/app/assets/builds/dbdoc_engine/application.css +5 -0
  5. data/app/assets/images/dbdoc_engine/arrowdown.svg +3 -0
  6. data/app/assets/images/dbdoc_engine/arrowhorizontal.svg +3 -0
  7. data/app/assets/images/dbdoc_engine/arrowleft.svg +3 -0
  8. data/app/assets/images/dbdoc_engine/changelog.svg +3 -0
  9. data/app/assets/images/dbdoc_engine/column_stats_dbdocs.svg +23 -0
  10. data/app/assets/images/dbdoc_engine/diagram.svg +3 -0
  11. data/app/assets/images/dbdoc_engine/double_arrow.svg +4 -0
  12. data/app/assets/images/dbdoc_engine/group_bu.svg +3 -0
  13. data/app/assets/images/dbdoc_engine/japan_circle.png +0 -0
  14. data/app/assets/images/dbdoc_engine/log_in_image.png +0 -0
  15. data/app/assets/images/dbdoc_engine/logo.svg +12 -0
  16. data/app/assets/images/dbdoc_engine/orange_changelog.svg +3 -0
  17. data/app/assets/images/dbdoc_engine/orange_fields.svg +23 -0
  18. data/app/assets/images/dbdoc_engine/orange_logo.svg +12 -0
  19. data/app/assets/images/dbdoc_engine/orange_table.svg +21 -0
  20. data/app/assets/images/dbdoc_engine/orange_updates.svg +43 -0
  21. data/app/assets/images/dbdoc_engine/orange_wiki.svg +3 -0
  22. data/app/assets/images/dbdoc_engine/search.svg +3 -0
  23. data/app/assets/images/dbdoc_engine/setting.svg +3 -0
  24. data/app/assets/images/dbdoc_engine/table_dbdocs.svg +21 -0
  25. data/app/assets/images/dbdoc_engine/uk_circle_transparent.png +0 -0
  26. data/app/assets/images/dbdoc_engine/update_stats_dbdocs.svg +43 -0
  27. data/app/assets/images/dbdoc_engine/wiki.svg +3 -0
  28. data/app/assets/stylesheets/dbdoc_engine/admin.css +176 -0
  29. data/app/assets/stylesheets/dbdoc_engine/admin_header.css +179 -0
  30. data/app/assets/stylesheets/dbdoc_engine/application.scss +1 -0
  31. data/app/assets/stylesheets/dbdoc_engine/changelog.css +173 -0
  32. data/app/assets/stylesheets/dbdoc_engine/dashboard.css +513 -0
  33. data/app/assets/stylesheets/dbdoc_engine/dbdoc_application.css +117 -0
  34. data/app/assets/stylesheets/dbdoc_engine/ecommerce.css +253 -0
  35. data/app/assets/stylesheets/dbdoc_engine/group_details.css +178 -0
  36. data/app/assets/stylesheets/dbdoc_engine/header.css +212 -0
  37. data/app/assets/stylesheets/dbdoc_engine/loading_spinner.css +127 -0
  38. data/app/assets/stylesheets/dbdoc_engine/login.css +213 -0
  39. data/app/assets/stylesheets/dbdoc_engine/schema_diagram.css +149 -0
  40. data/app/assets/stylesheets/dbdoc_engine/sidebar.css +296 -0
  41. data/app/assets/stylesheets/dbdoc_engine/table_details.css +417 -0
  42. data/app/controllers/dbdoc_engine/admin/base_controller.rb +23 -0
  43. data/app/controllers/dbdoc_engine/admin/dashboard_controller.rb +16 -0
  44. data/app/controllers/dbdoc_engine/admin/data_transfer_controller.rb +63 -0
  45. data/app/controllers/dbdoc_engine/admin/db_design_dynamic_tables_controller.rb +198 -0
  46. data/app/controllers/dbdoc_engine/admin/db_design_table_groups_controller.rb +107 -0
  47. data/app/controllers/dbdoc_engine/application_controller.rb +65 -0
  48. data/app/controllers/dbdoc_engine/concerns/internationalization.rb +57 -0
  49. data/app/controllers/dbdoc_engine/db_doc_sessions_controller.rb +33 -0
  50. data/app/controllers/dbdoc_engine/home_controller.rb +79 -0
  51. data/app/controllers/dbdoc_engine/schema_diagram_controller.rb +293 -0
  52. data/app/helper/dbdoc_engine/application_helper.rb +35 -0
  53. data/app/helpers/dbdoc_engine/application_helper.rb +4 -0
  54. data/app/helpers/dbdoc_engine/changelogs_helper.rb +27 -0
  55. data/app/helpers/dbdoc_engine/column_helper.rb +30 -0
  56. data/app/helpers/dbdoc_engine/db_design_dynamic_tables_helper.rb +15 -0
  57. data/app/helpers/dbdoc_engine/home_helper.rb +75 -0
  58. data/app/javascript/dbdoc_engine/application.js +12 -0
  59. data/app/javascript/dbdoc_engine/controllers/application.js +29 -0
  60. data/app/javascript/dbdoc_engine/controllers/auto_submit_controller.js +17 -0
  61. data/app/javascript/dbdoc_engine/controllers/chart_controller.js +58 -0
  62. data/app/javascript/dbdoc_engine/controllers/column-type_controller.js +149 -0
  63. data/app/javascript/dbdoc_engine/controllers/column_controller.js +362 -0
  64. data/app/javascript/dbdoc_engine/controllers/column_search_controller.js +42 -0
  65. data/app/javascript/dbdoc_engine/controllers/dbdoc_accordion_controller.js +42 -0
  66. data/app/javascript/dbdoc_engine/controllers/ecommerce_controller.js +73 -0
  67. data/app/javascript/dbdoc_engine/controllers/group_details_controller.js +88 -0
  68. data/app/javascript/dbdoc_engine/controllers/import_export_controller.js +200 -0
  69. data/app/javascript/dbdoc_engine/controllers/index.js +9 -0
  70. data/app/javascript/dbdoc_engine/controllers/language_controller.js +100 -0
  71. data/app/javascript/dbdoc_engine/controllers/loading_spinner_controller.js +48 -0
  72. data/app/javascript/dbdoc_engine/controllers/login_controller.js +75 -0
  73. data/app/javascript/dbdoc_engine/controllers/notification_controller.js +15 -0
  74. data/app/javascript/dbdoc_engine/controllers/schema_diagram_controller.js +1129 -0
  75. data/app/javascript/dbdoc_engine/controllers/select2_controller.js +67 -0
  76. data/app/javascript/dbdoc_engine/controllers/sidebar_controller.js +943 -0
  77. data/app/javascript/dbdoc_engine/controllers/table_details_controller.js +245 -0
  78. data/app/javascript/dbdoc_engine/controllers/table_group_validation_controller.js +148 -0
  79. data/app/javascript/dbdoc_engine/controllers/table_validation_controller.js +423 -0
  80. data/app/jobs/dbdoc_engine/application_job.rb +4 -0
  81. data/app/mailers/dbdoc_engine/application_mailer.rb +6 -0
  82. data/app/models/dbdoc_engine/application_record.rb +6 -0
  83. data/app/models/dbdoc_engine/concerns/soft_deletable.rb +30 -0
  84. data/app/models/dbdoc_engine/db_design_changelog.rb +44 -0
  85. data/app/models/dbdoc_engine/db_design_dynamic_column.rb +211 -0
  86. data/app/models/dbdoc_engine/db_design_dynamic_table.rb +124 -0
  87. data/app/models/dbdoc_engine/db_design_table_group.rb +88 -0
  88. data/app/models/dbdoc_engine/user.rb +21 -0
  89. data/app/queries/dbdoc_engine/admin_dashboard_queries.rb +71 -0
  90. data/app/queries/dbdoc_engine/db_design_changelog_queries.rb +68 -0
  91. data/app/queries/dbdoc_engine/db_design_dynamic_column_queries.rb +37 -0
  92. data/app/queries/dbdoc_engine/db_design_dynamic_table_commands.rb +106 -0
  93. data/app/queries/dbdoc_engine/db_design_dynamic_table_queries.rb +194 -0
  94. data/app/queries/dbdoc_engine/db_design_table_group_queries.rb +154 -0
  95. data/app/services/dbdoc_engine/db_design_dynamic_table_export_service.rb +38 -0
  96. data/app/services/dbdoc_engine/db_design_dynamic_table_handler_service.rb +49 -0
  97. data/app/services/dbdoc_engine/db_design_dynamic_tables_service.rb +21 -0
  98. data/app/services/dbdoc_engine/error_handler_service.rb +43 -0
  99. data/app/services/dbdoc_engine/schema_rb_import_service.rb +194 -0
  100. data/app/services/dbdoc_engine/schema_rb_parser_service.rb +339 -0
  101. data/app/services/dbdoc_engine/table_filter_service.rb +35 -0
  102. data/app/services/dbdoc_engine/table_groups_service.rb +199 -0
  103. data/app/services/dbdoc_engine/table_management_service.rb +192 -0
  104. data/app/views/dbdoc_engine/admin/dashboard/_action_badge.html.erb +11 -0
  105. data/app/views/dbdoc_engine/admin/dashboard/_changelog_rows.html.erb +22 -0
  106. data/app/views/dbdoc_engine/admin/dashboard/_changelog_table_headers.html.erb +8 -0
  107. data/app/views/dbdoc_engine/admin/dashboard/_filter_fields.html.erb +43 -0
  108. data/app/views/dbdoc_engine/admin/dashboard/index.html.erb +159 -0
  109. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_column_fields.html.erb +225 -0
  110. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_deleted_table_index.html.erb +110 -0
  111. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_foreign_key_fields.html.erb +51 -0
  112. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_form.html.erb +75 -0
  113. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_recent_activity.html.erb +39 -0
  114. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_table_columns.html.erb +127 -0
  115. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_table_index.html.erb +109 -0
  116. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/_table_information.html.erb +99 -0
  117. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/deleted_tables.html.erb +95 -0
  118. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/edit.html.erb +23 -0
  119. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/export_all_to_excel.xlsx.axlsx +240 -0
  120. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/export_to_excel.xlsx.axlsx +135 -0
  121. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/index.html.erb +109 -0
  122. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/new.html.erb +25 -0
  123. data/app/views/dbdoc_engine/admin/db_design_dynamic_tables/show_table_info.html.erb +125 -0
  124. data/app/views/dbdoc_engine/admin/db_design_table_groups/_deleted_table_groups_list.html.erb +75 -0
  125. data/app/views/dbdoc_engine/admin/db_design_table_groups/_form.html.erb +88 -0
  126. data/app/views/dbdoc_engine/admin/db_design_table_groups/_table_groups_list.html.erb +82 -0
  127. data/app/views/dbdoc_engine/admin/db_design_table_groups/deleted_groups.html.erb +60 -0
  128. data/app/views/dbdoc_engine/admin/db_design_table_groups/edit.html.erb +25 -0
  129. data/app/views/dbdoc_engine/admin/db_design_table_groups/index.html.erb +85 -0
  130. data/app/views/dbdoc_engine/admin/db_design_table_groups/new.html.erb +26 -0
  131. data/app/views/dbdoc_engine/db_doc_sessions/new.html.erb +59 -0
  132. data/app/views/dbdoc_engine/home/changelog_details.html.erb +80 -0
  133. data/app/views/dbdoc_engine/home/changelogs.html.erb +20 -0
  134. data/app/views/dbdoc_engine/home/group_details.html.erb +94 -0
  135. data/app/views/dbdoc_engine/home/index.html.erb +11 -0
  136. data/app/views/dbdoc_engine/home/partials/_action_badge.html.erb +11 -0
  137. data/app/views/dbdoc_engine/home/partials/_breadcrumb_navigation.html.erb +30 -0
  138. data/app/views/dbdoc_engine/home/partials/_changelog_rows.html.erb +35 -0
  139. data/app/views/dbdoc_engine/home/partials/_changelog_table_headers.html.erb +16 -0
  140. data/app/views/dbdoc_engine/home/partials/_column_headers.html.erb +23 -0
  141. data/app/views/dbdoc_engine/home/partials/_column_row.html.erb +157 -0
  142. data/app/views/dbdoc_engine/home/partials/_filter_form.html.erb +47 -0
  143. data/app/views/dbdoc_engine/home/partials/_group_section.html.erb +84 -0
  144. data/app/views/dbdoc_engine/home/partials/_pagination.html.erb +5 -0
  145. data/app/views/dbdoc_engine/home/partials/_stats_container.html.erb +46 -0
  146. data/app/views/dbdoc_engine/home/partials/_table_groups.html.erb +7 -0
  147. data/app/views/dbdoc_engine/home/partials/_table_information_section.html.erb +50 -0
  148. data/app/views/dbdoc_engine/home/partials/_table_section.html.erb +48 -0
  149. data/app/views/dbdoc_engine/home/table_details.html.erb +9 -0
  150. data/app/views/dbdoc_engine/schema_diagram/index.html.erb +102 -0
  151. data/app/views/dbdoc_engine/shared/_admin_header.html.erb +78 -0
  152. data/app/views/dbdoc_engine/shared/_header.html.erb +94 -0
  153. data/app/views/dbdoc_engine/shared/_js_translations.html.erb +3 -0
  154. data/app/views/dbdoc_engine/shared/_language_button.html.erb +14 -0
  155. data/app/views/dbdoc_engine/shared/_sidebar.html.erb +128 -0
  156. data/app/views/kaminari/dbdoc_engine/_first_page.html.erb +3 -0
  157. data/app/views/kaminari/dbdoc_engine/_gap.html.erb +3 -0
  158. data/app/views/kaminari/dbdoc_engine/_last_page.html.erb +3 -0
  159. data/app/views/kaminari/dbdoc_engine/_next_page.html.erb +3 -0
  160. data/app/views/kaminari/dbdoc_engine/_page.html.erb +9 -0
  161. data/app/views/kaminari/dbdoc_engine/_paginator.html.erb +17 -0
  162. data/app/views/kaminari/dbdoc_engine/_prev_page.html.erb +3 -0
  163. data/app/views/layouts/dbdoc_engine/application.html.erb +107 -0
  164. data/app/views/layouts/dbdoc_engine/header.html.erb +108 -0
  165. data/config/importmap.rb +11 -0
  166. data/config/locales/en.yml +307 -0
  167. data/config/locales/ja.yml +306 -0
  168. data/config/routes.rb +73 -0
  169. data/db/migrate/rails7/20250227060610_create_db_design_table_groups.rb +15 -0
  170. data/db/migrate/rails7/20250227094626_create_db_design_dynamic_tables.rb +19 -0
  171. data/db/migrate/rails7/20250228022732_create_db_design_dynamic_columns.rb +34 -0
  172. data/db/migrate/rails7/20250401051453_create_db_design_changelogs.rb +26 -0
  173. data/db/migrate/rails7/20250411040822_create_users.rb +14 -0
  174. data/db/migrate/rails7/20250421080851_add_missing_indexes_to_dbdoc_tables.rb +23 -0
  175. data/db/migrate/rails8/20250227060610_create_db_design_table_groups.rb +15 -0
  176. data/db/migrate/rails8/20250227094626_create_db_design_dynamic_tables.rb +19 -0
  177. data/db/migrate/rails8/20250228022732_create_db_design_dynamic_columns.rb +34 -0
  178. data/db/migrate/rails8/20250401051453_create_db_design_changelogs.rb +26 -0
  179. data/db/migrate/rails8/20250411040822_create_users.rb +14 -0
  180. data/db/migrate/rails8/20250421080851_add_missing_indexes_to_dbdoc_tables.rb +23 -0
  181. data/db/seeds.rb +28 -0
  182. data/lib/dbdoc_engine/engine.rb +57 -0
  183. data/lib/dbdoc_engine/version.rb +3 -0
  184. data/lib/dbdoc_engine.rb +9 -0
  185. data/lib/generators/dbdoc_engine/install/install_generator.rb +245 -0
  186. data/lib/generators/dbdoc_engine/uninstall/uninstall_generator.rb +196 -0
  187. data/lib/tasks/dbdoc_engine_tasks.rake +44 -0
  188. data/public/dbdoc_engine_assets/images/camel_chess_head.png +0 -0
  189. data/public/dbdoc_engine_assets/images/dblogo.svg +4 -0
  190. data/public/dbdoc_engine_assets/images/japan_circle.png +0 -0
  191. data/public/dbdoc_engine_assets/images/king_chess_head.png +0 -0
  192. data/public/dbdoc_engine_assets/images/login-bg.svg +44 -0
  193. data/public/dbdoc_engine_assets/images/logo.png +0 -0
  194. data/public/dbdoc_engine_assets/images/logo.svg +12 -0
  195. data/public/dbdoc_engine_assets/images/queen_chess_head.png +0 -0
  196. data/public/dbdoc_engine_assets/images/soldier_chess_headd.png +0 -0
  197. data/public/dbdoc_engine_assets/images/uk_circle_transparent.png +0 -0
  198. metadata +415 -0
@@ -0,0 +1,513 @@
1
+ /* === Dashboard Layout === */
2
+ .dashboard-container {
3
+ background: #f0f2f8;
4
+ min-height: 100vh;
5
+ padding: 28px 32px;
6
+ margin-left: 10px;
7
+ }
8
+
9
+ .dashboard-title {
10
+ color: #2d3a5c;
11
+ font-size: 24px;
12
+ letter-spacing: -0.3px;
13
+ }
14
+
15
+ /* === Breadcrumbs === */
16
+ .dashbread {
17
+ font-weight: bold;
18
+ color: #5366A0;
19
+ }
20
+ .slash {
21
+ padding-left: 7px;
22
+ padding-right: 7px;
23
+ font-weight: 400;
24
+ color: #666C79;
25
+ }
26
+
27
+ /* === Stats Cards Row === */
28
+ .dashboard-stats-row {
29
+ display: grid;
30
+ grid-template-columns: repeat(4, 1fr);
31
+ gap: 20px;
32
+ margin-bottom: 20px;
33
+ }
34
+
35
+ .stat-card {
36
+ background: #fff;
37
+ border-radius: 14px;
38
+ padding: 20px 22px;
39
+ display: flex;
40
+ align-items: center;
41
+ gap: 16px;
42
+ box-shadow: 0 1px 4px rgba(83, 102, 160, 0.08);
43
+ transition: box-shadow 0.2s, transform 0.2s;
44
+ border: 1px solid #e8ecf4;
45
+ }
46
+ .stat-card:hover {
47
+ box-shadow: 0 6px 20px rgba(83, 102, 160, 0.13);
48
+ transform: translateY(-2px);
49
+ }
50
+
51
+ .stat-icon-wrap {
52
+ width: 48px;
53
+ height: 48px;
54
+ border-radius: 12px;
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ font-size: 22px;
59
+ flex-shrink: 0;
60
+ }
61
+ .stat-icon-profile {
62
+ background: linear-gradient(135deg, #5366A0 0%, #6b7ec7 100%);
63
+ overflow: hidden;
64
+ }
65
+ .stat-icon-groups {
66
+ background: linear-gradient(135deg, #22c55e 0%, #4ade80 100%);
67
+ color: #fff;
68
+ }
69
+ .stat-icon-tables {
70
+ background: linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%);
71
+ color: #fff;
72
+ }
73
+ .stat-icon-columns {
74
+ background: linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%);
75
+ color: #fff;
76
+ }
77
+
78
+ .stat-avatar {
79
+ width: 48px;
80
+ height: 48px;
81
+ object-fit: cover;
82
+ }
83
+
84
+ .stat-info {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 2px;
88
+ min-width: 0;
89
+ }
90
+ .stat-label {
91
+ font-size: 12px;
92
+ font-weight: 600;
93
+ color: #8b95a8;
94
+ text-transform: uppercase;
95
+ letter-spacing: 0.6px;
96
+ }
97
+ .stat-value {
98
+ font-size: 26px;
99
+ font-weight: 700;
100
+ color: #2d3a5c;
101
+ line-height: 1.1;
102
+ }
103
+ .stat-value-sm {
104
+ font-size: 16px;
105
+ font-weight: 700;
106
+ color: #5366A0;
107
+ }
108
+
109
+ /* === Action Cards Row === */
110
+ .dashboard-action-row {
111
+ display: grid;
112
+ grid-template-columns: repeat(3, 1fr);
113
+ gap: 20px;
114
+ margin-bottom: 24px;
115
+ }
116
+
117
+ .action-card {
118
+ background: #fff;
119
+ border-radius: 14px;
120
+ padding: 20px 22px;
121
+ display: flex;
122
+ flex-wrap: wrap;
123
+ align-items: flex-start;
124
+ gap: 14px;
125
+ box-shadow: 0 1px 4px rgba(83, 102, 160, 0.08);
126
+ border: 1px solid #e8ecf4;
127
+ transition: box-shadow 0.2s, transform 0.2s;
128
+ position: relative;
129
+ }
130
+ .action-card:hover {
131
+ box-shadow: 0 6px 20px rgba(83, 102, 160, 0.13);
132
+ transform: translateY(-2px);
133
+ }
134
+
135
+ .action-card-icon {
136
+ width: 44px;
137
+ height: 44px;
138
+ border-radius: 10px;
139
+ background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
140
+ color: #fff;
141
+ display: flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ font-size: 20px;
145
+ flex-shrink: 0;
146
+ }
147
+ .action-icon-json {
148
+ background: linear-gradient(135deg, #8b5cf6 0%, #a78bfa 100%);
149
+ }
150
+ .action-icon-schema {
151
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
152
+ }
153
+ .action-card-excel .action-card-icon {
154
+ background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
155
+ }
156
+
157
+ .action-card-body {
158
+ display: flex;
159
+ flex-direction: column;
160
+ gap: 2px;
161
+ flex: 1;
162
+ min-width: 0;
163
+ }
164
+ .action-card-title {
165
+ font-size: 13px;
166
+ font-weight: 700;
167
+ color: #2d3a5c;
168
+ text-transform: uppercase;
169
+ letter-spacing: 0.4px;
170
+ }
171
+ .action-card-sub {
172
+ font-size: 13px;
173
+ color: #8b95a8;
174
+ font-weight: 500;
175
+ }
176
+
177
+ .action-btn {
178
+ font-size: 12px;
179
+ font-weight: 600;
180
+ padding: 5px 12px;
181
+ border-radius: 8px;
182
+ transition: all 0.15s;
183
+ }
184
+ .action-btn-export {
185
+ background: #ecfdf5;
186
+ color: #16a34a;
187
+ border: 1px solid #bbf7d0;
188
+ }
189
+ .action-btn-export:hover {
190
+ background: #16a34a;
191
+ color: #fff;
192
+ border-color: #16a34a;
193
+ }
194
+ .action-btn-import {
195
+ background: #eff6ff;
196
+ color: #3b82f6;
197
+ border: 1px solid #bfdbfe;
198
+ }
199
+ .action-btn-import:hover {
200
+ background: #3b82f6;
201
+ color: #fff;
202
+ border-color: #3b82f6;
203
+ }
204
+ .action-btn-schema {
205
+ background: #fffbeb;
206
+ color: #d97706;
207
+ border: 1px solid #fde68a;
208
+ }
209
+ .action-btn-schema:hover {
210
+ background: #d97706;
211
+ color: #fff;
212
+ border-color: #d97706;
213
+ }
214
+ .action-btn-upload {
215
+ background: #f0f9ff;
216
+ color: #0ea5e9;
217
+ border: 1px solid #bae6fd;
218
+ }
219
+ .action-btn-upload:hover {
220
+ background: #0ea5e9;
221
+ color: #fff;
222
+ border-color: #0ea5e9;
223
+ }
224
+
225
+ /* === Drop Zone === */
226
+ .drop-zone {
227
+ display: none;
228
+ width: 100%;
229
+ border: 2px dashed #cbd5e1;
230
+ border-radius: 10px;
231
+ padding: 14px;
232
+ text-align: center;
233
+ background: #f8fafc;
234
+ font-size: 13px;
235
+ color: #64748b;
236
+ margin-top: 10px;
237
+ transition: border-color 0.2s, background 0.2s;
238
+ }
239
+ .drop-zone.drag-over {
240
+ border-color: #5366A0;
241
+ background: #eef2ff;
242
+ }
243
+ .drop-zone-link {
244
+ color: #3b82f6;
245
+ cursor: pointer;
246
+ text-decoration: underline;
247
+ font-weight: 600;
248
+ }
249
+
250
+ /* === Main Content Row === */
251
+ .dashboard-main-row {
252
+ display: grid;
253
+ grid-template-columns: 1.6fr 1fr;
254
+ gap: 24px;
255
+ margin-top: 0;
256
+ }
257
+
258
+ .dashboard-table-section {
259
+ background: #fff;
260
+ border-radius: 14px;
261
+ box-shadow: 0 1px 4px rgba(83, 102, 160, 0.08);
262
+ border: 1px solid #e8ecf4;
263
+ padding: 22px 24px;
264
+ }
265
+
266
+ .dashboard-chart-section {
267
+ background: #fff;
268
+ border-radius: 14px;
269
+ box-shadow: 0 1px 4px rgba(83, 102, 160, 0.08);
270
+ border: 1px solid #e8ecf4;
271
+ padding: 22px 24px;
272
+ display: flex;
273
+ flex-direction: column;
274
+ }
275
+
276
+ .dashboard-section-title {
277
+ color: #2d3a5c;
278
+ font-size: 15px;
279
+ font-weight: 700;
280
+ letter-spacing: 0.2px;
281
+ }
282
+ .dashboard-section-title-right {
283
+ color: #2d3a5c;
284
+ font-size: 15px;
285
+ font-weight: 700;
286
+ margin-bottom: 18px;
287
+ }
288
+
289
+ .dashboard-chart-wrap {
290
+ flex: 1;
291
+ display: flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ min-height: 300px;
295
+ }
296
+ .dashboard-chart-wrap canvas {
297
+ max-width: 100%;
298
+ max-height: 100%;
299
+ }
300
+
301
+ /* === Filter Buttons === */
302
+ .filter-buttons {
303
+ display: flex;
304
+ gap: 6px;
305
+ }
306
+ .filter-button {
307
+ padding: 5px 14px;
308
+ border-radius: 20px;
309
+ background: #f1f5f9;
310
+ color: #64748b;
311
+ text-decoration: none;
312
+ font-size: 12px;
313
+ font-weight: 600;
314
+ transition: all 0.2s;
315
+ border: 1px solid transparent;
316
+ }
317
+ .filter-button:hover {
318
+ background: #e2e8f0;
319
+ color: #334155;
320
+ }
321
+ .filter-button.active {
322
+ background: #5366A0;
323
+ color: #fff;
324
+ border-color: #5366A0;
325
+ }
326
+
327
+ /* === Table Styling === */
328
+ .dashboard_table_scroll {
329
+ height: 340px;
330
+ overflow-y: auto;
331
+ scrollbar-width: thin;
332
+ scrollbar-color: #cbd5e1 transparent;
333
+ }
334
+ .dashboard_table_scroll::-webkit-scrollbar {
335
+ width: 5px;
336
+ }
337
+ .dashboard_table_scroll::-webkit-scrollbar-thumb {
338
+ background: #cbd5e1;
339
+ border-radius: 8px;
340
+ }
341
+
342
+ .dashboard_table_header {
343
+ background-color: #f8fafc !important;
344
+ font-size: 12px;
345
+ font-weight: 700;
346
+ color: #8b95a8 !important;
347
+ text-transform: uppercase;
348
+ letter-spacing: 0.5px;
349
+ }
350
+ .dashboard_table_header th {
351
+ border-bottom: 2px solid #e8ecf4 !important;
352
+ padding: 10px 14px !important;
353
+ }
354
+
355
+ .contents-changelog {
356
+ font-size: 13px;
357
+ color: #475569;
358
+ vertical-align: middle;
359
+ padding: 10px 14px !important;
360
+ }
361
+
362
+ .table-hover tbody tr:hover {
363
+ background-color: #f8fafc;
364
+ }
365
+
366
+ .table-responsive {
367
+ overflow-y: auto;
368
+ }
369
+ .sticky-top {
370
+ z-index: 999;
371
+ position: sticky;
372
+ top: 0;
373
+ }
374
+
375
+ /* === Pagination === */
376
+ .dashboard-pagination {
377
+ margin-top: 16px;
378
+ display: flex;
379
+ justify-content: flex-end;
380
+ }
381
+ .pagination {
382
+ display: flex;
383
+ list-style: none;
384
+ padding: 0;
385
+ margin: 0;
386
+ }
387
+ .pagination .page-item {
388
+ margin: 0 2px;
389
+ }
390
+ .pagination .page-item .page-link {
391
+ border-radius: 6px;
392
+ color: #64748b;
393
+ padding: 6px 12px;
394
+ text-decoration: none;
395
+ border: 1px solid #e2e8f0;
396
+ font-size: 13px;
397
+ background-color: #fff;
398
+ transition: all 0.15s;
399
+ }
400
+ .pagination .page-item.active .page-link {
401
+ background-color: #5366A0;
402
+ color: white;
403
+ border-color: #5366A0;
404
+ }
405
+ .pagination .page-item .page-link:hover:not(.active) {
406
+ background-color: #f1f5f9;
407
+ }
408
+ .pagination .page-item.disabled .page-link {
409
+ color: #cbd5e1;
410
+ pointer-events: none;
411
+ }
412
+
413
+ /* === Badge === */
414
+ .badge {
415
+ font-size: 11px;
416
+ font-weight: 600;
417
+ padding: 5px 10px;
418
+ border-radius: 6px;
419
+ }
420
+
421
+ /* === Legacy Classes (Changelog filters) === */
422
+ .changelog-above {
423
+ background-color: white;
424
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
425
+ margin-bottom: 1rem;
426
+ border-radius: 10px;
427
+ }
428
+ .input-group-text {
429
+ background-color: #f8fafc;
430
+ border-color: #e2e8f0;
431
+ }
432
+ .cantrol, .salect {
433
+ font-size: 13px;
434
+ padding: 0.375rem 0.75rem;
435
+ }
436
+ .applybutton {
437
+ background-color: #5366A0;
438
+ color: white;
439
+ border: none;
440
+ font-weight: bold;
441
+ font-size: 13px;
442
+ padding: 8px 20px;
443
+ border-radius: 8px;
444
+ }
445
+ .clear-button {
446
+ background-color: #f1f5f9;
447
+ color: #64748b;
448
+ border: none;
449
+ font-size: 13px;
450
+ padding: 8px 20px;
451
+ border-radius: 8px;
452
+ }
453
+
454
+ /* === Chart Legend === */
455
+ .chart-legend {
456
+ list-style: none;
457
+ padding: 0;
458
+ display: flex;
459
+ gap: 16px;
460
+ justify-content: center;
461
+ margin-top: 16px;
462
+ }
463
+ .chart-legend-item {
464
+ display: flex;
465
+ align-items: center;
466
+ gap: 8px;
467
+ font-size: 13px;
468
+ color: #64748b;
469
+ }
470
+ .chart-legend-color {
471
+ width: 10px;
472
+ height: 10px;
473
+ border-radius: 50%;
474
+ }
475
+
476
+ /* === Responsive === */
477
+ @media (max-width: 1400px) {
478
+ .dashboard-stats-row {
479
+ grid-template-columns: repeat(2, 1fr);
480
+ }
481
+ .dashboard-action-row {
482
+ grid-template-columns: repeat(2, 1fr);
483
+ }
484
+ }
485
+
486
+ @media (max-width: 1200px) {
487
+ .dashboard-main-row {
488
+ grid-template-columns: 1fr;
489
+ }
490
+ }
491
+
492
+ @media (max-width: 992px) {
493
+ .dashboard-stats-row {
494
+ grid-template-columns: 1fr;
495
+ }
496
+ .dashboard-action-row {
497
+ grid-template-columns: 1fr;
498
+ }
499
+ .dashboard-container {
500
+ padding: 20px 16px;
501
+ }
502
+ }
503
+
504
+ @media (max-width: 768px) {
505
+ .filter-buttons {
506
+ flex-wrap: wrap;
507
+ }
508
+ .d-flex.align-items-center.justify-content-between.mb-3 {
509
+ flex-direction: column;
510
+ align-items: flex-start !important;
511
+ gap: 8px;
512
+ }
513
+ }
@@ -0,0 +1,117 @@
1
+ /* Layout structure styles */
2
+ body {
3
+ font-family: 'Noto Sans JP', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
4
+ min-height: 100vh;
5
+ margin: 0;
6
+ padding: 0;
7
+ overflow-x: hidden;
8
+ }
9
+
10
+ /* Ensure sidebar takes full height */
11
+ .sidebar {
12
+ min-height: 100vh;
13
+ position: sticky;
14
+ top: 0;
15
+ z-index: 1000;
16
+ }
17
+
18
+ /* Right content wrapper - for everything except sidebar */
19
+ .right-content-wrapper {
20
+ min-height: 100vh;
21
+ width: calc(100% - 250px); /* Adjust based on your sidebar width */
22
+ overflow-x: hidden;
23
+ }
24
+
25
+ /* When sidebar is closed, adjust the right content width */
26
+ .sidebar.closed + .right-content-wrapper {
27
+ width: calc(100% - 20px); /* Adjust based on your collapsed sidebar width */
28
+ }
29
+
30
+ /* Header styles */
31
+ header {
32
+ width: 100%;
33
+ z-index: 999;
34
+ }
35
+
36
+ /* Main content area */
37
+ .main-content {
38
+ width: 100%;
39
+ }
40
+
41
+ /* Accordion styles - Fixed to prevent conflicts */
42
+ .accordion-collapse {
43
+ display: none;
44
+ overflow: hidden;
45
+ }
46
+
47
+ .accordion-collapse.show {
48
+ display: block;
49
+ }
50
+
51
+ /* Remove any conflicting collapse styles */
52
+ .accordion-collapse.collapse {
53
+ display: none;
54
+ }
55
+
56
+ .accordion-collapse.collapse.show {
57
+ display: block;
58
+ }
59
+
60
+ /* Accordion button styles */
61
+ .accordion-button {
62
+ position: relative;
63
+ display: flex;
64
+ align-items: center;
65
+ width: 100%;
66
+ padding: 1rem 1.25rem;
67
+ font-size: 1rem;
68
+ color: var(--bs-accordion-btn-color, #212529);
69
+ text-align: left;
70
+ background-color: var(--bs-accordion-btn-bg, #fff);
71
+ border: 0;
72
+ border-radius: 0;
73
+ overflow-anchor: none;
74
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
75
+ }
76
+
77
+ .accordion-button:not(.collapsed) {
78
+ color: var(--bs-accordion-btn-active-color, #0c63e4);
79
+ background-color: var(--bs-accordion-btn-active-bg, #e7f1ff);
80
+ box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width, 1px)) 0 var(--bs-accordion-border-color, #dee2e6);
81
+ }
82
+
83
+ .accordion-button::after {
84
+ flex-shrink: 0;
85
+ width: var(--bs-accordion-btn-icon-width, 1.25rem);
86
+ height: var(--bs-accordion-btn-icon-width, 1.25rem);
87
+ margin-left: auto;
88
+ content: "";
89
+ background-image: var(--bs-accordion-btn-icon, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"));
90
+ background-repeat: no-repeat;
91
+ background-size: var(--bs-accordion-btn-icon-width, 1.25rem);
92
+ transition: transform 0.2s ease-in-out;
93
+ }
94
+
95
+ .accordion-button.collapsed::after {
96
+ background-image: var(--bs-accordion-btn-icon, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"));
97
+ transform: rotate(-90deg);
98
+ }
99
+
100
+ .accordion-button:not(.collapsed)::after {
101
+ background-image: var(--bs-accordion-btn-active-icon, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"));
102
+ transform: rotate(0deg);
103
+ }
104
+
105
+ /* Ensure smooth transitions */
106
+ .accordion-collapse {
107
+ transition: all 0.2s ease-in-out;
108
+ }
109
+
110
+ /* Fix for any potential bootstrap conflicts */
111
+ .collapse:not(.show) {
112
+ display: none;
113
+ }
114
+
115
+ .collapse.show {
116
+ display: block;
117
+ }