ntc-dev-kit 1.3.0__tar.gz → 1.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/MANIFEST.in +1 -1
  2. {ntc_dev_kit-1.3.0/ntc_dev_kit.egg-info → ntc_dev_kit-1.3.1}/PKG-INFO +8 -4
  3. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/README.md +6 -2
  4. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/__init__.py +1 -1
  5. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/.env.example +6 -0
  6. ntc_dev_kit-1.3.1/ntc/templates/nextjs/public/logo.svg +1 -0
  7. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/about/page.tsx +19 -0
  8. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/contact/page.tsx +21 -0
  9. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/error.tsx +20 -0
  10. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/globals.css +198 -0
  11. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/icon.svg +1 -0
  12. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/layout.tsx +66 -0
  13. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/loading.tsx +10 -0
  14. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/manifest.ts +16 -0
  15. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/not-found.tsx +19 -0
  16. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/opengraph-image.tsx +25 -0
  17. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/page.tsx +23 -0
  18. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/robots.ts +14 -0
  19. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/app/sitemap.ts +12 -0
  20. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/components/Footer.tsx +11 -0
  21. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/components/Header.tsx +24 -0
  22. ntc_dev_kit-1.3.1/ntc/templates/nextjs/src/utils/constants.ts +16 -0
  23. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/structure.json +47 -3
  24. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/index.html +1 -1
  25. ntc_dev_kit-1.3.1/ntc/templates/react_admin/public/favicon.svg +1 -0
  26. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/structure.json +6 -1
  27. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/index.html +1 -1
  28. ntc_dev_kit-1.3.1/ntc/templates/react_structure/public/favicon.svg +1 -0
  29. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/structure.json +6 -1
  30. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/workspace/processes.py +3 -1
  31. ntc_dev_kit-1.3.1/ntc/workspace/screen.py +398 -0
  32. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1/ntc_dev_kit.egg-info}/PKG-INFO +8 -4
  33. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc_dev_kit.egg-info/SOURCES.txt +15 -0
  34. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc_dev_kit.egg-info/requires.txt +1 -1
  35. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/pyproject.toml +5 -2
  36. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/setup.py +2 -2
  37. ntc_dev_kit-1.3.1/tests/test_templates.py +44 -0
  38. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/tests/test_workspace.py +1 -1
  39. ntc_dev_kit-1.3.0/ntc/templates/nextjs/src/app/globals.css +0 -30
  40. ntc_dev_kit-1.3.0/ntc/templates/nextjs/src/app/layout.tsx +0 -59
  41. ntc_dev_kit-1.3.0/ntc/templates/nextjs/src/app/page.tsx +0 -22
  42. ntc_dev_kit-1.3.0/ntc/templates/nextjs/src/components/Header.tsx +0 -18
  43. ntc_dev_kit-1.3.0/ntc/templates/nextjs/src/utils/constants.ts +0 -2
  44. ntc_dev_kit-1.3.0/ntc/workspace/screen.py +0 -217
  45. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/LICENSE +0 -0
  46. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/app_creator.py +0 -0
  47. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/cli.py +0 -0
  48. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/cli_enhanced.py +0 -0
  49. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/composer/__init__.py +0 -0
  50. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/composer/main.py +0 -0
  51. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/deployment/__init__.py +0 -0
  52. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/main.py +0 -0
  53. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/__init__.py +0 -0
  54. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/__init__.py +0 -0
  55. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/admin.py +0 -0
  56. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/apps.py +0 -0
  57. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/migrations/0001_initial.py +0 -0
  58. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/models.py +0 -0
  59. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/serializers.py +0 -0
  60. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/tasks.py +0 -0
  61. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/templates/authentication/password_reset.html +0 -0
  62. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/templates/authentication/password_reset.txt +0 -0
  63. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/tests.py +0 -0
  64. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/urls.py +0 -0
  65. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/auth_app/views.py +0 -0
  66. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/__init__.py +0 -0
  67. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/drf_structure.md +0 -0
  68. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/main.py +0 -0
  69. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/structure.json +0 -0
  70. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/.entry/start_core_backend.sh +0 -0
  71. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/.entry/start_tasks_backend.sh +0 -0
  72. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/CLAUDE.md +0 -0
  73. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/README.md +0 -0
  74. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/app_admin.py +0 -0
  75. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/app_apps.py +0 -0
  76. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/app_models.py +0 -0
  77. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/app_urls.py +0 -0
  78. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/app_views.py +0 -0
  79. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/common_apps.py +0 -0
  80. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/common_checks.py +0 -0
  81. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/apps/common_models.py +0 -0
  82. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/ci/github_ci.yml +0 -0
  83. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/ci/pre_commit.yaml +0 -0
  84. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/config/gunicorn_config.py +0 -0
  85. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/config/http.conf +0 -0
  86. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/exceptions/handler.py +0 -0
  87. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/formatter.py +0 -0
  88. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/health.py +0 -0
  89. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/logger.py +0 -0
  90. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/pagination.py +0 -0
  91. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/renderers.py +0 -0
  92. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/response_wrapper.py +0 -0
  93. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/schema.py +0 -0
  94. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/services/azure/email/backend.py +0 -0
  95. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/services/azure/email/client.py +0 -0
  96. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/services/azure/email/notifier.py +0 -0
  97. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/services/object_storage.py +0 -0
  98. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/tests.py +0 -0
  99. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/core/utils/request.py +0 -0
  100. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/asgi.py +0 -0
  101. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/celery.py +0 -0
  102. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/dev_settings.py +0 -0
  103. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/django_settings.txt +0 -0
  104. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/prod_settings.py +0 -0
  105. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/project_init.py +0 -0
  106. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/schema.py +0 -0
  107. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/test_settings.py +0 -0
  108. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/urls.py +0 -0
  109. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/django_project/wsgi.py +0 -0
  110. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/docker/Dockerfile +0 -0
  111. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/docker/captain-definition +0 -0
  112. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/docker/docker-compose.yml +0 -0
  113. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/knowledge/knowledge_description.md +0 -0
  114. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/knowledge/knowledge_design_pattern.md +0 -0
  115. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/knowledge/knowledge_structure.md +0 -0
  116. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/README.md +0 -0
  117. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/django_env.txt +0 -0
  118. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/django_requirements.txt +0 -0
  119. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/django_requirements_dev.txt +0 -0
  120. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/dockerignore.txt +0 -0
  121. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/gitattributes.txt +0 -0
  122. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/gitignore.txt +0 -0
  123. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/manage.py +0 -0
  124. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/pytest_ini.txt +0 -0
  125. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/drf_structure/templates/root/ruff_toml.txt +0 -0
  126. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/.gitignore +0 -0
  127. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/.knowledge/knowledge_description.md +0 -0
  128. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/.knowledge/knowledge_design_pattern.md +0 -0
  129. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/.knowledge/knowledge_structure.md +0 -0
  130. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/CLAUDE.md +0 -0
  131. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/__init__.py +0 -0
  132. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/analysis_options.yaml +0 -0
  133. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/core/config/app_config.dart +0 -0
  134. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/core/config/environment.dart +0 -0
  135. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/core/constants/app_constants.dart +0 -0
  136. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/core/network/dio_client.dart +0 -0
  137. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/features/home/presentation/home_screen.dart +0 -0
  138. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/l10n/app_localizations.dart +0 -0
  139. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/main.dart +0 -0
  140. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/services/api_service.dart +0 -0
  141. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/shared/localization/locale_provider.dart +0 -0
  142. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/shared/theme/app_theme.dart +0 -0
  143. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/lib/shared/theme/theme_provider.dart +0 -0
  144. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/main.py +0 -0
  145. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/pubspec.yaml +0 -0
  146. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/flutter/structure.json +0 -0
  147. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/.gitignore +0 -0
  148. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/CLAUDE.md +0 -0
  149. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/README.md +0 -0
  150. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/__init__.py +0 -0
  151. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/eslint.config.mjs +0 -0
  152. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/knowledge/knowledge_description.md +0 -0
  153. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/knowledge/knowledge_design_pattern.md +0 -0
  154. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/knowledge/knowledge_structure.md +0 -0
  155. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/main.py +0 -0
  156. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/next.config.js +0 -0
  157. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/package.json +0 -0
  158. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/src/services/api.ts +0 -0
  159. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/src/services/server.ts +0 -0
  160. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/nextjs/tsconfig.json +0 -0
  161. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/.env.example +0 -0
  162. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/.gitignore +0 -0
  163. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/CLAUDE.md +0 -0
  164. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/README.md +0 -0
  165. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/__init__.py +0 -0
  166. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/eslint.config.js +0 -0
  167. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/knowledge/knowledge_description.md +0 -0
  168. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/knowledge/knowledge_design_pattern.md +0 -0
  169. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/knowledge/knowledge_structure.md +0 -0
  170. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/main.py +0 -0
  171. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/package.json +0 -0
  172. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/App.tsx +0 -0
  173. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/components/ProtectedRoute.tsx +0 -0
  174. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/components/Sidebar.tsx +0 -0
  175. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/components/TopNav.tsx +0 -0
  176. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/context/AuthContext.tsx +0 -0
  177. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/context/ThemeContext.tsx +0 -0
  178. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/context/WorkspaceContext.tsx +0 -0
  179. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/hooks/useApi.ts +0 -0
  180. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/index.css +0 -0
  181. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/layouts/AuthLayout.tsx +0 -0
  182. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/layouts/DashboardLayout.tsx +0 -0
  183. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/main.tsx +0 -0
  184. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/pages/DashboardPage.tsx +0 -0
  185. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/pages/auth/LoginPage.tsx +0 -0
  186. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/services/api.service.ts +0 -0
  187. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/services/base.service.ts +0 -0
  188. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/services/token.ts +0 -0
  189. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/src/vite-env.d.ts +0 -0
  190. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/tsconfig.app.json +0 -0
  191. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/tsconfig.json +0 -0
  192. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/tsconfig.node.json +0 -0
  193. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_admin/vite.config.ts +0 -0
  194. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/App.css +0 -0
  195. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/CLAUDE.md +0 -0
  196. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/__init__.py +0 -0
  197. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/index.css +0 -0
  198. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/knowledge/knowledge_description.md +0 -0
  199. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/knowledge/knowledge_design_pattern.md +0 -0
  200. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/knowledge/knowledge_structure.md +0 -0
  201. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/main.py +0 -0
  202. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/package.json +0 -0
  203. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/src/App.tsx +0 -0
  204. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/src/components/Header.tsx +0 -0
  205. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/src/main.tsx +0 -0
  206. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/src/services/api.ts +0 -0
  207. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/src/utils/constants.ts +0 -0
  208. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/src/vite-env.d.ts +0 -0
  209. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/tsconfig.app.json +0 -0
  210. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/tsconfig.json +0 -0
  211. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/tsconfig.node.json +0 -0
  212. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/templates/react_structure/vite.config.ts +0 -0
  213. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/ui/__init__.py +0 -0
  214. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/ui/app.py +0 -0
  215. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/utils/__init__.py +0 -0
  216. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/utils/environment.py +0 -0
  217. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/utils/output.py +0 -0
  218. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/utils/prompts.py +0 -0
  219. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/utils/shell.py +0 -0
  220. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/utils/validation.py +0 -0
  221. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/wizard.py +0 -0
  222. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/workspace/__init__.py +0 -0
  223. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/workspace/clean.py +0 -0
  224. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/workspace/config.py +0 -0
  225. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/workspace/create.py +0 -0
  226. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/workspace/setup.py +0 -0
  227. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc/workspace/start.py +0 -0
  228. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc_dev_kit.egg-info/dependency_links.txt +0 -0
  229. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc_dev_kit.egg-info/entry_points.txt +0 -0
  230. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/ntc_dev_kit.egg-info/top_level.txt +0 -0
  231. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/requirements.txt +0 -0
  232. {ntc_dev_kit-1.3.0 → ntc_dev_kit-1.3.1}/setup.cfg +0 -0
