@blawness/admin-kit 0.2.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 (131) hide show
  1. package/README.md +14 -0
  2. package/dist/auth/config.d.ts +3 -0
  3. package/dist/auth/config.d.ts.map +1 -0
  4. package/dist/auth/config.js +36 -0
  5. package/dist/auth/index.d.ts +6 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +46 -0
  8. package/dist/components/admin/editor.d.ts +5 -0
  9. package/dist/components/admin/editor.d.ts.map +1 -0
  10. package/dist/components/admin/editor.js +28 -0
  11. package/dist/components/admin/image-upload.d.ts +15 -0
  12. package/dist/components/admin/image-upload.d.ts.map +1 -0
  13. package/dist/components/admin/image-upload.js +50 -0
  14. package/dist/components/admin/toast-on-param.d.ts +5 -0
  15. package/dist/components/admin/toast-on-param.d.ts.map +1 -0
  16. package/dist/components/admin/toast-on-param.js +31 -0
  17. package/dist/components/confirm-delete.d.ts +14 -0
  18. package/dist/components/confirm-delete.d.ts.map +1 -0
  19. package/dist/components/confirm-delete.js +32 -0
  20. package/dist/components/ui/button.d.ts +9 -0
  21. package/dist/components/ui/button.d.ts.map +1 -0
  22. package/dist/components/ui/button.js +34 -0
  23. package/dist/components/ui/dialog.d.ts +18 -0
  24. package/dist/components/ui/dialog.d.ts.map +1 -0
  25. package/dist/components/ui/dialog.js +37 -0
  26. package/dist/components/ui/input.d.ts +4 -0
  27. package/dist/components/ui/input.d.ts.map +1 -0
  28. package/dist/components/ui/input.js +7 -0
  29. package/dist/components.d.ts +7 -0
  30. package/dist/components.d.ts.map +1 -0
  31. package/dist/components.js +6 -0
  32. package/dist/db/index.d.ts +6 -0
  33. package/dist/db/index.d.ts.map +1 -0
  34. package/dist/db/index.js +8 -0
  35. package/dist/db/schema.d.ts +202 -0
  36. package/dist/db/schema.d.ts.map +1 -0
  37. package/dist/db/schema.js +16 -0
  38. package/dist/index.d.ts +8 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +7 -0
  41. package/dist/lib/admin/media.d.ts +16 -0
  42. package/dist/lib/admin/media.d.ts.map +1 -0
  43. package/dist/lib/admin/media.js +13 -0
  44. package/dist/lib/admin/users.d.ts +12 -0
  45. package/dist/lib/admin/users.d.ts.map +1 -0
  46. package/dist/lib/admin/users.js +24 -0
  47. package/dist/lib/auth-helpers.d.ts +5 -0
  48. package/dist/lib/auth-helpers.d.ts.map +1 -0
  49. package/dist/lib/auth-helpers.js +16 -0
  50. package/dist/lib/db-errors.d.ts +5 -0
  51. package/dist/lib/db-errors.d.ts.map +1 -0
  52. package/dist/lib/db-errors.js +14 -0
  53. package/dist/lib/r2.d.ts +24 -0
  54. package/dist/lib/r2.d.ts.map +1 -0
  55. package/dist/lib/r2.js +59 -0
  56. package/dist/lib/sanitize.d.ts +14 -0
  57. package/dist/lib/sanitize.d.ts.map +1 -0
  58. package/dist/lib/sanitize.js +28 -0
  59. package/dist/lib/slug.d.ts +2 -0
  60. package/dist/lib/slug.d.ts.map +1 -0
  61. package/dist/lib/slug.js +9 -0
  62. package/dist/lib/utils.d.ts +3 -0
  63. package/dist/lib/utils.d.ts.map +1 -0
  64. package/dist/lib/utils.js +5 -0
  65. package/dist/screens/login/actions.d.ts +5 -0
  66. package/dist/screens/login/actions.d.ts.map +1 -0
  67. package/dist/screens/login/actions.js +28 -0
  68. package/dist/screens/login/page.d.ts +3 -0
  69. package/dist/screens/login/page.d.ts.map +1 -0
  70. package/dist/screens/login/page.js +11 -0
  71. package/dist/screens/media/actions.d.ts +5 -0
  72. package/dist/screens/media/actions.d.ts.map +1 -0
  73. package/dist/screens/media/actions.js +32 -0
  74. package/dist/screens/media/lib.d.ts +9 -0
  75. package/dist/screens/media/lib.d.ts.map +1 -0
  76. package/dist/screens/media/lib.js +30 -0
  77. package/dist/screens/media/page.d.ts +8 -0
  78. package/dist/screens/media/page.d.ts.map +1 -0
  79. package/dist/screens/media/page.js +13 -0
  80. package/dist/screens/media/uploader.d.ts +2 -0
  81. package/dist/screens/media/uploader.d.ts.map +1 -0
  82. package/dist/screens/media/uploader.js +10 -0
  83. package/dist/screens/users/actions.d.ts +5 -0
  84. package/dist/screens/users/actions.d.ts.map +1 -0
  85. package/dist/screens/users/actions.js +70 -0
  86. package/dist/screens/users/page.d.ts +7 -0
  87. package/dist/screens/users/page.d.ts.map +1 -0
  88. package/dist/screens/users/page.js +22 -0
  89. package/dist/shell/actions.d.ts +2 -0
  90. package/dist/shell/actions.d.ts.map +1 -0
  91. package/dist/shell/actions.js +5 -0
  92. package/dist/shell/layout.d.ts +9 -0
  93. package/dist/shell/layout.d.ts.map +1 -0
  94. package/dist/shell/layout.js +15 -0
  95. package/dist/shell/sidebar.d.ts +16 -0
  96. package/dist/shell/sidebar.d.ts.map +1 -0
  97. package/dist/shell/sidebar.js +19 -0
  98. package/package.json +148 -0
  99. package/src/auth/config.ts +36 -0
  100. package/src/auth/index.ts +49 -0
  101. package/src/components/admin/editor.tsx +53 -0
  102. package/src/components/admin/image-upload.tsx +128 -0
  103. package/src/components/admin/toast-on-param.tsx +47 -0
  104. package/src/components/confirm-delete.tsx +96 -0
  105. package/src/components/ui/button.tsx +58 -0
  106. package/src/components/ui/dialog.tsx +160 -0
  107. package/src/components/ui/input.tsx +20 -0
  108. package/src/components.ts +17 -0
  109. package/src/db/index.ts +8 -0
  110. package/src/db/schema.ts +23 -0
  111. package/src/index.ts +7 -0
  112. package/src/lib/admin/media.ts +16 -0
  113. package/src/lib/admin/users.ts +31 -0
  114. package/src/lib/auth-helpers.ts +16 -0
  115. package/src/lib/db-errors.ts +18 -0
  116. package/src/lib/r2.ts +70 -0
  117. package/src/lib/sanitize.ts +29 -0
  118. package/src/lib/slug.ts +9 -0
  119. package/src/lib/utils.ts +6 -0
  120. package/src/screens/login/actions.ts +38 -0
  121. package/src/screens/login/page.tsx +48 -0
  122. package/src/screens/media/actions.ts +34 -0
  123. package/src/screens/media/lib.ts +39 -0
  124. package/src/screens/media/page.tsx +82 -0
  125. package/src/screens/media/uploader.tsx +19 -0
  126. package/src/screens/users/actions.ts +71 -0
  127. package/src/screens/users/page.tsx +128 -0
  128. package/src/shell/actions.ts +6 -0
  129. package/src/shell/layout.tsx +47 -0
  130. package/src/shell/sidebar.tsx +74 -0
  131. package/src/types/next-auth.d.ts +20 -0
