django-cfg 1.4.82__py3-none-any.whl → 1.4.83__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of django-cfg might be problematic. Click here for more details.

Files changed (56) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/centrifugo/serializers/channels.py +3 -0
  3. django_cfg/apps/centrifugo/serializers/publishes.py +2 -0
  4. django_cfg/apps/centrifugo/views/admin_api.py +1 -1
  5. django_cfg/apps/centrifugo/views/monitoring.py +116 -6
  6. django_cfg/apps/centrifugo/views/testing_api.py +1 -1
  7. django_cfg/apps/frontend/JWT_AUTO_INJECTION.md +224 -0
  8. django_cfg/apps/frontend/views.py +116 -7
  9. django_cfg/apps/tasks/api/serializers.py +82 -0
  10. django_cfg/apps/tasks/api/views.py +571 -0
  11. django_cfg/middleware/README.md +12 -0
  12. django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/function.ts.jinja +1 -1
  13. django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +7 -10
  14. django_cfg/modules/django_client/core/parser/openapi30.py +19 -1
  15. django_cfg/modules/django_client/core/parser/openapi31.py +19 -1
  16. django_cfg/pyproject.toml +1 -1
  17. django_cfg/static/frontend/admin/404.html +1 -1
  18. django_cfg/static/frontend/admin/500.html +1 -1
  19. django_cfg/static/frontend/admin/_next/static/chunks/pages/404-c283223d1afd02a2.js +1 -0
  20. django_cfg/static/frontend/admin/_next/static/chunks/pages/500-389d6d3e1f2f7fda.js +1 -0
  21. django_cfg/static/frontend/admin/_next/static/chunks/pages/{_app-9c5ca2471de6b000.js → _app-16701a4e1bc3e6ac.js} +81 -81
  22. django_cfg/static/frontend/admin/_next/static/chunks/pages/_error-5291033275c26d09.js +1 -0
  23. django_cfg/static/frontend/admin/_next/static/chunks/pages/index-88751d9f44a32105.js +1 -0
  24. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{cookies-24588bf5551f30df.js → cookies-bb5507a122775f30.js} +1 -1
  25. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{privacy-354dae34a4c4da59.js → privacy-f8a3d8db1a197be3.js} +1 -1
  26. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{security-0a5d7fa591ebb1ae.js → security-aba50addd2179f8f.js} +1 -1
  27. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{terms-c3d80322f52dc112.js → terms-4aa35cd30b5c08ad.js} +1 -1
  28. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/centrifugo-1c5f00c26c77a47b.js +1 -0
  29. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/profile-e93a65e8e7d9022b.js +1 -0
  30. django_cfg/static/frontend/admin/_next/static/chunks/pages/ui-0e6c0e35862789ec.js +1 -0
  31. django_cfg/static/frontend/admin/_next/static/css/806300fb98c42afb.css +3 -0
  32. django_cfg/static/frontend/admin/_next/static/ibMHm1p66p0UGKsKnDWxn/_buildManifest.js +1 -0
  33. django_cfg/static/frontend/admin/auth.html +1 -1
  34. django_cfg/static/frontend/admin/index.html +1 -1
  35. django_cfg/static/frontend/admin/legal/cookies.html +1 -1
  36. django_cfg/static/frontend/admin/legal/privacy.html +1 -1
  37. django_cfg/static/frontend/admin/legal/security.html +1 -1
  38. django_cfg/static/frontend/admin/legal/terms.html +1 -1
  39. django_cfg/static/frontend/admin/private/centrifugo.html +1 -0
  40. django_cfg/static/frontend/admin/private/profile.html +1 -0
  41. django_cfg/static/frontend/admin/private.html +1 -1
  42. django_cfg/static/frontend/admin/ui.html +2 -2
  43. django_cfg/templatetags/django_cfg.py +57 -10
  44. {django_cfg-1.4.82.dist-info → django_cfg-1.4.83.dist-info}/METADATA +1 -1
  45. {django_cfg-1.4.82.dist-info → django_cfg-1.4.83.dist-info}/RECORD +49 -42
  46. django_cfg/static/frontend/admin/_next/static/chunks/pages/404-7cdad2942c3fb179.js +0 -1
  47. django_cfg/static/frontend/admin/_next/static/chunks/pages/500-6cdb27b00678364f.js +0 -1
  48. django_cfg/static/frontend/admin/_next/static/chunks/pages/_error-b8071a05cabe1c2d.js +0 -1
  49. django_cfg/static/frontend/admin/_next/static/chunks/pages/index-bf88192a30e013a9.js +0 -1
  50. django_cfg/static/frontend/admin/_next/static/chunks/pages/ui-73632f2d9c6b11ab.js +0 -1
  51. django_cfg/static/frontend/admin/_next/static/css/e201974f9a4d64e6.css +0 -3
  52. django_cfg/static/frontend/admin/_next/static/qEBrQJUidlI_maQ4xQnI0/_buildManifest.js +0 -1
  53. /django_cfg/static/frontend/admin/_next/static/{qEBrQJUidlI_maQ4xQnI0 → ibMHm1p66p0UGKsKnDWxn}/_ssgManifest.js +0 -0
  54. {django_cfg-1.4.82.dist-info → django_cfg-1.4.83.dist-info}/WHEEL +0 -0
  55. {django_cfg-1.4.82.dist-info → django_cfg-1.4.83.dist-info}/entry_points.txt +0 -0
  56. {django_cfg-1.4.82.dist-info → django_cfg-1.4.83.dist-info}/licenses/LICENSE +0 -0
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/875ae681bfde4580-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/e201974f9a4d64e6.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/e201974f9a4d64e6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-905bba30877f6490.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-f9b6d451d9991f19.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-9c5ca2471de6b000.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/ui-73632f2d9c6b11ab.js" defer=""></script><script src="/cfg/admin/_next/static/qEBrQJUidlI_maQ4xQnI0/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/qEBrQJUidlI_maQ4xQnI0/_ssgManifest.js" defer=""></script></head><body><link rel="preload" as="image" href="/cfg/admin/static/logos/vector.svg"/><div id="__next"><style>html { font-family: 'Manrope', 'Manrope Fallback'; }</style><div class="min-h-screen flex flex-col"><nav class="sticky top-0 w-full border-b backdrop-blur-xl z-[100] bg-background/80 border-border/30 isolate"><div class="w-full px-4 sm:px-6 lg:px-8"><div class="flex items-center justify-between py-2 min-h-[40px]"><div class="flex items-center gap-6"><a class="flex items-center gap-3 group" href="/cfg/admin"><img src="/cfg/admin/static/logos/vector.svg" alt="Django CFG Logo" class="h-8 w-auto object-contain transition-transform duration-300 group-hover:scale-105"/><span class="text-xl font-bold transition-colors duration-300 text-foreground group-hover:text-primary">Django CFG</span></a><div class="flex items-center gap-1"><a class="inline-flex h-9 items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50" href="/cfg/admin">Home</a><div><button type="button" id="radix-«Rklr6»" aria-haspopup="menu" aria-expanded="false" data-state="closed" class="inline-flex h-9 items-center justify-center gap-1 rounded-md px-4 py-2 text-sm font-medium transition-colors focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground">Resources<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-3 w-3 transition-transform duration-200 group-data-[state=open]:rotate-180"><path d="m6 9 6 6 6-6"></path></svg></button></div><div><button type="button" id="radix-«Rslr6»" aria-haspopup="menu" aria-expanded="false" data-state="closed" class="inline-flex h-9 items-center justify-center gap-1 rounded-md px-4 py-2 text-sm font-medium transition-colors focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground">Security<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-3 w-3 transition-transform duration-200 group-data-[state=open]:rotate-180"><path d="m6 9 6 6 6-6"></path></svg></button></div></div></div><div class="flex items-center gap-2"><div class="flex items-center gap-3"><a class="inline-flex cursor-pointer items-center justify-center whitespace-nowrap font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 rounded-md px-3 text-sm h-9 gap-1.5" href="/cfg/admin/auth"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-user w-4 h-4"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>Sign In</a></div></div></div></div></nav><main class="flex-1"><div class="min-h-screen"><div class="dark" style="--background:0 0% 4%;--foreground:0 0% 98%;--card:0 0% 8%;--card-foreground:0 0% 98%;--popover:0 0% 12%;--popover-foreground:0 0% 98%;--primary:217 91% 60%;--primary-foreground:0 0% 100%;--secondary:0 0% 98%;--secondary-foreground:0 0% 9%;--muted:0 0% 10%;--muted-foreground:0 0% 60%;--accent:0 0% 15%;--accent-foreground:0 0% 98%;--destructive:0 84% 60%;--destructive-foreground:0 0% 98%;--border:0 0% 15%;--input:0 0% 15%;--ring:217 91% 60%;--color-background:hsl(0 0% 4%);--color-foreground:hsl(0 0% 98%);--color-card:hsl(0 0% 8%);--color-card-foreground:hsl(0 0% 98%);--color-primary:hsl(217 91% 60%);--color-primary-foreground:hsl(0 0% 100%);--color-secondary:hsl(0 0% 98%);--color-secondary-foreground:hsl(0 0% 9%);--color-muted:hsl(0 0% 10%);--color-muted-foreground:hsl(0 0% 60%);--color-accent:hsl(0 0% 15%);--color-accent-foreground:hsl(0 0% 98%);--color-destructive:hsl(0 84% 60%);--color-destructive-foreground:hsl(0 0% 98%);--color-border:hsl(0 0% 15%);--color-input:hsl(0 0% 15%);--color-ring:hsl(217 91% 60%)"><section class="relative overflow-hidden bg-background text-foreground z-0 isolate"><div class="absolute inset-0 -z-10"><div class="absolute overflow-hidden pointer-events-none" style="inset:0;width:100%;height:100%"><div class="absolute inset-0 bg-gradient-to-br from-primary/7 via-transparent to-primary/7"></div><div class="absolute top-0 right-1/4 w-[600px] h-[600px] bg-gradient-to-br from-primary/25 to-transparent rounded-full blur-3xl" style="animation:float 20s ease-in-out infinite"></div><div class="absolute bottom-0 left-1/4 w-[600px] h-[600px] bg-gradient-to-tr from-primary/20 to-transparent rounded-full blur-3xl" style="animation:float 25s ease-in-out infinite reverse"></div><div class="absolute top-1/3 left-1/2 w-[400px] h-[400px] bg-primary/15 rounded-full blur-2xl" style="animation:float-diagonal 22s ease-in-out infinite"></div><style>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/875ae681bfde4580-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/806300fb98c42afb.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/806300fb98c42afb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-905bba30877f6490.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-f9b6d451d9991f19.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-16701a4e1bc3e6ac.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/ui-0e6c0e35862789ec.js" defer=""></script><script src="/cfg/admin/_next/static/ibMHm1p66p0UGKsKnDWxn/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/ibMHm1p66p0UGKsKnDWxn/_ssgManifest.js" defer=""></script></head><body><link rel="preload" as="image" href="/cfg/admin/static/logos/vector.svg"/><div id="__next"><style>html { font-family: 'Manrope', 'Manrope Fallback'; }</style><div class="min-h-screen flex flex-col"><nav class="sticky top-0 w-full border-b backdrop-blur-xl z-[100] bg-background/80 border-border/30 isolate"><div class="w-full px-4 sm:px-6 lg:px-8"><div class="flex items-center justify-between py-2 min-h-[40px]"><div class="flex items-center gap-6"><a class="flex items-center gap-3 group" href="/cfg/admin"><img src="/cfg/admin/static/logos/vector.svg" alt="Django CFG Logo" class="h-8 w-auto object-contain transition-transform duration-300 group-hover:scale-105"/><span class="text-xl font-bold transition-colors duration-300 text-foreground group-hover:text-primary">Django CFG</span></a><div class="flex items-center gap-1"><a class="inline-flex h-9 items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50" href="/cfg/admin">Home</a><div><button type="button" id="radix-«Rklr6»" aria-haspopup="menu" aria-expanded="false" data-state="closed" class="inline-flex h-9 items-center justify-center gap-1 rounded-md px-4 py-2 text-sm font-medium transition-colors focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground">Resources<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-3 w-3 transition-transform duration-200 group-data-[state=open]:rotate-180"><path d="m6 9 6 6 6-6"></path></svg></button></div><div><button type="button" id="radix-«Rslr6»" aria-haspopup="menu" aria-expanded="false" data-state="closed" class="inline-flex h-9 items-center justify-center gap-1 rounded-md px-4 py-2 text-sm font-medium transition-colors focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground">Security<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-3 w-3 transition-transform duration-200 group-data-[state=open]:rotate-180"><path d="m6 9 6 6 6-6"></path></svg></button></div></div></div><div class="flex items-center gap-2"><div class="flex items-center gap-3"><a class="inline-flex cursor-pointer items-center justify-center whitespace-nowrap font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 rounded-md px-3 text-sm h-9 gap-1.5" href="/cfg/admin/auth"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-user w-4 h-4"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>Sign In</a></div></div></div></div></nav><main class="flex-1"><div class="min-h-screen"><div class="dark" style="--background:0 0% 4%;--foreground:0 0% 98%;--card:0 0% 8%;--card-foreground:0 0% 98%;--popover:0 0% 12%;--popover-foreground:0 0% 98%;--primary:217 91% 60%;--primary-foreground:0 0% 100%;--secondary:0 0% 98%;--secondary-foreground:0 0% 9%;--muted:0 0% 10%;--muted-foreground:0 0% 60%;--accent:0 0% 15%;--accent-foreground:0 0% 98%;--destructive:0 84% 60%;--destructive-foreground:0 0% 98%;--border:0 0% 15%;--input:0 0% 15%;--ring:217 91% 60%;--color-background:hsl(0 0% 4%);--color-foreground:hsl(0 0% 98%);--color-card:hsl(0 0% 8%);--color-card-foreground:hsl(0 0% 98%);--color-primary:hsl(217 91% 60%);--color-primary-foreground:hsl(0 0% 100%);--color-secondary:hsl(0 0% 98%);--color-secondary-foreground:hsl(0 0% 9%);--color-muted:hsl(0 0% 10%);--color-muted-foreground:hsl(0 0% 60%);--color-accent:hsl(0 0% 15%);--color-accent-foreground:hsl(0 0% 98%);--color-destructive:hsl(0 84% 60%);--color-destructive-foreground:hsl(0 0% 98%);--color-border:hsl(0 0% 15%);--color-input:hsl(0 0% 15%);--color-ring:hsl(217 91% 60%)"><section class="relative overflow-hidden bg-background text-foreground z-0 isolate"><div class="absolute inset-0 -z-10"><div class="absolute overflow-hidden pointer-events-none" style="inset:0;width:100%;height:100%"><div class="absolute inset-0 bg-gradient-to-br from-primary/7 via-transparent to-primary/7"></div><div class="absolute top-0 right-1/4 w-[600px] h-[600px] bg-gradient-to-br from-primary/25 to-transparent rounded-full blur-3xl" style="animation:float 20s ease-in-out infinite"></div><div class="absolute bottom-0 left-1/4 w-[600px] h-[600px] bg-gradient-to-tr from-primary/20 to-transparent rounded-full blur-3xl" style="animation:float 25s ease-in-out infinite reverse"></div><div class="absolute top-1/3 left-1/2 w-[400px] h-[400px] bg-primary/15 rounded-full blur-2xl" style="animation:float-diagonal 22s ease-in-out infinite"></div><style>
2
2
  @keyframes float {
3
3
  0%, 100% { transform: translate(0, 0); }
4
4
  33% { transform: translate(30px, -30px); }
@@ -89,4 +89,4 @@
89
89
  opacity: 0;
90
90
  }
