create-nexwire 4.0.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 (488) hide show
  1. package/README.md +233 -0
  2. package/express/.dockerignore +14 -0
  3. package/express/.env +44 -0
  4. package/express/.env.example +42 -0
  5. package/express/.vscode/settings.json +26 -0
  6. package/express/LICENSE +21 -0
  7. package/express/README.md +211 -0
  8. package/express/biome.json +66 -0
  9. package/express/drizzle.config.ts +25 -0
  10. package/express/gitignore-stub +24 -0
  11. package/express/package.json +108 -0
  12. package/express/public/.gitkeep +0 -0
  13. package/express/src/config/app.ts +41 -0
  14. package/express/src/config/auth.ts +12 -0
  15. package/express/src/config/cache.ts +16 -0
  16. package/express/src/config/cookie.ts +15 -0
  17. package/express/src/config/cors.ts +12 -0
  18. package/express/src/config/database.ts +29 -0
  19. package/express/src/config/index.ts +83 -0
  20. package/express/src/config/jwt.ts +19 -0
  21. package/express/src/config/logging.ts +13 -0
  22. package/express/src/config/mail.ts +24 -0
  23. package/express/src/config/openapi.ts +54 -0
  24. package/express/src/config/queue.ts +30 -0
  25. package/express/src/config/rateLimit.ts +17 -0
  26. package/express/src/config/realtime.ts +15 -0
  27. package/express/src/config/redis.ts +18 -0
  28. package/express/src/config/security.ts +44 -0
  29. package/express/src/config/session.ts +17 -0
  30. package/express/src/config/storage.ts +22 -0
  31. package/express/src/config/validate.ts +40 -0
  32. package/express/src/database/migrations/sqlite/0000_init.sql +61 -0
  33. package/express/src/database/migrations/sqlite/meta/0000_snapshot.json +412 -0
  34. package/express/src/database/migrations/sqlite/meta/_journal.json +13 -0
  35. package/express/src/database/schema.ts +3 -0
  36. package/express/src/env.ts +76 -0
  37. package/express/src/framework/cache/cache.ts +81 -0
  38. package/express/src/framework/circuit-breaker/cb.ts +60 -0
  39. package/express/src/framework/database/connection.ts +196 -0
  40. package/express/src/framework/database/migrate-hooks.ts +87 -0
  41. package/express/src/framework/database/paginate.ts +227 -0
  42. package/express/src/framework/database/schema.ts +20 -0
  43. package/express/src/framework/database/seed.ts +139 -0
  44. package/express/src/framework/events/dispatcher.ts +49 -0
  45. package/express/src/framework/facade.ts +48 -0
  46. package/express/src/framework/http/app.ts +107 -0
  47. package/express/src/framework/http/cors.ts +7 -0
  48. package/express/src/framework/http/logger.ts +69 -0
  49. package/express/src/framework/http/metrics.ts +22 -0
  50. package/express/src/framework/http/openapi.ts +54 -0
  51. package/express/src/framework/http/ratelimiter.ts +16 -0
  52. package/express/src/framework/http/router.ts +178 -0
  53. package/express/src/framework/http/security.ts +23 -0
  54. package/express/src/framework/http/static.ts +23 -0
  55. package/express/src/framework/http/validation.ts +18 -0
  56. package/express/src/framework/kernel.ts +52 -0
  57. package/express/src/framework/maker-cli/db/core.mjs +288 -0
  58. package/express/src/framework/maker-cli/db/index.mjs +204 -0
  59. package/express/src/framework/maker-cli/deploy/core.mjs +1047 -0
  60. package/express/src/framework/maker-cli/deploy/index.mjs +91 -0
  61. package/express/src/framework/maker-cli/index.mjs +53 -0
  62. package/express/src/framework/maker-cli/middleware/core.mjs +47 -0
  63. package/express/src/framework/maker-cli/middleware/index.mjs +17 -0
  64. package/express/src/framework/maker-cli/module/core.mjs +684 -0
  65. package/express/src/framework/maker-cli/module/index.mjs +140 -0
  66. package/express/src/framework/maker-cli/runtime/build-ui.mjs +16 -0
  67. package/express/src/framework/maker-cli/runtime/core.mjs +543 -0
  68. package/express/src/framework/maker-cli/runtime/index.mjs +104 -0
  69. package/express/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
  70. package/express/src/framework/maker-cli/stubs/controller/openapi.ts.stub +47 -0
  71. package/express/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +48 -0
  72. package/express/src/framework/maker-cli/stubs/controller/plain.ts.stub +54 -0
  73. package/express/src/framework/maker-cli/stubs/controller/schema.plain.ts.stub +14 -0
  74. package/express/src/framework/maker-cli/stubs/controller/schema.ts.stub +33 -0
  75. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
  76. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
  77. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
  78. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
  79. package/express/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
  80. package/express/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
  81. package/express/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
  82. package/express/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
  83. package/express/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
  84. package/express/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
  85. package/express/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
  86. package/express/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
  87. package/express/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
  88. package/express/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
  89. package/express/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
  90. package/express/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
  91. package/express/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
  92. package/express/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
  93. package/express/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
  94. package/express/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
  95. package/express/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
  96. package/express/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
  97. package/express/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
  98. package/express/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
  99. package/express/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
  100. package/express/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
  101. package/express/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
  102. package/express/src/framework/maker-cli/stubs/example/console.ts.stub +34 -0
  103. package/express/src/framework/maker-cli/stubs/example/controller.ts.stub +418 -0
  104. package/express/src/framework/maker-cli/stubs/example/job.ts.stub +75 -0
  105. package/express/src/framework/maker-cli/stubs/example/route.api.ts.stub +207 -0
  106. package/express/src/framework/maker-cli/stubs/example/route.plain.ts.stub +18 -0
  107. package/express/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +42 -0
  108. package/express/src/framework/maker-cli/stubs/example/schema.ts.stub +42 -0
  109. package/express/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
  110. package/express/src/framework/maker-cli/stubs/middleware/name.ts.stub +14 -0
  111. package/express/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -0
  112. package/express/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -0
  113. package/express/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -0
  114. package/express/src/framework/maker-cli/stubs/notification/controller.ts.stub +77 -0
  115. package/express/src/framework/maker-cli/stubs/notification/job.ts.stub +13 -0
  116. package/express/src/framework/maker-cli/stubs/notification/route.api.ts.stub +50 -0
  117. package/express/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +12 -0
  118. package/express/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
  119. package/express/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
  120. package/express/src/framework/maker-cli/stubs/route/api.ts.stub +80 -0
  121. package/express/src/framework/maker-cli/stubs/route/plain.ts.stub +11 -0
  122. package/express/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
  123. package/express/src/framework/maker-cli/stubs/seeder/name.ts.stub +20 -0
  124. package/express/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
  125. package/express/src/framework/maker-cli/utils/env-config.mjs +44 -0
  126. package/express/src/framework/maker-cli/utils/env-db.mjs +61 -0
  127. package/express/src/framework/maker-cli/utils/file-ops.mjs +30 -0
  128. package/express/src/framework/maker-cli/utils/flags.mjs +14 -0
  129. package/express/src/framework/maker-cli/utils/help.mjs +50 -0
  130. package/express/src/framework/maker-cli/utils/naming.mjs +13 -0
  131. package/express/src/framework/maker-cli/utils/process.mjs +52 -0
  132. package/express/src/framework/modules/discover.ts +54 -0
  133. package/express/src/framework/modules/routes.ts +21 -0
  134. package/express/src/framework/notification/index.ts +116 -0
  135. package/express/src/framework/queue/clear.ts +22 -0
  136. package/express/src/framework/queue/queue.ts +342 -0
  137. package/express/src/framework/queue/ui.ts +187 -0
  138. package/express/src/framework/queue/worker.ts +61 -0
  139. package/express/src/framework/realtime/broadcast.ts +46 -0
  140. package/express/src/framework/realtime/index.ts +2 -0
  141. package/express/src/framework/realtime/socket-cookie.ts +71 -0
  142. package/express/src/framework/realtime/socket.ts +119 -0
  143. package/express/src/framework/realtime/types.ts +6 -0
  144. package/express/src/framework/realtime/ui.ts +16 -0
  145. package/express/src/framework/redis/client.ts +151 -0
  146. package/express/src/framework/runtime/runtime.ts +23 -0
  147. package/express/src/framework/runtime/server-adapter.ts +34 -0
  148. package/express/src/framework/scheduler/lock.ts +116 -0
  149. package/express/src/framework/scheduler/run.ts +48 -0
  150. package/express/src/framework/scheduler/scheduler.ts +155 -0
  151. package/express/src/framework/server.ts +177 -0
  152. package/express/src/framework/session/session.ts +98 -0
  153. package/express/src/framework/storage/storage.ts +785 -0
  154. package/express/src/framework/support/cookie.ts +62 -0
  155. package/express/src/framework/support/jwt.ts +33 -0
  156. package/express/src/framework/support/lifecycle.ts +35 -0
  157. package/express/src/framework/support/logger.ts +148 -0
  158. package/express/src/framework/support/mail.ts +48 -0
  159. package/express/src/framework/support/password.ts +23 -0
  160. package/express/src/framework/support/upload.ts +160 -0
  161. package/express/src/framework/support/url.ts +41 -0
  162. package/express/src/middlewares/auth-middleware.ts +98 -0
  163. package/express/src/middlewares/role-middleware.ts +25 -0
  164. package/express/src/modules/auth/controllers/auth.controller.ts +358 -0
  165. package/express/src/modules/auth/controllers/auth.helpers.ts +104 -0
  166. package/express/src/modules/auth/controllers/auth.schema.ts +102 -0
  167. package/express/src/modules/auth/controllers/role.controller.ts +15 -0
  168. package/express/src/modules/auth/database/models/notifications.ts +24 -0
  169. package/express/src/modules/auth/database/models/role.ts +14 -0
  170. package/express/src/modules/auth/database/models/user.ts +46 -0
  171. package/express/src/modules/auth/database/seeders/role.ts +18 -0
  172. package/express/src/modules/auth/database/seeders/user.ts +35 -0
  173. package/express/src/modules/auth/jobs/forgetpass.ts +20 -0
  174. package/express/src/modules/auth/jobs/registeruser.ts +23 -0
  175. package/express/src/modules/auth/jobs/verifyemail.ts +18 -0
  176. package/express/src/modules/auth/routes/api.ts +150 -0
  177. package/express/src/modules/auth/routes/role.ts +33 -0
  178. package/express/src/resources/index.html +17 -0
  179. package/express/src/resources/src/App.vue +5 -0
  180. package/express/src/resources/src/assets/css/styles.css +14761 -0
  181. package/express/src/resources/src/assets/css/styles.css.map +1 -0
  182. package/express/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
  183. package/express/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
  184. package/express/src/resources/src/assets/images/favicon/favicon.ico +0 -0
  185. package/express/src/resources/src/assets/images/logo.png +0 -0
  186. package/express/src/resources/src/assets/scss/custom.css +217 -0
  187. package/express/src/resources/src/assets/scss/custom.css.map +1 -0
  188. package/express/src/resources/src/assets/scss/custom.scss +1346 -0
  189. package/express/src/resources/src/components/Button.vue +32 -0
  190. package/express/src/resources/src/components/Checkbox.vue +29 -0
  191. package/express/src/resources/src/components/Datepicker.vue +106 -0
  192. package/express/src/resources/src/components/FeatureButton.vue +53 -0
  193. package/express/src/resources/src/components/FloatButton.vue +33 -0
  194. package/express/src/resources/src/components/Href.vue +32 -0
  195. package/express/src/resources/src/components/Input.vue +223 -0
  196. package/express/src/resources/src/components/InputGroup.vue +145 -0
  197. package/express/src/resources/src/components/InputPasswordToggle.vue +213 -0
  198. package/express/src/resources/src/components/Modal.vue +55 -0
  199. package/express/src/resources/src/components/Pagebar.vue +26 -0
  200. package/express/src/resources/src/components/Select.vue +384 -0
  201. package/express/src/resources/src/components/Spinner.vue +42 -0
  202. package/express/src/resources/src/components/Switch.vue +65 -0
  203. package/express/src/resources/src/components/TextArea.vue +117 -0
  204. package/express/src/resources/src/components/Toast.vue +56 -0
  205. package/express/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
  206. package/express/src/resources/src/components/datatable/Pagination.vue +147 -0
  207. package/express/src/resources/src/components/datatable/SelectOpption.vue +64 -0
  208. package/express/src/resources/src/components/datatable/index.vue +199 -0
  209. package/express/src/resources/src/composables/useAuth.ts +52 -0
  210. package/express/src/resources/src/helpers/nformatter.ts +10 -0
  211. package/express/src/resources/src/helpers/utils.ts +75 -0
  212. package/express/src/resources/src/layouts/AuthLayout.vue +20 -0
  213. package/express/src/resources/src/layouts/Layout/Footer.vue +23 -0
  214. package/express/src/resources/src/layouts/Layout/Header.vue +105 -0
  215. package/express/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
  216. package/express/src/resources/src/layouts/Layout/index.vue +87 -0
  217. package/express/src/resources/src/main.ts +26 -0
  218. package/express/src/resources/src/pages/auth/forgetPassword.vue +82 -0
  219. package/express/src/resources/src/pages/auth/login.vue +99 -0
  220. package/express/src/resources/src/pages/auth/register.vue +133 -0
  221. package/express/src/resources/src/pages/auth/resetPassword.vue +118 -0
  222. package/express/src/resources/src/pages/auth/verifyEmail.vue +68 -0
  223. package/express/src/resources/src/pages/dashboard/index.vue +66 -0
  224. package/express/src/resources/src/plugins/axios.ts +31 -0
  225. package/express/src/resources/src/plugins/browserDetect.ts +55 -0
  226. package/express/src/resources/src/plugins/dialog.ts +216 -0
  227. package/express/src/resources/src/plugins/gum.ts +367 -0
  228. package/express/src/resources/src/plugins/pulse.ts +147 -0
  229. package/express/src/resources/src/plugins/routeProgress.ts +87 -0
  230. package/express/src/resources/src/router/index.ts +85 -0
  231. package/express/src/resources/src/stores/admin-ui.ts +148 -0
  232. package/express/src/resources/src/stores/auth.ts +164 -0
  233. package/express/src/resources/tsconfig.json +19 -0
  234. package/express/src/resources/vite.config.ts +46 -0
  235. package/express/src/storage/app/private/.gitkeep +0 -0
  236. package/express/src/storage/app/public/.gitkeep +0 -0
  237. package/express/src/storage/app/tmp/generated/.gitkeep +0 -0
  238. package/express/src/storage/database/nexwire.sqlite +0 -0
  239. package/express/src/storage/logs/.gitkeep +0 -0
  240. package/express/src/storage/tmp/.gitkeep +0 -0
  241. package/express/src/storage/trash/modules/.gitkeep +0 -0
  242. package/express/src/types/global.d.ts +26 -0
  243. package/express/tsconfig.json +19 -0
  244. package/express/vitest.config.ts +23 -0
  245. package/hono/.dockerignore +14 -0
  246. package/hono/.env +44 -0
  247. package/hono/.env.example +42 -0
  248. package/hono/.vscode/settings.json +26 -0
  249. package/hono/LICENSE +21 -0
  250. package/hono/README.md +211 -0
  251. package/hono/biome.json +76 -0
  252. package/hono/drizzle.config.ts +25 -0
  253. package/hono/gitignore-stub +24 -0
  254. package/hono/package.json +99 -0
  255. package/hono/public/.gitkeep +0 -0
  256. package/hono/src/config/app.ts +41 -0
  257. package/hono/src/config/auth.ts +12 -0
  258. package/hono/src/config/cache.ts +16 -0
  259. package/hono/src/config/cookie.ts +15 -0
  260. package/hono/src/config/cors.ts +12 -0
  261. package/hono/src/config/database.ts +29 -0
  262. package/hono/src/config/index.ts +83 -0
  263. package/hono/src/config/jwt.ts +19 -0
  264. package/hono/src/config/logging.ts +13 -0
  265. package/hono/src/config/mail.ts +24 -0
  266. package/hono/src/config/openapi.ts +54 -0
  267. package/hono/src/config/queue.ts +30 -0
  268. package/hono/src/config/rateLimit.ts +17 -0
  269. package/hono/src/config/realtime.ts +15 -0
  270. package/hono/src/config/redis.ts +18 -0
  271. package/hono/src/config/security.ts +44 -0
  272. package/hono/src/config/session.ts +17 -0
  273. package/hono/src/config/storage.ts +22 -0
  274. package/hono/src/config/validate.ts +40 -0
  275. package/hono/src/database/migrations/sqlite/0000_init.sql +61 -0
  276. package/hono/src/database/migrations/sqlite/meta/0000_snapshot.json +412 -0
  277. package/hono/src/database/migrations/sqlite/meta/_journal.json +13 -0
  278. package/hono/src/database/schema.ts +3 -0
  279. package/hono/src/env.ts +76 -0
  280. package/hono/src/framework/cache/cache.ts +81 -0
  281. package/hono/src/framework/circuit-breaker/cb.ts +60 -0
  282. package/hono/src/framework/database/connection.ts +196 -0
  283. package/hono/src/framework/database/migrate-hooks.ts +87 -0
  284. package/hono/src/framework/database/paginate.ts +253 -0
  285. package/hono/src/framework/database/schema.ts +20 -0
  286. package/hono/src/framework/database/seed.ts +139 -0
  287. package/hono/src/framework/events/dispatcher.ts +49 -0
  288. package/hono/src/framework/facade.ts +29 -0
  289. package/hono/src/framework/http/app.ts +109 -0
  290. package/hono/src/framework/http/cors.ts +19 -0
  291. package/hono/src/framework/http/logger.ts +81 -0
  292. package/hono/src/framework/http/metrics.ts +22 -0
  293. package/hono/src/framework/http/openapi.ts +42 -0
  294. package/hono/src/framework/http/ratelimiter.ts +172 -0
  295. package/hono/src/framework/http/router.ts +76 -0
  296. package/hono/src/framework/http/security.ts +23 -0
  297. package/hono/src/framework/http/static.ts +70 -0
  298. package/hono/src/framework/http/validation.ts +21 -0
  299. package/hono/src/framework/kernel.ts +48 -0
  300. package/hono/src/framework/maker-cli/db/core.mjs +288 -0
  301. package/hono/src/framework/maker-cli/db/index.mjs +204 -0
  302. package/hono/src/framework/maker-cli/deploy/core.mjs +1038 -0
  303. package/hono/src/framework/maker-cli/deploy/index.mjs +91 -0
  304. package/hono/src/framework/maker-cli/index.mjs +53 -0
  305. package/hono/src/framework/maker-cli/middleware/core.mjs +47 -0
  306. package/hono/src/framework/maker-cli/middleware/index.mjs +12 -0
  307. package/hono/src/framework/maker-cli/module/core.mjs +684 -0
  308. package/hono/src/framework/maker-cli/module/index.mjs +140 -0
  309. package/hono/src/framework/maker-cli/runtime/build-ui.mjs +17 -0
  310. package/hono/src/framework/maker-cli/runtime/core.mjs +543 -0
  311. package/hono/src/framework/maker-cli/runtime/index.mjs +104 -0
  312. package/hono/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
  313. package/hono/src/framework/maker-cli/stubs/controller/openapi.ts.stub +57 -0
  314. package/hono/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +58 -0
  315. package/hono/src/framework/maker-cli/stubs/controller/plain.ts.stub +59 -0
  316. package/hono/src/framework/maker-cli/stubs/controller/schema.plain.ts.stub +14 -0
  317. package/hono/src/framework/maker-cli/stubs/controller/schema.ts.stub +33 -0
  318. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
  319. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
  320. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
  321. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
  322. package/hono/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
  323. package/hono/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
  324. package/hono/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
  325. package/hono/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
  326. package/hono/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
  327. package/hono/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
  328. package/hono/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
  329. package/hono/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
  330. package/hono/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
  331. package/hono/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
  332. package/hono/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
  333. package/hono/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
  334. package/hono/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
  335. package/hono/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
  336. package/hono/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
  337. package/hono/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
  338. package/hono/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
  339. package/hono/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
  340. package/hono/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
  341. package/hono/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
  342. package/hono/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
  343. package/hono/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
  344. package/hono/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
  345. package/hono/src/framework/maker-cli/stubs/example/console.ts.stub +34 -0
  346. package/hono/src/framework/maker-cli/stubs/example/controller.ts.stub +505 -0
  347. package/hono/src/framework/maker-cli/stubs/example/job.ts.stub +75 -0
  348. package/hono/src/framework/maker-cli/stubs/example/route.api.ts.stub +207 -0
  349. package/hono/src/framework/maker-cli/stubs/example/route.plain.ts.stub +18 -0
  350. package/hono/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +42 -0
  351. package/hono/src/framework/maker-cli/stubs/example/schema.ts.stub +42 -0
  352. package/hono/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
  353. package/hono/src/framework/maker-cli/stubs/middleware/name.ts.stub +14 -0
  354. package/hono/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -0
  355. package/hono/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -0
  356. package/hono/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -0
  357. package/hono/src/framework/maker-cli/stubs/notification/controller.ts.stub +86 -0
  358. package/hono/src/framework/maker-cli/stubs/notification/job.ts.stub +13 -0
  359. package/hono/src/framework/maker-cli/stubs/notification/route.api.ts.stub +50 -0
  360. package/hono/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +12 -0
  361. package/hono/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
  362. package/hono/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
  363. package/hono/src/framework/maker-cli/stubs/route/api.ts.stub +80 -0
  364. package/hono/src/framework/maker-cli/stubs/route/plain.ts.stub +11 -0
  365. package/hono/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
  366. package/hono/src/framework/maker-cli/stubs/seeder/name.ts.stub +20 -0
  367. package/hono/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
  368. package/hono/src/framework/maker-cli/utils/env-config.mjs +44 -0
  369. package/hono/src/framework/maker-cli/utils/env-db.mjs +61 -0
  370. package/hono/src/framework/maker-cli/utils/file-ops.mjs +30 -0
  371. package/hono/src/framework/maker-cli/utils/flags.mjs +14 -0
  372. package/hono/src/framework/maker-cli/utils/help.mjs +50 -0
  373. package/hono/src/framework/maker-cli/utils/naming.mjs +13 -0
  374. package/hono/src/framework/maker-cli/utils/process.mjs +52 -0
  375. package/hono/src/framework/modules/discover.ts +54 -0
  376. package/hono/src/framework/modules/routes.ts +24 -0
  377. package/hono/src/framework/notification/index.ts +116 -0
  378. package/hono/src/framework/queue/clear.ts +22 -0
  379. package/hono/src/framework/queue/queue.ts +342 -0
  380. package/hono/src/framework/queue/ui.ts +214 -0
  381. package/hono/src/framework/queue/worker.ts +61 -0
  382. package/hono/src/framework/realtime/broadcast.ts +46 -0
  383. package/hono/src/framework/realtime/index.ts +2 -0
  384. package/hono/src/framework/realtime/socket-cookie.ts +68 -0
  385. package/hono/src/framework/realtime/socket.ts +196 -0
  386. package/hono/src/framework/realtime/types.ts +6 -0
  387. package/hono/src/framework/realtime/ui.ts +16 -0
  388. package/hono/src/framework/redis/client.ts +151 -0
  389. package/hono/src/framework/runtime/runtime.ts +23 -0
  390. package/hono/src/framework/runtime/server-adapter.ts +94 -0
  391. package/hono/src/framework/scheduler/lock.ts +116 -0
  392. package/hono/src/framework/scheduler/run.ts +48 -0
  393. package/hono/src/framework/scheduler/scheduler.ts +155 -0
  394. package/hono/src/framework/server.ts +183 -0
  395. package/hono/src/framework/session/session.ts +116 -0
  396. package/hono/src/framework/storage/storage.ts +785 -0
  397. package/hono/src/framework/support/cookie.ts +99 -0
  398. package/hono/src/framework/support/jwt.ts +45 -0
  399. package/hono/src/framework/support/lifecycle.ts +35 -0
  400. package/hono/src/framework/support/logger.ts +148 -0
  401. package/hono/src/framework/support/mail.ts +48 -0
  402. package/hono/src/framework/support/password.ts +23 -0
  403. package/hono/src/framework/support/url.ts +41 -0
  404. package/hono/src/middlewares/auth-middleware.ts +98 -0
  405. package/hono/src/middlewares/role-middleware.ts +25 -0
  406. package/hono/src/modules/auth/controllers/auth.controller.ts +413 -0
  407. package/hono/src/modules/auth/controllers/auth.helpers.ts +128 -0
  408. package/hono/src/modules/auth/controllers/auth.schema.ts +102 -0
  409. package/hono/src/modules/auth/controllers/role.controller.ts +25 -0
  410. package/hono/src/modules/auth/database/models/notifications.ts +24 -0
  411. package/hono/src/modules/auth/database/models/role.ts +14 -0
  412. package/hono/src/modules/auth/database/models/user.ts +46 -0
  413. package/hono/src/modules/auth/database/seeders/role.ts +18 -0
  414. package/hono/src/modules/auth/database/seeders/user.ts +35 -0
  415. package/hono/src/modules/auth/jobs/forgetpass.ts +20 -0
  416. package/hono/src/modules/auth/jobs/registeruser.ts +23 -0
  417. package/hono/src/modules/auth/jobs/verifyemail.ts +18 -0
  418. package/hono/src/modules/auth/routes/api.ts +150 -0
  419. package/hono/src/modules/auth/routes/role.ts +33 -0
  420. package/hono/src/resources/index.html +17 -0
  421. package/hono/src/resources/src/App.vue +5 -0
  422. package/hono/src/resources/src/assets/css/styles.css +14913 -0
  423. package/hono/src/resources/src/assets/css/styles.css.map +1 -0
  424. package/hono/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
  425. package/hono/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
  426. package/hono/src/resources/src/assets/images/favicon/favicon.ico +0 -0
  427. package/hono/src/resources/src/assets/images/logo.png +0 -0
  428. package/hono/src/resources/src/assets/scss/custom.css +217 -0
  429. package/hono/src/resources/src/assets/scss/custom.css.map +1 -0
  430. package/hono/src/resources/src/assets/scss/custom.scss +1346 -0
  431. package/hono/src/resources/src/components/Button.vue +32 -0
  432. package/hono/src/resources/src/components/Checkbox.vue +29 -0
  433. package/hono/src/resources/src/components/Datepicker.vue +106 -0
  434. package/hono/src/resources/src/components/FeatureButton.vue +53 -0
  435. package/hono/src/resources/src/components/FloatButton.vue +33 -0
  436. package/hono/src/resources/src/components/Href.vue +32 -0
  437. package/hono/src/resources/src/components/Input.vue +234 -0
  438. package/hono/src/resources/src/components/InputGroup.vue +149 -0
  439. package/hono/src/resources/src/components/InputPasswordToggle.vue +222 -0
  440. package/hono/src/resources/src/components/Modal.vue +55 -0
  441. package/hono/src/resources/src/components/Pagebar.vue +26 -0
  442. package/hono/src/resources/src/components/Select.vue +415 -0
  443. package/hono/src/resources/src/components/Spinner.vue +42 -0
  444. package/hono/src/resources/src/components/Switch.vue +65 -0
  445. package/hono/src/resources/src/components/TextArea.vue +121 -0
  446. package/hono/src/resources/src/components/Toast.vue +56 -0
  447. package/hono/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
  448. package/hono/src/resources/src/components/datatable/Pagination.vue +147 -0
  449. package/hono/src/resources/src/components/datatable/SelectOpption.vue +64 -0
  450. package/hono/src/resources/src/components/datatable/index.vue +199 -0
  451. package/hono/src/resources/src/composables/useAuth.ts +52 -0
  452. package/hono/src/resources/src/helpers/nformatter.ts +10 -0
  453. package/hono/src/resources/src/helpers/utils.ts +75 -0
  454. package/hono/src/resources/src/layouts/AuthLayout.vue +20 -0
  455. package/hono/src/resources/src/layouts/Layout/Footer.vue +23 -0
  456. package/hono/src/resources/src/layouts/Layout/Header.vue +105 -0
  457. package/hono/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
  458. package/hono/src/resources/src/layouts/Layout/index.vue +87 -0
  459. package/hono/src/resources/src/main.ts +26 -0
  460. package/hono/src/resources/src/pages/auth/forgetPassword.vue +82 -0
  461. package/hono/src/resources/src/pages/auth/login.vue +99 -0
  462. package/hono/src/resources/src/pages/auth/register.vue +133 -0
  463. package/hono/src/resources/src/pages/auth/resetPassword.vue +118 -0
  464. package/hono/src/resources/src/pages/auth/verifyEmail.vue +68 -0
  465. package/hono/src/resources/src/pages/dashboard/index.vue +66 -0
  466. package/hono/src/resources/src/plugins/axios.ts +31 -0
  467. package/hono/src/resources/src/plugins/browserDetect.ts +55 -0
  468. package/hono/src/resources/src/plugins/dialog.ts +216 -0
  469. package/hono/src/resources/src/plugins/gum.ts +367 -0
  470. package/hono/src/resources/src/plugins/pulse.ts +147 -0
  471. package/hono/src/resources/src/plugins/routeProgress.ts +87 -0
  472. package/hono/src/resources/src/router/index.ts +85 -0
  473. package/hono/src/resources/src/stores/admin-ui.ts +148 -0
  474. package/hono/src/resources/src/stores/auth.ts +164 -0
  475. package/hono/src/resources/tsconfig.json +19 -0
  476. package/hono/src/resources/vite.config.ts +46 -0
  477. package/hono/src/storage/app/private/.gitkeep +0 -0
  478. package/hono/src/storage/app/public/.gitkeep +0 -0
  479. package/hono/src/storage/app/tmp/generated/.gitkeep +0 -0
  480. package/hono/src/storage/database/nexwire.sqlite +0 -0
  481. package/hono/src/storage/logs/.gitkeep +0 -0
  482. package/hono/src/storage/tmp/.gitkeep +0 -0
  483. package/hono/src/storage/trash/modules/.gitkeep +0 -0
  484. package/hono/src/types/global.d.ts +26 -0
  485. package/hono/tsconfig.json +20 -0
  486. package/hono/vitest.config.ts +23 -0
  487. package/package.json +238 -0
  488. package/src/index.js +204 -0