@@ -3,7 +3,7 @@ include LICENSE
3
3
  include requirements.txt
4
4
  recursive-include ntc/templates *.py *.json *.md *.txt *.html *.ts *.tsx *.css *.scss *.yml *.yaml *.sh *.conf *.cfg
5
5
  recursive-include ntc/templates *.env.example *.gitignore
6
- recursive-include ntc/templates *.js *.mjs *.dart Dockerfile captain-definition
6
+ recursive-include ntc/templates *.js *.mjs *.dart *.svg *.png *.ico Dockerfile captain-definition
7
7
 
8
8
  global-exclude __pycache__
9
9
  global-exclude *.py[co]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ntc-dev-kit
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Summary: Nexent Toolkit Console - A CLI tool for scaffolding Django REST Framework, React, Next.js, and Flutter projects
5
5
  Home-page: https://github.com/nexent/ntc
6
6
  Author: Nexent
@@ -26,7 +26,7 @@ Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
27
  Requires-Dist: colorama>=0.4.6
28
28
  Requires-Dist: pyyaml>=6.0
29
- Requires-Dist: textual>=0.47.0
29
+ Requires-Dist: textual>=1.0
30
30
  Requires-Dist: tomli>=2.0; python_version < "3.11"
31
31
  Provides-Extra: dev