91
91
  }
92
- </style></div></div><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 sm:py-24 lg:py-32 relative z-10"><div class="text-center"><div class="inline-flex items-center gap-2 px-4 py-2 bg-primary/10 text-primary rounded-full text-sm font-medium mb-6 border border-primary/20 hover:bg-primary/20 transition-all duration-300"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sparkles w-4 h-4"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path><path d="M20 3v4"></path><path d="M22 5h-4"></path><path d="M4 17v2"></path><path d="M5 18H3"></path></svg>56+ Components · 7 Blocks · 11 Hooks</div><h1 class="text-4xl sm:text-5xl lg:text-6xl xl:text-7xl font-bold text-foreground mb-6 leading-tight">Django CFG<br/><span class="bg-gradient-to-r from-primary via-primary/80 to-secondary bg-clip-text text-transparent animate-pulse">UI Library</span></h1><p class="text-xl sm:text-2xl lg:text-3xl text-muted-foreground mb-8 max-w-4xl mx-auto leading-relaxed">Modern React component library built with Next.js 15, Radix UI, and Tailwind CSS 4</p><div class="flex flex-wrap justify-center gap-6 mb-8"><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>⚛️</span><span>React 19</span></div><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>📘</span><span>TypeScript</span></div><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>🎨</span><span>Tailwind CSS 4</span></div><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>🌙</span><span>Dark Mode</span></div></div><div class="flex flex-col sm:flex-row gap-4 justify-center mb-12"><a class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-14 rounded-md px-10 text-lg group" href="/cfg/admin/ui#">Explore Components<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right group-hover:translate-x-1 transition-transform duration-300" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a><a class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-14 rounded-md px-10 text-lg group" href="/cfg/admin/ui#">View Blocks<span class="group-hover:rotate-12 transition-transform duration-300"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-book-open w-5 h-5"><path d="M12 7v14"></path><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"></path></svg></span></a></div><div class="flex flex-wrap justify-center gap-x-6 gap-y-3 md:gap-x-8 md:gap-y-4 max-w-3xl mx-auto"><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">56+</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Components</div></div><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">7</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Blocks</div></div><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">11</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Hooks</div></div><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">100%</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Type Safe</div></div></div></div></div><div class="absolute bottom-8 right-8 z-10 flex gap-2"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input hover:text-accent-foreground h-9 w-9 bg-background/80 backdrop-blur-sm hover:bg-background shadow-lg" title="Switch to light theme"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun w-4 h-4" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></button><div class="relative"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input hover:text-accent-foreground h-9 w-9 bg-background/80 backdrop-blur-sm hover:bg-background shadow-lg" title="Change background animation"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-wand-sparkles w-4 h-4" aria-hidden="true"><path d="m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72"></path><path d="m14 7 3 3"></path><path d="M5 6v4"></path><path d="M19 14v4"></path><path d="M10 2v2"></path><path d="M7 8H3"></path><path d="M21 16h-4"></path><path d="M11 3H9"></path></svg></button></div></div></section></div><section class="py-12 sm:py-16 lg:py-24 bg-card"><div class="w-full px-4 sm:px-6 lg:px-8"><div class="text-center mb-12 sm:mb-16"><h2 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-bold text-foreground mb-4 sm:mb-6">Everything You Need</h2><p class="text-base sm:text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto px-2">A comprehensive component library with all the building blocks for modern web applications</p></div><div class="grid gap-6 sm:gap-8 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-package w-6 h-6"><path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z"></path><path d="M12 22V12"></path><path d="m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7"></path><path d="m7.5 4.27 9 5.15"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">56+ Components</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">From basic buttons to complex data tables, we&#x27;ve got you covered with production-ready components</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-blocks w-6 h-6"><rect width="7" height="7" x="14" y="3" rx="1"></rect><path d="M10 21V8a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H3"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Landing Page Blocks</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Pre-built sections like Hero, Features, CTA, Testimonials to ship landing pages faster</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap w-6 h-6"><path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Lightning Fast</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Optimized for performance with React 19 and Next.js 15 for blazing fast user experiences</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield w-6 h-6"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Fully Accessible</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Built on Radix UI primitives ensuring WCAG compliance and keyboard navigation support</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-palette w-6 h-6"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"></circle><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"></circle><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"></circle><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"></circle><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Themeable</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Dark mode built-in with CSS variables. Customize colors, spacing, and typography easily</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml w-6 h-6"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">TypeScript First</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Fully typed with TypeScript for better DX, autocomplete, and fewer runtime errors</div></div></div></div></div></section><section class="py-12 sm:py-16 lg:py-24 bg-background"><div class="w-full px-4 sm:px-6 lg:px-8"><div class="text-center mb-12 sm:mb-16 animate-fade-in"><h2 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-bold text-foreground mb-4 sm:mb-6">Built for Scale</h2><p class="text-base sm:text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto px-2">Everything you need to build modern web applications</p></div><div class="grid gap-6 sm:gap-8 grid-cols-2 sm:grid-cols-2 lg:grid-cols-4"><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panels-top-left w-6 h-6"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M3 9h18"></path><path d="M9 21V9"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">56+</div><div class="text-sm sm:text-base text-muted-foreground font-medium">UI Components</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Production-ready</p></div></div><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0.1s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-blocks w-6 h-6"><rect width="7" height="7" x="14" y="3" rx="1"></rect><path d="M10 21V8a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H3"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">7</div><div class="text-sm sm:text-base text-muted-foreground font-medium">Landing Blocks</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Pre-built sections</p></div></div><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0.2s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml w-6 h-6"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">11</div><div class="text-sm sm:text-base text-muted-foreground font-medium">React Hooks</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Custom utilities</p></div></div><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0.30000000000000004s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check w-6 h-6"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">100%</div><div class="text-sm sm:text-base text-muted-foreground font-medium">Type Safe</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Full TypeScript</p></div></div></div></div></section><section class="relative py-16 sm:py-20 md:py-24 lg:py-32 bg-gradient-to-b from-background via-primary/5 to-background"><div class="absolute inset-0 -z-10 overflow-hidden pointer-events-none" aria-hidden="true"><div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-4xl aspect-square bg-primary/10 rounded-full blur-3xl"></div></div><div class="container max-w-4xl mx-auto px-4 sm:px-6 lg:px-8"><div class="text-center space-y-6 sm:space-y-8"><h2 class="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight">Ready to Build Something Amazing?</h2><p class="text-base sm:text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto leading-relaxed">Start exploring our component library and ship your next project faster with pre-built, accessible components</p><div class="flex flex-col sm:flex-row gap-3 sm:gap-4 justify-center items-center pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 w-full sm:w-auto">Browse Components</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 w-full sm:w-auto">View Blocks</button></div></div></div></section></div></main><footer class="max-lg:hidden bg-background border-t border-border mt-auto"><div class="w-full px-8 lg:px-16 xl:px-24 py-12"><div class="flex flex-col gap-8"><div class="flex gap-8"><div class="space-y-4" style="width:30%;min-width:300px"><div class="flex items-center gap-2"><div class="w-8 h-8 flex items-center justify-center"><img src="/cfg/admin/static/logos/vector.svg" alt="Django CFG Logo" class="w-full h-full object-contain"/></div><span class="text-xl font-bold text-foreground">Django CFG</span></div><p class="text-muted-foreground text-sm leading-relaxed">Django CFG Admin Panel</p><div class="pt-2"><span class="inline-flex items-center gap-2 px-3 py-1.5 rounded-sm bg-primary/10 hover:bg-primary/15 border border-primary/20 text-xs font-medium text-primary transition-colors"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-car w-3.5 h-3.5" aria-hidden="true"><path d="M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2"></path><circle cx="7" cy="17" r="2"></circle><path d="M9 17h6"></path><circle cx="17" cy="17" r="2"></circle></svg>Django CFG</span></div></div><div class="grid grid-cols-2 md:grid-cols-4 gap-8 flex-1"><div><h3 class="text-sm font-semibold text-foreground mb-3">Legal</h3><ul class="space-y-2"><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/docs">Documentation</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/privacy">Privacy Policy</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/terms">Terms of Service</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/security">Security Policy</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/cookies">Cookie Policy</a></li></ul></div></div></div><div class="border-t border-border" style="margin-top:2rem;padding-top:2rem"><div class="flex justify-between items-center gap-4"><div class="text-xs text-muted-foreground">© <!-- -->2025<!-- --> <!-- -->Django CFG<!-- -->. All rights reserved.</div><div class="text-xs text-muted-foreground flex items-center gap-1">Made with ❤️ by<!-- --> <a href="https://reforms.ai" target="_blank" rel="noopener noreferrer" class="hover:text-primary transition-colors">ReformsAI</a></div><div class="flex flex-wrap items-center gap-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 hover:bg-accent h-auto w-auto p-1 text-muted-foreground hover:text-primary transition-colors" title="Package Versions" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="radix-«R3rr6»" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info h-3 w-3"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg></button><a href="/docs" target="_blank" rel="noopener noreferrer" class="text-xs text-muted-foreground hover:text-primary transition-colors" title="Documentation">Docs</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/privacy">Privacy Policy</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/terms">Terms of Service</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/security">Security</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/cookies">Cookies</a></div></div></div></div></div></footer></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/ui","query":{},"buildId":"qEBrQJUidlI_maQ4xQnI0","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
92
+ </style></div></div><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 sm:py-24 lg:py-32 relative z-10"><div class="text-center"><div class="inline-flex items-center gap-2 px-4 py-2 bg-primary/10 text-primary rounded-full text-sm font-medium mb-6 border border-primary/20 hover:bg-primary/20 transition-all duration-300"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sparkles w-4 h-4"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path><path d="M20 3v4"></path><path d="M22 5h-4"></path><path d="M4 17v2"></path><path d="M5 18H3"></path></svg>56+ Components · 7 Blocks · 11 Hooks</div><h1 class="text-4xl sm:text-5xl lg:text-6xl xl:text-7xl font-bold text-foreground mb-6 leading-tight">Django CFG<br/><span class="bg-gradient-to-r from-primary via-primary/80 to-secondary bg-clip-text text-transparent animate-pulse">UI Library</span></h1><p class="text-xl sm:text-2xl lg:text-3xl text-muted-foreground mb-8 max-w-4xl mx-auto leading-relaxed">Modern React component library built with Next.js 15, Radix UI, and Tailwind CSS 4</p><div class="flex flex-wrap justify-center gap-6 mb-8"><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>⚛️</span><span>React 19</span></div><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>📘</span><span>TypeScript</span></div><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>🎨</span><span>Tailwind CSS 4</span></div><div class="flex items-center gap-2 text-sm text-muted-foreground bg-card/50 px-4 py-2 rounded-full border border-border/50 hover:border-primary/30 hover:bg-card transition-all duration-300"><span>🌙</span><span>Dark Mode</span></div></div><div class="flex flex-col sm:flex-row gap-4 justify-center mb-12"><a class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-14 rounded-md px-10 text-lg group" href="/cfg/admin/ui#">Explore Components<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right group-hover:translate-x-1 transition-transform duration-300" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a><a class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-14 rounded-md px-10 text-lg group" href="/cfg/admin/ui#">View Blocks<span class="group-hover:rotate-12 transition-transform duration-300"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-book-open w-5 h-5"><path d="M12 7v14"></path><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"></path></svg></span></a></div><div class="flex flex-wrap justify-center gap-x-6 gap-y-3 md:gap-x-8 md:gap-y-4 max-w-3xl mx-auto"><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">56+</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Components</div></div><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">7</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Blocks</div></div><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">11</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Hooks</div></div><div class="text-center min-w-[80px] md:min-w-[100px] px-4 py-2 md:px-5 md:py-3 rounded-lg border border-foreground/8 bg-background/10 backdrop-blur-sm"><div class="text-lg md:text-xl font-bold text-foreground mb-0.5 md:mb-1">100%</div><div class="text-[10px] md:text-xs text-foreground/50 uppercase tracking-wide">Type Safe</div></div></div></div></div><div class="absolute bottom-8 right-8 z-10 flex gap-2"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input hover:text-accent-foreground h-9 w-9 bg-background/80 backdrop-blur-sm hover:bg-background shadow-lg" title="Switch to light theme"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun w-4 h-4" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></button><div class="relative"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input hover:text-accent-foreground h-9 w-9 bg-background/80 backdrop-blur-sm hover:bg-background shadow-lg" title="Change background animation"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-wand-sparkles w-4 h-4" aria-hidden="true"><path d="m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72"></path><path d="m14 7 3 3"></path><path d="M5 6v4"></path><path d="M19 14v4"></path><path d="M10 2v2"></path><path d="M7 8H3"></path><path d="M21 16h-4"></path><path d="M11 3H9"></path></svg></button></div></div></section></div><section class="py-12 sm:py-16 lg:py-24 bg-card"><div class="w-full px-4 sm:px-6 lg:px-8"><div class="text-center mb-12 sm:mb-16"><h2 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-bold text-foreground mb-4 sm:mb-6">Everything You Need</h2><p class="text-base sm:text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto px-2">A comprehensive component library with all the building blocks for modern web applications</p></div><div class="grid gap-6 sm:gap-8 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-package w-6 h-6"><path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z"></path><path d="M12 22V12"></path><path d="m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7"></path><path d="m7.5 4.27 9 5.15"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">56+ Components</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">From basic buttons to complex data tables, we&#x27;ve got you covered with production-ready components</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-blocks w-6 h-6"><rect width="7" height="7" x="14" y="3" rx="1"></rect><path d="M10 21V8a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H3"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Landing Page Blocks</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Pre-built sections like Hero, Features, CTA, Testimonials to ship landing pages faster</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap w-6 h-6"><path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Lightning Fast</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Optimized for performance with React 19 and Next.js 15 for blazing fast user experiences</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield w-6 h-6"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Fully Accessible</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Built on Radix UI primitives ensuring WCAG compliance and keyboard navigation support</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-palette w-6 h-6"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"></circle><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"></circle><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"></circle><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"></circle><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">Themeable</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Dark mode built-in with CSS variables. Customize colors, spacing, and typography easily</div></div></div><div class="rounded-xl border bg-card text-card-foreground shadow h-full hover:shadow-lg transition-all duration-300 backdrop-blur-sm border-border/50 hover:border-primary/30 group"><div class="flex flex-col space-y-1.5 p-6 pb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 rounded-lg flex items-center justify-center mb-4 sm:mb-6 group-hover:scale-110 transition-all duration-300 bg-primary/10 text-primary group-hover:bg-primary/20"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml w-6 h-6"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></div></div><div class="font-semibold tracking-tight text-lg sm:text-xl text-foreground group-hover:text-primary transition-colors duration-300">TypeScript First</div></div><div class="p-6 pt-0"><div class="text-sm sm:text-base text-muted-foreground leading-relaxed">Fully typed with TypeScript for better DX, autocomplete, and fewer runtime errors</div></div></div></div></div></section><section class="py-12 sm:py-16 lg:py-24 bg-background"><div class="w-full px-4 sm:px-6 lg:px-8"><div class="text-center mb-12 sm:mb-16 animate-fade-in"><h2 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-bold text-foreground mb-4 sm:mb-6">Built for Scale</h2><p class="text-base sm:text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto px-2">Everything you need to build modern web applications</p></div><div class="grid gap-6 sm:gap-8 grid-cols-2 sm:grid-cols-2 lg:grid-cols-4"><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panels-top-left w-6 h-6"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M3 9h18"></path><path d="M9 21V9"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">56+</div><div class="text-sm sm:text-base text-muted-foreground font-medium">UI Components</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Production-ready</p></div></div><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0.1s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-blocks w-6 h-6"><rect width="7" height="7" x="14" y="3" rx="1"></rect><path d="M10 21V8a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H3"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">7</div><div class="text-sm sm:text-base text-muted-foreground font-medium">Landing Blocks</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Pre-built sections</p></div></div><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0.2s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml w-6 h-6"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">11</div><div class="text-sm sm:text-base text-muted-foreground font-medium">React Hooks</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Custom utilities</p></div></div><div class="rounded-xl border bg-card text-card-foreground shadow text-center hover:shadow-large transition-all duration-300 animate-scale-in backdrop-blur-sm border-border/50 hover:border-primary/30 group" style="animation-delay:0.30000000000000004s"><div class="p-6 sm:p-8"><div class="w-12 h-12 sm:w-16 sm:h-16 bg-primary/10 text-primary rounded-lg flex items-center justify-center mx-auto mb-4 sm:mb-6 group-hover:scale-110 group-hover:bg-primary/20 transition-all duration-300"><div class="text-xl sm:text-2xl"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check w-6 h-6"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg></div></div><div class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-2 sm:mb-3 group-hover:text-primary transition-colors duration-300">100%</div><div class="text-sm sm:text-base text-muted-foreground font-medium">Type Safe</div><p class="text-xs sm:text-sm text-muted-foreground mt-2">Full TypeScript</p></div></div></div></div></section><section class="relative py-16 sm:py-20 md:py-24 lg:py-32 bg-gradient-to-b from-background via-primary/5 to-background"><div class="absolute inset-0 -z-10 overflow-hidden pointer-events-none" aria-hidden="true"><div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-4xl aspect-square bg-primary/10 rounded-full blur-3xl"></div></div><div class="container max-w-4xl mx-auto px-4 sm:px-6 lg:px-8"><div class="text-center space-y-6 sm:space-y-8"><h2 class="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight">Ready to Build Something Amazing?</h2><p class="text-base sm:text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto leading-relaxed">Start exploring our component library and ship your next project faster with pre-built, accessible components</p><div class="flex flex-col sm:flex-row gap-3 sm:gap-4 justify-center items-center pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 w-full sm:w-auto">Browse Components</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 w-full sm:w-auto">View Blocks</button></div></div></div></section></div></main><footer class="max-lg:hidden bg-background border-t border-border mt-auto"><div class="w-full px-8 lg:px-16 xl:px-24 py-12"><div class="flex flex-col gap-8"><div class="flex gap-8"><div class="space-y-4" style="width:30%;min-width:300px"><div class="flex items-center gap-2"><div class="w-8 h-8 flex items-center justify-center"><img src="/cfg/admin/static/logos/vector.svg" alt="Django CFG Logo" class="w-full h-full object-contain"/></div><span class="text-xl font-bold text-foreground">Django CFG</span></div><p class="text-muted-foreground text-sm leading-relaxed">Django CFG Admin Panel</p><div class="pt-2"><span class="inline-flex items-center gap-2 px-3 py-1.5 rounded-sm bg-primary/10 hover:bg-primary/15 border border-primary/20 text-xs font-medium text-primary transition-colors"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-car w-3.5 h-3.5" aria-hidden="true"><path d="M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2"></path><circle cx="7" cy="17" r="2"></circle><path d="M9 17h6"></path><circle cx="17" cy="17" r="2"></circle></svg>Django CFG</span></div></div><div class="grid grid-cols-2 md:grid-cols-4 gap-8 flex-1"><div><h3 class="text-sm font-semibold text-foreground mb-3">Legal</h3><ul class="space-y-2"><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/docs">Documentation</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/privacy">Privacy Policy</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/terms">Terms of Service</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/security">Security Policy</a></li><li><a class="text-muted-foreground hover:text-primary text-sm transition-colors" href="/cfg/admin/cookies">Cookie Policy</a></li></ul></div></div></div><div class="border-t border-border" style="margin-top:2rem;padding-top:2rem"><div class="flex justify-between items-center gap-4"><div class="text-xs text-muted-foreground">© <!-- -->2025<!-- --> <!-- -->Django CFG<!-- -->. All rights reserved.</div><div class="text-xs text-muted-foreground flex items-center gap-1">Made with ❤️ by<!-- --> <a href="https://reforms.ai" target="_blank" rel="noopener noreferrer" class="hover:text-primary transition-colors">ReformsAI</a></div><div class="flex flex-wrap items-center gap-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 hover:bg-accent h-auto w-auto p-1 text-muted-foreground hover:text-primary transition-colors" title="Package Versions" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="radix-«R3rr6»" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info h-3 w-3"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg></button><a href="/docs" target="_blank" rel="noopener noreferrer" class="text-xs text-muted-foreground hover:text-primary transition-colors" title="Documentation">Docs</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/privacy">Privacy Policy</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/terms">Terms of Service</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/security">Security</a><a class="text-xs text-muted-foreground hover:text-primary transition-colors" href="/cfg/admin/cookies">Cookies</a></div></div></div></div></div></footer></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[9999] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/ui","query":{},"buildId":"ibMHm1p66p0UGKsKnDWxn","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -5,11 +5,8 @@ Provides template tags for accessing django-cfg configuration constants.
5
5
  """
6
6
 
7
7
  from django import template
8
-
9
- try:
10
- from rest_framework_simplejwt.tokens import RefreshToken
11
- except ImportError:
12
- RefreshToken = None
8
+ from django.utils.safestring import mark_safe
9
+ from rest_framework_simplejwt.tokens import RefreshToken
13
10
 
14
11
  register = template.Library()
15
12
 
@@ -75,15 +72,65 @@ def user_jwt_token(context):
75
72
  window.USER_JWT_TOKEN = '{% user_jwt_token %}';
76
73
  </script>
77
74
  """