@@ -0,0 +1,1346 @@
1
+ @use "sass:map";
2
+ @use "sass:color";
3
+ @use "bootstrap/scss/bootstrap" as *;
4
+
5
+ @font-face {
6
+ font-family: "Public Sans";
7
+ font-style: normal;
8
+ font-weight: 100 900;
9
+ font-display: swap;
10
+ src: url("../fonts/public-sans/public-sans-latin.woff2") format("woff2");
11
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
12
+ }
13
+
14
+ @font-face {
15
+ font-family: "Public Sans";
16
+ font-style: normal;
17
+ font-weight: 100 900;
18
+ font-display: swap;
19
+ src: url("../fonts/public-sans/public-sans-latin-ext.woff2") format("woff2");
20
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
21
+ }
22
+
23
+ /*
24
+ * Here from start custom css
25
+ * Our custom css depends on some bootstrap class
26
+ * and our new class
27
+ */
28
+
29
+ html,
30
+ body {
31
+ height: 100%;
32
+ color: $gray-700;
33
+ scroll-behavior: smooth;
34
+ font-family: "Public Sans", sans-serif;
35
+ --bs-body-font-family: "Public Sans", sans-serif;
36
+ --bs-font-sans-serif: "Public Sans", sans-serif;
37
+ }
38
+
39
+ #app {
40
+ position: relative;
41
+ min-height: 100%;
42
+ }
43
+
44
+ $themes: (
45
+ light: (bg: #f5f5f9,
46
+ bg-white: #ffffff,
47
+ text-color: #495057,
48
+ gray-700: $gray-700,
49
+ gray-200: $gray-200,
50
+ gray-300: $gray-300,
51
+ gray-400: $gray-400,
52
+ gray-500: $gray-500,
53
+ gray-900: $gray-900,
54
+ primary: $primary,
55
+ secondary: $secondary,
56
+ danger: $danger,
57
+ warning: $warning,
58
+ success: $success,
59
+ info: $info,
60
+ dark-color: $dark,
61
+ input-bg: #FFFFFF,
62
+ skeleton: #efefef,
63
+ skeleton-hi: #f8f8f8,
64
+ border-custom: #cdcdcd,
65
+ auth-shadow: rgba(34, 48, 62, 0.1),
66
+ sidebar-shadow: rgba(145, 152, 159, 0.12),
67
+ sidebar-link-bg: rgba(59, 142, 237, 0.16),
68
+ backdrop: rgba(0, 0, 0, 0.5),
69
+ shadow-custom: rgba(34, 48, 62, 0.08),
70
+ 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"),
71
+ 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")),
72
+ dark: (bg: #121212,
73
+ bg-white: #1B1B1F,
74
+ text-color: #E5E5E5,
75
+ // surface
76
+ gray-700: #e5e5e5,
77
+ // body text
78
+ gray-200: #2a2a2a,
79
+ gray-300: #4a4a4a,
80
+ gray-400: #6a6a6a,
81
+ // hover surface
82
+ gray-500: #a8a8a8,
83
+ // muted
84
+ gray-900: #ffffff,
85
+ // high contrast text
86
+ primary: #3b8eed,
87
+ secondary: #9aa0a6,
88
+ danger: $danger,
89
+ warning: $warning,
90
+ success: $success,
91
+ info: $info,
92
+ dark-color: #3b8eed,
93
+ input-bg: #121212,
94
+ skeleton: #4a4a4a,
95
+ skeleton-hi: #2a2a2a,
96
+ border-custom: #3f3f3f,
97
+ auth-shadow: rgba(0, 0, 0, 0.35),
98
+ sidebar-shadow: rgba(0, 0, 0, 0.35),
99
+ sidebar-link-bg: rgba(59, 142, 237, 0.22),
100
+ backdrop: rgba(0, 0, 0, 0.6),
101
+ shadow-custom: rgba(34, 48, 62, 0.08),
102
+ 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"),
103
+ 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"))
104
+ );
105
+
106
+ $sidebar-width: 16.25rem;
107
+
108
+ .fs-7 {
109
+ font-size: 12px;
110
+ }
111
+
112
+ @mixin theme($theme-name) {
113
+ $theme: map.get($themes, $theme-name);
114
+
115
+ & {
116
+ /* App custom tokens */
117
+ --app-bg: #{map.get($theme, bg)};
118
+ --app-surface: #{map.get($theme, bg-white)};
119
+ --app-text: #{map.get($theme, text-color)};
120
+ --app-text-strong: #{map.get($theme, text-color)};
121
+ --app-text-muted: #{map.get($theme, gray-500)};
122
+ --app-border: #{map.get($theme, border-custom)};
123
+ --app-hover: #{map.get($theme, gray-200)};
124
+ --app-primary: #{map.get($theme, primary)};
125
+ --app-backdrop: #{map.get($theme, backdrop)};
126
+ --app-skeleton: #{map.get($theme, skeleton)};
127
+ --app-skeleton-hi: #{map.get($theme, skeleton-hi)};
128
+
129
+ /* Bootstrap runtime vars */
130
+ --bs-body-bg: var(--app-bg);
131
+ --bs-body-color: var(--app-text);
132
+ --bs-border-color: var(--app-border);
133
+ --bs-dropdown-bg: var(--app-surface);
134
+ --bs-dropdown-link-color: var(--app-text);
135
+ --bs-dropdown-link-hover-bg: var(--app-hover);
136
+ --bs-input-bg: var(--app-surface);
137
+ --bs-input-color: var(--app-text);
138
+ --bs-link-color: var(--app-primary);
139
+ --bs-navbar-bg: transparent; // you use transparent
140
+ --bs-secondary-color: #{map.get($theme, gray-500)};
141
+ --bs-secondary-bg-subtle: #{map.get($theme, gray-200)};
142
+ --bs-secondary-color-rgb: #{color.channel(map.get($theme, gray-500), "red", $space: rgb)},
143
+ #{color.channel(map.get($theme, gray-500), "green", $space: rgb)},
144
+ #{color.channel(map.get($theme, gray-500), "blue", $space: rgb)};
145
+ }
146
+
147
+ & {
148
+ background-color: map.get($theme, bg);
149
+ color: var(--app-text);
150
+
151
+ *::-webkit-scrollbar {
152
+ width: 6px;
153
+
154
+ &-track {
155
+ background: map.get($theme, gray-200);
156
+ }
157
+
158
+ &-thumb {
159
+ background: map.get($theme, gray-500);
160
+ border-radius: 0.375rem;
161
+ }
162
+ }
163
+ }
164
+
165
+ // Ensure modal close icon visible in each theme
166
+ .btn-close {
167
+ @if $theme-name ==dark {
168
+ filter: invert(1) grayscale(100%) brightness(200%) !important;
169
+ }
170
+
171
+ opacity: 0.85;
172
+
173
+ &:hover {
174
+ opacity: 1;
175
+ }
176
+
177
+ &:focus {
178
+ box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--app-primary), transparent 75%);
179
+ }
180
+ }
181
+
182
+ // Outline-dark becomes warning color; datatable pagination follows the same variants
183
+ @each $btn-variant in (primary, secondary, success, danger, warning, info, dark) {
184
+ $pagination-color: if(sass($btn-variant ==dark): dark-color; else: $btn-variant);
185
+
186
+ .btn-outline-#{$btn-variant} {
187
+ @if $btn-variant ==dark {
188
+ color: map.get($theme, dark-color) !important;
189
+ border-color: map.get($theme, dark-color) !important;
190
+
191
+ &:hover,
192
+ &:focus,
193
+ &:active,
194
+ &.active {
195
+ background-color: map.get($theme, dark-color) !important;
196
+ color: map.get($theme, bg-white) !important; // improve contrast
197
+ border-color: map.get($theme, dark-color) !important;
198
+ }
199
+ }
200
+ }
201
+
202
+ // Datatable pagination per variant (dark theme only; light theme stays default)
203
+ @if $theme-name ==dark {
204
+ & .datatable-pagination.pagination-#{$btn-variant} {
205
+
206
+ & input,
207
+ & input:hover {
208
+ border: 1px solid map.get($theme, $pagination-color) !important;
209
+ }
210
+
211
+ & span.page-link {
212
+ border-color: map.get($theme, $pagination-color) !important;
213
+ color: map.get($theme, $pagination-color) !important;
214
+
215
+ &:hover {
216
+ background: none;
217
+ color: none !important;
218
+ }
219
+ }
220
+
221
+ & button {
222
+ &.page-link[aria-disabled="true"] {
223
+ background-color: map.get($theme, $pagination-color) !important;
224
+ color: map.get($theme, bg-white) !important;
225
+ }
226
+
227
+ &.page-link {
228
+ color: map.get($theme, $pagination-color) !important;
229
+ border-color: map.get($theme, $pagination-color) !important;
230
+
231
+ &:hover,
232
+ &:focus,
233
+ &:active,
234
+ &.active {
235
+ background-color: map.get($theme, $pagination-color) !important;
236
+ color: map.get($theme, bg-white) !important; // improve contrast
237
+ border-color: map.get($theme, $pagination-color) !important;
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
243
+ }
244
+
245
+ // Skeleton / placeholder shimmer (dark theme only; light keeps component defaults)
246
+ @if $theme-name ==dark {
247
+ & .skeleton {
248
+ & .bg-custom {
249
+ animation: skeleton-shimmer 3s infinite;
250
+ }
251
+
252
+ & table,
253
+ & tr,
254
+ & th,
255
+ & td {
256
+ border-color: map.get($theme, border-custom) !important;
257
+ animation: skeleton-shimmer 3s infinite;
258
+ }
259
+ }
260
+ }
261
+
262
+ .card {
263
+ --bs-card-bg: #{map.get($theme, bg-white)};
264
+ --bs-card-color: #{map.get($theme, text-color)};
265
+ --bs-card-border-color: #{map.get($theme, border-custom)};
266
+ /* optional bits */
267
+ --bs-card-cap-bg: var(--bs-card-bg);
268
+ --bs-card-cap-color: var(--bs-card-color);
269
+
270
+ .card-header,
271
+ .card-footer {
272
+ --bs-card-footer-bg: var(--bs-card-cap-bg);
273
+ }
274
+ }
275
+
276
+ .table {
277
+ --bs-table-color: #{map.get($theme, text-color)};
278
+ --bs-table-bg: #{map.get($theme, bg-white)};
279
+ --bs-table-border-color: #{map.get($theme, border-custom)};
280
+ --bs-table-striped-bg: #{map.get($theme, gray-200)};
281
+ --bs-table-striped-color: #{map.get($theme, text-color)};
282
+ --bs-table-hover-bg: #{map.get($theme, gray-300)};
283
+ --bs-table-hover-color: #{map.get($theme, text-color)};
284
+ --bs-table-active-bg: #{map.get($theme, gray-200)};
285
+ --bs-table-active-color: #{map.get($theme, text-color)};
286
+ }
287
+
288
+ .auth {
289
+ background-color: map.get($theme, bg-white);
290
+ box-shadow: 0 0.1875rem 0.5rem 0 map.get($theme, auth-shadow);
291
+ border: 1px solid map.get($theme, border-custom);
292
+ box-sizing: border-box;
293
+ padding: 1.5rem 2rem 3.5rem 2rem;
294
+ max-width: 460px;
295
+ margin: 0 auto;
296
+ border-radius: 0.375rem;
297
+
298
+ @include media-breakpoint-down(sm) {
299
+ padding: 3rem 0.5rem;
300
+ }
301
+ }
302
+
303
+ .input-group-text {
304
+ background: map.get($theme, input-bg);
305
+
306
+ &:focus-visible {
307
+ outline: none;
308
+ }
309
+ }
310
+
311
+ .form-control {
312
+ border: 1px solid map.get($theme, border-custom);
313
+ // padding: calc(0.44rem - var(--bs-border-width)) calc(0.9375rem - var(--bs-border-width));
314
+ // line-height: 1.375;
315
+ background: map.get($theme, input-bg);
316
+
317
+ @if $theme-name ==dark {
318
+ color-scheme: dark;
319
+ }
320
+
321
+ &:hover {
322
+ border: 1px solid map.get($theme, secondary);
323
+ }
324
+
325
+ &:focus {
326
+ box-shadow: 0 0 1px map.get($theme, primary);
327
+ border: 1px solid map.get($theme, primary);
328
+ background: map.get($theme, input-bg);
329
+ }
330
+
331
+ &::placeholder {
332
+ color: map.get($theme, gray-500);
333
+ }
334
+
335
+ &[type="checkbox"] {
336
+ padding: 8px;
337
+ border: 1px solid map.get($theme, secondary);
338
+ }
339
+
340
+ &[type="file"] {
341
+ background: map.get($theme, bg-white);
342
+ color: map.get($theme, text-color);
343
+
344
+ &::file-selector-button {
345
+ background: map.get($theme, gray-300);
346
+ color: map.get($theme, gray-900);
347
+ border: none;
348
+ border-radius: 0.25rem;
349
+ padding: 0.4rem 0.75rem;
350
+ margin-inline-end: 0.5rem;
351
+ }
352
+
353
+ &:hover:not(:disabled):not([readonly])::file-selector-button {
354
+ background: map.get($theme, gray-400);
355
+ }
356
+ }
357
+
358
+ &:read-only,
359
+ &[readonly],
360
+ &:disabled {
361
+ @if $theme-name ==light {
362
+ background: #f6f6f6;
363
+ }
364
+
365
+ @else {
366
+ color: map.get($theme, gray-500);
367
+ background-color: map.get($theme, gray-200);
368
+ }
369
+ }
370
+
371
+ &.second-input[readonly]:focus {
372
+ background: #f6f6f6;
373
+ border-left: 1px solid map.get($theme, border-custom) !important;
374
+
375
+ @if $theme-name ==dark {
376
+ background-color: map.get($theme, gray-200);
377
+ }
378
+ }
379
+ }
380
+
381
+ .form-select {
382
+ background-color: map.get($theme, input-bg);
383
+
384
+ &:hover {
385
+ border: 1px solid map.get($theme, secondary);
386
+ }
387
+ }
388
+
389
+ label[for] {
390
+ cursor: pointer;
391
+ margin-bottom: 0.25rem;
392
+ }
393
+
394
+ .input-group {
395
+ border: 1px solid map.get($theme, border-custom);
396
+ border-radius: 0.375rem; // match Bootstrap default radius
397
+ display: flex;
398
+ align-items: center;
399
+
400
+ &:hover {
401
+ border: 1px solid map.get($theme, secondary);
402
+ }
403
+
404
+ &:focus-within {
405
+ box-shadow: 0 0 1px map.get($theme, primary);
406
+ border: 1px solid map.get($theme, primary);
407
+ }
408
+
409
+ .form-control,
410
+ .form-select {
411
+ border: none;
412
+ box-shadow: none;
413
+
414
+ &:focus {
415
+ box-shadow: none !important;
416
+ border: none !important;
417
+ background: map.get($theme, input-bg);
418
+ }
419
+ }
420
+
421
+ input.form-control:focus:first-child {
422
+ border-right: 1px solid map.get($theme, border-custom) !important;
423
+ }
424
+
425
+ input.form-control+input.form-control {
426
+ border-left: 1px solid map.get($theme, border-custom) !important;
427
+ }
428
+ }
429
+
430
+ .btn {
431
+ // padding-top: 0.2rem;
432
+ font-weight: 500;
433
+ align-items: center;
434
+
435
+ // line-height: 1.8;
436
+ &:hover {
437
+ transform: translateY(-0.5px);
438
+
439
+ i {
440
+ transform: translateY(-1px); // only icon moves slightly upward
441
+ }
442
+ }
443
+
444
+ transition: all 0.2s ease-in-out;
445
+ }
446
+
447
+ // select infinite custom
448
+ .v-select {
449
+ @if $theme-name ==dark {
450
+ --vs-controls-color: #fff;
451
+ /* icons (arrow/clear) use this */
452
+ background: map.get($theme, input-bg);
453
+ }
454
+ }
455
+
456
+ .vs__search,
457
+ .vs__search:focus {
458
+ margin: 0;
459
+ padding-top: 2px;
460
+ padding-bottom: 2px;
461
+ background: map.get($theme, input-bg);
462
+ }
463
+
464
+ .vs__dropdown-toggle {
465
+ padding: 0.26rem 0;
466
+ border-radius: 5px;
467
+ border-color: map.get($theme, border-custom) !important;
468
+ }
469
+
470
+ .vs__dropdown-menu {
471
+ background-color: map.get($theme, input-bg) !important;
472
+ border-color: map.get($theme, border-custom) !important;
473
+ max-height: 225px;
474
+ min-width: 100px !important;
475
+ right: 0 !important;
476
+ left: auto !important;
477
+ }
478
+
479
+ .vs__selected {
480
+ margin: 0;
481
+
482
+ @if $theme-name ==dark {
483
+ color: map.get($theme, gray-700) !important;
484
+ }
485
+ }
486
+
487
+ .vs__selected .vs__search,
488
+ .vs__selected .vs__search:focus {
489
+ margin: 0;
490
+ padding-top: 2px;
491
+ padding-bottom: 2px;
492
+ }
493
+
494
+ .vs--disabled .vs__dropdown-toggle,
495
+ .vs--disabled .vs__clear,
496
+ .vs--disabled .vs__search,
497
+ .vs--disabled .vs__selected,
498
+ .vs--disabled .vs__open-indicator {
499
+ @if $theme-name ==dark {
500
+ background-color: map.get($theme, gray-200) !important;
501
+ color: map.get($theme, gray-500) !important;
502
+ }
503
+ }
504
+
505
+ // datepicker custom (match v-select design; override the library's own dp--theme-light vars)
506
+ .dp--theme-light {
507
+ --dp-background-color: #{map.get($theme, input-bg)};
508
+ --dp-text-color: #{map.get($theme, text-color)};
509
+ --dp-menu-bg: #{map.get($theme, bg-white)};
510
+ --dp-menu-text-color: #{map.get($theme, text-color)};
511
+ --dp-border-color: #{map.get($theme, border-custom)};
512
+ --dp-menu-border-color: #{map.get($theme, border-custom)};
513
+ --dp-border-color-hover: #{map.get($theme, secondary)};
514
+ --dp-border-color-focus: #{map.get($theme, primary)};
515
+ --dp-icon-color: #{map.get($theme, gray-500)};
516
+ --dp-primary-color: #{map.get($theme, primary)};
517
+ --dp-primary-text-color: #fff;
518
+ --dp-secondary-color: #{map.get($theme, gray-200)};
519
+ --dp-hover-color: #{map.get($theme, gray-200)};
520
+ --dp-hover-text-color: #{map.get($theme, text-color)};
521
+ --dp-border-radius: 5px;
522
+ --dp-cell-border-radius: 5px;
523
+
524
+ // input
525
+ --dp-input-background-color: #{map.get($theme, bg-white)};
526
+ --dp-input-text-color: #{map.get($theme, text-color)};
527
+ --dp-input-placeholder-color: #{map.get($theme, gray-500)};
528
+
529
+ // action row (cancel/select buttons)
530
+ --dp-action-row-background-color: #{map.get($theme, bg-white)};
531
+ --dp-action-row-text-color: #{map.get($theme, text-color)};
532
+ --dp-action-row-cancel-button-color: #{map.get($theme, text-color)};
533
+ --dp-action-row-cancel-button-hover-color: rgba(255, 255, 255, 0.1);
534
+ --dp-cancel-button-color: #{map.get($theme, text-color)};
535
+ --dp-cancel-button-hover-color: #{map.get($theme, text-color)};
536
+
537
+ // calendar, month/year overlay, time
538
+ --dp-month-year-row-color: #{map.get($theme, text-color)};
539
+ --dp-month-year-text-color: #{map.get($theme, text-color)};
540
+ --dp-calendar-header-day-color: #{map.get($theme, text-color)};
541
+ --dp-calendar-header-month-year-color: #{map.get($theme, text-color)};
542
+ --dp-day-cell-unselected-color: #{map.get($theme, text-color)};
543
+ --dp-overlay-background-color: #{map.get($theme, bg-white)};
544
+ --dp-overlay-text-color: #{map.get($theme, text-color)};
545
+ --dp-overlay-header-color: #{map.get($theme, text-color)};
546
+ --dp-overlay-close-btn-color: #{map.get($theme, text-color)};
547
+ --dp-overlay-month-col-text-color: #{map.get($theme, text-color)};
548
+ --dp-overlay-year-col-text-color: #{map.get($theme, text-color)};
549
+ --dp-overlay-primary-btn-bg: #{map.get($theme, primary)};
550
+ --dp-overlay-primary-btn-text: #fff;
551
+ --dp-overlay-month-col-bg: #{map.get($theme, bg-white)};
552
+ --dp-overlay-year-col-bg: #{map.get($theme, bg-white)};
553
+ --dp-grid-overlay-month-bg: #{map.get($theme, bg-white)};
554
+ --dp-grid-overlay-month-text: #{map.get($theme, text-color)};
555
+ --dp-grid-overlay-year-bg: #{map.get($theme, bg-white)};
556
+ --dp-grid-overlay-year-text: #{map.get($theme, text-color)};
557
+ --dp-time-picker-background-color: #{map.get($theme, bg-white)};
558
+ --dp-time-picker-color: #{map.get($theme, text-color)};
559
+ --dp-highlight-color: #{map.get($theme, primary)};
560
+ }
561
+
562
+ .dp--input {
563
+ border-radius: 5px;
564
+
565
+ &:hover:not(.dp--input-focus) {
566
+ border-color: map.get($theme, secondary);
567
+ }
568
+
569
+ &.dp--input-focus {
570
+ border-color: map.get($theme, primary);
571
+ box-shadow: 0 0 1px map.get($theme, primary);
572
+ }
573
+
574
+ &::placeholder {
575
+ color: map.get($theme, gray-500);
576
+ }
577
+ }
578
+
579
+ .dp--menu {
580
+ background-color: map.get($theme, bg-white);
581
+ border: 1px solid map.get($theme, border-custom);
582
+ border-radius: 5px;
583
+ }
584
+
585
+
586
+ .fs-mini {
587
+ font-size: 10px;
588
+ }
589
+
590
+ .form-text {
591
+ font-size: 0.775rem;
592
+ }
593
+
594
+ .sidebar {
595
+ position: fixed;
596
+ top: 0;
597
+ left: 0;
598
+ height: 100%;
599
+ width: $sidebar-width;
600
+ background-color: map.get($theme, bg-white);
601
+ box-shadow: 0 0.125rem 0.375rem 0 map.get($theme, sidebar-shadow);
602
+ box-sizing: border-box;
603
+ z-index: 1100;
604
+ // border: 1px solid map.get($theme, border-custom);
605
+
606
+ & .app-brand {
607
+ margin-top: 0.5rem;
608
+ padding-left: 2rem;
609
+ padding-right: 2rem;
610
+ height: 64px;
611
+ width: 100%;
612
+ box-sizing: border-box;
613
+ display: flex;
614
+ align-items: center;
615
+ flex-grow: 0;
616
+ flex-shrink: 0;
617
+ line-height: 1;
618
+ min-height: 1px;
619
+ overflow: hidden;
620
+ justify-content: center;
621
+
622
+ >a {
623
+ text-decoration: none;
624
+ color: map.get($theme, gray-900);
625
+ }
626
+
627
+ img {
628
+ width: 100%;
629
+ vertical-align: middle;
630
+ }
631
+ }
632
+
633
+ & .accordion {
634
+ position: relative;
635
+ height: calc(100% - 4.5rem);
636
+ overflow-y: auto;
637
+ padding-bottom: 7rem;
638
+ box-sizing: border-box;
639
+
640
+ // Firefox only: Chrome/Edge ignore ::-webkit-scrollbar when
641
+ // scrollbar-width/scrollbar-color are set on the element, and Firefox
642
+ // 153+ reports ::-webkit-scrollbar as supported, so detect Firefox directly.
643
+ @supports (-moz-appearance: none) {
644
+ scrollbar-width: thin;
645
+ scrollbar-color: map.get($theme, gray-500) map.get($theme, gray-200);
646
+ }
647
+
648
+ &::-webkit-scrollbar {
649
+ width: 3px;
650
+ }
651
+
652
+ // Active state
653
+ & .active {
654
+ background-color: map.get($theme, sidebar-link-bg) !important;
655
+
656
+ a {
657
+ color: map.get($theme, primary) !important;
658
+
659
+ &:hover {
660
+ background: none !important;
661
+ }
662
+ }
663
+
664
+ &::after {
665
+ content: "";
666
+ position: absolute;
667
+ right: -1rem;
668
+ top: 0;
669
+ height: 100%;
670
+ width: 0.25rem;
671
+ background: map.get($theme, primary);
672
+ border-radius: 0.375rem 0 0 0.375rem;
673
+ }
674
+ }
675
+
676
+ & ul.list-group {
677
+ list-style-type: none;
678
+ padding-left: 1rem;
679
+ padding-right: 1rem;
680
+
681
+ & li.split-label {
682
+ position: relative;
683
+ font-size: 13px;
684
+ color: map.get($theme, gray-500);
685
+ padding-top: 0.5rem;
686
+ padding-bottom: 0.5rem;
687
+ padding-left: 1rem;
688
+ background: none;
689
+
690
+ &:hover {
691
+ background: none;
692
+ }
693
+
694
+ &::before {
695
+ content: "";
696
+ position: absolute;
697
+ top: 50%;
698
+ left: -1rem;
699
+ width: 1rem;
700
+ height: 0.1rem;
701
+ border-bottom: 1px solid map.get($theme, gray-500);
702
+ transform: translateY(-50%);
703
+ }
704
+ }
705
+
706
+ & li.list-group-item {
707
+ position: relative;
708
+ padding: 0;
709
+ border: none;
710
+ border-radius: 0.375rem;
711
+ margin-top: 0.25rem;
712
+
713
+ & a {
714
+ display: flex;
715
+ align-items: center;
716
+ color: map.get($theme, gray-700);
717
+ text-decoration: none;
718
+ padding: 0.25rem 1rem;
719
+ box-shadow: none;
720
+
721
+ .menu-icon {
722
+ display: flex;
723
+ width: 1.5rem;
724
+ flex-shrink: 0;
725
+ flex-grow: 0;
726
+ margin-right: 0.5rem;
727
+ font-size: 1.3rem;
728
+ }
729
+ }
730
+
731
+ // Normal hover for top-level
732
+ &:hover>a {
733
+ background: map.get($theme, gray-200);
734
+ transition: all 0.2s ease-in-out;
735
+ border-radius: 0.375rem;
736
+ padding: 0.25rem 1rem;
737
+ }
738
+
739
+ // Accordion section -> 1st level
740
+ &.accordion-item {
741
+ padding: 0;
742
+
743
+ &>a {
744
+ &:hover {
745
+ background: map.get($theme, gray-200);
746
+ }
747
+
748
+ &::after {
749
+ flex-shrink: 0;
750
+ width: 1rem;
751
+ height: 1rem;
752
+ margin-left: auto; // push icon fully to right
753
+ background-size: 1rem;
754
+ background-image: map.get($theme, accordion-icon);
755
+ background-repeat: no-repeat;
756
+ font-size: 10px;
757
+ transition: transform 0.2s ease-in-out;
758
+
759
+ // Default state → down arrow
760
+ transform: rotate(-90deg);
761
+ }
762
+
763
+ &:not(.collapsed) {
764
+ background: map.get($theme, gray-200);
765
+
766
+ &::after {
767
+ transform: rotate(0deg);
768
+ }
769
+ }
770
+ }
771
+
772
+ // Nested list hover -> 2nd level
773
+ &>ul {
774
+ padding-left: 0;
775
+ padding-right: 0;
776
+
777
+ &>li {
778
+ margin-top: 0.25rem;
779
+ position: relative;
780
+
781
+ &>a {
782
+ // vertical-align: middle;
783
+ padding: 0.5rem 1rem 0.5rem 3rem;
784
+ }
785
+
786
+ &::before {
787
+ content: "";
788
+ position: absolute;
789
+ top: 1rem;
790
+ left: 1.3rem;
791
+ width: 0.5rem;
792
+ height: 0.5rem;
793
+ border-radius: 50%;
794
+ background-color: map.get($theme, gray-500);
795
+ z-index: 100;
796
+ }
797
+
798
+ &.active {
799
+ &::before {
800
+ content: "";
801
+ position: absolute;
802
+ top: 50%;
803
+ left: 1.256rem;
804
+ width: 0.6rem;
805
+ height: 0.6rem;
806
+ border-radius: 50%;
807
+ transform: translateY(-50%);
808
+ background-color: map.get($theme, primary);
809
+ box-shadow: 0 0 0.2rem map.get($theme, primary);
810
+ z-index: 100;
811
+ }
812
+ }
813
+
814
+ >ul li {
815
+ &::after {
816
+ content: "";
817
+ position: absolute;
818
+ top: 0;
819
+ left: 1.56rem;
820
+ width: 1px;
821
+ height: 100%;
822
+ background-color: map.get($theme, gray-500);
823
+ z-index: 50;
824
+ }
825
+
826
+ &.active {
827
+ &::after {
828
+ content: "";
829
+ position: absolute;
830
+ top: 0;
831
+ left: 1.56rem;
832
+ width: 1px;
833
+ height: 100%;
834
+ background-color: map.get($theme, primary);
835
+ }
836
+ }
837
+ }
838
+ }
839
+ }
840
+ }
841
+ }
842
+ }
843
+ }
844
+ }
845
+
846
+ .main {
847
+ position: relative;
848
+ min-height: 100vh;
849
+ display: flex;
850
+ flex: 1 0 auto;
851
+ margin-left: 0.8rem;
852
+ margin-right: 0.8rem;
853
+ padding-left: $sidebar-width;
854
+ transition: padding-left 0.4s ease;
855
+
856
+ &.no-transition {
857
+ transition: none !important;
858
+ }
859
+
860
+ .content-wrapper {
861
+ position: inherit;
862
+ min-height: 100vh;
863
+ display: flex;
864
+ flex-direction: column;
865
+
866
+ header {
867
+ position: sticky;
868
+ top: 0;
869
+ z-index: 1060;
870
+ padding-top: 0.5rem;
871
+ padding-bottom: 0.5rem;
872
+ transition:
873
+ padding 0.1s ease-in-out,
874
+ background-color 0.1s ease-in-out;
875
+
876
+ &.scrolled {
877
+ padding-top: 0;
878
+ padding-bottom: 0; // optional
879
+ background-color: map.get($theme, bg-white); // optional: add bg when scrolled
880
+ }
881
+
882
+ & ul.dropdown-menu {
883
+ --bs-dropdown-bg: #{map.get($theme, bg-white)};
884
+ --bs-dropdown-border-color: #{map.get($theme, border-custom)};
885
+ --bs-dropdown-link-color: #{map.get($theme, gray-700)};
886
+ --bs-dropdown-link-hover-bg: #{map.get($theme, bg)};
887
+ --bs-dropdown-link-hover-color: #{map.get($theme, primary)};
888
+ --bs-dropdown-link-active-bg: #{map.get($theme, sidebar-link-bg)};
889
+ --bs-dropdown-link-active-color: #{map.get($theme, primary)};
890
+ --bs-dropdown-divider-bg: #{map.get($theme, gray-300)};
891
+ }
892
+
893
+ .nav-btn {
894
+ font-size: 1.5rem !important;
895
+ border: 1px solid map.get($theme, border-custom);
896
+ box-shadow: 0 0.125rem 0.375rem 0 map.get($theme, shadow-custom);
897
+ padding: 0.7rem 1.2rem;
898
+ border-radius: 0.25rem;
899
+ background: map.get($theme, bg-white);
900
+ color: map.get($theme, text-color);
901
+
902
+ &:hover {
903
+ background: map.get($theme, bg-white);
904
+ color: map.get($theme, primary);
905
+ }
906
+ }
907
+
908
+ .nav-card {
909
+ height: 3.75rem;
910
+ padding-block: 0; // remove top/bottom padding
911
+ padding-inline: 0.75rem; // keep a little left/right padding
912
+
913
+ display: grid;
914
+ align-items: center; // vertical center
915
+ justify-items: start; // left align (doesn't center horizontally)
916
+
917
+ text-align: left;
918
+ color: map.get($theme, text-color);
919
+ background: map.get($theme, bg-white);
920
+ border-color: map.get($theme, border-custom);
921
+ box-shadow: 0 0.125rem 0.375rem 0 map.get($theme, shadow-custom);
922
+ }
923
+
924
+ @include media-breakpoint-down(sm) {
925
+ .nav-btn {
926
+ flex: 1 1 calc(20% - 0.25rem); // 4 items per row with gap
927
+ display: flex;
928
+ justify-content: center;
929
+ }
930
+ }
931
+ }
932
+
933
+ .content {
934
+ position: inherit;
935
+ flex: 1 1 auto;
936
+ min-height: 0;
937
+ color: map.get($theme, text-color);
938
+ }
939
+
940
+ footer {
941
+ font-size: 0.875rem;
942
+ color: map.get($theme, secondary);
943
+ }
944
+ }
945
+ }
946
+
947
+ @include media-breakpoint-up(xl) {
948
+ .sidebar {
949
+ left: 0;
950
+ transition: left 0.3s ease-in-out;
951
+ }
952
+
953
+ .sidebar.tgl {
954
+ left: -$sidebar-width;
955
+ transition: left 0.3s ease-in-out;
956
+ }
957
+
958
+ .main.tgl {
959
+ padding-left: 0;
960
+ transition: padding-left 0.3s ease-in-out;
961
+ }
962
+ }
963
+
964
+ @include media-breakpoint-down(xl) {
965
+ .sidebar {
966
+ left: -($sidebar-width + 1rem);
967
+ transition: left 0.3s ease-in-out;
968
+ }
969
+
970
+ .sidebar-toggle {
971
+ margin-right: -1rem;
972
+ margin-top: 1.5rem;
973
+ border: 0.4rem solid map.get($theme, bg-white);
974
+ font-size: 10px;
975
+ padding: 0.25rem 0.425rem;
976
+ background: map.get($theme, primary);
977
+ color: map.get($theme, bg-white);
978
+ }
979
+
980
+ .sidebar.tgl {
981
+ left: 0;
982
+ transition: left 0.3s ease-in-out;
983
+ }
984
+
985
+ .backdrop.off-canvas {
986
+ position: absolute;
987
+ background: map.get($theme, backdrop);
988
+ top: 0;
989
+ left: 0;
990
+ width: 100%;
991
+ height: 100%;
992
+ z-index: 1099;
993
+ }
994
+
995
+ .main {
996
+ padding-left: 0;
997
+ transition: padding-left 0.3s ease-in-out;
998
+ }
999
+
1000
+ .main.tgl {
1001
+ padding-left: 0;
1002
+ transition: padding-left 0.3s ease-in-out;
1003
+ }
1004
+ }
1005
+
1006
+ }
1007
+
1008
+ // .datatable {
1009
+
1010
+ // thead tr>th,
1011
+ // tbody tr>td {
1012
+ // padding: 7.5px 10px;
1013
+ // }
1014
+
1015
+ // thead {
1016
+ // tr>th {
1017
+ // padding-top: 7.5px;
1018
+ // padding-bottom: 7.5px;
1019
+ // }
1020
+
1021
+ // tr>th:nth-child(-n + 2) {
1022
+ // width: 1%;
1023
+ // white-space: nowrap;
1024
+ // }
1025
+
1026
+ // tr>th:nth-child(-n + 1) {
1027
+ // padding-left: 6px !important;
1028
+ // padding-right: 5px !important;
1029
+ // }
1030
+
1031
+ // tr>th:last-child {
1032
+ // width: 1%;
1033
+ // white-space: nowrap;
1034
+ // text-align: center;
1035
+ // }
1036
+ // }
1037
+
1038
+ // tbody tr>td:nth-child(-n + 1) {
1039
+ // padding-left: 6px !important;
1040
+ // padding-right: 5px !important;
1041
+ // }
1042
+
1043
+ // .datatable-pagination .page-item {
1044
+ // .page-link {
1045
+ // border-radius: 5px;
1046
+ // margin-left: 0;
1047
+ // border: 1px solid #dfdfdf;
1048
+ // }
1049
+ // }
1050
+ // }
1051
+
1052
+ // // general table
1053
+ // .datatable-general thead tr>th,
1054
+ // .datatable-general tbody tr>td {
1055
+ // padding: 7.5px 10px;
1056
+ // }
1057
+
1058
+ // .datatable-general thead tr>th {
1059
+ // padding-top: 15px;
1060
+ // padding-bottom: 15px;
1061
+ // }
1062
+
1063
+ // .datatable-general thead tr>th:nth-child(-n + 1) {
1064
+ // width: 1%;
1065
+ // white-space: nowrap;
1066
+ // }
1067
+
1068
+ // .datatable-general-pagination .page-item {
1069
+ // .page-link {
1070
+ // border-radius: 5px;
1071
+ // margin-left: 0;
1072
+ // border: 1px solid #dfdfdf;
1073
+ // }
1074
+ // }
1075
+
1076
+ .datatable thead tr>th,
1077
+ .datatable tbody tr>td {
1078
+ padding: 7.5px 10px;
1079
+ }
1080
+
1081
+ .datatable thead tr>th:nth-child(-n+2) {
1082
+ width: 1%;
1083
+ white-space: nowrap;
1084
+ }
1085
+
1086
+ .datatable thead tr>th:nth-child(-n+1),
1087
+ .datatable tbody tr>td:nth-child(-n+1) {
1088
+ padding-left: 6px !important;
1089
+ padding-right: 5px !important;
1090
+ }
1091
+
1092
+ // .datatable thead tr > th:last-child {
1093
+ // width: 1% !important;
1094
+ // }
1095
+
1096
+ .datatable-pagination .page-item {
1097
+ .page-link {
1098
+ border-radius: 5px;
1099
+ margin-left: 0;
1100
+ border: 1px solid #DFDFDF;
1101
+ }
1102
+ }
1103
+
1104
+ // general table
1105
+ .datatable-general thead tr>th,
1106
+ .datatable-general tbody tr>td {
1107
+ padding: 7.5px 10px;
1108
+ }
1109
+
1110
+ .datatable-general thead tr>th:nth-child(-n+1) {
1111
+ width: 1%;
1112
+ white-space: nowrap;
1113
+ }
1114
+
1115
+ .datatable-general-pagination .page-item {
1116
+ .page-link {
1117
+ border-radius: 5px;
1118
+ margin-left: 0;
1119
+ border: 1px solid #DFDFDF;
1120
+ }
1121
+ }
1122
+
1123
+ .modal-backdrop.show {
1124
+ z-index: 1100 !important;
1125
+ }
1126
+
1127
+ .modal.show {
1128
+ z-index: 1110 !important;
1129
+ }
1130
+
1131
+ // theme light or dark
1132
+ .theme-light {
1133
+ @include theme(light);
1134
+ }
1135
+
1136
+ .theme-dark {
1137
+ @include theme(dark);
1138
+ }
1139
+
1140
+ .theme-auto {
1141
+ @media (prefers-color-scheme: dark) {
1142
+ @include theme(dark);
1143
+ }
1144
+
1145
+ @media (prefers-color-scheme: light) {
1146
+ @include theme(light);
1147
+ }
1148
+ }
1149
+
1150
+ // Shared skeleton shimmer (theme-aware via --app-skeleton tokens on body)
1151
+ @keyframes skeleton-shimmer {
1152
+
1153
+ 0%,
1154
+ 50%,
1155
+ 100% {
1156
+ background-color: var(--app-skeleton);
1157
+ }
1158
+
1159
+ 25%,
1160
+ 75% {
1161
+ background-color: var(--app-skeleton-hi);
1162
+ }
1163
+ }
1164
+
1165
+ // this is section for print media
1166
+ /* PAGE MARGINS — DO NOT USE size: so Firefox shows orientation */
1167
+ @page {
1168
+ margin: 12mm;
1169
+ }
1170
+
1171
+ @media print {
1172
+
1173
+ /***************
1174
+ GLOBAL RESET
1175
+ ***************/
1176
+ html,
1177
+ body,
1178
+ #app,
1179
+ .wrapper,
1180
+ .main,
1181
+ .content-wrapper,
1182
+ .content,
1183
+ .card {
1184
+ height: auto !important;
1185
+ min-height: 0 !important;
1186
+ margin: 0 !important;
1187
+ padding: 0 !important;
1188
+
1189
+ background: #ffffff !important;
1190
+ color: #000000 !important;
1191
+
1192
+ /* kill theme variables (dark mode fix) */
1193
+ --app-bg: #ffffff !important;
1194
+ --app-surface: #ffffff !important;
1195
+ --app-text: #000000 !important;
1196
+ --app-text-muted: #000000 !important;
1197
+ --bs-body-bg: #ffffff !important;
1198
+ --bs-body-color: #000000 !important;
1199
+ --bs-card-bg: #ffffff !important;
1200
+ --bs-card-color: #000000 !important;
1201
+ --bs-table-bg: #ffffff !important;
1202
+ --bs-table-color: #000000 !important;
1203
+ }
1204
+
1205
+ * {
1206
+ -webkit-print-color-adjust: exact !important;
1207
+ print-color-adjust: exact !important;
1208
+ }
1209
+
1210
+ .table {
1211
+ margin-bottom: 0 !important;
1212
+ }
1213
+
1214
+ /***************
1215
+ REMOVE NON-PRINT ELEMENTS
1216
+ ***************/
1217
+ .content-wrapper>header,
1218
+ .content-wrapper>footer,
1219
+ .PageBar,
1220
+ .Refresh,
1221
+ .sidebar,
1222
+ footer {
1223
+ display: none !important;
1224
+ }
1225
+
1226
+ /* remove left space from sidebar */
1227
+ .main {
1228
+ padding-left: 0 !important;
1229
+ margin-left: 0 !important;
1230
+ }
1231
+
1232
+ .wrapper {
1233
+ height: auto !important;
1234
+ overflow: visible !important;
1235
+ font-size: 12px !important;
1236
+ }
1237
+
1238
+ /***************
1239
+ PRINT UTILITY RESET
1240
+ ***************/
1241
+ .pp-0,
1242
+ .pm-0 {
1243
+ padding: 0 !important;
1244
+ margin: 0 !important;
1245
+ }
1246
+
1247
+ @each $name, $size in $spacers {
1248
+
1249
+ /* Padding */
1250
+ .pp-#{$name} {
1251
+ padding: $size !important;
1252
+ }
1253
+
1254
+ .ppt-#{$name} {
1255
+ padding-top: $size !important;
1256
+ }
1257
+
1258
+ .ppe-#{$name} {
1259
+ padding-right: $size !important;
1260
+ }
1261
+
1262
+ .ppb-#{$name} {
1263
+ padding-bottom: $size !important;
1264
+ }
1265
+
1266
+ .pps-#{$name} {
1267
+ padding-left: $size !important;
1268
+ }
1269
+
1270
+ /* Margin */
1271
+ .pm-#{$name} {
1272
+ margin: $size !important;
1273
+ }
1274
+
1275
+ .pmt-#{$name} {
1276
+ margin-top: $size !important;
1277
+ }
1278
+
1279
+ .pme-#{$name} {
1280
+ margin-right: $size !important;
1281
+ }
1282
+
1283
+ .pmb-#{$name} {
1284
+ margin-bottom: $size !important;
1285
+ }
1286
+
1287
+ .pms-#{$name} {
1288
+ margin-left: $size !important;
1289
+ }
1290
+ }
1291
+
1292
+ /* Remove all card borders completely */
1293
+ .card.border,
1294
+ .card-body,
1295
+ .card-body.border {
1296
+ border: none !important;
1297
+ box-shadow: none !important;
1298
+ }
1299
+
1300
+ /***************
1301
+ RESPONSIVE TABLE FIX
1302
+ (NO SCROLL, SHRINK TO FIT)
1303
+ ***************/
1304
+ .table-responsive {
1305
+ overflow: visible !important;
1306
+ }
1307
+
1308
+ .table-responsive>table {
1309
+ width: 100% !important;
1310
+ table-layout: fixed !important;
1311
+ }
1312
+
1313
+ .table-responsive th,
1314
+ .table-responsive td {
1315
+ padding: 2px 4px !important;
1316
+ white-space: normal !important;
1317
+ word-wrap: break-word !important;
1318
+ }
1319
+
1320
+ /***************
1321
+ PAGE BREAK & TABLE SPLIT FIX
1322
+ ***************/
1323
+ table {
1324
+ width: 100% !important;
1325
+ border-collapse: collapse !important;
1326
+ page-break-inside: auto !important;
1327
+ break-inside: auto !important;
1328
+ }
1329
+
1330
+ thead {
1331
+ display: table-header-group !important;
1332
+ }
1333
+
1334
+ tfoot {
1335
+ display: table-footer-group !important;
1336
+ }
1337
+
1338
+ tr,
1339
+ th,
1340
+ td {
1341
+ page-break-inside: avoid !important;
1342
+ /* do not split ROWS */
1343
+ break-inside: avoid-page !important;
1344
+ page-break-after: auto !important;
1345
+ }
1346
+ }