coati-payroll 0.0.2__py3-none-any.whl

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.

Potentially problematic release.


This version of coati-payroll might be problematic. Click here for more details.

Files changed (243) hide show
  1. coati_payroll/__init__.py +415 -0
  2. coati_payroll/app.py +95 -0
  3. coati_payroll/audit_helpers.py +904 -0
  4. coati_payroll/auth.py +123 -0
  5. coati_payroll/cli.py +1318 -0
  6. coati_payroll/config.py +219 -0
  7. coati_payroll/demo_data.py +813 -0
  8. coati_payroll/enums.py +278 -0
  9. coati_payroll/forms.py +1769 -0
  10. coati_payroll/formula_engine/__init__.py +81 -0
  11. coati_payroll/formula_engine/ast/__init__.py +110 -0
  12. coati_payroll/formula_engine/ast/ast_visitor.py +259 -0
  13. coati_payroll/formula_engine/ast/expression_evaluator.py +228 -0
  14. coati_payroll/formula_engine/ast/safe_operators.py +131 -0
  15. coati_payroll/formula_engine/ast/type_converter.py +172 -0
  16. coati_payroll/formula_engine/data_sources.py +752 -0
  17. coati_payroll/formula_engine/engine.py +247 -0
  18. coati_payroll/formula_engine/exceptions.py +52 -0
  19. coati_payroll/formula_engine/execution/__init__.py +24 -0
  20. coati_payroll/formula_engine/execution/execution_context.py +52 -0
  21. coati_payroll/formula_engine/execution/step_executor.py +62 -0
  22. coati_payroll/formula_engine/execution/variable_store.py +59 -0
  23. coati_payroll/formula_engine/novelty_codes.py +206 -0
  24. coati_payroll/formula_engine/results/__init__.py +20 -0
  25. coati_payroll/formula_engine/results/execution_result.py +59 -0
  26. coati_payroll/formula_engine/steps/__init__.py +30 -0
  27. coati_payroll/formula_engine/steps/assignment_step.py +71 -0
  28. coati_payroll/formula_engine/steps/base_step.py +48 -0
  29. coati_payroll/formula_engine/steps/calculation_step.py +42 -0
  30. coati_payroll/formula_engine/steps/conditional_step.py +122 -0
  31. coati_payroll/formula_engine/steps/step_factory.py +58 -0
  32. coati_payroll/formula_engine/steps/tax_lookup_step.py +45 -0
  33. coati_payroll/formula_engine/tables/__init__.py +24 -0
  34. coati_payroll/formula_engine/tables/bracket_calculator.py +51 -0
  35. coati_payroll/formula_engine/tables/table_lookup.py +161 -0
  36. coati_payroll/formula_engine/tables/tax_table.py +32 -0
  37. coati_payroll/formula_engine/validation/__init__.py +24 -0
  38. coati_payroll/formula_engine/validation/schema_validator.py +37 -0
  39. coati_payroll/formula_engine/validation/security_validator.py +52 -0
  40. coati_payroll/formula_engine/validation/tax_table_validator.py +205 -0
  41. coati_payroll/formula_engine_examples.py +153 -0
  42. coati_payroll/i18n.py +54 -0
  43. coati_payroll/initial_data.py +613 -0
  44. coati_payroll/interes_engine.py +450 -0
  45. coati_payroll/liquidacion_engine/__init__.py +25 -0
  46. coati_payroll/liquidacion_engine/engine.py +267 -0
  47. coati_payroll/locale_config.py +165 -0
  48. coati_payroll/log.py +138 -0
  49. coati_payroll/model.py +2410 -0
  50. coati_payroll/nomina_engine/__init__.py +87 -0
  51. coati_payroll/nomina_engine/calculators/__init__.py +30 -0
  52. coati_payroll/nomina_engine/calculators/benefit_calculator.py +79 -0
  53. coati_payroll/nomina_engine/calculators/concept_calculator.py +254 -0
  54. coati_payroll/nomina_engine/calculators/deduction_calculator.py +105 -0
  55. coati_payroll/nomina_engine/calculators/exchange_rate_calculator.py +51 -0
  56. coati_payroll/nomina_engine/calculators/perception_calculator.py +75 -0
  57. coati_payroll/nomina_engine/calculators/salary_calculator.py +86 -0
  58. coati_payroll/nomina_engine/domain/__init__.py +27 -0
  59. coati_payroll/nomina_engine/domain/calculation_items.py +52 -0
  60. coati_payroll/nomina_engine/domain/employee_calculation.py +53 -0
  61. coati_payroll/nomina_engine/domain/payroll_context.py +44 -0
  62. coati_payroll/nomina_engine/engine.py +188 -0
  63. coati_payroll/nomina_engine/processors/__init__.py +28 -0
  64. coati_payroll/nomina_engine/processors/accounting_processor.py +171 -0
  65. coati_payroll/nomina_engine/processors/accumulation_processor.py +90 -0
  66. coati_payroll/nomina_engine/processors/loan_processor.py +227 -0
  67. coati_payroll/nomina_engine/processors/novelty_processor.py +42 -0
  68. coati_payroll/nomina_engine/processors/vacation_processor.py +67 -0
  69. coati_payroll/nomina_engine/repositories/__init__.py +32 -0
  70. coati_payroll/nomina_engine/repositories/acumulado_repository.py +83 -0
  71. coati_payroll/nomina_engine/repositories/base_repository.py +40 -0
  72. coati_payroll/nomina_engine/repositories/config_repository.py +102 -0
  73. coati_payroll/nomina_engine/repositories/employee_repository.py +34 -0
  74. coati_payroll/nomina_engine/repositories/exchange_rate_repository.py +58 -0
  75. coati_payroll/nomina_engine/repositories/novelty_repository.py +54 -0
  76. coati_payroll/nomina_engine/repositories/planilla_repository.py +52 -0
  77. coati_payroll/nomina_engine/results/__init__.py +24 -0
  78. coati_payroll/nomina_engine/results/error_result.py +28 -0
  79. coati_payroll/nomina_engine/results/payroll_result.py +53 -0
  80. coati_payroll/nomina_engine/results/validation_result.py +39 -0
  81. coati_payroll/nomina_engine/services/__init__.py +22 -0
  82. coati_payroll/nomina_engine/services/accounting_voucher_service.py +708 -0
  83. coati_payroll/nomina_engine/services/employee_processing_service.py +173 -0
  84. coati_payroll/nomina_engine/services/payroll_execution_service.py +374 -0
  85. coati_payroll/nomina_engine/services/snapshot_service.py +295 -0
  86. coati_payroll/nomina_engine/validators/__init__.py +31 -0
  87. coati_payroll/nomina_engine/validators/base_validator.py +48 -0
  88. coati_payroll/nomina_engine/validators/currency_validator.py +50 -0
  89. coati_payroll/nomina_engine/validators/employee_validator.py +87 -0
  90. coati_payroll/nomina_engine/validators/period_validator.py +44 -0
  91. coati_payroll/nomina_engine/validators/planilla_validator.py +136 -0
  92. coati_payroll/plugin_manager.py +176 -0
  93. coati_payroll/queue/__init__.py +33 -0
  94. coati_payroll/queue/driver.py +127 -0
  95. coati_payroll/queue/drivers/__init__.py +22 -0
  96. coati_payroll/queue/drivers/dramatiq_driver.py +268 -0
  97. coati_payroll/queue/drivers/huey_driver.py +390 -0
  98. coati_payroll/queue/drivers/noop_driver.py +54 -0
  99. coati_payroll/queue/selector.py +121 -0
  100. coati_payroll/queue/tasks.py +764 -0
  101. coati_payroll/rate_limiting.py +83 -0
  102. coati_payroll/rbac.py +183 -0
  103. coati_payroll/report_engine.py +512 -0
  104. coati_payroll/report_export.py +208 -0
  105. coati_payroll/schema_validator.py +167 -0
  106. coati_payroll/security.py +77 -0
  107. coati_payroll/static/styles.css +1044 -0
  108. coati_payroll/system_reports.py +573 -0
  109. coati_payroll/templates/auth/login.html +189 -0
  110. coati_payroll/templates/base.html +283 -0
  111. coati_payroll/templates/index.html +227 -0
  112. coati_payroll/templates/macros.html +146 -0
  113. coati_payroll/templates/modules/calculation_rule/form.html +78 -0
  114. coati_payroll/templates/modules/calculation_rule/index.html +102 -0
  115. coati_payroll/templates/modules/calculation_rule/schema_editor.html +1159 -0
  116. coati_payroll/templates/modules/carga_inicial_prestacion/form.html +170 -0
  117. coati_payroll/templates/modules/carga_inicial_prestacion/index.html +170 -0
  118. coati_payroll/templates/modules/carga_inicial_prestacion/reporte.html +193 -0
  119. coati_payroll/templates/modules/config_calculos/index.html +44 -0
  120. coati_payroll/templates/modules/configuracion/index.html +90 -0
  121. coati_payroll/templates/modules/currency/form.html +47 -0
  122. coati_payroll/templates/modules/currency/index.html +64 -0
  123. coati_payroll/templates/modules/custom_field/form.html +62 -0
  124. coati_payroll/templates/modules/custom_field/index.html +78 -0
  125. coati_payroll/templates/modules/deduccion/form.html +1 -0
  126. coati_payroll/templates/modules/deduccion/index.html +1 -0
  127. coati_payroll/templates/modules/employee/form.html +254 -0
  128. coati_payroll/templates/modules/employee/index.html +76 -0
  129. coati_payroll/templates/modules/empresa/form.html +74 -0
  130. coati_payroll/templates/modules/empresa/index.html +71 -0
  131. coati_payroll/templates/modules/exchange_rate/form.html +47 -0
  132. coati_payroll/templates/modules/exchange_rate/import.html +93 -0
  133. coati_payroll/templates/modules/exchange_rate/index.html +114 -0
  134. coati_payroll/templates/modules/liquidacion/index.html +58 -0
  135. coati_payroll/templates/modules/liquidacion/nueva.html +51 -0
  136. coati_payroll/templates/modules/liquidacion/ver.html +91 -0
  137. coati_payroll/templates/modules/payroll_concepts/audit_log.html +146 -0
  138. coati_payroll/templates/modules/percepcion/form.html +1 -0
  139. coati_payroll/templates/modules/percepcion/index.html +1 -0
  140. coati_payroll/templates/modules/planilla/config.html +190 -0
  141. coati_payroll/templates/modules/planilla/config_deducciones.html +129 -0
  142. coati_payroll/templates/modules/planilla/config_empleados.html +116 -0
  143. coati_payroll/templates/modules/planilla/config_percepciones.html +113 -0
  144. coati_payroll/templates/modules/planilla/config_prestaciones.html +118 -0
  145. coati_payroll/templates/modules/planilla/config_reglas.html +120 -0
  146. coati_payroll/templates/modules/planilla/ejecutar_nomina.html +106 -0
  147. coati_payroll/templates/modules/planilla/form.html +197 -0
  148. coati_payroll/templates/modules/planilla/index.html +144 -0
  149. coati_payroll/templates/modules/planilla/listar_nominas.html +91 -0
  150. coati_payroll/templates/modules/planilla/log_nomina.html +135 -0
  151. coati_payroll/templates/modules/planilla/novedades/form.html +177 -0
  152. coati_payroll/templates/modules/planilla/novedades/index.html +170 -0
  153. coati_payroll/templates/modules/planilla/ver_nomina.html +477 -0
  154. coati_payroll/templates/modules/planilla/ver_nomina_empleado.html +231 -0
  155. coati_payroll/templates/modules/plugins/index.html +71 -0
  156. coati_payroll/templates/modules/prestacion/form.html +1 -0
  157. coati_payroll/templates/modules/prestacion/index.html +1 -0
  158. coati_payroll/templates/modules/prestacion_management/dashboard.html +150 -0
  159. coati_payroll/templates/modules/prestacion_management/initial_balance_bulk.html +195 -0
  160. coati_payroll/templates/modules/prestamo/approve.html +156 -0
  161. coati_payroll/templates/modules/prestamo/condonacion.html +249 -0
  162. coati_payroll/templates/modules/prestamo/detail.html +443 -0
  163. coati_payroll/templates/modules/prestamo/form.html +203 -0
  164. coati_payroll/templates/modules/prestamo/index.html +150 -0
  165. coati_payroll/templates/modules/prestamo/pago_extraordinario.html +211 -0
  166. coati_payroll/templates/modules/prestamo/tabla_pago_pdf.html +181 -0
  167. coati_payroll/templates/modules/report/admin_index.html +125 -0
  168. coati_payroll/templates/modules/report/detail.html +129 -0
  169. coati_payroll/templates/modules/report/execute.html +266 -0
  170. coati_payroll/templates/modules/report/index.html +95 -0
  171. coati_payroll/templates/modules/report/permissions.html +64 -0
  172. coati_payroll/templates/modules/settings/index.html +274 -0
  173. coati_payroll/templates/modules/shared/concept_form.html +201 -0
  174. coati_payroll/templates/modules/shared/concept_index.html +145 -0
  175. coati_payroll/templates/modules/tipo_planilla/form.html +70 -0
  176. coati_payroll/templates/modules/tipo_planilla/index.html +68 -0
  177. coati_payroll/templates/modules/user/form.html +65 -0
  178. coati_payroll/templates/modules/user/index.html +76 -0
  179. coati_payroll/templates/modules/user/profile.html +81 -0
  180. coati_payroll/templates/modules/vacation/account_detail.html +149 -0
  181. coati_payroll/templates/modules/vacation/account_form.html +52 -0
  182. coati_payroll/templates/modules/vacation/account_index.html +68 -0
  183. coati_payroll/templates/modules/vacation/dashboard.html +156 -0
  184. coati_payroll/templates/modules/vacation/initial_balance_bulk.html +149 -0
  185. coati_payroll/templates/modules/vacation/initial_balance_form.html +93 -0
  186. coati_payroll/templates/modules/vacation/leave_request_detail.html +158 -0
  187. coati_payroll/templates/modules/vacation/leave_request_form.html +61 -0
  188. coati_payroll/templates/modules/vacation/leave_request_index.html +98 -0
  189. coati_payroll/templates/modules/vacation/policy_detail.html +176 -0
  190. coati_payroll/templates/modules/vacation/policy_form.html +152 -0
  191. coati_payroll/templates/modules/vacation/policy_index.html +79 -0
  192. coati_payroll/templates/modules/vacation/register_taken_form.html +178 -0
  193. coati_payroll/translations/en/LC_MESSAGES/messages.mo +0 -0
  194. coati_payroll/translations/en/LC_MESSAGES/messages.po +7283 -0
  195. coati_payroll/translations/es/LC_MESSAGES/messages.mo +0 -0
  196. coati_payroll/translations/es/LC_MESSAGES/messages.po +7374 -0
  197. coati_payroll/vacation_service.py +451 -0
  198. coati_payroll/version.py +18 -0
  199. coati_payroll/vistas/__init__.py +64 -0
  200. coati_payroll/vistas/calculation_rule.py +307 -0
  201. coati_payroll/vistas/carga_inicial_prestacion.py +423 -0
  202. coati_payroll/vistas/config_calculos.py +72 -0
  203. coati_payroll/vistas/configuracion.py +87 -0
  204. coati_payroll/vistas/constants.py +17 -0
  205. coati_payroll/vistas/currency.py +112 -0
  206. coati_payroll/vistas/custom_field.py +120 -0
  207. coati_payroll/vistas/employee.py +305 -0
  208. coati_payroll/vistas/empresa.py +153 -0
  209. coati_payroll/vistas/exchange_rate.py +341 -0
  210. coati_payroll/vistas/liquidacion.py +205 -0
  211. coati_payroll/vistas/payroll_concepts.py +580 -0
  212. coati_payroll/vistas/planilla/__init__.py +38 -0
  213. coati_payroll/vistas/planilla/association_routes.py +238 -0
  214. coati_payroll/vistas/planilla/config_routes.py +158 -0
  215. coati_payroll/vistas/planilla/export_routes.py +175 -0
  216. coati_payroll/vistas/planilla/helpers/__init__.py +34 -0
  217. coati_payroll/vistas/planilla/helpers/association_helpers.py +161 -0
  218. coati_payroll/vistas/planilla/helpers/excel_helpers.py +29 -0
  219. coati_payroll/vistas/planilla/helpers/form_helpers.py +97 -0
  220. coati_payroll/vistas/planilla/nomina_routes.py +488 -0
  221. coati_payroll/vistas/planilla/novedad_routes.py +227 -0
  222. coati_payroll/vistas/planilla/routes.py +145 -0
  223. coati_payroll/vistas/planilla/services/__init__.py +26 -0
  224. coati_payroll/vistas/planilla/services/export_service.py +687 -0
  225. coati_payroll/vistas/planilla/services/nomina_service.py +233 -0
  226. coati_payroll/vistas/planilla/services/novedad_service.py +126 -0
  227. coati_payroll/vistas/planilla/services/planilla_service.py +34 -0
  228. coati_payroll/vistas/planilla/validators/__init__.py +18 -0
  229. coati_payroll/vistas/planilla/validators/planilla_validators.py +40 -0
  230. coati_payroll/vistas/plugins.py +45 -0
  231. coati_payroll/vistas/prestacion.py +272 -0
  232. coati_payroll/vistas/prestamo.py +808 -0
  233. coati_payroll/vistas/report.py +432 -0
  234. coati_payroll/vistas/settings.py +29 -0
  235. coati_payroll/vistas/tipo_planilla.py +134 -0
  236. coati_payroll/vistas/user.py +172 -0
  237. coati_payroll/vistas/vacation.py +1045 -0
  238. coati_payroll-0.0.2.dist-info/LICENSE +201 -0
  239. coati_payroll-0.0.2.dist-info/METADATA +581 -0
  240. coati_payroll-0.0.2.dist-info/RECORD +243 -0
  241. coati_payroll-0.0.2.dist-info/WHEEL +5 -0
  242. coati_payroll-0.0.2.dist-info/entry_points.txt +2 -0
  243. coati_payroll-0.0.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1044 @@