78
- if not RefreshToken:
75
+ request = context.get('request')
76
+ if not request or not request.user or not request.user.is_authenticated:
79
77
  return ''
80
78
 
79
+ refresh = RefreshToken.for_user(request.user)
80
+ return str(refresh.access_token)
81
+
82
+
83
+ @register.simple_tag(takes_context=True)
84
+ def user_jwt_refresh_token(context):
85
+ """
86
+ Generate JWT refresh token for the current authenticated user.
87
+
88
+ Returns JWT refresh token that can be used to obtain new access tokens.
89
+
90
+ Usage in template:
91
+ {% load django_cfg %}
92
+ <script>
93
+ window.USER_JWT_REFRESH_TOKEN = '{% user_jwt_refresh_token %}';
94
+ </script>
95
+ """
81
96
  request = context.get('request')
82
97
  if not request or not request.user or not request.user.is_authenticated:
83
98
  return ''
84
99
 
85
- try:
86
- refresh = RefreshToken.for_user(request.user)
87
- return str(refresh.access_token)
88
- except Exception:
100
+ refresh = RefreshToken.for_user(request.user)
101
+ return str(refresh)
102
+
103
+
104
+ @register.simple_tag(takes_context=True)
105
+ def inject_jwt_tokens_script(context):
106
+ """
107
+ Generate complete script tag that injects JWT tokens into localStorage.
108
+
109
+ Automatically stores auth_token and refresh_token in localStorage
110
+ for the current authenticated user.
111
+
112
+ Usage in template (usually in <head> or before </body>):
113
+ {% load django_cfg %}
114
+ {% inject_jwt_tokens_script %}
115
+ """
116
+ request = context.get('request')
117
+ if not request or not request.user or not request.user.is_authenticated:
89
118
  return ''
