create-nexgen 1.0.4

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 (240) hide show
  1. package/package.json +26 -0
  2. package/src/index.js +108 -0
  3. package/template/.dockerignore +14 -0
  4. package/template/.env +58 -0
  5. package/template/.env.example +59 -0
  6. package/template/.prettierignore +5 -0
  7. package/template/.prettierrc +8 -0
  8. package/template/README.md +447 -0
  9. package/template/drizzle.config.ts +29 -0
  10. package/template/eslint.config.js +52 -0
  11. package/template/gitignore-stub +24 -0
  12. package/template/package.json +96 -0
  13. package/template/public/assets/AuthLayout-CbswhpjJ.js +1 -0
  14. package/template/public/assets/Button-_7aQ7gHL.js +1 -0
  15. package/template/public/assets/Input-CLNJXmKc.css +1 -0
  16. package/template/public/assets/Input-z8GI8Aqo.js +1 -0
  17. package/template/public/assets/InputPasswordToggle-BxlzVGp3.js +1 -0
  18. package/template/public/assets/InputPasswordToggle-C77FI9Eg.css +1 -0
  19. package/template/public/assets/Layout-DotR1sQC.js +1 -0
  20. package/template/public/assets/Refresh-BdqsPPBC.js +1 -0
  21. package/template/public/assets/admin-ui-CU34rLdN.js +1 -0
  22. package/template/public/assets/bootstrap-icons-BeopsB42.woff +0 -0
  23. package/template/public/assets/bootstrap-icons-mSm7cUeB.woff2 +0 -0
  24. package/template/public/assets/dashboard-CwybEyLc.js +1 -0
  25. package/template/public/assets/dashboard-Dc4d-Pi7.css +1 -0
  26. package/template/public/assets/forgetPassword-CKEJaXsq.js +1 -0
  27. package/template/public/assets/index-Bleyx5dm.js +64 -0
  28. package/template/public/assets/index-DUw8E6Yg.css +1 -0
  29. package/template/public/assets/login-DC7PTlQF.js +1 -0
  30. package/template/public/assets/realtime-test-BPQdrFym.css +1 -0
  31. package/template/public/assets/realtime-test-tQZ0rBEJ.js +1 -0
  32. package/template/public/assets/register-3O7Qs28C.js +1 -0
  33. package/template/public/assets/resetPassword-A5AzMWKs.js +1 -0
  34. package/template/public/assets/verifyEmail-DDBEQHOv.js +1 -0
  35. package/template/public/index.html +17 -0
  36. package/template/src/database/migrations/mysql/0000_init.sql +73 -0
  37. package/template/src/database/migrations/mysql/meta/0000_snapshot.json +484 -0
  38. package/template/src/database/migrations/mysql/meta/_journal.json +13 -0
  39. package/template/src/database/schema.ts +4 -0
  40. package/template/src/env.ts +107 -0
  41. package/template/src/framework/cache/cache.ts +81 -0
  42. package/template/src/framework/database/connection.ts +168 -0
  43. package/template/src/framework/database/optional-db-drivers.d.ts +9 -0
  44. package/template/src/framework/database/paginate.ts +200 -0
  45. package/template/src/framework/database/schema.ts +26 -0
  46. package/template/src/framework/database/seed.ts +33 -0
  47. package/template/src/framework/events/dispatcher.ts +57 -0
  48. package/template/src/framework/facade.ts +27 -0
  49. package/template/src/framework/http/app.ts +61 -0
  50. package/template/src/framework/http/cors.ts +19 -0
  51. package/template/src/framework/http/logger.ts +85 -0
  52. package/template/src/framework/http/openapi.ts +34 -0
  53. package/template/src/framework/http/ratelimiter.ts +13 -0
  54. package/template/src/framework/http/router.ts +76 -0
  55. package/template/src/framework/http/static.ts +33 -0
  56. package/template/src/framework/http/validation.ts +24 -0
  57. package/template/src/framework/kernel.ts +40 -0
  58. package/template/src/framework/maker-cli/src/index.mjs +51 -0
  59. package/template/src/framework/maker-cli/src/levels/level-1/env-db.mjs +57 -0
  60. package/template/src/framework/maker-cli/src/levels/level-1/file-ops.mjs +30 -0
  61. package/template/src/framework/maker-cli/src/levels/level-1/flags.mjs +16 -0
  62. package/template/src/framework/maker-cli/src/levels/level-1/help.mjs +24 -0
  63. package/template/src/framework/maker-cli/src/levels/level-1/naming.mjs +13 -0
  64. package/template/src/framework/maker-cli/src/levels/level-1/process.mjs +47 -0
  65. package/template/src/framework/maker-cli/src/levels/level-2/db/core.mjs +299 -0
  66. package/template/src/framework/maker-cli/src/levels/level-2/db/index.mjs +177 -0
  67. package/template/src/framework/maker-cli/src/levels/level-2/deploy/core.mjs +635 -0
  68. package/template/src/framework/maker-cli/src/levels/level-2/deploy/index.mjs +145 -0
  69. package/template/src/framework/maker-cli/src/levels/level-2/module/core.mjs +707 -0
  70. package/template/src/framework/maker-cli/src/levels/level-2/module/index.mjs +116 -0
  71. package/template/src/framework/maker-cli/src/levels/level-2/runtime/build-frontend.mjs +16 -0
  72. package/template/src/framework/maker-cli/src/levels/level-2/runtime/core.mjs +311 -0
  73. package/template/src/framework/maker-cli/src/levels/level-2/runtime/index.mjs +71 -0
  74. package/template/src/framework/maker-cli/stubs/controller/openapi.ts.stub +55 -0
  75. package/template/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +56 -0
  76. package/template/src/framework/maker-cli/stubs/controller/plain.ts.stub +57 -0
  77. package/template/src/framework/maker-cli/stubs/controller/schema.plain.ts.stub +13 -0
  78. package/template/src/framework/maker-cli/stubs/controller/schema.ts.stub +32 -0
  79. package/template/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +49 -0
  80. package/template/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +53 -0
  81. package/template/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +49 -0
  82. package/template/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +53 -0
  83. package/template/src/framework/maker-cli/stubs/deploy/README.stub +55 -0
  84. package/template/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +29 -0
  85. package/template/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +29 -0
  86. package/template/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +29 -0
  87. package/template/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +73 -0
  88. package/template/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +73 -0
  89. package/template/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +72 -0
  90. package/template/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +15 -0
  91. package/template/src/framework/maker-cli/stubs/deploy/server/README.stub +77 -0
  92. package/template/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +118 -0
  93. package/template/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +131 -0
  94. package/template/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +129 -0
  95. package/template/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +10 -0
  96. package/template/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +24 -0
  97. package/template/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +24 -0
  98. package/template/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +15 -0
  99. package/template/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +12 -0
  100. package/template/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +13 -0
  101. package/template/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +6 -0
  102. package/template/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +53 -0
  103. package/template/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +69 -0
  104. package/template/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +24 -0
  105. package/template/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +20 -0
  106. package/template/src/framework/maker-cli/stubs/example/console.ts.stub +33 -0
  107. package/template/src/framework/maker-cli/stubs/example/controller.ts.stub +503 -0
  108. package/template/src/framework/maker-cli/stubs/example/job.ts.stub +74 -0
  109. package/template/src/framework/maker-cli/stubs/example/route.api.ts.stub +206 -0
  110. package/template/src/framework/maker-cli/stubs/example/schema.ts.stub +41 -0
  111. package/template/src/framework/maker-cli/stubs/job/name.ts.stub +24 -0
  112. package/template/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +8 -0
  113. package/template/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +8 -0
  114. package/template/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +8 -0
  115. package/template/src/framework/maker-cli/stubs/notification/NotificationBell.vue.stub +218 -0
  116. package/template/src/framework/maker-cli/stubs/notification/controller.ts.stub +85 -0
  117. package/template/src/framework/maker-cli/stubs/notification/index.vue.stub +211 -0
  118. package/template/src/framework/maker-cli/stubs/notification/job.ts.stub +12 -0
  119. package/template/src/framework/maker-cli/stubs/notification/route.api.ts.stub +49 -0
  120. package/template/src/framework/maker-cli/stubs/notification/schema.ts.stub +25 -0
  121. package/template/src/framework/maker-cli/stubs/route/api.ts.stub +79 -0
  122. package/template/src/framework/maker-cli/stubs/route/plain.ts.stub +10 -0
  123. package/template/src/framework/maker-cli/stubs/schedule/name.ts.stub +35 -0
  124. package/template/src/framework/maker-cli/stubs/seeder/name.ts.stub +17 -0
  125. package/template/src/framework/modules/discover.ts +54 -0
  126. package/template/src/framework/modules/routes.ts +26 -0
  127. package/template/src/framework/notification/index.ts +109 -0
  128. package/template/src/framework/queue/clear.ts +20 -0
  129. package/template/src/framework/queue/queue.ts +213 -0
  130. package/template/src/framework/queue/ui.ts +104 -0
  131. package/template/src/framework/queue/worker.ts +33 -0
  132. package/template/src/framework/realtime/broadcast.ts +27 -0
  133. package/template/src/framework/realtime/index.ts +1 -0
  134. package/template/src/framework/realtime/socket-cookie.ts +65 -0
  135. package/template/src/framework/realtime/socket.ts +132 -0
  136. package/template/src/framework/realtime/types.ts +6 -0
  137. package/template/src/framework/realtime/ui.ts +16 -0
  138. package/template/src/framework/redis/client.ts +126 -0
  139. package/template/src/framework/scheduler/lock.ts +124 -0
  140. package/template/src/framework/scheduler/run.ts +26 -0
  141. package/template/src/framework/scheduler/scheduler.ts +82 -0
  142. package/template/src/framework/server.ts +147 -0
  143. package/template/src/framework/session/session.ts +116 -0
  144. package/template/src/framework/storage/storage.ts +743 -0
  145. package/template/src/framework/support/cookie.ts +78 -0
  146. package/template/src/framework/support/jwt.ts +45 -0
  147. package/template/src/framework/support/lifecycle.ts +35 -0
  148. package/template/src/framework/support/logger.ts +102 -0
  149. package/template/src/framework/support/mail.ts +43 -0
  150. package/template/src/framework/support/password.ts +23 -0
  151. package/template/src/framework/support/url.ts +25 -0
  152. package/template/src/middlewares/auth-middleware.ts +98 -0
  153. package/template/src/middlewares/role-middleware.ts +24 -0
  154. package/template/src/modules/auth/controllers/auth.controller.ts +445 -0
  155. package/template/src/modules/auth/controllers/auth.helpers.ts +110 -0
  156. package/template/src/modules/auth/controllers/auth.schema.ts +102 -0
  157. package/template/src/modules/auth/controllers/role.controller.ts +25 -0
  158. package/template/src/modules/auth/database/models/notifications.ts +22 -0
  159. package/template/src/modules/auth/database/models/role.ts +14 -0
  160. package/template/src/modules/auth/database/models/user.ts +46 -0
  161. package/template/src/modules/auth/database/seeders/role.ts +19 -0
  162. package/template/src/modules/auth/database/seeders/user.ts +33 -0
  163. package/template/src/modules/auth/jobs/forgetpass.ts +18 -0
  164. package/template/src/modules/auth/jobs/registeruser.ts +31 -0
  165. package/template/src/modules/auth/jobs/verifyemail.ts +18 -0
  166. package/template/src/modules/auth/routes/api.ts +151 -0
  167. package/template/src/modules/auth/routes/role.ts +39 -0
  168. package/template/src/modules/welcome/controllers/welcome.controller.ts +14 -0
  169. package/template/src/modules/welcome/controllers/welcome.schema.ts +6 -0
  170. package/template/src/modules/welcome/database/models/welcome.ts +6 -0
  171. package/template/src/modules/welcome/routes/api.ts +20 -0
  172. package/template/src/resources/index.html +16 -0
  173. package/template/src/resources/src/App.vue +5 -0
  174. package/template/src/resources/src/assets/css/styles.css +14934 -0
  175. package/template/src/resources/src/assets/css/styles.css.map +1 -0
  176. package/template/src/resources/src/assets/images/favicon/favicon.ico +0 -0
  177. package/template/src/resources/src/assets/images/favicon/favicon1.ico +0 -0
  178. package/template/src/resources/src/assets/images/logo-1.png +0 -0
  179. package/template/src/resources/src/assets/images/logo-dark-sm.png +0 -0
  180. package/template/src/resources/src/assets/images/logo-dark.png +0 -0
  181. package/template/src/resources/src/assets/images/logo-dark1.png +0 -0
  182. package/template/src/resources/src/assets/images/logo-sm.png +0 -0
  183. package/template/src/resources/src/assets/images/logo1.png +0 -0
  184. package/template/src/resources/src/assets/images/logo2.png +0 -0
  185. package/template/src/resources/src/assets/scss/custom.css +217 -0
  186. package/template/src/resources/src/assets/scss/custom.css.map +1 -0
  187. package/template/src/resources/src/assets/scss/custom.scss +1100 -0
  188. package/template/src/resources/src/components/Button.vue +35 -0
  189. package/template/src/resources/src/components/Checkbox.vue +29 -0
  190. package/template/src/resources/src/components/FloatButton.vue +36 -0
  191. package/template/src/resources/src/components/Href.vue +32 -0
  192. package/template/src/resources/src/components/Input.vue +227 -0
  193. package/template/src/resources/src/components/InputGroup.vue +153 -0
  194. package/template/src/resources/src/components/InputPasswordToggle.vue +226 -0
  195. package/template/src/resources/src/components/Modal.vue +102 -0
  196. package/template/src/resources/src/components/Pagebar.vue +28 -0
  197. package/template/src/resources/src/components/Refresh.vue +26 -0
  198. package/template/src/resources/src/components/Select.vue +390 -0
  199. package/template/src/resources/src/components/Spinner.vue +42 -0
  200. package/template/src/resources/src/components/Switch.vue +65 -0
  201. package/template/src/resources/src/components/TextArea.vue +121 -0
  202. package/template/src/resources/src/components/Toast.vue +56 -0
  203. package/template/src/resources/src/components/datatable/DataTableSkeleton.vue +99 -0
  204. package/template/src/resources/src/components/datatable/Pagination.vue +161 -0
  205. package/template/src/resources/src/components/datatable/SelectOpption.vue +54 -0
  206. package/template/src/resources/src/components/datatable/index.vue +237 -0
  207. package/template/src/resources/src/composables/useAuth.ts +52 -0
  208. package/template/src/resources/src/composables/useBrowserDetect.ts +5 -0
  209. package/template/src/resources/src/composables/useDialog.ts +5 -0
  210. package/template/src/resources/src/composables/useGum.ts +3 -0
  211. package/template/src/resources/src/composables/usePulse.ts +5 -0
  212. package/template/src/resources/src/env.d.ts +20 -0
  213. package/template/src/resources/src/helpers/nformatter.ts +10 -0
  214. package/template/src/resources/src/helpers/utils.ts +68 -0
  215. package/template/src/resources/src/layouts/AuthLayout.vue +20 -0
  216. package/template/src/resources/src/layouts/Layout/Footer.vue +23 -0
  217. package/template/src/resources/src/layouts/Layout/Header.vue +90 -0
  218. package/template/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
  219. package/template/src/resources/src/layouts/Layout/index.vue +76 -0
  220. package/template/src/resources/src/main.ts +27 -0
  221. package/template/src/resources/src/pages/auth/forgetPassword.vue +76 -0
  222. package/template/src/resources/src/pages/auth/login.vue +93 -0
  223. package/template/src/resources/src/pages/auth/register.vue +130 -0
  224. package/template/src/resources/src/pages/auth/resetPassword.vue +119 -0
  225. package/template/src/resources/src/pages/auth/verifyEmail.vue +60 -0
  226. package/template/src/resources/src/pages/dashboard/index.vue +76 -0
  227. package/template/src/resources/src/plugins/axios.ts +33 -0
  228. package/template/src/resources/src/plugins/browserDetect.ts +55 -0
  229. package/template/src/resources/src/plugins/dialog.ts +167 -0
  230. package/template/src/resources/src/plugins/gum.ts +343 -0
  231. package/template/src/resources/src/plugins/pulse.ts +141 -0
  232. package/template/src/resources/src/plugins/routeProgress.ts +87 -0
  233. package/template/src/resources/src/router/index.ts +85 -0
  234. package/template/src/resources/src/stores/admin-ui.ts +148 -0
  235. package/template/src/resources/src/stores/auth.ts +151 -0
  236. package/template/src/resources/tsconfig.json +19 -0
  237. package/template/src/resources/vite.config.ts +43 -0
  238. package/template/src/storage/logs/app.log +20179 -0
  239. package/template/src/storage/logs/fatal.log +727 -0
  240. package/template/tsconfig.json +20 -0