32
32
  Requires-Dist: build>=1.0; extra == "dev"
@@ -159,8 +159,12 @@ ntc clean --deep # also node_modules and Python environments
159
159
  ntc add # another app, wired in like the rest
160
160
  ```
161
161
 
162
- In `ntc start`: **1-9** (or the tabs) switch app, **0** shows all, **r** restarts, **s** stops or
163
- starts, **o** opens it in the browser, **i** types into it (Flutter's `r` hot reload), **q** quits
162
+ In `ntc start`, **All** is a grid of up to four terminals, one per app (**[** and **]** page
163
+ through more), with each app's port and status on its border and its output colour-coded: errors
164
+ red, warnings amber, ready/compiled green, HTTP status codes by class. **Tab** moves between the
165
+ terminals and the keys act on the focused one: **r** restarts, **s** stops or starts, **o** opens
166
+ it in the browser, **i** types into it (Flutter's `r` hot reload), **c** clears, **Enter** opens it
167
+ full screen (**Esc** comes back). **1-9** jump to an app's own tab, **0** back to all, **q** quits
164
168
  and stops everything. Apps wait for the ones they `need` (the backend) before starting, and a port
165
169
  that's already taken is reported instead of crashing.
166
170
 
@@ -118,8 +118,12 @@ ntc clean --deep # also node_modules and Python environments
118
118
  ntc add # another app, wired in like the rest
119
119
  ```