119
+
120
+ refresh = RefreshToken.for_user(request.user)
121
+ access_token = str(refresh.access_token)
122
+ refresh_token = str(refresh)
123
+
124
+ script = f"""<script>
125
+ (function() {{
126
+ try {{
127
+ // Store JWT tokens in localStorage for Next.js app
128
+ localStorage.setItem('auth_token', '{access_token}');
129
+ localStorage.setItem('refresh_token', '{refresh_token}');
130
+ console.log('JWT tokens injected successfully');
131
+ }} catch (e) {{
132
+ console.error('Failed to inject JWT tokens:', e);
133
+ }}
134
+ }})();
135
+ </script>"""
136
+ return mark_safe(script)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.82
3
+ Version: 1.4.83
4
4
  Summary: Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django.
5
5
  Project-URL: Homepage, https://djangocfg.com
6
6
  Project-URL: Documentation, https://djangocfg.com
@@ -1,5 +1,5 @@
1
1
  django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- django_cfg/__init__.py,sha256=fVyiXAK_YzQfgicGbX2TRMefaVnHz_3XgQoNHGsZIok,1620
2
+ django_cfg/__init__.py,sha256=kSJVbrVEgcls0REj1NiXg8cBspvSglkIZh1fRbdpypg,1620
3
3
  django_cfg/apps.py,sha256=72m3uuvyqGiLx6gOfE-BD3P61jddCCERuBOYpxTX518,1605