@@ -0,0 +1,1100 @@
1
+ @use "sass:map";
2
+ @use "sass:color";
3
+ @use "bootstrap/scss/bootstrap" as *;
4
+
5
+ /*
6
+ * Here from start custom css
7
+ * Our custom css depends on some bootstrap class
8
+ * and our new class
9
+ */
10
+
11
+ html,
12
+ body {
13
+ height: 100%;
14
+ color: $gray-700;
15
+ scroll-behavior: smooth;
16
+ }
17
+
18
+ #app {
19
+ position: relative;
20
+ min-height: 100%;
21
+ }
22
+
23
+ $themes: (
24
+ light: (bg: #f5f5f9,
25
+ bg-white: #ffffff,
26
+ text-color: $gray-900,
27
+ gray-700: $gray-700,
28
+ gray-200: $gray-200,
29
+ gray-300: $gray-300,
30
+ gray-400: $gray-400,
31
+ gray-500: $gray-500,
32
+ gray-900: $gray-900,
33
+ primary: $primary,
34
+ secondary: $secondary,
35
+ danger: $danger,
36
+ warning: $warning,
37
+ success: $success,
38
+ info: $info,
39
+ dark-color: $dark,
40
+ border-custom: #cdcdcd,
41
+ auth-shadow: rgba(34, 48, 62, 0.1),
42
+ sidebar-shadow: rgba(145, 152, 159, 0.12),
43
+ sidebar-link-bg: rgba(105, 108, 255, 0.16),
44
+ backdrop: rgba(0, 0, 0, 0.5),
45
+ shadow-custom: rgba(34, 48, 62, 0.08),
46
+ accordion-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 16 16'%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"),
47
+ accordion-icon-active: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' d='M1.646 10.354a.5.5 0 0 1 .708 0L8 4.707l5.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")),
48
+ dark: (bg: #121212,
49
+ bg-white: #1b1b1b,
50
+ text-color: #ffffff,
51
+ // surface
52
+ gray-700: #e5e5e5,
53
+ // body text
54
+ gray-200: #2a2a2a,
55
+ gray-300: #4a4a4a,
56
+ gray-400: #6a6a6a,
57
+ // hover surface
58
+ gray-500: #a8a8a8,
59
+ // muted
60
+ gray-900: #ffffff,
61
+ // high contrast text
62
+ primary: $warning,
63
+ secondary: #9aa0a6,
64
+ danger: $danger,
65
+ warning: $warning,
66
+ success: $success,
67
+ info: $info,
68
+ dark-color: $warning,
69
+ border-custom: #3f3f3f,
70
+ auth-shadow: rgba(0, 0, 0, 0.35),
71
+ sidebar-shadow: rgba(0, 0, 0, 0.35),
72
+ sidebar-link-bg: rgba(105, 108, 255, 0.22),
73
+ backdrop: rgba(0, 0, 0, 0.6),
74
+ shadow-custom: rgba(34, 48, 62, 0.08),
75
+ accordion-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%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"),
76
+ accordion-icon-active: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' d='M1.646 10.354a.5.5 0 0 1 .708 0L8 4.707l5.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"))
77
+ );
78
+
79
+ $sidebar-width: 16.25rem;
80
+
81
+ @mixin theme($theme-name) {
82
+ $theme: map.get($themes, $theme-name);
83
+
84
+ & {
85
+ /* App custom tokens */
86
+ --app-bg: #{map.get($theme, bg)};
87
+ --app-surface: #{map.get($theme, bg-white)};
88
+ --app-text: #{map.get($theme, text-color)};
89
+ --app-text-strong: #{map.get($theme, text-color)};
90
+ --app-text-muted: #{map.get($theme, gray-500)};
91
+ --app-border: #{map.get($theme, border-custom)};
92
+ --app-hover: #{map.get($theme, gray-200)};
93
+ --app-primary: #{map.get($theme, primary)};
94
+ --app-backdrop: #{map.get($theme, backdrop)};
95
+
96
+ /* Bootstrap runtime vars */
97
+ --bs-body-bg: var(--app-bg);
98
+ --bs-body-color: var(--app-text);
99
+ --bs-border-color: var(--app-border);
100
+ --bs-dropdown-bg: var(--app-surface);
101
+ --bs-dropdown-link-color: var(--app-text);
102
+ --bs-dropdown-link-hover-bg: var(--app-hover);
103
+ --bs-input-bg: var(--app-surface);
104
+ --bs-input-color: var(--app-text);
105
+ --bs-link-color: var(--app-primary);
106
+ --bs-navbar-bg: transparent; // you use transparent
107
+ --bs-secondary-color: #{map.get($theme, gray-500)};
108
+ --bs-secondary-color-rgb: #{color.channel(map.get($theme, gray-500), "red", $space: rgb)},
109
+ #{color.channel(map.get($theme, gray-500), "green", $space: rgb)},
110
+ #{color.channel(map.get($theme, gray-500), "blue", $space: rgb)};
111
+ }
112
+
113
+ & {
114
+ background-color: map.get($theme, bg);
115
+ color: var(--app-text);
116
+
117
+ *::-webkit-scrollbar {
118
+ width: 6px;
119
+
120
+ &-track {
121
+ background: map.get($theme, gray-200);
122
+ }
123
+
124
+ &-thumb {
125
+ background: map.get($theme, gray-500);
126
+ border-radius: 0.375rem;
127
+ }
128
+ }
129
+ }
130
+
131
+ // Ensure modal close icon visible in each theme
132
+ .btn-close {
133
+ @if $theme-name ==dark {
134
+ filter: invert(1) grayscale(100%) brightness(200%) !important;
135
+ }
136
+
137
+ opacity: 0.85;
138
+
139
+ &:hover {
140
+ opacity: 1;
141
+ }
142
+
143
+ &:focus {
144
+ box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--app-primary), transparent 75%);
145
+ }
146
+ }
147
+
148
+ // Outline-dark becomes warning color
149
+ @each $btn-variant in (primary, secondary, success, danger, warning, info, dark) {
150
+ .btn-outline-#{$btn-variant} {
151
+ @if $btn-variant ==dark {
152
+ color: map.get($theme, dark-color) !important;
153
+ border-color: map.get($theme, dark-color) !important;
154
+
155
+ &:hover,
156
+ &:focus,
157
+ &:active,
158
+ &.active {
159
+ background-color: map.get($theme, dark-color) !important;
160
+ color: map.get($theme, bg-white) !important; // improve contrast
161
+ border-color: map.get($theme, dark-color) !important;
162
+ }
163
+ }
164
+ }
165
+ }
166
+
167
+ .card {
168
+ --bs-card-bg: #{map.get($theme, bg-white)};
169
+ --bs-card-color: #{map.get($theme, text-color)};
170
+ --bs-card-border-color: #{map.get($theme, border-custom)};
171
+ /* optional bits */
172
+ --bs-card-cap-bg: var(--bs-card-bg);
173
+ --bs-card-cap-color: var(--bs-card-color);
174
+
175
+ .card-header,
176
+ .card-footer {
177
+ --bs-card-footer-bg: var(--bs-card-cap-bg);
178
+ }
179
+ }
180
+
181
+ .table {
182
+ --bs-table-color: #{map.get($theme, text-color)};
183
+ --bs-table-bg: #{map.get($theme, bg-white)};
184
+ --bs-table-border-color: #{map.get($theme, border-custom)};
185
+ --bs-table-striped-bg: #{map.get($theme, gray-200)};
186
+ --bs-table-striped-color: #{map.get($theme, text-color)};
187
+ --bs-table-hover-bg: #{map.get($theme, gray-300)};
188
+ --bs-table-hover-color: #{map.get($theme, text-color)};
189
+ --bs-table-active-bg: #{map.get($theme, gray-200)};
190
+ --bs-table-active-color: #{map.get($theme, text-color)};
191
+ }
192
+
193
+ .auth {
194
+ background-color: map.get($theme, bg-white);
195
+ box-shadow: 0 0.1875rem 0.5rem 0 map.get($theme, auth-shadow);
196
+ border: 1px solid map.get($theme, border-custom);
197
+ box-sizing: border-box;
198
+ padding: 1.5rem 2rem 3.5rem 2rem;
199
+ max-width: 460px;
200
+ margin: 0 auto;
201
+ border-radius: 0.375rem;
202
+
203
+ @include media-breakpoint-down(sm) {
204
+ padding: 3rem 0.5rem;
205
+ }
206
+ }
207
+
208
+ .input-group-text {
209
+ background: map.get($theme, bg-white);
210
+
211
+ &:focus-visible {
212
+ outline: none;
213
+ }
214
+ }
215
+
216
+ .form-control {
217
+ border: 1px solid map.get($theme, border-custom);
218
+ // padding: calc(0.44rem - var(--bs-border-width)) calc(0.9375rem - var(--bs-border-width));
219
+ // line-height: 1.375;
220
+ background: map.get($theme, bg-white);
221
+
222
+ @if $theme-name ==dark {
223
+ color-scheme: dark;
224
+ }
225
+
226
+ &:hover {
227
+ border: 1px solid map.get($theme, secondary);
228
+ }
229
+
230
+ &:focus {
231
+ box-shadow: 0 0 1px map.get($theme, primary);
232
+ border: 1px solid map.get($theme, primary);
233
+ background: map.get($theme, bg-white);
234
+ }
235
+
236
+ &::placeholder {
237
+ color: map.get($theme, gray-500);
238
+ }
239
+
240
+ &[type="checkbox"] {
241
+ padding: 8px;
242
+ border: 1px solid map.get($theme, secondary);
243
+ }
244
+
245
+ &:read-only,
246
+ &[readonly],
247
+ &:disabled {
248
+ @if $theme-name ==light {
249
+ background: #f6f6f6;
250
+ }
251
+
252
+ @else {
253
+ color: map.get($theme, gray-500);
254
+ background-color: map.get($theme, gray-200);
255
+ }
256
+ }
257
+
258
+ &.second-input[readonly]:focus {
259
+ background: #f6f6f6;
260
+ border-left: 1px solid map.get($theme, border-custom) !important;
261
+
262
+ @if $theme-name ==dark {
263
+ background-color: map.get($theme, gray-200);
264
+ }
265
+ }
266
+ }
267
+
268
+ .form-select {
269
+ background-color: map.get($theme, bg-white);
270
+
271
+ &:hover {
272
+ border: 1px solid map.get($theme, secondary);
273
+ }
274
+ }
275
+
276
+ label[for] {
277
+ cursor: pointer;
278
+ margin-bottom: 0.25rem;
279
+ }
280
+
281
+ .input-group {
282
+ border: 1px solid map.get($theme, border-custom);
283
+ border-radius: 0.375rem; // match Bootstrap default radius
284
+ display: flex;
285
+ align-items: center;
286
+
287
+ &:hover {
288
+ border: 1px solid map.get($theme, secondary);
289
+ }
290
+
291
+ &:focus-within {
292
+ box-shadow: 0 0 1px map.get($theme, primary);
293
+ border: 1px solid map.get($theme, primary);
294
+ }
295
+
296
+ .form-control,
297
+ .form-select {
298
+ border: none;
299
+ box-shadow: none;
300
+
301
+ &:focus {
302
+ box-shadow: none !important;
303
+ border: none !important;
304
+ background: map.get($theme, bg-white);
305
+ }
306
+ }
307
+
308
+ input.form-control:focus:first-child {
309
+ border-right: 1px solid map.get($theme, border-custom) !important;
310
+ }
311
+
312
+ input.form-control+input.form-control {
313
+ border-left: 1px solid map.get($theme, border-custom) !important;
314
+ }
315
+ }
316
+
317
+ .btn {
318
+ // padding-top: 0.2rem;
319
+ font-weight: 500;
320
+ align-items: center;
321
+
322
+ // line-height: 1.8;
323
+ &:hover {
324
+ transform: translateY(-0.5px);
325
+
326
+ i {
327
+ transform: translateY(-1px); // only icon moves slightly upward
328
+ }
329
+ }
330
+
331
+ transition: all 0.2s ease-in-out;
332
+ }
333
+
334
+ // select infinite custom
335
+ .v-select {
336
+ @if $theme-name ==dark {
337
+ --vs-controls-color: #fff;
338
+ /* icons (arrow/clear) use this */
339
+ }
340
+ }
341
+
342
+ .vs__search,
343
+ .vs__search:focus {
344
+ margin: 0;
345
+ padding-top: 2px;
346
+ padding-bottom: 2px;
347
+ }
348
+
349
+ .vs__dropdown-toggle {
350
+ padding: 0.26rem 0;
351
+ border-radius: 5px;
352
+ border-color: map.get($theme, border-custom) !important;
353
+ }
354
+
355
+ .vs__dropdown-menu {
356
+ background-color: map.get($theme, bg-white) !important;
357
+ border-color: map.get($theme, border-custom) !important;
358
+ max-height: 225px;
359
+ min-width: 100px !important;
360
+ right: 0 !important;
361
+ left: auto !important;
362
+ }
363
+
364
+ .vs__selected {
365
+ margin: 0;
366
+
367
+ @if $theme-name ==dark {
368
+ color: map.get($theme, gray-700) !important;
369
+ }
370
+ }
371
+
372
+ .vs__selected .vs__search,
373
+ .vs__selected .vs__search:focus {
374
+ margin: 0;
375
+ padding-top: 2px;
376
+ padding-bottom: 2px;
377
+ }
378
+
379
+ .vs--disabled .vs__dropdown-toggle,
380
+ .vs--disabled .vs__clear,
381
+ .vs--disabled .vs__search,
382
+ .vs--disabled .vs__selected,
383
+ .vs--disabled .vs__open-indicator {
384
+ @if $theme-name ==dark {
385
+ background-color: map.get($theme, gray-200) !important;
386
+ color: map.get($theme, gray-500) !important;
387
+ }
388
+ }
389
+
390
+ .fs-mini {
391
+ font-size: 10px;
392
+ }
393
+
394
+ .form-text {
395
+ font-size: 0.775rem;
396
+ }
397
+
398
+ .sidebar {
399
+ position: fixed;
400
+ top: 0;
401
+ left: 0;
402
+ height: 100%;
403
+ width: $sidebar-width;
404
+ background-color: map.get($theme, bg-white);
405
+ box-shadow: 0 0.125rem 0.375rem 0 map.get($theme, sidebar-shadow);
406
+ box-sizing: border-box;
407
+ z-index: 1100;
408
+ // border: 1px solid map.get($theme, border-custom);
409
+
410
+ & .app-brand {
411
+ margin-top: 0.5rem;
412
+ padding-left: 2rem;
413
+ padding-right: 2rem;
414
+ height: 64px;
415
+ width: 100%;
416
+ box-sizing: border-box;
417
+ display: flex;
418
+ align-items: center;
419
+ flex-grow: 0;
420
+ flex-shrink: 0;
421
+ line-height: 1;
422
+ min-height: 1px;
423
+ overflow: hidden;
424
+ justify-content: center;
425
+
426
+ >a {
427
+ text-decoration: none;
428
+ color: map.get($theme, gray-900);
429
+ }
430
+
431
+ img {
432
+ width: 100%;
433
+ vertical-align: middle;
434
+ }
435
+ }
436
+
437
+ .accordion {
438
+ position: relative;
439
+ height: calc(100% - 4.5rem);
440
+ overflow-y: auto;
441
+ padding-bottom: 7rem;
442
+ box-sizing: border-box;
443
+
444
+ &::-webkit-scrollbar {
445
+ display: none;
446
+ width: 2px;
447
+
448
+ &-track {
449
+ background: map.get($theme, gray-200);
450
+ }
451
+
452
+ &-thumb {
453
+ background: map.get($theme, gray-700);
454
+ border-radius: 0.375rem;
455
+ }
456
+ }
457
+
458
+ &:hover {
459
+ &::-webkit-scrollbar {
460
+ display: block;
461
+
462
+ &-thumb {
463
+ background: map.get($theme, gray-700);
464
+ }
465
+ }
466
+ }
467
+
468
+ // Active state
469
+ & .active {
470
+ background-color: map.get($theme, sidebar-link-bg) !important;
471
+
472
+ a {
473
+ color: map.get($theme, primary) !important;
474
+
475
+ &:hover {
476
+ background: none !important;
477
+ }
478
+ }
479
+
480
+ &::after {
481
+ content: "";
482
+ position: absolute;
483
+ right: -1rem;
484
+ top: 0;
485
+ height: 100%;
486
+ width: 0.25rem;
487
+ background: map.get($theme, primary);
488
+ border-radius: 0.375rem 0 0 0.375rem;
489
+ }
490
+ }
491
+
492
+ & ul.list-group {
493
+ list-style-type: none;
494
+ padding-left: 1rem;
495
+ padding-right: 1rem;
496
+
497
+ & li.split-label {
498
+ position: relative;
499
+ font-size: 13px;
500
+ color: map.get($theme, gray-500);
501
+ padding-top: 0.5rem;
502
+ padding-bottom: 0.5rem;
503
+ padding-left: 1rem;
504
+ background: none;
505
+
506
+ &:hover {
507
+ background: none;
508
+ }
509
+
510
+ &::before {
511
+ content: "";
512
+ position: absolute;
513
+ top: 50%;
514
+ left: -1rem;
515
+ width: 1rem;
516
+ height: 0.1rem;
517
+ border-bottom: 1px solid map.get($theme, gray-500);
518
+ transform: translateY(-50%);
519
+ }
520
+ }
521
+
522
+ & li.list-group-item {
523
+ position: relative;
524
+ padding: 0;
525
+ border: none;
526
+ border-radius: 0.375rem;
527
+ margin-top: 0.25rem;
528
+
529
+ & a {
530
+ display: flex;
531
+ align-items: center;
532
+ color: map.get($theme, gray-700);
533
+ text-decoration: none;
534
+ padding: 0.25rem 1rem;
535
+ box-shadow: none;
536
+
537
+ .menu-icon {
538
+ display: flex;
539
+ width: 1.5rem;
540
+ flex-shrink: 0;
541
+ flex-grow: 0;
542
+ margin-right: 0.5rem;
543
+ font-size: 1.3rem;
544
+ }
545
+ }
546
+
547
+ // Normal hover for top-level
548
+ &:hover>a {
549
+ background: map.get($theme, gray-200);
550
+ transition: all 0.2s ease-in-out;
551
+ border-radius: 0.375rem;
552
+ padding: 0.25rem 1rem;
553
+ }
554
+
555
+ // Accordion section -> 1st level
556
+ &.accordion-item {
557
+ padding: 0;
558
+
559
+ &>a {
560
+ &:hover {
561
+ background: map.get($theme, gray-200);
562
+ }
563
+
564
+ &::after {
565
+ flex-shrink: 0;
566
+ width: 1rem;
567
+ height: 1rem;
568
+ margin-left: auto; // push icon fully to right
569
+ background-size: 1rem;
570
+ background-image: map.get($theme, accordion-icon);
571
+ background-repeat: no-repeat;
572
+ font-size: 10px;
573
+ transition: transform 0.2s ease-in-out;
574
+
575
+ // Default state → down arrow
576
+ transform: rotate(-90deg);
577
+ }
578
+
579
+ &:not(.collapsed) {
580
+ background: map.get($theme, gray-200);
581
+
582
+ &::after {
583
+ transform: rotate(0deg);
584
+ }
585
+ }
586
+ }
587
+
588
+ // Nested list hover -> 2nd level
589
+ &>ul {
590
+ padding-left: 0;
591
+ padding-right: 0;
592
+
593
+ &>li {
594
+ margin-top: 0.25rem;
595
+ position: relative;
596
+
597
+ &>a {
598
+ // vertical-align: middle;
599
+ padding: 0.5rem 1rem 0.5rem 3rem;
600
+ }
601
+
602
+ &::before {
603
+ content: "";
604
+ position: absolute;
605
+ top: 1rem;
606
+ left: 1.3rem;
607
+ width: 0.5rem;
608
+ height: 0.5rem;
609
+ border-radius: 50%;
610
+ background-color: map.get($theme, gray-500);
611
+ z-index: 100;
612
+ }
613
+
614
+ &.active {
615
+ &::before {
616
+ content: "";
617
+ position: absolute;
618
+ top: 50%;
619
+ left: 1.256rem;
620
+ width: 0.6rem;
621
+ height: 0.6rem;
622
+ border-radius: 50%;
623
+ transform: translateY(-50%);
624
+ background-color: map.get($theme, primary);
625
+ box-shadow: 0 0 0.2rem map.get($theme, primary);
626
+ z-index: 100;
627
+ }
628
+ }
629
+
630
+ >ul li {
631
+ &::after {
632
+ content: "";
633
+ position: absolute;
634
+ top: 0;
635
+ left: 1.56rem;
636
+ width: 1px;
637
+ height: 100%;
638
+ background-color: map.get($theme, gray-500);
639
+ z-index: 50;
640
+ }
641
+
642
+ &.active {
643
+ &::after {
644
+ content: "";
645
+ position: absolute;
646
+ top: 0;
647
+ left: 1.56rem;
648
+ width: 1px;
649
+ height: 100%;
650
+ background-color: map.get($theme, primary);
651
+ }
652
+ }
653
+ }
654
+ }
655
+ }
656
+ }
657
+ }
658
+ }
659
+ }
660
+ }
661
+
662
+ .main {
663
+ position: relative;
664
+ min-height: 100vh;
665
+ display: flex;
666
+ flex: 1 0 auto;
667
+ margin-left: 0.8rem;
668
+ margin-right: 0.8rem;
669
+ padding-left: $sidebar-width;
670
+ transition: padding-left 0.4s ease;
671
+
672
+ &.no-transition {
673
+ transition: none !important;
674
+ }
675
+
676
+ .content-wrapper {
677
+ position: inherit;
678
+ min-height: 100vh;
679
+ display: flex;
680
+ flex-direction: column;
681
+
682
+ header {
683
+ position: sticky;
684
+ top: 0;
685
+ z-index: 1060;
686
+ padding-top: 0.5rem;
687
+ padding-bottom: 0.5rem;
688
+ transition:
689
+ padding 0.1s ease-in-out,
690
+ background-color 0.1s ease-in-out;
691
+
692
+ &.scrolled {
693
+ padding-top: 0;
694
+ padding-bottom: 0; // optional
695
+ background-color: map.get($theme, bg-white); // optional: add bg when scrolled
696
+ }
697
+
698
+ & ul.dropdown-menu {
699
+ --bs-dropdown-bg: #{map.get($theme, bg-white)};
700
+ --bs-dropdown-border-color: #{map.get($theme, border-custom)};
701
+ --bs-dropdown-link-color: #{map.get($theme, gray-700)};
702
+ --bs-dropdown-link-hover-bg: #{map.get($theme, bg)};
703
+ --bs-dropdown-link-hover-color: #{map.get($theme, primary)};
704
+ --bs-dropdown-link-active-bg: #{map.get($theme, sidebar-link-bg)};
705
+ --bs-dropdown-link-active-color: #{map.get($theme, primary)};
706
+ --bs-dropdown-divider-bg: #{map.get($theme, gray-300)};
707
+ }
708
+
709
+ .nav-btn {
710
+ font-size: 1.5rem !important;
711
+ border: 1px solid map.get($theme, border-custom);
712
+ box-shadow: 0 0.125rem 0.375rem 0 map.get($theme, shadow-custom);
713
+ padding: 0.7rem 1.2rem;
714
+ border-radius: 0.25rem;
715
+ background: map.get($theme, bg-white);
716
+ color: map.get($theme, text-color);
717
+
718
+ &:hover {
719
+ background: map.get($theme, bg-white);
720
+ color: map.get($theme, primary);
721
+ }
722
+ }
723
+
724
+ .nav-card {
725
+ height: 3.75rem;
726
+ padding-block: 0; // remove top/bottom padding
727
+ padding-inline: 0.75rem; // keep a little left/right padding
728
+
729
+ display: grid;
730
+ align-items: center; // vertical center
731
+ justify-items: start; // left align (doesn't center horizontally)
732
+
733
+ text-align: left;
734
+ color: map.get($theme, text-color);
735
+ background: map.get($theme, bg-white);
736
+ border-color: map.get($theme, border-custom);
737
+ box-shadow: 0 0.125rem 0.375rem 0 map.get($theme, shadow-custom);
738
+ }
739
+
740
+ @include media-breakpoint-down(sm) {
741
+ .nav-btn {
742
+ flex: 1 1 calc(20% - 0.25rem); // 4 items per row with gap
743
+ display: flex;
744
+ justify-content: center;
745
+ }
746
+ }
747
+ }
748
+
749
+ .content {
750
+ position: inherit;
751
+ flex: 1 1 auto;
752
+ min-height: 0;
753
+ color: map.get($theme, text-color);
754
+ }
755
+
756
+ footer {
757
+ font-size: 0.875rem;
758
+ color: map.get($theme, secondary);
759
+ }
760
+ }
761
+ }
762
+
763
+ @include media-breakpoint-up(xl) {
764
+ .sidebar {
765
+ left: 0;
766
+ transition: left 0.3s ease-in-out;
767
+ }
768
+
769
+ .sidebar.tgl {
770
+ left: -$sidebar-width;
771
+ transition: left 0.3s ease-in-out;
772
+ }
773
+
774
+ .main.tgl {
775
+ padding-left: 0;
776
+ transition: padding-left 0.3s ease-in-out;
777
+ }
778
+ }
779
+
780
+ @include media-breakpoint-down(xl) {
781
+ .sidebar {
782
+ left: -($sidebar-width + 1rem);
783
+ transition: left 0.3s ease-in-out;
784
+ }
785
+
786
+ .sidebar-toggle {
787
+ margin-right: -1rem;
788
+ margin-top: 1.5rem;
789
+ border: 0.4rem solid map.get($theme, bg-white);
790
+ font-size: 10px;
791
+ padding: 0.25rem 0.425rem;
792
+ background: map.get($theme, primary);
793
+ color: map.get($theme, bg-white);
794
+ }
795
+
796
+ .sidebar.tgl {
797
+ left: 0;
798
+ transition: left 0.3s ease-in-out;
799
+ }
800
+
801
+ .backdrop.off-canvas {
802
+ position: absolute;
803
+ background: map.get($theme, backdrop);
804
+ top: 0;
805
+ left: 0;
806
+ width: 100%;
807
+ height: 100%;
808
+ z-index: 1099;
809
+ }
810
+
811
+ .main {
812
+ padding-left: 0;
813
+ transition: padding-left 0.3s ease-in-out;
814
+ }
815
+
816
+ .main.tgl {
817
+ padding-left: 0;
818
+ transition: padding-left 0.3s ease-in-out;
819
+ }
820
+ }
821
+
822
+ }
823
+
824
+ .datatable {
825
+
826
+ thead tr>th,
827
+ tbody tr>td {
828
+ padding: 7.5px 10px;
829
+ }
830
+
831
+ thead {
832
+ tr>th {
833
+ padding-top: 7.5px;
834
+ padding-bottom: 7.5px;
835
+ }
836
+
837
+ tr>th:nth-child(-n + 2) {
838
+ width: 1%;
839
+ white-space: nowrap;
840
+ }
841
+
842
+ tr>th:nth-child(-n + 1) {
843
+ padding-left: 6px !important;
844
+ padding-right: 5px !important;
845
+ }
846
+
847
+ tr>th:last-child {
848
+ width: 1%;
849
+ white-space: nowrap;
850
+ text-align: center;
851
+ }
852
+ }
853
+
854
+ tbody tr>td:nth-child(-n + 1) {
855
+ padding-left: 6px !important;
856
+ padding-right: 5px !important;
857
+ }
858
+
859
+ .datatable-pagination .page-item {
860
+ .page-link {
861
+ border-radius: 5px;
862
+ margin-left: 0;
863
+ border: 1px solid #dfdfdf;
864
+ }
865
+ }
866
+ }
867
+
868
+ // general table
869
+ .datatable-general thead tr>th,
870
+ .datatable-general tbody tr>td {
871
+ padding: 7.5px 10px;
872
+ }
873
+
874
+ .datatable-general thead tr>th {
875
+ padding-top: 15px;
876
+ padding-bottom: 15px;
877
+ }
878
+
879
+ .datatable-general thead tr>th:nth-child(-n + 1) {
880
+ width: 1%;
881
+ white-space: nowrap;
882
+ }
883
+
884
+ .datatable-general-pagination .page-item {
885
+ .page-link {
886
+ border-radius: 5px;
887
+ margin-left: 0;
888
+ border: 1px solid #dfdfdf;
889
+ }
890
+ }
891
+
892
+ .modal-backdrop.show {
893
+ z-index: 1100 !important;
894
+ }
895
+
896
+ .modal.show {
897
+ z-index: 1110 !important;
898
+ }
899
+
900
+ // theme light or dark
901
+ .theme-light {
902
+ @include theme(light);
903
+ }
904
+
905
+ .theme-dark {
906
+ @include theme(dark);
907
+ }
908
+
909
+ .theme-auto {
910
+ @media (prefers-color-scheme: dark) {
911
+ @include theme(dark);
912
+ }
913
+
914
+ @media (prefers-color-scheme: light) {
915
+ @include theme(light);
916
+ }
917
+ }
918
+
919
+ // this is section for print media
920
+ /* PAGE MARGINS — DO NOT USE size: so Firefox shows orientation */
921
+ @page {
922
+ margin: 12mm;
923
+ }
924
+
925
+ @media print {
926
+
927
+ /***************
928
+ GLOBAL RESET
929
+ ***************/
930
+ html,
931
+ body,
932
+ #app,
933
+ .wrapper,
934
+ .main,
935
+ .content-wrapper,
936
+ .content,
937
+ .card {
938
+ height: auto !important;
939
+ min-height: 0 !important;
940
+ margin: 0 !important;
941
+ padding: 0 !important;
942
+
943
+ background: #ffffff !important;
944
+ color: #000000 !important;
945
+
946
+ /* kill theme variables (dark mode fix) */
947
+ --app-bg: #ffffff !important;
948
+ --app-surface: #ffffff !important;
949
+ --app-text: #000000 !important;
950
+ --app-text-muted: #000000 !important;
951
+ --bs-body-bg: #ffffff !important;
952
+ --bs-body-color: #000000 !important;
953
+ --bs-card-bg: #ffffff !important;
954
+ --bs-card-color: #000000 !important;
955
+ --bs-table-bg: #ffffff !important;
956
+ --bs-table-color: #000000 !important;
957
+ }
958
+
959
+ * {
960
+ -webkit-print-color-adjust: exact !important;
961
+ print-color-adjust: exact !important;
962
+ }
963
+
964
+ .table {
965
+ margin-bottom: 0 !important;
966
+ }
967
+
968
+ /***************
969
+ REMOVE NON-PRINT ELEMENTS
970
+ ***************/
971
+ .content-wrapper>header,
972
+ .content-wrapper>footer,
973
+ .PageBar,
974
+ .Refresh,
975
+ .sidebar,
976
+ footer {
977
+ display: none !important;
978
+ }
979
+
980
+ /* remove left space from sidebar */
981
+ .main {
982
+ padding-left: 0 !important;
983
+ margin-left: 0 !important;
984
+ }
985
+
986
+ .wrapper {
987
+ height: auto !important;
988
+ overflow: visible !important;
989
+ font-size: 12px !important;
990
+ }
991
+
992
+ /***************
993
+ PRINT UTILITY RESET
994
+ ***************/
995
+ .pp-0,
996
+ .pm-0 {
997
+ padding: 0 !important;
998
+ margin: 0 !important;
999
+ }
1000
+
1001
+ @each $name, $size in $spacers {
1002
+
1003
+ /* Padding */
1004
+ .pp-#{$name} {
1005
+ padding: $size !important;
1006
+ }
1007
+
1008
+ .ppt-#{$name} {
1009
+ padding-top: $size !important;
1010
+ }
1011
+
1012
+ .ppe-#{$name} {
1013
+ padding-right: $size !important;
1014
+ }
1015
+
1016
+ .ppb-#{$name} {
1017
+ padding-bottom: $size !important;
1018
+ }
1019
+
1020
+ .pps-#{$name} {
1021
+ padding-left: $size !important;
1022
+ }
1023
+
1024
+ /* Margin */
1025
+ .pm-#{$name} {
1026
+ margin: $size !important;
1027
+ }
1028
+
1029
+ .pmt-#{$name} {
1030
+ margin-top: $size !important;
1031
+ }
1032
+
1033
+ .pme-#{$name} {
1034
+ margin-right: $size !important;
1035
+ }
1036
+
1037
+ .pmb-#{$name} {
1038
+ margin-bottom: $size !important;
1039
+ }
1040
+
1041
+ .pms-#{$name} {
1042
+ margin-left: $size !important;
1043
+ }
1044
+ }
1045
+
1046
+ /* Remove all card borders completely */
1047
+ .card.border,
1048
+ .card-body,
1049
+ .card-body.border {
1050
+ border: none !important;
1051
+ box-shadow: none !important;
1052
+ }
1053
+
1054
+ /***************
1055
+ RESPONSIVE TABLE FIX
1056
+ (NO SCROLL, SHRINK TO FIT)
1057
+ ***************/
1058
+ .table-responsive {
1059
+ overflow: visible !important;
1060
+ }
1061
+
1062
+ .table-responsive>table {
1063
+ width: 100% !important;
1064
+ table-layout: fixed !important;
1065
+ }
1066
+
1067
+ .table-responsive th,
1068
+ .table-responsive td {
1069
+ padding: 2px 4px !important;
1070
+ white-space: normal !important;
1071
+ word-wrap: break-word !important;
1072
+ }
1073
+
1074
+ /***************
1075
+ PAGE BREAK & TABLE SPLIT FIX
1076
+ ***************/
1077
+ table {
1078
+ width: 100% !important;
1079
+ border-collapse: collapse !important;
1080
+ page-break-inside: auto !important;
1081
+ break-inside: auto !important;
1082
+ }
1083
+
1084
+ thead {
1085
+ display: table-header-group !important;
1086
+ }
1087
+
1088
+ tfoot {
1089
+ display: table-footer-group !important;
1090
+ }
1091
+
1092
+ tr,
1093
+ th,
1094
+ td {
1095
+ page-break-inside: avoid !important;
1096
+ /* do not split ROWS */
1097
+ break-inside: avoid-page !important;
1098
+ page-break-after: auto !important;
1099
+ }
1100
+ }