1
+ /* ==================================================
2
+ Tema Empresarial Coati Payroll
3
+ - Estilo empresarial profesional
4
+ - Paleta: tonos profesionales y corporativos
5
+ - Tipografía compacta y legible
6
+ ==================================================*/
7
+
8
+ :root{
9
+ /* Primary Enterprise Palette */
10
+ --coati-dark: #5D4037; /* Marrón Mocha Oscuro - navegación */
11
+ --coati-navbar: #5D4037; /* Marrón Mocha Oscuro - navbar */
12
+ --coati-primary: #A0522D; /* Terracota / Naranja Quemado - acciones primarias */
13
+ --coati-primary-hover: #8B4513; /* Saddle Brown - hover state for primary */
14
+ --coati-mid: #5D4037; /* Marrón para acentos */
15
+ --coati-sand: #FAF8F6; /* Blanco cálido/crudo - fondo sidebar */
16
+ --coati-light: #FAF8F6; /* Blanco cálido/crudo */
17
+ --coati-accent:#A0522D; /* Terracota para acentos */
18
+ --coati-amber:#A0522D; /* Terracota */
19
+
20
+ /* Neutral Grays */
21
+ --coati-border:#DDDDDD; /* Gris para bordes */
22
+ --coati-border-light:#EEEEEE; /* Gris muy claro para separadores */
23
+ --text-primary: #333333; /* Gris oscuro para texto principal */
24
+ --text-secondary: #666666; /* Gris medio para texto secundario */
25
+ --muted: #666666;
26
+
27
+ /* Background */
28
+ --bg: #FAF8F6; /* Blanco cálido/crudo para contenido */
29
+ --bg-white: #FFFFFF; /* Blanco puro para cards */
30
+
31
+ /* UI */
32
+ --radius: 4px; /* Bordes más sutiles */
33
+ --transition: 0.2s ease;
34
+
35
+ /* Sidebar dimensions */
36
+ --sidebar-width: 240px;
37
+ --sidebar-collapsed-width: 56px;
38
+ }
39
+
40
+ /* Tipografía base - empresarial y compacta */
41
+ body{
42
+ font-family: 'Roboto', 'Open Sans', system-ui, -apple-system, sans-serif;
43
+ background: var(--bg);
44
+ color: var(--text-primary);
45
+ -webkit-font-smoothing:antialiased;
46
+ -moz-osx-font-smoothing:grayscale;
47
+ line-height: 1.5;
48
+ font-size: 13px;
49
+ }
50
+
51
+ /* Navbar - empresarial y compacta */
52
+ .navbar{
53
+ background: var(--coati-navbar);
54
+ border-bottom: 1px solid var(--coati-border);
55
+ padding: 0.35rem 1rem;
56
+ box-shadow: 0 1px 3px rgba(0,0,0,0.08);
57
+ min-height: 48px;
58
+ }
59
+ .navbar .navbar-brand{
60
+ color: #FFFFFF;
61
+ font-weight: 600;
62
+ letter-spacing: 0.5px;
63
+ font-size: 0.95rem;
64
+ display: flex;
65
+ align-items: center;
66
+ gap: 8px;
67
+ }
68
+ .navbar .navbar-brand:hover{ color: #FFFFFF; opacity: 0.9; }
69
+ .navbar .nav-link{
70
+ color: rgba(255,255,255,0.85) !important;
71
+ font-weight: 500;
72
+ font-size: 12px;
73
+ padding: 0.4rem 0.75rem;
74
+ transition: color var(--transition);
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 5px;
78
+ }
79
+ .navbar .nav-link:hover{ color: #FFFFFF !important; }
80
+ .navbar .nav-link i { font-size: 0.9rem; }
81
+
82
+ /* Navbar nav items - ensure horizontal layout and no bullets */
83
+ .navbar .navbar-nav {
84
+ list-style: none;
85
+ padding: 0;
86
+ margin: 0;
87
+ display: flex;
88
+ flex-direction: row;
89
+ }
90
+ .navbar .navbar-nav .nav-item {
91
+ list-style: none;
92
+ }
93
+
94
+ /* Sidebar list - remove bullets */
95
+ .sidebar ul,
96
+ .sidebar .nav {
97
+ list-style: none;
98
+ padding: 0;
99
+ margin: 0;
100
+ }
101
+ .sidebar li,
102
+ .sidebar .nav-item {
103
+ list-style: none;
104
+ }
105
+
106
+ /* Logo placeholder - compacto */
107
+ .logo-placeholder {
108
+ width: 28px;
109
+ height: 28px;
110
+ background: var(--coati-primary);
111
+ border-radius: 4px;
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ font-weight: bold;
116
+ color: #FFFFFF;
117
+ font-size: 0.8rem;
118
+ }
119
+
120
+ /* Sidebar empresarial - colapsable con iconos, superpuesto al contenido */
121
+ .sidebar{
122
+ width: var(--sidebar-collapsed-width);
123
+ min-height: calc(100vh - 48px);
124
+ padding: 8px 4px;
125
+ background: var(--bg-white);
126
+ border-right: 1px solid var(--coati-border);
127
+ transition: width var(--transition);
128
+ overflow-x: hidden;
129
+ overflow-y: auto;
130
+ position: fixed;
131
+ left: 0;
132
+ top: 48px;
133
+ z-index: 100;
134
+ box-shadow: 2px 0 8px rgba(0,0,0,0.05);
135
+ }
136
+ .sidebar:hover {
137
+ width: var(--sidebar-width);
138
+ box-shadow: 4px 0 15px rgba(0,0,0,0.1);
139
+ }
140
+ .sidebar .nav-link{
141
+ color: var(--text-secondary);
142
+ border-radius: var(--radius);
143
+ padding: 8px 12px;
144
+ margin-bottom: 2px;
145
+ font-weight: 500;
146
+ font-size: 12px;
147
+ transition: all var(--transition);
148
+ position: relative;
149
+ white-space: nowrap;
150
+ overflow: hidden;
151
+ text-overflow: clip;
152
+ }
153
+ /* Defense-in-depth approach to hide text when sidebar is collapsed:
154
+ 1. Outer span: width-based hiding prevents container from taking space
155
+ 2. Inner span: opacity-based hiding ensures any overflow text is invisible */
156
+ .sidebar .nav-link > span {
157
+ display: inline-block;
158
+ width: 0;
159
+ overflow: hidden;
160
+ transition: width var(--transition);
161
+ }
162
+ .sidebar:hover .nav-link > span {
163
+ width: auto;
164
+ }
165
+ .sidebar .nav-link span span {
166
+ opacity: 0;
167
+ transition: opacity var(--transition);
168
+ }
169
+ .sidebar:hover .nav-link span span {
170
+ opacity: 1;
171
+ }
172
+ .sidebar .nav-link:hover{
173
+ background: rgba(160,82,45,0.08);
174
+ color: var(--coati-primary);
175
+ }
176
+ .sidebar .nav-link:hover::before {
177
+ content: '';
178
+ position: absolute;
179
+ left: 0;
180
+ top: 50%;
181
+ transform: translateY(-50%);
182
+ width: 3px;
183
+ height: 70%;
184
+ background: var(--coati-primary);
185
+ border-radius: 0 2px 2px 0;
186
+ }
187
+ .sidebar .nav-link i{ color: var(--text-secondary); margin-right: 10px; font-size: 1rem; min-width: 20px; }
188
+ .sidebar .nav-link:hover i { color: var(--coati-primary); }
189
+
190
+ /* Sidebar section dividers */
191
+ .sidebar .nav-divider {
192
+ height: 1px;
193
+ background: var(--coati-border-light);
194
+ margin: 8px 6px;
195
+ }
196
+
197
+ /* Sidebar title/header - oculto cuando colapsado */
198
+ .sidebar-header {
199
+ overflow: hidden;
200
+ opacity: 0;
201
+ height: 0;
202
+ padding: 0;
203
+ border: none;
204
+ margin: 0;
205
+ transition: all var(--transition);
206
+ }
207
+ .sidebar:hover .sidebar-header {
208
+ opacity: 1;
209
+ height: auto;
210
+ padding: 10px 12px 16px 12px;
211
+ border-bottom: 1px solid var(--coati-border-light);
212
+ margin-bottom: 8px;
213
+ }
214
+ .sidebar-header .brand-title {
215
+ font-weight: 600;
216
+ color: var(--coati-dark);
217
+ font-size: 0.95rem;
218
+ display: flex;
219
+ align-items: center;
220
+ gap: 8px;
221
+ white-space: nowrap;
222
+ }
223
+ .sidebar-header .brand-subtitle {
224
+ color: var(--text-secondary);
225
+ font-size: 11px;
226
+ margin-left: 36px;
227
+ }
228
+
229
+ /* Floating small button - hidden by default */
230
+ .sidebar-floating-btn{ display: none; }
231
+
232
+ /* Sidebar toggle button */
233
+ .sidebar-toggle-btn{
234
+ background: transparent;
235
+ border: 1px solid rgba(255,255,255,0.2);
236
+ color: #fff;
237
+ padding: 6px 10px;
238
+ border-radius: var(--radius);
239
+ transition: all var(--transition);
240
+ }
241
+ .sidebar-toggle-btn:hover {
242
+ background: rgba(255,255,255,0.1);
243
+ border-color: var(--coati-accent);
244
+ }
245
+
246
+ /* Main content area - empresarial */
247
+ main{
248
+ padding: 16px 24px;
249
+ background: var(--bg);
250
+ min-height: calc(100vh - 48px);
251
+ flex: 1;
252
+ margin-left: var(--sidebar-collapsed-width);
253
+ width: calc(100% - var(--sidebar-collapsed-width));
254
+ }
255
+ main .container{ max-width: 100%; margin-left: 0; padding-left: 0 }
256
+ main .container-fluid { padding-left: 0; padding-right: 0; }
257
+
258
+ /* Content headers - compactos */
259
+ main h1, main h2, main h3 {
260
+ color: var(--text-primary);
261
+ font-weight: 600;
262
+ }
263
+ main h2 {
264
+ font-size: 1.25rem;
265
+ margin-bottom: 0.75rem;
266
+ }
267
+
268
+ /* Cards - empresarial */
269
+ .card{
270
+ border-radius: var(--radius);
271
+ box-shadow: 0 1px 3px rgba(0,0,0,0.04);
272
+ border: 1px solid var(--coati-border);
273
+ background: var(--bg-white);
274
+ }
275
+ .card:hover {
276
+ box-shadow: 0 2px 6px rgba(0,0,0,0.06);
277
+ }
278
+ .card .card-header{
279
+ background: transparent;
280
+ border-bottom: 1px solid var(--coati-border-light);
281
+ font-weight: 600;
282
+ font-size: 13px;
283
+ color: var(--text-primary);
284
+ padding: 12px 16px;
285
+ }
286
+ .card .card-body {
287
+ padding: 16px;
288
+ }
289
+
290
+ /* Botones - empresariales y compactos */
291
+ .btn{
292
+ border-radius: var(--radius);
293
+ padding: 6px 14px;
294
+ font-weight: 500;
295
+ font-size: 12px;
296
+ transition: all var(--transition);
297
+ border: 1px solid transparent;
298
+ }
299
+ .btn-sm {
300
+ padding: 4px 10px;
301
+ font-size: 11px;
302
+ }
303
+ .btn-primary{
304
+ background: var(--coati-primary);
305
+ border-color: var(--coati-primary);
306
+ color: #FFFFFF;
307
+ }
308
+ .btn-primary:hover {
309
+ background: var(--coati-primary-hover);
310
+ border-color: var(--coati-primary-hover);
311
+ }
312
+ .btn-secondary{
313
+ background: transparent;
314
+ border: 1px solid var(--coati-border);
315
+ color: var(--text-secondary);
316
+ }
317
+ .btn-secondary:hover {
318
+ background: var(--coati-sand);
319
+ border-color: var(--coati-border);
320
+ color: var(--text-primary);
321
+ }
322
+ /* Botones outline más sutiles */
323
+ .btn-outline-primary {
324
+ border-color: var(--coati-border);
325
+ color: var(--coati-primary);
326
+ background: transparent;
327
+ }
328
+ .btn-outline-primary:hover {
329
+ background: rgba(160,82,45,0.08);
330
+ border-color: var(--coati-primary);
331
+ color: var(--coati-primary);
332
+ }
333
+ .btn-outline-danger {
334
+ border-color: var(--coati-border);
335
+ color: #dc3545;
336
+ background: transparent;
337
+ }
338
+ .btn-outline-danger:hover {
339
+ background: rgba(220,53,69,0.08);
340
+ border-color: #dc3545;
341
+ color: #dc3545;
342
+ }
343
+ .btn-outline-secondary {
344
+ border-color: var(--coati-border);
345
+ color: var(--text-secondary);
346
+ background: transparent;
347
+ }
348
+ .btn-outline-secondary:hover {
349
+ background: var(--coati-sand);
350
+ border-color: var(--coati-border);
351
+ color: var(--text-primary);
352
+ }
353
+ /* Custom Coati primary button */
354
+ .btn-coaty {
355
+ background: var(--coati-primary);
356
+ border-color: var(--coati-primary);
357
+ color: #FFFFFF;
358
+ }
359
+ .btn-coaty:hover {
360
+ background: var(--coati-primary-hover);
361
+ border-color: var(--coati-primary-hover);
362
+ color: #FFFFFF;
363
+ }
364
+
365
+ /* Formularios - compactos */
366
+ input, textarea, select{
367
+ border-radius: var(--radius);
368
+ border: 1px solid var(--coati-border);
369
+ padding: 6px 10px;
370
+ background: var(--bg-white);
371
+ font-size: 13px;
372
+ transition: border-color var(--transition), box-shadow var(--transition);
373
+ }
374
+ input:focus, textarea:focus, select:focus {
375
+ outline: none;
376
+ border-color: var(--coati-primary);
377
+ box-shadow: 0 0 0 2px rgba(160,82,45,0.1);
378
+ }
379
+ label{ color: var(--text-primary); font-size: 12px; font-weight: 500; }
380
+
381
+ /* Tablas - compactas y empresariales */
382
+ .table {
383
+ font-size: 12px;
384
+ margin-bottom: 0;
385
+ }
386
+ .table thead th {
387
+ font-weight: 600;
388
+ color: var(--text-primary);
389
+ background: var(--coati-sand);
390
+ border-bottom: 1px solid var(--coati-border);
391
+ padding: 8px 12px;
392
+ font-size: 11px;
393
+ text-transform: uppercase;
394
+ letter-spacing: 0.3px;
395
+ }
396
+ .table tbody td {
397
+ padding: 6px 12px;
398
+ border-bottom: 1px solid var(--coati-border-light);
399
+ vertical-align: middle;
400
+ color: var(--text-primary);
401
+ }
402
+ .table-hover tbody tr:hover {
403
+ background: rgba(160,82,45,0.03);
404
+ }
405
+
406
+ /* Badges - más sutiles, texto en lugar de colores brillantes */
407
+ .badge {
408
+ font-weight: 500;
409
+ font-size: 11px;
410
+ padding: 3px 8px;
411
+ border-radius: 3px;
412
+ }
413
+ .badge.bg-success {
414
+ background: transparent !important;
415
+ color: #2E7D32 !important;
416
+ border: 1px solid #2E7D32;
417
+ }
418
+ .badge.bg-warning {
419
+ background: transparent !important;
420
+ color: #ED6C02 !important;
421
+ border: 1px solid #ED6C02;
422
+ }
423
+ .badge.bg-danger {
424
+ background: transparent !important;
425
+ color: #D32F2F !important;
426
+ border: 1px solid #D32F2F;
427
+ }
428
+ .badge.bg-primary {
429
+ background: transparent !important;
430
+ color: var(--coati-primary) !important;
431
+ border: 1px solid var(--coati-primary);
432
+ }
433
+ .badge.bg-secondary {
434
+ background: transparent !important;
435
+ color: var(--text-secondary) !important;
436
+ border: 1px solid var(--coati-border);
437
+ }
438
+ .badge.bg-light {
439
+ background: var(--coati-sand) !important;
440
+ color: var(--text-secondary) !important;
441
+ border: 1px solid var(--coati-border);
442
+ }
443
+ .badge.bg-info {
444
+ background: transparent !important;
445
+ color: #0288D1 !important;
446
+ border: 1px solid #0288D1;
447
+ }
448
+
449
+ /* Action buttons in tables - icon only, compact */
450
+ .table .btn-sm {
451
+ padding: 4px 8px;
452
+ line-height: 1;
453
+ }
454
+ .table .btn-sm i {
455
+ font-size: 12px;
456
+ }
457
+
458
+ /* =====================================================
459
+ LOGIN PAGE STYLES - Empresarial
460
+ ===================================================== */
461
+
462
+ /* Login page body */
463
+ .login-page {
464
+ min-height: 100vh;
465
+ margin: 0;
466
+ padding: 0;
467
+ font-size: 13px;
468
+ }
469
+
470
+ /* Login container - split layout */
471
+ .login-container {
472
+ display: flex;
473
+ min-height: 100vh;
474
+ }
475
+
476
+ /* Left side - Branding panel */
477
+ .login-branding {
478
+ flex: 1;
479
+ background: linear-gradient(135deg, var(--coati-dark) 0%, #5D4037 50%, var(--coati-primary) 100%);
480
+ display: flex;
481
+ align-items: center;
482
+ justify-content: center;
483
+ padding: 40px;
484
+ position: relative;
485
+ overflow: hidden;
486
+ }
487
+
488
+ .login-branding::before {
489
+ content: '';
490
+ position: absolute;
491
+ top: -50%;
492
+ right: -50%;
493
+ width: 100%;
494
+ height: 100%;
495
+ background: radial-gradient(circle, rgba(160,82,45,0.1) 0%, transparent 70%);
496
+ }
497
+
498
+ .branding-content {
499
+ text-align: center;
500
+ color: #fff;
501
+ position: relative;
502
+ z-index: 1;
503
+ }
504
+
505
+ .logo-container {
506
+ margin-bottom: 20px;
507
+ }
508
+
509
+ .logo-large {
510
+ width: 64px;
511
+ height: 64px;
512
+ font-size: 1.5rem;
513
+ }
514
+
515
+ .brand-name {
516
+ font-size: 2rem;
517
+ font-weight: 600;
518
+ margin-bottom: 6px;
519
+ letter-spacing: 0.5px;
520
+ }
521
+
522
+ .brand-name span {
523
+ font-weight: 400;
524
+ color: rgba(255,255,255,0.85);
525
+ }
526
+
527
+ .brand-tagline {
528
+ font-size: 0.95rem;
529
+ opacity: 0.9;
530
+ margin-bottom: 32px;
531
+ }
532
+
533
+ .brand-features {
534
+ text-align: left;
535
+ max-width: 260px;
536
+ margin: 0 auto;
537
+ }
538
+
539
+ .feature-item {
540
+ display: flex;
541
+ align-items: center;
542
+ gap: 10px;
543
+ padding: 10px 0;
544
+ border-bottom: 1px solid rgba(255,255,255,0.1);
545
+ font-size: 13px;
546
+ }
547
+
548
+ .feature-item:last-child {
549
+ border-bottom: none;
550
+ }
551
+
552
+ .feature-item i {
553
+ font-size: 1rem;
554
+ color: rgba(255,255,255,0.8);
555
+ }
556
+
557
+ .feature-item span {
558
+ font-size: 0.9rem;
559
+ }
560
+
561
+ /* Right side - Login form */
562
+ .login-form-container {
563
+ flex: 1;
564
+ display: flex;
565
+ align-items: center;
566
+ justify-content: center;
567
+ padding: 40px;
568
+ background: var(--bg);
569
+ }
570
+
571
+ .login-form-wrapper {
572
+ width: 100%;
573
+ max-width: 380px;
574
+ }
575
+
576
+ .login-header {
577
+ margin-bottom: 24px;
578
+ }
579
+
580
+ .login-header h2 {
581
+ font-size: 1.5rem;
582
+ font-weight: 600;
583
+ color: var(--text-primary);
584
+ margin-bottom: 6px;
585
+ }
586
+
587
+ .login-subtitle {
588
+ color: var(--text-secondary);
589
+ font-size: 13px;
590
+ margin: 0;
591
+ }
592
+
593
+ /* Login form specific styles */
594
+ .login-form-container .form-control-lg {
595
+ padding: 10px 14px;
596
+ font-size: 13px;
597
+ border-radius: var(--radius);
598
+ border: 1px solid var(--coati-border);
599
+ }
600
+
601
+ .login-form-container .form-control-lg:focus {
602
+ border-color: var(--coati-primary);
603
+ box-shadow: 0 0 0 2px rgba(160,82,45,0.1);
604
+ }
605
+
606
+ .login-form-container .btn-primary {
607
+ padding: 10px 20px;
608
+ font-weight: 600;
609
+ letter-spacing: 0.3px;
610
+ }
611
+
612
+ .login-form-container .btn-outline-secondary {
613
+ border-color: var(--coati-border);
614
+ color: var(--text-secondary);
615
+ }
616
+
617
+ .login-form-container .btn-outline-secondary:hover {
618
+ background: var(--coati-sand);
619
+ border-color: var(--coati-border);
620
+ color: var(--text-primary);
621
+ }
622
+
623
+ .login-form-container .input-group .form-control-lg {
624
+ border-right: none;
625
+ }
626
+
627
+ .login-form-container .input-group .btn {
628
+ border-left: none;
629
+ border-top-left-radius: 0;
630
+ border-bottom-left-radius: 0;
631
+ }
632
+
633
+ .login-form-container .alert-warning {
634
+ background: rgba(237,108,2,0.08);
635
+ border: 1px solid #ED6C02;
636
+ color: var(--text-primary);
637
+ border-radius: var(--radius);
638
+ font-size: 12px;
639
+ padding: 10px 14px;
640
+ }
641
+
642
+ .login-footer {
643
+ text-align: center;
644
+ margin-top: 20px;
645
+ color: var(--text-secondary);
646
+ font-size: 12px;
647
+ }
648
+
649
+ .login-footer a {
650
+ color: var(--coati-primary);
651
+ font-weight: 500;
652
+ }
653
+
654
+ .login-footer a:hover {
655
+ color: var(--coati-primary-hover);
656
+ }
657
+
658
+ /* Login page responsive */
659
+ @media (max-width: 991.98px) {
660
+ .login-container {
661
+ flex-direction: column;
662
+ }
663
+
664
+ .login-branding {
665
+ padding: 32px 24px;
666
+ min-height: auto;
667
+ }
668
+
669
+ .brand-name {
670
+ font-size: 1.75rem;
671
+ }
672
+
673
+ .brand-features {
674
+ display: none;
675
+ }
676
+
677
+ .login-form-container {
678
+ padding: 24px;
679
+ }
680
+ }
681
+
682
+ @media (max-width: 575.98px) {
683
+ .login-branding {
684
+ padding: 24px 16px;
685
+ }
686
+
687
+ .logo-large {
688
+ width: 48px;
689
+ height: 48px;
690
+ font-size: 1.25rem;
691
+ }
692
+
693
+ .brand-name {
694
+ font-size: 1.5rem;
695
+ }
696
+
697
+ .brand-tagline {
698
+ margin-bottom: 0;
699
+ }
700
+
701
+ .login-form-container {
702
+ padding: 20px 16px;
703
+ }
704
+
705
+ .login-header h2 {
706
+ font-size: 1.25rem;
707
+ }
708
+ }
709
+
710
+ /* =====================================================
711
+ END LOGIN PAGE STYLES
712
+ ===================================================== */
713
+
714
+ /* Legacy Login card specific tweaks */
715
+ .card-login{ max-width:400px; margin: auto }
716
+
717
+ /* Footer */
718
+ .footer{ color:var(--text-secondary); font-size:12px }
719
+
720
+ /* Sidebar mobile-only links (profile/logout) - base styles */
721
+ .sidebar .mobile-only-links {
722
+ display: none;
723
+ border-top: 1px solid var(--coati-border-light);
724
+ padding-top: 12px;
725
+ margin-top: 12px;
726
+ }
727
+ .sidebar .mobile-only-links .nav-link {
728
+ color: var(--text-secondary);
729
+ }
730
+ .sidebar .mobile-only-links .nav-link:hover {
731
+ color: var(--coati-primary);
732
+ }
733
+
734
+ /* Responsive adjustments */
735
+ @media (max-width: 991.98px){
736
+ /* On mobile, sidebar is hidden by default and fully expanded when opened */
737
+ .sidebar{
738
+ position: fixed;
739
+ left: -260px;
740
+ top: 48px;
741
+ z-index: 1000;
742
+ width: 240px;
743
+ height: calc(100vh - 48px);
744
+ box-shadow: 2px 0 10px rgba(0,0,0,0.08);
745
+ overflow-y: auto;
746
+ }
747
+ /* Sidebar opens fully expanded on mobile (no collapse behavior) */
748
+ .sidebar.open{ left: 0; width: 240px; }
749
+ .sidebar:hover { width: 240px; }
750
+ .sidebar .nav-link span { opacity: 1; }
751
+ .sidebar .nav-link span span { opacity: 1; }
752
+ .sidebar .sidebar-header {
753
+ opacity: 1;
754
+ height: auto;
755
+ padding: 10px 12px 16px 12px;
756
+ border-bottom: 1px solid var(--coati-border-light);
757
+ margin-bottom: 8px;
758
+ }
759
+ /* On mobile, main content takes full width */
760
+ main{
761
+ padding: 16px;
762
+ margin-left: 0;
763
+ width: 100%;
764
+ }
765
+
766
+ /* Show mobile-only links in sidebar when on small screens */
767
+ .sidebar .mobile-only-links {
768
+ display: block;
769
+ }
770
+
771
+ /* Show submenu arrows on mobile */
772
+ .sidebar .submenu-arrow {
773
+ opacity: 1;
774
+ }
775
+
776
+ /* Center logo in navbar on small screens */
777
+ .navbar {
778
+ justify-content: center;
779
+ }
780
+ .navbar .sidebar-toggle-btn {
781
+ position: absolute;
782
+ left: 1rem;
783
+ }
784
+ }
785
+
786
+ /* Small helpers */
787
+ .text-muted{ color:var(--text-secondary) }
788
+ .rounded-lg{ border-radius: var(--radius) }
789
+
790
+ /* Accents for links */
791
+ a{ color: var(--coati-primary); transition: color var(--transition); }
792
+ a:hover{ color: var(--coati-primary-hover); }
793
+
794
+ /* Utilities keeping compatibility with previous classes */
795
+ .bg-coaty-dark{ background-color: var(--coati-dark) !important }
796
+ .bg-coaty-light{ background-color: var(--bg-white) !important }
797
+
798
+ /* Sidebar submenus - empresarial */
799
+ .sidebar .submenu {
800
+ background: rgba(250,248,246,0.5);
801
+ border-radius: var(--radius);
802
+ margin-top: 2px;
803
+ margin-bottom: 4px;
804
+ border-left: 2px solid var(--coati-border-light);
805
+ margin-left: 12px;
806
+ padding-left: 6px;
807
+ }
808
+ /* Bootstrap's collapse adds .show class when expanded */
809
+ .sidebar .submenu .nav-link {
810
+ font-size: 11px;
811
+ padding: 5px 10px;
812
+ margin-bottom: 1px;
813
+ color: var(--text-secondary);
814
+ }
815
+ .sidebar .submenu .nav-link:hover {
816
+ background: rgba(160,82,45,0.06);
817
+ color: var(--coati-primary);
818
+ }
819
+ .sidebar .submenu .nav-link:hover::before {
820
+ display: none;
821
+ }
822
+ .sidebar .submenu-arrow {
823
+ font-size: 0.6rem;
824
+ transition: transform var(--transition);
825
+ color: var(--text-secondary);
826
+ opacity: 0;
827
+ }
828
+ .sidebar:hover .submenu-arrow {
829
+ opacity: 1;
830
+ }
831
+ .sidebar [aria-expanded="true"] .submenu-arrow {
832
+ transform: rotate(180deg);
833
+ }
834
+ .sidebar .nav-link[data-bs-toggle="collapse"] {
835
+ cursor: pointer;
836
+ }
837
+
838
+ /* Pagination - compacta */
839
+ .pagination {
840
+ margin: 0;
841
+ }
842
+ .pagination .page-link {
843
+ font-size: 11px;
844
+ padding: 4px 10px;
845
+ color: var(--text-secondary);
846
+ border-color: var(--coati-border);
847
+ }
848
+ .pagination .page-item.active .page-link {
849
+ background-color: var(--coati-primary);
850
+ border-color: var(--coati-primary);
851
+ }
852
+ .pagination .page-link:hover {
853
+ background-color: var(--coati-sand);
854
+ border-color: var(--coati-border);
855
+ color: var(--coati-primary);
856
+ }
857
+
858
+ /* Alerts - empresarial */
859
+ .alert {
860
+ border-radius: var(--radius);
861
+ font-size: 12px;
862
+ padding: 10px 14px;
863
+ }
864
+
865
+ /* Form-control sizing */
866
+ .form-control, .form-select {
867
+ font-size: 13px;
868
+ padding: 6px 10px;
869
+ }
870
+ .form-control:focus, .form-select:focus {
871
+ border-color: var(--coati-primary);
872
+ box-shadow: 0 0 0 2px rgba(160,82,45,0.1);
873
+ }
874
+ .form-label {
875
+ font-size: 12px;
876
+ font-weight: 500;
877
+ color: var(--text-primary);
878
+ margin-bottom: 4px;
879
+ }
880
+
881
+ /* mb classes adjustment for compact forms */
882
+ .mb-3 {
883
+ margin-bottom: 12px !important;
884
+ }
885
+ .mb-4 {
886
+ margin-bottom: 16px !important;
887
+ }
888
+
889
+ /* =====================================================
890
+ DASHBOARD STYLES
891
+ ===================================================== */
892
+
893
+ /* Dashboard Cards */
894
+ .dashboard-card {
895
+ transition: all var(--transition);
896
+ height: 100%;
897
+ }
898
+
899
+ .dashboard-card:hover {
900
+ transform: translateY(-2px);
901
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
902
+ }
903
+
904
+ .dashboard-card .card-body {
905
+ padding: 20px;
906
+ }
907
+
908
+ .dashboard-icon {
909
+ width: 56px;
910
+ height: 56px;
911
+ border-radius: 8px;
912
+ display: flex;
913
+ align-items: center;
914
+ justify-content: center;
915
+ font-size: 1.5rem;
916
+ flex-shrink: 0;
917
+ }
918
+
919
+ .dashboard-card-title {
920
+ font-size: 12px;
921
+ font-weight: 500;
922
+ color: var(--text-secondary);
923
+ margin-bottom: 4px;
924
+ text-transform: uppercase;
925
+ letter-spacing: 0.3px;
926
+ }
927
+
928
+ .dashboard-card-value {
929
+ font-size: 1.75rem;
930
+ font-weight: 700;
931
+ color: var(--text-primary);
932
+ margin-bottom: 0;
933
+ line-height: 1;
934
+ }
935
+
936
+ .dashboard-card-label {
937
+ font-size: 11px;
938
+ color: var(--text-secondary);
939
+ margin-bottom: 0;
940
+ margin-top: 2px;
941
+ }
942
+
943
+ /* Background colors for icons */
944
+ .bg-primary-light {
945
+ background-color: rgba(160,82,45,0.12);
946
+ color: var(--coati-primary);
947
+ }
948
+
949
+ .bg-success-light {
950
+ background-color: rgba(46,125,50,0.12);
951
+ color: #2E7D32;
952
+ }
953
+
954
+ .bg-warning-light {
955
+ background-color: rgba(237,108,2,0.12);
956
+ color: #ED6C02;
957
+ }
958
+
959
+ .bg-info-light {
960
+ background-color: rgba(2,136,209,0.12);
961
+ color: #0288D1;
962
+ }
963
+
964
+ .bg-danger-light {
965
+ background-color: rgba(211,47,47,0.12);
966
+ color: #D32F2F;
967
+ }
968
+
969
+ .bg-secondary-light {
970
+ background-color: rgba(102,102,102,0.12);
971
+ color: var(--text-secondary);
972
+ }
973
+
974
+ /* Quick Action Cards */
975
+ .quick-action-card {
976
+ display: flex;
977
+ align-items: center;
978
+ padding: 16px;
979
+ background: var(--bg-white);
980
+ border: 1px solid var(--coati-border);
981
+ border-radius: var(--radius);
982
+ text-decoration: none;
983
+ transition: all var(--transition);
984
+ height: 100%;
985
+ }
986
+
987
+ .quick-action-card:hover {
988
+ border-color: var(--coati-primary);
989
+ box-shadow: 0 4px 12px rgba(0,0,0,0.08);
990
+ transform: translateY(-2px);
991
+ }
992
+
993
+ .quick-action-icon {
994
+ width: 48px;
995
+ height: 48px;
996
+ border-radius: 6px;
997
+ display: flex;
998
+ align-items: center;
999
+ justify-content: center;
1000
+ font-size: 1.25rem;
1001
+ flex-shrink: 0;
1002
+ margin-right: 12px;
1003
+ }
1004
+
1005
+ .quick-action-content h6 {
1006
+ font-size: 13px;
1007
+ font-weight: 600;
1008
+ color: var(--text-primary);
1009
+ margin-bottom: 4px;
1010
+ }
1011
+
1012
+ .quick-action-content p {
1013
+ font-size: 11px;
1014
+ color: var(--text-secondary);
1015
+ margin-bottom: 0;
1016
+ line-height: 1.4;
1017
+ }
1018
+
1019
+ /* Dashboard responsive */
1020
+ @media (max-width: 575.98px) {
1021
+ .dashboard-card-value {
1022
+ font-size: 1.5rem;
1023
+ }
1024
+
1025
+ .dashboard-icon {
1026
+ width: 48px;
1027
+ height: 48px;
1028
+ font-size: 1.25rem;
1029
+ }
1030
+
1031
+ .quick-action-card {
1032
+ padding: 12px;
1033
+ }
1034
+
1035
+ .quick-action-icon {
1036
+ width: 40px;
1037
+ height: 40px;
1038
+ font-size: 1.1rem;
1039
+ }
1040
+ }
1041
+
1042
+ /* =====================================================
1043
+ END DASHBOARD STYLES
1044
+ ===================================================== */