4
4
  django_cfg/config.py,sha256=y4Z3rnYsHBE0TehpwAIPaxr---mkvyKrZGGsNwYso74,1398
5
5
  django_cfg/apps/__init__.py,sha256=JtDmEYt1OcleWM2ZaeX0LKDnRQzPOavfaXBWG4ECB5Q,26
@@ -178,9 +178,9 @@ django_cfg/apps/centrifugo/models/__init__.py,sha256=vav0ToNcSDcwwpJ-7_npM1oBSbh
178
178
  django_cfg/apps/centrifugo/models/centrifugo_log.py,sha256=VAUrfXZzPO7rR-6wbSySpKSnbMvCptOKlnTT2umF2KY,5656
179
179
  django_cfg/apps/centrifugo/serializers/__init__.py,sha256=AjNEgSrCqiRtI4_bbLnGeuwdB-84btJDyqYuunwLWBI,1161
180
180
  django_cfg/apps/centrifugo/serializers/admin_api.py,sha256=oKhMAes1GswpJnO9sXN7zPSyA1vtneeO8JYVO4dKodY,7769
181
- django_cfg/apps/centrifugo/serializers/channels.py,sha256=Oh0Otb5qdGduzSgE9ijsgXaWukLjUCmk5N87cixtVcE,864
181
+ django_cfg/apps/centrifugo/serializers/channels.py,sha256=_U1SnvQ1MTTJnioo0DMo4OnHnnDpyvaE39lziLPtJpI,1003
182
182
  django_cfg/apps/centrifugo/serializers/health.py,sha256=2vmtHwSEedU91IhAvAcx-SJS2X5Ud-bJoU2FVRjFXBQ,493
183
- django_cfg/apps/centrifugo/serializers/publishes.py,sha256=Mt98RX4W2iPcR--JyugTYMOVnJAuzJZ8xw_L6OuIGNE,437
183
+ django_cfg/apps/centrifugo/serializers/publishes.py,sha256=J59H9U7Iu44D7FOKQ8qgqCcESpJV9zDEhbtiHtz2anQ,609
184
184
  django_cfg/apps/centrifugo/serializers/stats.py,sha256=po3sR0EGOWj9C8F8cFatGrDugebF3J66-klJW-2ZMIg,784
185
185
  django_cfg/apps/centrifugo/services/__init__.py,sha256=IKtNnDDRMOQdOhAP41GgUIDPpEspF1dW87IE9Jc80vI,247
186
186
  django_cfg/apps/centrifugo/services/config_helper.py,sha256=d2eT8AczcCRl-v2OqZUu0n-MvSt42GWJOD7tJTHKiSg,1583
@@ -211,15 +211,16 @@ django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/tags/connection_scrip
211
211
  django_cfg/apps/centrifugo/templatetags/__init__.py,sha256=W0mT4SMe7uZ3wInk88xVw1LP2vYWBsVV1U3EFt9uW7k,32
212
212
  django_cfg/apps/centrifugo/templatetags/centrifugo_tags.py,sha256=0t9cZjxBgKJ3JDh9moRwnPEFkaXwB7gnk2LLwofLgmE,1873
213
213
  django_cfg/apps/centrifugo/views/__init__.py,sha256=k4gAQehwJOF6RE-wqgEISdtTRjT4iMw9NoLqh4AeNqk,364
214
- django_cfg/apps/centrifugo/views/admin_api.py,sha256=N6rJx2cXo6IxkLdo2C9bpOGjTg-9ZQ7TaGLfJITVa6I,13968
214
+ django_cfg/apps/centrifugo/views/admin_api.py,sha256=4IUaPuzUSB9oN4wbpVUKsOZiYK6ZQGGWLmt-XfRvkfg,13970
215
215
  django_cfg/apps/centrifugo/views/dashboard.py,sha256=9FTZDJu-4RsAyc2G5udpsK-ffn3uBlxY3z_TSPfUB4E,757
216
- django_cfg/apps/centrifugo/views/monitoring.py,sha256=YVDMB-zsTgznijloxpRBZoyixTZZ99y5q003klo_y3A,10006
217
- django_cfg/apps/centrifugo/views/testing_api.py,sha256=rhceDkaXrp2L_xHpkb4TmxTP-jBzJK8VS6S4CYIsJAE,16952
216
+ django_cfg/apps/centrifugo/views/monitoring.py,sha256=eFjoZDvnfwZh-Fw2OwFDii-SZTReHswi_hqAQeVOLk4,14502
217
+ django_cfg/apps/centrifugo/views/testing_api.py,sha256=fOGc1I7XxOuRIIOnDQ9T1E0GwS5UuyR_YVJxw685UdE,16954
218
+ django_cfg/apps/frontend/JWT_AUTO_INJECTION.md,sha256=vw4M49mijxjd1ANlumPbye3d2XIaYuc_3jYRbmWsb-8,8018
218
219
  django_cfg/apps/frontend/__init__.py,sha256=QMFJM9mpjiPcU0e5EnuLZb6xpCWi3cbSnihyPS9U2Ik,394
219
220
  django_cfg/apps/frontend/apps.py,sha256=9eEK0Tq2nOsol7xSK5aobdwTDJTJrWx6Iy1I1DQb_Yk,391
220
221
  django_cfg/apps/frontend/setup.py,sha256=TxKQwQw4xTF6VSyhrQBzbUsdsVQR9JHdjc36LZKeQh4,2444
221
222
  django_cfg/apps/frontend/urls.py,sha256=Vz22_2i2w1J0KQYDCxHnTF5rUf32kUUSBDJZrP07XgY,284
222
- django_cfg/apps/frontend/views.py,sha256=ozo1-FysXEtXRJoLdW3FHL5LMi3Y38OI_a8-VdSPc1A,1448
223
+ django_cfg/apps/frontend/views.py,sha256=5oYPvrsmOqUUiUNI8uoW-19REgpJyqaVzFkQ7m-LaRE,5983
223
224
  django_cfg/apps/knowbase/README.md,sha256=HXt_J6WCN-LsMhA7p9mdvih07_vp_r_hkPdmqHhNEeo,3965
224
225
  django_cfg/apps/knowbase/__init__.py,sha256=cfGnxDQwjajPhUoleKkgvdabJcB0LdXEglnsBojKkPo,1045
225
226
  django_cfg/apps/knowbase/apps.py,sha256=GAYw98_rQdGHoak58xN-0vjdDcRNpJuND3kV-FfM1II,3290
@@ -495,6 +496,8 @@ django_cfg/apps/tasks/urls_admin.py,sha256=qSKV-Oo1TRwS1i_f9tXLL7uU6HSxGFKrQx2O5
495
496
  django_cfg/apps/tasks/admin/__init__.py,sha256=vn7ddiQYGTl3HA9C_WixLmhmRF0W13Mtu2O9up1cGjc,208
496
497
  django_cfg/apps/tasks/admin/actions.py,sha256=csxHx2UALp4iiqlHPHf-QSovE3zkPYaEAy158tTQGGA,860
497
498
  django_cfg/apps/tasks/admin/tasks_admin.py,sha256=kzDA5hBULAZEBy8lQMxRxGsJOoa5tweTlY8UMoMv7TQ,6669