120
120
 
121
- In `ntc start`: **1-9** (or the tabs) switch app, **0** shows all, **r** restarts, **s** stops or
122
- starts, **o** opens it in the browser, **i** types into it (Flutter's `r` hot reload), **q** quits
121
+ In `ntc start`, **All** is a grid of up to four terminals, one per app (**[** and **]** page
122
+ through more), with each app's port and status on its border and its output colour-coded: errors
123
+ red, warnings amber, ready/compiled green, HTTP status codes by class. **Tab** moves between the
124
+ terminals and the keys act on the focused one: **r** restarts, **s** stops or starts, **o** opens
125
+ it in the browser, **i** types into it (Flutter's `r` hot reload), **c** clears, **Enter** opens it
126
+ full screen (**Esc** comes back). **1-9** jump to an app's own tab, **0** back to all, **q** quits
123
127
  and stops everything. Apps wait for the ones they `need` (the backend) before starting, and a port
124
128
  that's already taken is reported instead of crashing.
125
129
 
@@ -1,5 +1,5 @@
1
1
  """NTC - Nexent Toolkit Console."""
2
2
 
3
- __version__ = "1.3.0"
3
+ __version__ = "1.3.1"
4
4
  __author__ = "Nexent"
5
5
  __license__ = "MIT"
@@ -8,3 +8,9 @@ NEXT_PUBLIC_SITE_URL=http://localhost:3000
8
8
  # SEO Configuration
9
9
  NEXT_PUBLIC_SITE_DESCRIPTION=A modern website built with Next.js
10
10
  NEXT_PUBLIC_SITE_KEYWORDS=nextjs,react,typescript
11
+
12
+ # Search engines: true on staging/preview copies (robots.txt then disallows everything)
13
+ NEXT_PUBLIC_NOINDEX=false
14
+ # Search console verification codes (leave empty to add no tag)
15
+ NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=
16
+ NEXT_PUBLIC_BING_SITE_VERIFICATION=
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="32" height="32"><rect width="64" height="64" rx="14" fill="#0f172a"/><path d="M20 44V20h6l12 15V20h6v24h-6L26 29v15z" fill="#fff"/></svg>
@@ -0,0 +1,19 @@
1
+ import type { Metadata } from 'next'
2
+ import { SITE_NAME } from '@/utils/constants'
3
+
4
+ export const metadata: Metadata = {
5
+ title: 'About',
6
+ description: `About ${SITE_NAME}.`,
7
+ alternates: { canonical: '/about' },
8
+ }
9
+
10
+ export default function About() {
11
+ return (
12
+ <section className="page">
13
+ <div className="container prose">
14
+ <h1>About {SITE_NAME}</h1>
15
+ <p>Tell visitors who you are, what you do and why it matters.</p>
16
+ </div>
17
+ </section>
18
+ )
19
+ }
@@ -0,0 +1,21 @@
1
+ import type { Metadata } from 'next'
2
+ import { SITE_NAME } from '@/utils/constants'
3
+
4
+ export const metadata: Metadata = {
5
+ title: 'Contact',
6
+ description: `Get in touch with ${SITE_NAME}.`,
7
+ alternates: { canonical: '/contact' },
8
+ }
9
+
10
+ export default function Contact() {
11
+ return (
12
+ <section className="page">
13
+ <div className="container prose">
14
+ <h1>Contact</h1>
15
+ <p>
16
+ Email us at <a href="mailto:hello@example.com">hello@example.com</a> and we&apos;ll get back to you.
17
+ </p>
18
+ </div>
19
+ </section>
20
+ )
21
+ }
@@ -0,0 +1,20 @@
1
+ 'use client'
2
+
3
+ import { useEffect } from 'react'
4
+
5
+ // Shown when a page throws while rendering. The header and footer (the layout) stay.
6
+ export default function Error({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {
7
+ useEffect(() => {
8
+ console.error(error)
9
+ }, [error])
10
+
11
+ return (
12
+ <section className="page">
13
+ <div className="container prose">
14
+ <h1>Something went wrong</h1>
15
+ <p>Please try again. If it keeps happening, let us know.</p>
16
+ <p><button className="button" onClick={() => reset()}>Try again</button></p>
17
+ </div>
18
+ </section>
19
+ )
20
+ }
@@ -0,0 +1,198 @@
1
+ /* Base styles sit in the base layer, so utility classes (e.g. Tailwind's, if added) override them
2
+ instead of losing to unlayered CSS. */
3
+ @layer base {
4
+ :root {
5
+ --text: #0f172a;
6
+ --muted: #475569;
7
+ --background: #ffffff;
8
+ --surface: #f8fafc;
9
+ --border: #e2e8f0;
10
+ --accent: #0f172a;
11
+ --accent-text: #ffffff;
12
+ }
13
+
14
+ * {
15
+ box-sizing: border-box;
16
+ padding: 0;
17
+ margin: 0;
18
+ }
19
+
20
+ html,
21
+ body {
22
+ max-width: 100vw;
23
+ overflow-x: hidden;
24
+ }
25
+
26
+ body {
27
+ min-height: 100vh;
28
+ display: flex;
29
+ flex-direction: column;
30
+ background: var(--background);
31
+ color: var(--text);
32
+ line-height: 1.6;
33
+ -webkit-font-smoothing: antialiased;
34
+ -moz-osx-font-smoothing: grayscale;
35
+ }
36
+
37
+ main {
38
+ flex: 1;
39
+ }
40
+
41
+ a {
42
+ color: inherit;
43
+ text-decoration: none;
44
+ }
45
+
46
+ img {
47
+ max-width: 100%;
48
+ height: auto;
49
+ }
50
+ }
51
+
52
+ @layer components {
53
+ .container {
54
+ width: 100%;
55
+ max-width: 1120px;
56
+ margin: 0 auto;
57
+ padding: 0 1.25rem;
58
+ }
59
+
60
+ .skip-link {
61
+ position: absolute;
62
+ left: -9999px;
63
+ }
64
+
65
+ .skip-link:focus {
66
+ left: 1rem;
67
+ top: 1rem;
68
+ padding: 0.5rem 1rem;
69
+ background: var(--accent);
70
+ color: var(--accent-text);
71
+ z-index: 10;
72
+ }
73
+
74
+ .site-header {
75
+ border-bottom: 1px solid var(--border);
76
+ }
77
+
78
+ .nav {
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: space-between;
82
+ gap: 1rem;
83
+ min-height: 4rem;
84
+ }
85
+
86
+ .brand {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 0.6rem;
90
+ font-weight: 700;
91
+ font-size: 1.1rem;
92
+ }
93
+
94
+ .nav ul {
95
+ display: flex;
96
+ gap: 1.5rem;
97
+ list-style: none;
98
+ }
99
+
100
+ .nav ul a {
101
+ color: var(--muted);
102
+ }
103
+
104
+ .nav ul a:hover {
105
+ color: var(--text);
106
+ }
107
+
108
+ .hero {
109
+ padding: 6rem 0;
110
+ background: var(--surface);
111
+ }
112
+
113
+ .hero h1 {
114
+ font-size: clamp(2.25rem, 6vw, 3.5rem);
115
+ line-height: 1.1;
116
+ }
117
+
118
+ .lead {
119
+ margin-top: 1rem;
120
+ max-width: 40rem;
121
+ font-size: 1.2rem;
122
+ color: var(--muted);
123
+ }
124
+
125
+ .actions {
126
+ display: flex;
127
+ flex-wrap: wrap;
128
+ gap: 0.75rem;
129
+ margin-top: 2rem;
130
+ }
131
+
132
+ .button {
133
+ display: inline-block;
134
+ padding: 0.7rem 1.3rem;
135
+ border: 1px solid var(--accent);
136
+ border-radius: 0.5rem;
137
+ background: var(--accent);
138
+ color: var(--accent-text);
139
+ font: inherit;
140
+ font-weight: 600;
141
+ cursor: pointer;
142
+ }
143
+
144
+ .button-secondary {
145
+ background: transparent;
146
+ color: var(--accent);
147
+ }
148
+
149
+ .page {
150
+ padding: 4rem 0;
151
+ }
152
+
153
+ .prose h1 {
154
+ font-size: 2.25rem;
155
+ line-height: 1.2;
156
+ margin-bottom: 1rem;
157
+ }
158
+
159
+ .prose p + p {
160
+ margin-top: 1rem;
161
+ }
162
+
163
+ .prose a:not(.button) {
164
+ text-decoration: underline;
165
+ }
166
+
167
+ .spinner {
168
+ width: 2rem;
169
+ height: 2rem;
170
+ border: 3px solid var(--border);
171
+ border-top-color: var(--accent);
172
+ border-radius: 50%;
173
+ animation: spin 0.8s linear infinite;
174
+ }
175
+
176
+ .site-footer {
177
+ padding: 2rem 0;
178
+ border-top: 1px solid var(--border);
179
+ color: var(--muted);
180
+ font-size: 0.9rem;
181
+ }
182
+
183
+ @media (max-width: 640px) {
184
+ .nav ul {
185
+ gap: 1rem;
186
+ }
187
+
188
+ .hero {
189
+ padding: 4rem 0;
190
+ }
191
+ }
192
+ }
193
+
194
+ @keyframes spin {
195
+ to {
196
+ transform: rotate(360deg);
197
+ }
198
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#0f172a"/><path d="M20 44V20h6l12 15V20h6v24h-6L26 29v15z" fill="#fff"/></svg>
@@ -0,0 +1,66 @@
1
+ import type { Metadata, Viewport } from 'next'
2
+ import { Inter } from 'next/font/google'
3
+ import Footer from '@/components/Footer'
4
+ import Header from '@/components/Header'
5
+ import { SITE_DESCRIPTION, SITE_KEYWORDS, SITE_NAME, SITE_URL } from '@/utils/constants'
6
+ import './globals.css'
7
+
8
+ const inter = Inter({ subsets: ['latin'] })
9
+
10
+ // Search-console verification tags only when the codes are set: empty ones are invalid markup.
11
+ const verification: Metadata['verification'] = {}
12
+ if (process.env.NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION) verification.google = process.env.NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION
13
+ if (process.env.NEXT_PUBLIC_BING_SITE_VERIFICATION) verification.other = { 'msvalidate.01': process.env.NEXT_PUBLIC_BING_SITE_VERIFICATION }
14
+
15
+ export const metadata: Metadata = {
16
+ metadataBase: new URL(SITE_URL),
17
+ // Pages set just their own title ("About"); this turns it into "About · Site name".
18
+ title: { default: SITE_NAME, template: `%s · ${SITE_NAME}` },
19
+ description: SITE_DESCRIPTION,
20
+ keywords: SITE_KEYWORDS,
21
+ applicationName: SITE_NAME,
22
+ authors: [{ name: SITE_NAME }],
23
+ creator: SITE_NAME,
24
+ publisher: SITE_NAME,
25
+ // The social image is src/app/opengraph-image.tsx; the favicon is src/app/icon.svg.
26
+ openGraph: {
27
+ type: 'website',
28
+ locale: 'en_US',
29
+ url: SITE_URL,
30
+ siteName: SITE_NAME,
31
+ title: SITE_NAME,
32
+ description: SITE_DESCRIPTION,
33
+ },
34
+ twitter: {
35
+ card: 'summary_large_image',
36
+ title: SITE_NAME,
37
+ description: SITE_DESCRIPTION,
38
+ },
39
+ robots: {
40
+ index: true,
41
+ follow: true,
42
+ googleBot: { index: true, follow: true, 'max-video-preview': -1, 'max-image-preview': 'large', 'max-snippet': -1 },
43
+ },
44
+ verification,
45
+ }
46
+
47
+ export const viewport: Viewport = {
48
+ themeColor: '#0f172a',
49
+ width: 'device-width',
50
+ initialScale: 1,
51
+ }
52
+
53
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
54
+ return (
55
+ // No <link rel="canonical"> here: in the root layout it would name the home page as the
56
+ // canonical URL of every page. Each page sets its own with `alternates: { canonical: '/path' }`.
57
+ <html lang="en">
58
+ <body className={inter.className}>
59
+ <a className="skip-link" href="#content">Skip to content</a>
60
+ <Header />
61
+ <main id="content">{children}</main>
62
+ <Footer />
63
+ </body>
64
+ </html>
65
+ )
66
+ }
@@ -0,0 +1,10 @@
1
+ // Shown while a page's data loads (server components that await).
2
+ export default function Loading() {
3
+ return (
4
+ <section className="page" aria-busy="true">
5
+ <div className="container">
6
+ <div className="spinner" role="status" aria-label="Loading" />
7
+ </div>
8
+ </section>
9
+ )
10
+ }
@@ -0,0 +1,16 @@
1
+ import type { MetadataRoute } from 'next'
2
+ import { SITE_DESCRIPTION, SITE_NAME } from '@/utils/constants'
3
+
4
+ // /manifest.webmanifest: name and icon when the site is added to a phone's home screen.
5
+ export default function manifest(): MetadataRoute.Manifest {
6
+ return {
7
+ name: SITE_NAME,
8
+ short_name: SITE_NAME,
9
+ description: SITE_DESCRIPTION,
10
+ start_url: '/',
11
+ display: 'standalone',
12
+ background_color: '#ffffff',
13
+ theme_color: '#0f172a',
14
+ icons: [{ src: '/icon.svg', sizes: 'any', type: 'image/svg+xml' }],
15
+ }
16
+ }
@@ -0,0 +1,19 @@
1
+ import type { Metadata } from 'next'
2
+ import Link from 'next/link'
3
+
4
+ export const metadata: Metadata = {
5
+ title: 'Page not found',
6
+ robots: { index: false },
7
+ }
8
+
9
+ export default function NotFound() {
10
+ return (
11
+ <section className="page">
12
+ <div className="container prose">
13
+ <h1>Page not found</h1>
14
+ <p>The page you&apos;re looking for doesn&apos;t exist or has moved.</p>
15
+ <p><Link className="button" href="/">Back to the home page</Link></p>
16
+ </div>
17
+ </section>
18
+ )
19
+ }
@@ -0,0 +1,25 @@
1
+ import { ImageResponse } from 'next/og'
2
+ import { SITE_DESCRIPTION, SITE_NAME } from '@/utils/constants'
3
+
4
+ // The picture shown when a link to the site is shared (Open Graph / Twitter cards). Generated at
5
+ // build time; replace it with a designed image by putting opengraph-image.png here instead.
6
+ export const alt = SITE_NAME
7
+ export const size = { width: 1200, height: 630 }
8
+ export const contentType = 'image/png'
9
+
10
+ export default function OpengraphImage() {
11
+ return new ImageResponse(
12
+ (
13
+ <div
14
+ style={{
15
+ width: '100%', height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'center',
16
+ padding: '80px', background: '#0f172a', color: '#ffffff',
17
+ }}
18
+ >
19
+ <div style={{ fontSize: 80, fontWeight: 700 }}>{SITE_NAME}</div>
20
+ <div style={{ fontSize: 36, marginTop: 24, color: '#cbd5e1' }}>{SITE_DESCRIPTION}</div>
21
+ </div>
22
+ ),
23
+ size,
24
+ )
25
+ }
@@ -0,0 +1,23 @@
1
+ import type { Metadata } from 'next'
2
+ import Link from 'next/link'
3
+ import { SITE_DESCRIPTION, SITE_NAME } from '@/utils/constants'
4
+
5
+ // No title: the home page uses the site name itself (the layout's default).
6
+ export const metadata: Metadata = {
7
+ alternates: { canonical: '/' },
8
+ }
9
+
10
+ export default function Home() {
11
+ return (
12
+ <section className="hero">
13
+ <div className="container">
14
+ <h1>{SITE_NAME}</h1>
15
+ <p className="lead">{SITE_DESCRIPTION}</p>
16
+ <div className="actions">
17
+ <Link className="button" href="/contact">Get in touch</Link>
18
+ <Link className="button button-secondary" href="/about">Learn more</Link>
19
+ </div>
20
+ </div>
21
+ </section>
22
+ )
23
+ }
@@ -0,0 +1,14 @@
1
+ import type { MetadataRoute } from 'next'
2
+ import { SITE_URL } from '@/utils/constants'
3
+
4
+ // /robots.txt. Outside production (NEXT_PUBLIC_SITE_URL still localhost, a staging host...) set
5
+ // NEXT_PUBLIC_NOINDEX=true so search engines don't index a copy of the site.
6
+ export default function robots(): MetadataRoute.Robots {
7
+ if (process.env.NEXT_PUBLIC_NOINDEX === 'true') {
8
+ return { rules: { userAgent: '*', disallow: '/' } }
9
+ }
10
+ return {
11
+ rules: { userAgent: '*', allow: '/' },
12
+ sitemap: `${SITE_URL}/sitemap.xml`,
13
+ }
14
+ }
@@ -0,0 +1,12 @@
1
+ import type { MetadataRoute } from 'next'
2
+ import { PAGES, SITE_URL } from '@/utils/constants'
3
+
4
+ // /sitemap.xml: the pages in PAGES. Pages built from data (articles, products) are added here too,
5
+ // e.g. by fetching their slugs from the API.
6
+ export default function sitemap(): MetadataRoute.Sitemap {
7
+ return PAGES.map((page) => ({
8
+ url: `${SITE_URL}${page.path === '/' ? '' : page.path}`,
9
+ changeFrequency: 'monthly' as const,
10
+ priority: page.path === '/' ? 1 : 0.7,
11
+ }))
12
+ }
@@ -0,0 +1,11 @@
1
+ import { SITE_NAME } from '@/utils/constants'
2
+
3
+ export default function Footer() {
4
+ return (
5
+ <footer className="site-footer">
6
+ <div className="container">
7
+ © {new Date().getFullYear()} {SITE_NAME}
8
+ </div>
9
+ </footer>
10
+ )
11
+ }
@@ -0,0 +1,24 @@
1
+ import Image from 'next/image'
2
+ import Link from 'next/link'
3
+ import { PAGES, SITE_NAME } from '@/utils/constants'
4
+
5
+ export default function Header() {
6
+ return (
7
+ <header className="site-header">
8
+ <nav className="container nav" aria-label="Main">
9
+ {/* Not an <h1>: each page has its own, and a page should have one. */}
10
+ <Link href="/" className="brand">
11
+ <Image src="/logo.svg" alt="" width={32} height={32} priority />
12
+ <span>{SITE_NAME}</span>
13
+ </Link>
14
+ <ul>
15
+ {PAGES.map((page) => (
16
+ <li key={page.path}>
17
+ <Link href={page.path}>{page.label}</Link>
18
+ </li>
19
+ ))}
20
+ </ul>
21
+ </nav>
22
+ </header>
23
+ )
24
+ }
@@ -0,0 +1,16 @@
1
+ // The ntc Django template serves its API under /api/v1/.
2
+ export const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:8000/api/v1'
3
+
4
+ // The site itself: used by the layout's metadata, robots.txt, the sitemap, the manifest and the
5
+ // social image. Set them per environment in .env.local / the deployment's variables.
6
+ export const SITE_NAME = process.env.NEXT_PUBLIC_SITE_NAME || '{project_name}'
7
+ export const SITE_URL = (process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000').replace(/\/$/, '')
8
+ export const SITE_DESCRIPTION = process.env.NEXT_PUBLIC_SITE_DESCRIPTION || 'A modern website built with Next.js'
9
+ export const SITE_KEYWORDS = (process.env.NEXT_PUBLIC_SITE_KEYWORDS || 'nextjs,react,typescript').split(',')
10
+
11
+ // The pages in the header and the sitemap. Add a page here when you add one under src/app/.
12
+ export const PAGES = [
13
+ { path: '/', label: 'Home' },
14
+ { path: '/about', label: 'About' },
15
+ { path: '/contact', label: 'Contact' },
16
+ ]