@@ -0,0 +1,74 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import { usePathname } from "next/navigation";
5
+ import { LogOut } from "lucide-react";
6
+ import type { ComponentType } from "react";
7
+ import { signOutAction } from "./actions";
8
+
9
+ export type NavItem = {
10
+ href: string;
11
+ label: string;
12
+ icon: ComponentType<{ className?: string }>;
13
+ adminOnly?: boolean;
14
+ };
15
+
16
+ export function AdminSidebar({ role, navItems, logoSrc = "/logo.png", brandName = "Admin" }: { role: string; navItems: NavItem[]; logoSrc?: string; brandName?: string }) {
17
+ const pathname = usePathname();
18
+ return (
19
+ <aside className="flex w-60 shrink-0 flex-col bg-gradient-to-b from-navy-900 to-navy-950 text-navy-100">
20
+ <div className="flex h-16 items-center gap-2.5 border-b border-white/5 px-5">
21
+ {/* eslint-disable-next-line @next/next/no-img-element -- static logo */}
22
+ <img src={logoSrc} alt="" className="h-8 w-8" />
23
+ <div className="leading-none">
24
+ <p className="font-heading text-sm font-extrabold text-white">{brandName}</p>
25
+ <p className="mt-1 text-[10px] font-semibold tracking-[0.22em] text-gold-400">
26
+ ADMIN
27
+ </p>
28
+ </div>
29
+ </div>
30
+
31
+ <nav className="flex-1 space-y-1 p-3">
32
+ {navItems
33
+ .filter((l) => !l.adminOnly || role === "admin")
34
+ .map((l) => {
35
+ const active =
36
+ pathname === l.href ||
37
+ (l.href !== "/admin" && pathname.startsWith(l.href));
38
+ const Icon = l.icon;
39
+ return (
40
+ <Link
41
+ key={l.href}
42
+ href={l.href}
43
+ className={`relative flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors ${
44
+ active
45
+ ? "bg-white/10 font-medium text-white"
46
+ : "text-navy-200 hover:bg-white/5 hover:text-white"
47
+ }`}
48
+ >
49
+ {active && (
50
+ <span className="absolute left-0 top-1/2 h-5 w-1 -translate-y-1/2 rounded-r-full bg-gold-400" />
51
+ )}
52
+ <Icon
53
+ className={`h-4 w-4 ${active ? "text-gold-400" : "text-navy-300"}`}
54
+ />
55
+ {l.label}
56
+ </Link>
57
+ );
58
+ })}
59
+ </nav>
60
+
61
+ <div className="border-t border-white/5 p-3">
62
+ <form action={signOutAction}>
63
+ <button
64
+ type="submit"
65
+ className="flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm text-navy-200 transition-colors hover:bg-white/5 hover:text-white"
66
+ >
67
+ <LogOut className="h-4 w-4" />
68
+ Keluar
69
+ </button>
70
+ </form>
71
+ </div>
72
+ </aside>
73
+ );
74
+ }
@@ -0,0 +1,20 @@
1
+ import type { DefaultSession } from "next-auth";
2
+
3
+ declare module "next-auth" {
4
+ interface User {
5
+ role?: string | null;
6
+ }
7
+ interface Session {
8
+ user: {
9
+ id: string;
10
+ role: string;
11
+ } & DefaultSession["user"];
12
+ }
13
+ }
14
+
15
+ declare module "next-auth/jwt" {
16
+ interface JWT {
17
+ id?: string;
18
+ role?: string;
19
+ }
20
+ }