499
+ django_cfg/apps/tasks/api/serializers.py,sha256=zmh99EM2rkPW21vlnwUupruxLWFdehnq0H0joimUfBQ,2703
500
+ django_cfg/apps/tasks/api/views.py,sha256=ft8eaRoMYz_iStPxcHg7d_3dvjaNxNZyzyh0RJq8f1g,21869
498
501
  django_cfg/apps/tasks/static/tasks/css/dashboard-alpine.css,sha256=NKuZh8Qcq3zt_hoTiJyrpS2dh8p7q4A9MPpNwmq5PpQ,5242
499
502
  django_cfg/apps/tasks/static/tasks/css/dashboard.css,sha256=1ULA4LGX40dWrpiv86my0ATmixkyIpGLyRjMfPmqy-0,2166
500
503
  django_cfg/apps/tasks/static/tasks/js/dashboard-alpine.js,sha256=pw2vlekIdzsePW9x4_7Ybk7UcXM1d-tXVhzr09hHMJY,25506
@@ -627,7 +630,7 @@ django_cfg/management/commands/test_telegram.py,sha256=aLnGM4oArXhQekNNWoPMU5vu6
627
630
  django_cfg/management/commands/test_twilio.py,sha256=Wn-vp9pI1gDyl1rmuvzk-s2NSarGaQOsyua53nJG6QI,632
628
631
  django_cfg/management/commands/tree.py,sha256=CoUFAVrABWuRlZ6movUuDKHoj48DRazPxZh4ucqOdt8,12729
629
632
  django_cfg/management/commands/validate_openapi.py,sha256=CdcoMhtxQhjTL6nCifAYkn02uqvo9hmKeyPJxlhz4Iw,342
630
- django_cfg/middleware/README.md,sha256=M-SvjLUygS6t_flzG4mcKSCSzU1xAVGvm9Lr3Qbsvn8,13089
633
+ django_cfg/middleware/README.md,sha256=OLnK_Lto3tWnvjlrovmXU_nXTS2fQZyNzMFvTErlNB8,13501
631
634
  django_cfg/middleware/__init__.py,sha256=EVah9AYIWT3R8inTqPY20oB4xb-KejhwqngM1Z4UrD8,465
632
635
  django_cfg/middleware/admin_notifications.py,sha256=EVoXjSLaDz4r-lL5hy6V9sC1BpNF0rKsa-s6L31foRQ,6856
633
636
  django_cfg/middleware/authentication.py,sha256=1deekm3lyAMJ2pK7Usd5q1FtUN1aDq_CGJuZrJuHZtE,6139
@@ -793,7 +796,7 @@ django_cfg/modules/django_client/core/generator/typescript/templates/api_instanc
793
796
  django_cfg/modules/django_client/core/generator/typescript/templates/app_index.ts.jinja,sha256=gLsoYyEzKD6Gv64vsO9sQHMPiFMGdaB5XVufLHeRyvQ,62
794
797
  django_cfg/modules/django_client/core/generator/typescript/templates/client_file.ts.jinja,sha256=LHUt72fO2eRNAHYEscIYvqVR69GC6mxqjcgSlUzeCtc,251
795
798
  django_cfg/modules/django_client/core/generator/typescript/templates/index.ts.jinja,sha256=OtQxzqV_6SYvugk_oS0F9_WXty2tnKY_wl2n9-WeJqo,127
796
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja,sha256=9OipX7Ni4kwA0Ev2A6ihrYmdJNNomYE4Jq0dYmxcPHs,7343
799
+ django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja,sha256=5B_X07RJF0k7to78I_KC9buHFvzYlLFZaQZNnFa-oog,7396
797
800
  django_cfg/modules/django_client/core/generator/typescript/templates/package.json.jinja,sha256=XOgZJG3twzWJ8gsZ5VZ_gQx7zBvrnwXy-yUFHfdyBBs,1280
798
801
  django_cfg/modules/django_client/core/generator/typescript/templates/tsconfig.json.jinja,sha256=QKbo6hYoVdRXrm7psRzBGStzAP5omQrnamSQT6b44gE,482
799
802
  django_cfg/modules/django_client/core/generator/typescript/templates/client/app_client.ts.jinja,sha256=jaFN_QIQU2eyu-6uiwUjwACYNr06LI14XGJN0Dgv-9E,260
@@ -803,7 +806,7 @@ django_cfg/modules/django_client/core/generator/typescript/templates/client/main
803
806
  django_cfg/modules/django_client/core/generator/typescript/templates/client/operation.ts.jinja,sha256=z6GD-r7Y-S_yhDtlOAjMgDSL10AF3YrBLLNLPiCt8rE,1869
804
807
  django_cfg/modules/django_client/core/generator/typescript/templates/client/sub_client.ts.jinja,sha256=1rtFMqJO8ynjNNblhMPwCbVFhbSbLJJwiMhuJJYf9Lw,215
805
808
  django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/fetchers.ts.jinja,sha256=HNeYh8LnTTmeKTQS7uup37Oq-_HwBPZH8qE1kneaJsg,1296
806
- django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/function.ts.jinja,sha256=y2H5DtBYgPughgW3qg_mV0-A_oLmTkBdOix2SEXIt4M,575
809
+ django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/function.ts.jinja,sha256=cR4Y4eJ1ENcON9BcfI-ttnJfKxv61efMW2oVDrmJga8,580
807
810
  django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/index.ts.jinja,sha256=DoAVm8EoglJKtLrE917Fk7Na6rn5Bt9L1nI39o9AwzM,747
808
811
  django_cfg/modules/django_client/core/generator/typescript/templates/hooks/hooks.ts.jinja,sha256=_iyvJBEQviLLtZ5z1qXNUM976zXPW-v9DXFyHJdrpCQ,802
809
812
  django_cfg/modules/django_client/core/generator/typescript/templates/hooks/index.ts.jinja,sha256=c4Jru6DAKD-y8nzig1my0iE-BO3OwjSCENALbHvAp7E,694
@@ -829,8 +832,8 @@ django_cfg/modules/django_client/core/ir/operation.py,sha256=gwvTciqIAUS0Hb7TqVU
829
832
  django_cfg/modules/django_client/core/ir/schema.py,sha256=TfG6iLlAJVa8Jtxis_nPmz4TrfTqRlocZFlv8pvBNj8,12561
830
833
  django_cfg/modules/django_client/core/parser/__init__.py,sha256=8luZt53hRdtLRPVMWG3zpaWK53sKGBabQGmkDCye4ow,2312
831
834
  django_cfg/modules/django_client/core/parser/base.py,sha256=-6xCCxc7Y33TtcgFYsGKDpvABkNLUlZTA8iSXksnjdw,23471
832
- django_cfg/modules/django_client/core/parser/openapi30.py,sha256=f4v4bNODtLf6ifajpmATarUDStDts_Lnh-_T87ZwYdA,1641
833
- django_cfg/modules/django_client/core/parser/openapi31.py,sha256=6cBARQJQiXi63Efz874pfuH_e_w6YCReQrsqJj1hkJI,1922
835
+ django_cfg/modules/django_client/core/parser/openapi30.py,sha256=CBkl4ppQ0lvirkLmLGIn5GIFBbu3jUsV6t4vlI44vto,2323
836
+ django_cfg/modules/django_client/core/parser/openapi31.py,sha256=K-ru1AOG0a9rVTTdt7Wa_iQJbRYwUcAGB8Oj-dz6eio,2614
834
837
  django_cfg/modules/django_client/core/parser/models/__init__.py,sha256=GrGazWB-rr-e_HBtOTFNRA2WjkyGM5MH85iAMs_cs7s,1690
835
838
  django_cfg/modules/django_client/core/parser/models/base.py,sha256=orOGoX3zUglZt_vCk0JJycmmsAFG5zN-KAYy9cwp8Ao,5467
836
839
  django_cfg/modules/django_client/core/parser/models/components.py,sha256=BCgUL_OlnRKYLJ2ea47o1YJnVeP5F4gNNCeHcZ_WWhk,4473
@@ -1058,14 +1061,14 @@ django_cfg/static/admin/js/alpine/commands-section.js,sha256=8z2MQNwZF9Tx_2EK1AY
1058
1061
  django_cfg/static/admin/js/alpine/dashboard-tabs.js,sha256=ob8Q_I9lFLDv_hFERXgTyvqMDBspAGfzCxI_7slRur4,1354
1059
1062
  django_cfg/static/admin/js/alpine/system-metrics.js,sha256=m-Fg55K_vpHXToD46PXL9twl4OBF_V9MONvbSWbQqDw,440
1060
1063
  django_cfg/static/admin/js/alpine/toggle-section.js,sha256=T141NFmy0fRJyGGuuaCJRjJXwPam-xxtQNW1hi8BJbc,672
1061
- django_cfg/static/frontend/admin/404.html,sha256=lyTelM7J03VGxqzwEk6rbGdvY0UsXIc0R5hswrwVvSA,13147
1062
- django_cfg/static/frontend/admin/500.html,sha256=ureA57lhF-YmRf862oJWZZeG_ZT21fAWtk-uqSX5vNY,13244
1063
- django_cfg/static/frontend/admin/auth.html,sha256=vYTZ2pK-LtlnpDVp7iXqX95zBymyVLFoI-SSAX1x1tc,8445
1064
+ django_cfg/static/frontend/admin/404.html,sha256=WD4L5foHVPTrZszlZQZmvYlejmqMSek56g-p3uZYPiQ,13148
1065
+ django_cfg/static/frontend/admin/500.html,sha256=WGJErMSt8FwjU0kC0R8Qu3w4rFAcjP1l9N7lRWDZwhc,13245
1066
+ django_cfg/static/frontend/admin/auth.html,sha256=ObqXcxYAMLQ3MhhOGZCN6FlJLM3t6xbLzNfyhEUy5Nc,8446
1064
1067
  django_cfg/static/frontend/admin/favicon.png,sha256=k_yaCRYwsPBknQkEIdpakdMGbORiOrpvrBQyC_SN5NM,33530
1065
- django_cfg/static/frontend/admin/index.html,sha256=Wng-i-CQMJGbwUR-KBUOdLAZdmhGZdiNZcmcmK-_WxE,11614
1068
+ django_cfg/static/frontend/admin/index.html,sha256=Ahb4o2-NxCCmMVWOoXQgUESN7MhzKem0j4s2TEelHQ0,11615
1066
1069
  django_cfg/static/frontend/admin/manifest.json,sha256=Jc3Eu0qeRafLub6jlsmzQLD-g8sm1b1IU2GEu1yZz-8,663
1067
- django_cfg/static/frontend/admin/private.html,sha256=fHkBpatFTonDI2U1Yfd3_smy4hU0FFv5ssY_FDbYdRI,8248
1068
- django_cfg/static/frontend/admin/ui.html,sha256=tggN5bB4R5LTpbRsrAop5OBZOOB1L6nuk0r_JFTkTyE,39539
1070
+ django_cfg/static/frontend/admin/private.html,sha256=rEXny5hWbn20PklKp_kF8F63YEADAmdbEozHLCJnNNw,8249
1071
+ django_cfg/static/frontend/admin/ui.html,sha256=PNAgnIwrRm6C02b7b-aHYSCDpDmzKzYie8k_W8SC1jQ,39540
1069
1072
  django_cfg/static/frontend/admin/_next/static/chunks/10004.28e6c5f4c1878a7f.js,sha256=SDxi6Bnx_spdfbZmruPtX-b2CkBPk6NZWuN908PJy00,1970
1070
1073
  django_cfg/static/frontend/admin/_next/static/chunks/10045.c0de73a7d5e3b776.js,sha256=mUUE9DVL67cYOOCH5prwZEttparzaHaBCRFvBGURgAk,1661
1071
1074
  django_cfg/static/frontend/admin/_next/static/chunks/1010.b05c484e9c210a35.js,sha256=ztx1p7LeQUHI1apKRPUThrFWGHPNuO3GRqm_Lh0p5n4,50539
@@ -3205,31 +3208,35 @@ django_cfg/static/frontend/admin/_next/static/chunks/framework-46f25b115ad0e595.
3205
3208
  django_cfg/static/frontend/admin/_next/static/chunks/main-f9b6d451d9991f19.js,sha256=n0uA5eK_7TEJxH2edZGsDWjLcln4qIOFRz5A6ZCVxl8,128050
3206
3209
  django_cfg/static/frontend/admin/_next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
3207
3210
  django_cfg/static/frontend/admin/_next/static/chunks/webpack-905bba30877f6490.js,sha256=1_XaWBFS4ofNLjFc6xoGeUVMmR-_IoJJcvDfDY3igoI,56750
3208
- django_cfg/static/frontend/admin/_next/static/chunks/pages/404-7cdad2942c3fb179.js,sha256=WTMdnz3MVLMQbcmNjh3LVGK8-dsmbDMJQw0eh5QrTp0,399
3209
- django_cfg/static/frontend/admin/_next/static/chunks/pages/500-6cdb27b00678364f.js,sha256=Vr97AVtyfeQgMcljd8lKHcLTVQxvprpfTbxYBDG0TW8,401
3210
- django_cfg/static/frontend/admin/_next/static/chunks/pages/_app-9c5ca2471de6b000.js,sha256=1zazD3KmExnznylbgN3ga9GujwGvjCp60Oug5ObyJEQ,2924303
3211
- django_cfg/static/frontend/admin/_next/static/chunks/pages/_error-b8071a05cabe1c2d.js,sha256=DE-tnVgPIBDt3OzBPewCdazt9KJ7ts9PHUiIoroaNpU,453
3211
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/404-c283223d1afd02a2.js,sha256=oaxFxJ8o8GUiRsCBwhna0eBnb345FanlUTpzvrhjs5Q,400
3212
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/500-389d6d3e1f2f7fda.js,sha256=DyJHmOprhI1awBfcVh9Mi12vE56A4a_bPsuJFv4kXjU,402
3213
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/_app-16701a4e1bc3e6ac.js,sha256=SFcRYxFuaq1EIt9Jm3d4HmeQWvoGHTLObFpovCkXf4c,2971904
3214
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/_error-5291033275c26d09.js,sha256=YDUKht9kE0boy6cRWENr0smhLKdFAT6oD05MW4CokKQ,454
3212
3215
  django_cfg/static/frontend/admin/_next/static/chunks/pages/auth-a872607f98742e5a.js,sha256=RhpzAFpGuXVTrg935pLfhLoMJXrMlwxw_1al5nzs4d8,613
3213
- django_cfg/static/frontend/admin/_next/static/chunks/pages/index-bf88192a30e013a9.js,sha256=W7pH2Fuo3b8cUOiGEziI2uSr133Djw7JvcVKPrcrX5Q,1001
3216
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/index-88751d9f44a32105.js,sha256=N5EsnScJh5bv735oLXsGbZqgEv1KrJu0akrk7iAi1DQ,977
3214
3217
  django_cfg/static/frontend/admin/_next/static/chunks/pages/private-2f58633ddf63a5bc.js,sha256=C5fSXw9hKFyMCbbvvrPfqORZqmkcWPJZgqfUACAf-dI,450
3215
- django_cfg/static/frontend/admin/_next/static/chunks/pages/ui-73632f2d9c6b11ab.js,sha256=oyV-Uh-A6T8w8KGo3mXePP3A3jaN3inFZajb8x7ALLo,456
3216
- django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/cookies-24588bf5551f30df.js,sha256=QSV5IKUb-c_In0yTR-adFK0VV6c2402fdcK5D2lQMqU,3246
3217
- django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/privacy-354dae34a4c4da59.js,sha256=YNGRBH6XDogfPyIfR_2TG0TDGad5MoTrVS_fbcZjj80,3193
3218
- django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/security-0a5d7fa591ebb1ae.js,sha256=dYqhzHNQ9va9qtQtPRmBTpm1Rn84R8ERl3Cg8Jx6DNE,3402
3219
- django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/terms-c3d80322f52dc112.js,sha256=kE7wAPC1FczDKDbypa-dNWZ0PZb42L4F8_51vcGVE8g,2846
3220
- django_cfg/static/frontend/admin/_next/static/css/e201974f9a4d64e6.css,sha256=T1WPpUTn2c6l1r0yHHzRZH7r-qQfjF2KGp0t406rf6U,123360
3218
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/ui-0e6c0e35862789ec.js,sha256=0jqj1mR7hNs14w3pU7R3EFvFcEyNuKdxZWMInle0MXk,457
3219
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/cookies-bb5507a122775f30.js,sha256=eAtXieRRprPLCyk2hmWTRfi_Vh-_QJuUJp4oWIHyHtc,3246
3220
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/privacy-f8a3d8db1a197be3.js,sha256=g6IDtbozrPQOIgPYgVfS1lpvY2AWJakQ3RgQkXtJMeU,3193
3221
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/security-aba50addd2179f8f.js,sha256=niU1F4OwnFMxtTLZCl2-8gNyQPBRpHeg65DhS0i9yEM,3402
3222
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/terms-4aa35cd30b5c08ad.js,sha256=HpF0hwzoRoCSmpO2Hzd0Nb-L9p5KnR6a8B5fIKby5yw,2846
3223
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/private/centrifugo-1c5f00c26c77a47b.js,sha256=HlDqU13Fm5LySao_xuHHF6BwVUylxoCvN2Hd9TPgz5k,311888
3224
+ django_cfg/static/frontend/admin/_next/static/chunks/pages/private/profile-e93a65e8e7d9022b.js,sha256=VFofW3pgKqrjSUR-4WjYw49-gBpehdxTR6nNVvb6w8w,472
3225
+ django_cfg/static/frontend/admin/_next/static/css/806300fb98c42afb.css,sha256=dgYD3RpHRYhZS44r9weKiefCwgEYe8tKYd2ZOAY4qH0,124312
3226
+ django_cfg/static/frontend/admin/_next/static/ibMHm1p66p0UGKsKnDWxn/_buildManifest.js,sha256=qdg3bKiWRnZB9DrxijGk59Z_TkeM4oa6DddLuzI36q4,1376
3227
+ django_cfg/static/frontend/admin/_next/static/ibMHm1p66p0UGKsKnDWxn/_ssgManifest.js,sha256=b1tKoA0vjWrtmTW0cYBr96zvRk0MHTkCYOX-J_gAxn4,77
3221
3228
  django_cfg/static/frontend/admin/_next/static/media/438aa629764e75f3-s.woff2,sha256=6MCzmZLwaz3JqYNElAiAFIWfNjv2yoeStrsH4Xx5ZfM,2592
3222
3229
  django_cfg/static/frontend/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2,sha256=4xC1Wn_ZZ39eNVXmxsTQZPofHSQ5Pw3b4hfOoSqMQy8,24576
3223
3230
  django_cfg/static/frontend/admin/_next/static/media/51251f8b9793cdb3-s.woff2,sha256=QK8RMn_lMIFmxstXh4CLBC222oiav2AvCkh2xJZ12H4,9360
3224
3231
  django_cfg/static/frontend/admin/_next/static/media/875ae681bfde4580-s.p.woff2,sha256=laSTBh_gqNDQJ8KJJ0cTS6dHFBES075NUCLnCrfToaY,14544
3225
3232
  django_cfg/static/frontend/admin/_next/static/media/cc978ac5ee68c2b6-s.woff2,sha256=zgk7NB2cEGWO4eqoXF-AQv8zB7xsz8X0BWFutDfwAJ4,15240
3226
3233
  django_cfg/static/frontend/admin/_next/static/media/e857b654a2caa584-s.woff2,sha256=urdX-KChvAQFXumMtXd_MlSqsR9tIiNm4fQKNvOQUGo,8492
3227
- django_cfg/static/frontend/admin/_next/static/qEBrQJUidlI_maQ4xQnI0/_buildManifest.js,sha256=DbaB8WTu_0N8HqFtgZmv10J9D60UK1P3NduS8aNS6Ao,1171
3228
- django_cfg/static/frontend/admin/_next/static/qEBrQJUidlI_maQ4xQnI0/_ssgManifest.js,sha256=b1tKoA0vjWrtmTW0cYBr96zvRk0MHTkCYOX-J_gAxn4,77
3229
- django_cfg/static/frontend/admin/legal/cookies.html,sha256=Y_tjim7jbLV6rdrlWYLywtRg6HY0Q9OXmVxf78Doapg,13838
3230
- django_cfg/static/frontend/admin/legal/privacy.html,sha256=U_ujbgKIPgtoo6NWHET_DT-fI1-y_8-obyYhC99BkJ8,13879
3231
- django_cfg/static/frontend/admin/legal/security.html,sha256=k694yfO-e5jg4vY5CUVpcQ61PeToQZn53XLPdVRIavQ,14200
3232
- django_cfg/static/frontend/admin/legal/terms.html,sha256=RuP1zZbaV2GqBFacoB3vXN6_cNZp7PF4xMgZROiju0M,13614
3234
+ django_cfg/static/frontend/admin/legal/cookies.html,sha256=ToDETyeSYHt9j8ZoCYPRR7yFxISjiLifxiEAwX955B0,13839
3235
+ django_cfg/static/frontend/admin/legal/privacy.html,sha256=6yexv9xsOna9ih0p8yfnz8WqqYPmdEeqUykNd9gaSOw,13880
3236
+ django_cfg/static/frontend/admin/legal/security.html,sha256=HdNewhk5CQS9BpPdjV-B9f3AaOjqpNoqA859i4FKo-E,14201
3237
+ django_cfg/static/frontend/admin/legal/terms.html,sha256=X1BMU3FDWjE4D3jkiMxti8SMWt-WgESG_C-kku3vHMI,13615
3238
+ django_cfg/static/frontend/admin/private/centrifugo.html,sha256=upxi_yYHASYeIKP2l4PNd0W_2L9cE7kxAtaE5AlIUWo,8271
3239
+ django_cfg/static/frontend/admin/private/profile.html,sha256=QmbySMkaO5oSQa0cxVx8HVJAyG12mial2N7B9aVU-ns,8265
3233
3240
  django_cfg/static/frontend/admin/static/logos/192x192.png,sha256=k_yaCRYwsPBknQkEIdpakdMGbORiOrpvrBQyC_SN5NM,33530
3234
3241
  django_cfg/static/frontend/admin/static/logos/384x384.png,sha256=T2JZG0LfPv-k-8brPjbKPTlTQqfivmak1qr2ijJ6ckg,133486
3235
3242
  django_cfg/static/frontend/admin/static/logos/512x512.png,sha256=_fYvtvBJTTef8nUlZ-YyCa7L6Tt8eZTt14N4LCRJPA0,244293
@@ -3307,7 +3314,7 @@ django_cfg/templates/admin/snippets/tabs/widgets_tab.html,sha256=1TxvLPjydcOQRVd
3307
3314
  django_cfg/templates/admin/snippets/zones/zones_table.html,sha256=WtaI-x16LijochRy7uFj8xyUeqcCqhenF9xKRW_JQWE,11879
3308
3315
  django_cfg/templates/emails/base_email.html,sha256=TWcvYa2IHShlF_E8jf1bWZStRO0v8G4L_GexPxvz6XQ,8836
3309
3316
  django_cfg/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3310
- django_cfg/templatetags/django_cfg.py,sha256=5CsqbuNCbLtCpcqRPz_S-Sl73KsgqcELjtZ14kzqj2U,2295
3317
+ django_cfg/templatetags/django_cfg.py,sha256=dPCcuZySSNvDlsiFkyeZ1b_GkhhybNLY-bHHF9Wmm-w,3907
3311
3318
  django_cfg/utils/__init__.py,sha256=64wwXJuXytvwt8Ze_erSR2HmV07nGWJ6DV5wloRBvYE,435
3312
3319
  django_cfg/utils/path_resolution.py,sha256=2n0I04lQkSssFaELu3A93YyMAl1K10KPdpxMt5k4Iy0,13341
3313
3320
  django_cfg/utils/smart_defaults.py,sha256=ZUj6K_Deq-fp5O0Dy_Emt257UWFn0f9bkgFv9YCR58U,9239
@@ -3315,9 +3322,9 @@ django_cfg/utils/version_check.py,sha256=WO51J2m2e-wVqWCRwbultEwu3q1lQasV67Mw2aa
3315
3322
  django_cfg/CHANGELOG.md,sha256=jtT3EprqEJkqSUh7IraP73vQ8PmKUMdRtznQsEnqDZk,2052
3316
3323
  django_cfg/CONTRIBUTING.md,sha256=DU2kyQ6PU0Z24ob7O_OqKWEYHcZmJDgzw-lQCmu6uBg,3041
3317
3324
  django_cfg/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
3318
- django_cfg/pyproject.toml,sha256=s7bvezcIVuRkz1wgGkzvUOZ8JiUbns-i5QX_eJnGT7Q,8164
3319
- django_cfg-1.4.82.dist-info/METADATA,sha256=cGTYCgoPNUyudlX5H17-j9j1H5cvcFvMOMThLJ-0uzk,22624
3320
- django_cfg-1.4.82.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
3321
- django_cfg-1.4.82.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
3322
- django_cfg-1.4.82.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
3323
- django_cfg-1.4.82.dist-info/RECORD,,
3325
+ django_cfg/pyproject.toml,sha256=osZ_C6FoyVkgNjrU43ZoWeUjCy0IbPbpYcTbrtaaJ_4,8164
3326
+ django_cfg-1.4.83.dist-info/METADATA,sha256=BTzOBAuo3-2e9oLu_kKOwiK8Jgzs2lMs3-Oje_p_y0U,22624
3327
+ django_cfg-1.4.83.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
3328
+ django_cfg-1.4.83.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
3329
+ django_cfg-1.4.83.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
3330
+ django_cfg-1.4.83.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[32336],{5539:(_,n,u)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/404",function(){return u(95022)}])},95022:(_,n,u)=>{"use strict";u.r(n),u.d(n,{default:()=>c});var e=u(94513),t=u(56781),s=u(4758);function c(){return(0,e.jsx)(s.x$,{code:404,supportEmail:t.W0.contact.email})}}},_=>{_.O(0,[90636,46593,38792],()=>_(_.s=5539)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[40421],{80315:(_,n,u)=>{"use strict";u.r(n),u.d(n,{default:()=>c});var e=u(94513),t=u(56781),s=u(4758);function c(){return(0,e.jsx)(s.x$,{code:500,supportEmail:t.W0.contact.email})}},80883:(_,n,u)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/500",function(){return u(80315)}])}},_=>{_.O(0,[90636,46593,38792],()=>_(_.s=80883)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[12731],{83953:(e,t,_)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return _(94437)}])},94437:(e,t,_)=>{"use strict";_.r(t),_.d(t,{default:()=>i});var n=_(94513),r=_(56781),s=_(4758);function u(e){let{statusCode:t}=e;return(0,n.jsx)(s.x$,{code:t,supportEmail:r.W0.contact.email})}u.getInitialProps=s.sL;let i=u}},e=>{e.O(0,[90636,46593,38792],()=>e(e.s=83953)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[93332],{27923:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var a=s(94513),l=s(4758),n=s(30512),r=s(94285),i=s(84553),c=s(58380);let d=(0,s(25365).A)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);var u=s(44754);let h=()=>{let{isAuthenticated:e}=(0,l.h7)(),t=(0,c.useRouter)();return(0,r.useEffect)(()=>{e||u.yz||t.push((0,n.OJ)(i.JZ))},[e,t.asPath]),(0,a.jsx)("div",{className:"flex items-center justify-center min-h-screen bg-background",children:(0,a.jsxs)("div",{className:"flex flex-col items-center gap-4",children:[(0,a.jsx)(d,{className:"animate-spin text-primary",style:{width:"48px",height:"48px"}}),(0,a.jsx)("span",{className:"text-lg font-medium text-muted-foreground",children:"Loading..."})]})})};h.pageConfig={title:"Portal"};let f=h},59409:(e,t,s)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/",function(){return s(27923)}])}},e=>{e.O(0,[90636,46593,38792],()=>e(e.s=59409)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[66038],{2731:(e,o,n)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/ui",function(){return n(5232)}])},5232:(e,o,n)=>{"use strict";n.r(o),n.d(o,{default:()=>c});var t=n(94513),s=n(4758);let _=()=>(0,t.jsx)(s.QP,{});_.pageConfig={title:"Component Showcase",description:"Explore our comprehensive collection of React components"};let c=_}},e=>{e.O(0,[90636,46593,38792],()=>e(e.s=2731)),_N_E=e.O()}]);