difflicious 0.11.0__tar.gz → 0.12.0__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 (188) hide show
  1. difflicious-0.12.0/.github/workflows/pages.yml +39 -0
  2. {difflicious-0.11.0 → difflicious-0.12.0}/CHANGELOG.md +15 -2
  3. {difflicious-0.11.0 → difflicious-0.12.0}/CLAUDE.md +2 -1
  4. difflicious-0.12.0/CONTRIBUTING.md +8 -0
  5. difflicious-0.11.0/CONTRIBUTING.md → difflicious-0.12.0/DEVELOPING.md +6 -36
  6. {difflicious-0.11.0 → difflicious-0.12.0}/INSTALLATION.md +18 -5
  7. difflicious-0.12.0/PKG-INFO +112 -0
  8. difflicious-0.12.0/README.md +74 -0
  9. difflicious-0.12.0/docs/plans/2026-04-12-presentation-layer-separation.md +1823 -0
  10. difflicious-0.12.0/docs/presentation-layer-separation.md +184 -0
  11. difflicious-0.12.0/docs/screenshots/.gitkeep +1 -0
  12. difflicious-0.12.0/docs/screenshots/dark.png +0 -0
  13. difflicious-0.12.0/docs/screenshots/light.png +0 -0
  14. difflicious-0.12.0/docs/site/_config.yml +6 -0
  15. difflicious-0.12.0/docs/site/assets/logo.png +0 -0
  16. difflicious-0.12.0/docs/site/index.md +14 -0
  17. {difflicious-0.11.0 → difflicious-0.12.0}/pyproject.toml +2 -0
  18. difflicious-0.12.0/scripts/screenshot.py +259 -0
  19. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/__init__.py +1 -1
  20. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/app.py +16 -12
  21. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/auto_reload_routes.py +3 -2
  22. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/views.py +1 -2
  23. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/template_service.py +6 -23
  24. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/css/styles.css +130 -1
  25. difflicious-0.12.0/src/difflicious/static/css/tailwind.css +1 -0
  26. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/alpine-init.js +2 -0
  27. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/main.js +2 -48
  28. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/auto-reload.js +3 -5
  29. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/context-expansion-ui.js +4 -4
  30. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/full-diff.js +4 -4
  31. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/hunk-operations.js +13 -13
  32. difflicious-0.12.0/src/difflicious/static/js/modules/toolbar.js +52 -0
  33. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/stores/diffStore.js +49 -2
  34. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/stores/themeStore.js +7 -22
  35. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/base.html +25 -0
  36. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/diff_file.html +32 -30
  37. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/diff_groups.html +6 -6
  38. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/diff_hunk.html +30 -22
  39. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/global_controls.html +4 -4
  40. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/toolbar.html +10 -128
  41. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/auto-reload.test.js +1 -1
  42. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/context-expansion-ui.test.js +6 -6
  43. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/context-expansion.test.js +5 -5
  44. difflicious-0.12.0/tests/js/diffStore-actions.test.js +83 -0
  45. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/full-diff.test.js +1 -1
  46. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/stores/themeStore.test.js +13 -18
  47. difflicious-0.12.0/tests/js/toolbar.test.js +42 -0
  48. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_template_service.py +73 -22
  49. {difflicious-0.11.0 → difflicious-0.12.0}/uv.lock +59 -1
  50. difflicious-0.11.0/PKG-INFO +0 -213
  51. difflicious-0.11.0/README.md +0 -176
  52. difflicious-0.11.0/src/difflicious/static/css/tailwind.css +0 -1
  53. difflicious-0.11.0/src/difflicious/static/js/modules/file-operations.js +0 -177
  54. difflicious-0.11.0/src/difflicious/static/js/modules/state.js +0 -277
  55. {difflicious-0.11.0 → difflicious-0.12.0}/.dockerignore +0 -0
  56. {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/auto-release.yml +0 -0
  57. {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/ci.yml +0 -0
  58. {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/docker-publish.yml +0 -0
  59. {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/pypi-publish.yml +0 -0
  60. {difflicious-0.11.0 → difflicious-0.12.0}/.gitignore +0 -0
  61. {difflicious-0.11.0 → difflicious-0.12.0}/AGENTS.md +0 -0
  62. {difflicious-0.11.0 → difflicious-0.12.0}/Dockerfile +0 -0
  63. {difflicious-0.11.0 → difflicious-0.12.0}/LICENSE +0 -0
  64. {difflicious-0.11.0 → difflicious-0.12.0}/PLAN.md +0 -0
  65. {difflicious-0.11.0 → difflicious-0.12.0}/cilicious.sh +0 -0
  66. {difflicious-0.11.0 → difflicious-0.12.0}/docs/2025-11-18-alpine-component-architecture.md +0 -0
  67. {difflicious-0.11.0 → difflicious-0.12.0}/docs/CSS-STYLE-GUIDE.md +0 -0
  68. {difflicious-0.11.0 → difflicious-0.12.0}/docs/TROUBLESHOOTING.md +0 -0
  69. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-08-03-1009-claude-fixing-uncommon-off-by-one-error.md +0 -0
  70. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-08-19-1925-expandable-context.md +0 -0
  71. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-08-19-1925-troubleshooting-context-expansion-2025-07-29.md +0 -0
  72. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-11-18-alpine-js-migration-progress.md +0 -0
  73. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-11-18-alpine-js-migration-status.md +0 -0
  74. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/prompts/2025-08-19-1934-phase-1-css-foundation-dark-theme.md +0 -0
  75. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-29-1916-code-structure-refactoring-recommendations.md +0 -0
  76. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-29-1917-extract-context-expansion-module.md +0 -0
  77. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-29-1918-extract-business-logic-service-layer.md +0 -0
  78. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-30-1701-jinja2-server-side-diff-rendering.md +0 -0
  79. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-30-1730-virtual-scrolling-lazy-rendering.md +0 -0
  80. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-03-2106-typescript-migration-plan.md +0 -0
  81. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-04-2130-simplify-diff-logic-and-ui.md +0 -0
  82. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-18-1954-font-configuration-proposal.md +0 -0
  83. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-18-1954-font-implementation-plan.md +0 -0
  84. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-18-1954-font-implementation-summary.md +0 -0
  85. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-19-1430-dark-light-mode-implementation.md +0 -0
  86. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-11-18-0130-alpine-js-dom-manipulation.md +0 -0
  87. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-07-29-2100-context-expansion-extraction-report.md +0 -0
  88. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-07-30-1647-diff-rendering-performance-analysis.md +0 -0
  89. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-07-30-1655-backend-migration-performance-analysis.md +0 -0
  90. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-08-18-1200-dead-code-analysis-report.md +0 -0
  91. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-09-22-1857-production-readiness-analysis.md +0 -0
  92. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-09-22-1949-ui-css-cleanup-analysis.md +0 -0
  93. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-30-2201-production-readiness-update.md +0 -0
  94. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-31-1253-test-coverage-analysis.md +0 -0
  95. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-31-1718-test-coverage-improvement-summary.md +0 -0
  96. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-31-1720-0.9-release-plan.md +0 -0
  97. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-05-1857-css-rationalization-analysis.md +0 -0
  98. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-05-2019-color-audit.md +0 -0
  99. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-05-2019-phase2-implementation-plan.md +0 -0
  100. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-17-1730-codebase-improvements-analysis.md +0 -0
  101. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2026-02-05-v1.0-release-readiness-audit.md +0 -0
  102. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-27-1256-project-setup-and-modern-python-packaging.md +0 -0
  103. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-27-1415-git-integration-and-security-implementation.md +0 -0
  104. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-27-1820-diff-parser-and-side-by-side-ui.md +0 -0
  105. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-28-0953-syntax-highlighting-implementation.md +0 -0
  106. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-28-1500-commit-comparison-and-ui-enhancements.md +0 -0
  107. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-28-1805-untracked-files-implementation-and-bugfix.md +0 -0
  108. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-31-1730-pygments-syntax-highlighting.compacted.md +0 -0
  109. {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-11-18-0130-alpine-js-migration-implementation.md +0 -0
  110. {difflicious-0.11.0 → difflicious-0.12.0}/docs/javascript-modularization-plan.md +0 -0
  111. {difflicious-0.11.0 → difflicious-0.12.0}/docs/plans/2025-07-29-1015-expandable-context-feature.md +0 -0
  112. {difflicious-0.11.0 → difflicious-0.12.0}/docs/plans/2025-11-04-2318-gitpython-migration-plan.md +0 -0
  113. {difflicious-0.11.0 → difflicious-0.12.0}/docs/plans/2025-11-22-1.0-release-execution-plan.md +0 -0
  114. {difflicious-0.11.0 → difflicious-0.12.0}/docs/reference/app.js.reference +0 -0
  115. {difflicious-0.11.0 → difflicious-0.12.0}/docs/reference/diff-interactions.js.reference +0 -0
  116. {difflicious-0.11.0 → difflicious-0.12.0}/docs/tailwind-design-system.md +0 -0
  117. {difflicious-0.11.0 → difflicious-0.12.0}/package-lock.json +0 -0
  118. {difflicious-0.11.0 → difflicious-0.12.0}/package.json +0 -0
  119. {difflicious-0.11.0 → difflicious-0.12.0}/pnpm-lock.yaml +0 -0
  120. {difflicious-0.11.0 → difflicious-0.12.0}/postcss.config.cjs +0 -0
  121. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/__init__.py +0 -0
  122. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/context_routes.py +0 -0
  123. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/diff_routes.py +0 -0
  124. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/git_routes.py +0 -0
  125. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/helpers.py +0 -0
  126. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/cli.py +0 -0
  127. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/config.py +0 -0
  128. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/diff_parser.py +0 -0
  129. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/dummy_data.json +0 -0
  130. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/git_operations.py +0 -0
  131. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/__init__.py +0 -0
  132. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/base_service.py +0 -0
  133. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/diff_service.py +0 -0
  134. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/dtos.py +0 -0
  135. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/exceptions.py +0 -0
  136. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/file_watcher.py +0 -0
  137. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/git_service.py +0 -0
  138. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/syntax_service.py +0 -0
  139. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/css/tailwind.input.css +0 -0
  140. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/data/language_map.json +0 -0
  141. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/fileComponent.js +0 -0
  142. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/groupComponent.js +0 -0
  143. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/hunkComponent.js +0 -0
  144. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/searchComponent.js +0 -0
  145. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/context-expansion.js +0 -0
  146. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/design-system.js +0 -0
  147. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/dom-utils.js +0 -0
  148. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/navigation.js +0 -0
  149. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/search.js +0 -0
  150. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/theme.js +0 -0
  151. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/stores/searchStore.js +0 -0
  152. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/index.html +0 -0
  153. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/empty_state.html +0 -0
  154. {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/loading_state.html +0 -0
  155. {difflicious-0.11.0 → difflicious-0.12.0}/tailwind.config.cjs +0 -0
  156. {difflicious-0.11.0 → difflicious-0.12.0}/tests/__init__.py +0 -0
  157. {difflicious-0.11.0 → difflicious-0.12.0}/tests/conftest.py +0 -0
  158. {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/conftest.py +0 -0
  159. {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/test_api.py +0 -0
  160. {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/test_api_detailed.py +0 -0
  161. {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/test_frontend.py +0 -0
  162. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/components/fileComponent.test.js +0 -0
  163. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/components/groupComponent.test.js +0 -0
  164. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/components/hunkComponent.test.js +0 -0
  165. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/design-system.test.js +0 -0
  166. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/diff-state-persistence.test.js.old +0 -0
  167. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/dom-utils.test.js +0 -0
  168. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/navigation.test.js +0 -0
  169. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/search.test.js +0 -0
  170. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/setup.js +0 -0
  171. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/stores/diffStore.test.js +0 -0
  172. {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/stores/searchStore.test.js +0 -0
  173. {difflicious-0.11.0 → difflicious-0.12.0}/tests/sample_01.diff +0 -0
  174. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/__init__.py +0 -0
  175. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_base_service.py +0 -0
  176. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_diff_service.py +0 -0
  177. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_exceptions.py +0 -0
  178. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_file_watcher.py +0 -0
  179. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_git_service.py +0 -0
  180. {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_syntax_service.py +0 -0
  181. {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_app.py +0 -0
  182. {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_auto_reload_routes.py +0 -0
  183. {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_cli.py +0 -0
  184. {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_git_operations.py +0 -0
  185. {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_diff_parser_line_count.py +0 -0
  186. {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_diff_parser_side_by_side.py +0 -0
  187. {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_diff_rendering.py +0 -0
  188. {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_parser.py +0 -0
@@ -0,0 +1,39 @@
1
+ name: Deploy GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "docs/site/**"
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+ pages: write
13
+ id-token: write
14
+
15
+ concurrency:
16
+ group: "pages"
17
+ cancel-in-progress: false
18
+
19
+ jobs:
20
+ build:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: actions/configure-pages@v5
25
+ - uses: actions/jekyll-build-pages@v1
26
+ with:
27
+ source: ./docs/site
28
+ destination: ./_site
29
+ - uses: actions/upload-pages-artifact@v3
30
+
31
+ deploy:
32
+ environment:
33
+ name: github-pages
34
+ url: ${{ steps.deployment.outputs.page_url }}
35
+ runs-on: ubuntu-latest
36
+ needs: build
37
+ steps:
38
+ - id: deployment
39
+ uses: actions/deploy-pages@v4
@@ -5,10 +5,23 @@ All notable changes to difflicious will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [0.11.0] - 2026-02-28
8
+ ## [0.12.0] - 2026-04-14
9
+
10
+ ### Presentation Layer Separation
11
+
12
+ Enforced explicit contracts between the data, service, template, CSS, and JS layers. Full design rationale in [`docs/presentation-layer-separation.md`](docs/presentation-layer-separation.md).
9
13
 
10
14
  ### Changed
11
- - Pipeline test releaseverifying PyPI and Docker Hub publishing workflows
15
+ - **Removed dual state**deleted `state.js` and `file-operations.js`; `diffStore` is now the single source of truth for expansion state
16
+ - **Template→JS contract** — all JS query-hook CSS selectors prefixed `js-` (e.g. `js-hunk`, `js-expansion-btn`) to distinguish them from styled classes
17
+ - **Template→CSS contract** — inline Tailwind colour utilities moved to semantic component classes (`.file-card`, `.file-card-header`, `.file-card-nav-btn`)
18
+ - **ThemeStore init** — reads initial theme from the server-rendered `data-theme` DOM attribute only; no redundant localStorage/matchMedia read on boot
19
+
20
+ ### Fixed
21
+ - **Flash of unstyled content** — added the missing `[x-cloak] { display: none !important }` CSS rule; every prior `x-cloak` attribute was inert without it
22
+ - **Flash of expansion state** — server now embeds repo name as `window.DIFFLICIOUS_REPO`; an inline pre-warming script reads localStorage before Alpine boots so the first render reflects saved state
23
+ - **File content animation** — removed vertical scale transform; transition is now a plain opacity fade
24
+ - **Ctrl+C shutdown** — SIGINT now triggers `os._exit(0)` matching the existing SIGTERM handler, so a single keypress exits cleanly regardless of open SSE connections
12
25
 
13
26
  ## [1.0.0] - 2026-02-06
14
27
 
@@ -535,7 +535,8 @@ The application is designed for multiple distribution channels:
535
535
  - `README.md` - User-facing documentation and installation instructions
536
536
  - `CLAUDE.md` - This file - AI assistant guidance and codebase overview
537
537
  - `PLAN.md` - Original project plan and technical decisions
538
- - `CONTRIBUTING.md` - Contribution guidelines
538
+ - `CONTRIBUTING.md` - Brief contribution pointer
539
+ - `DEVELOPING.md` - Full development setup, workflow, and conventions
539
540
  - `CHANGELOG.md` - Version history and changes
540
541
  - `INSTALLATION.md` - Installation and usage guide (PyPI, Docker, configuration)
541
542
 
@@ -0,0 +1,8 @@
1
+ # Contributing to Difflicious
2
+
3
+ Contributions are welcome. Please see [DEVELOPING.md](DEVELOPING.md) for:
4
+
5
+ - Development environment setup
6
+ - Running tests and quality checks
7
+ - Code style and conventions
8
+ - Submitting pull requests
@@ -1,36 +1,20 @@
1
- # Contributing to Difflicious
1
+ # Developing Difflicious
2
2
 
3
- Thank you for your interest in contributing to difflicious! This document provides guidelines and instructions for development setup and making contributions.
3
+ This document covers development environment setup, workflow, and code conventions.
4
4
 
5
5
  ## Table of Contents
6
6
 
7
- - [Getting Started](#getting-started)
8
- - [Development Setup](#development-setup)
7
+ - [Setup](#setup)
9
8
  - [Development Workflow](#development-workflow)
10
9
  - [Testing](#testing)
11
10
  - [Code Style](#code-style)
12
- - [Making Changes](#making-changes)
11
+ - [Commit Messages](#commit-messages)
13
12
  - [Submitting Changes](#submitting-changes)
14
13
  - [Releasing New Versions](#releasing-new-versions)
15
14
  - [Development Commands](#development-commands)
16
15
  - [Project Structure](#project-structure)
17
- - [Getting Help](#getting-help)
18
16
 
19
- ## Getting Started
20
-
21
- 1. **Fork the repository** on GitHub
22
- 2. **Clone your fork**:
23
- ```bash
24
- git clone https://github.com/YOUR_USERNAME/difflicious.git
25
- cd difflicious
26
- ```
27
- 3. **Add the upstream repository**:
28
- ```bash
29
- git remote add upstream https://github.com/insipid/difflicious.git
30
- ```
31
- 4. **Create a branch** for your changes
32
-
33
- ## Development Setup
17
+ ## Setup
34
18
 
35
19
  ### Prerequisites
36
20
 
@@ -217,9 +201,7 @@ This ensures:
217
201
  - All tests pass
218
202
  - Code is formatted correctly
219
203
 
220
- ## Making Changes
221
-
222
- ### Commit Messages
204
+ ## Commit Messages
223
205
 
224
206
  Write clear, descriptive commit messages:
225
207
 
@@ -482,15 +464,3 @@ difflicious/
482
464
  └── README.md # Project overview
483
465
  ```
484
466
 
485
- ## Getting Help
486
-
487
- If you need help:
488
- - **Check existing issues** on GitHub
489
- - **Open a new issue** with questions
490
- - **Ask in discussions** for non-urgent queries
491
- - **Check the README** for project overview
492
- - **Read existing code** for examples
493
-
494
- ## Thank You
495
-
496
- Contributions are what make open source great. Thank you for taking the time to contribute to difflicious!
@@ -207,9 +207,23 @@ docker-compose up
207
207
 
208
208
  ### Font Customization
209
209
 
210
- For the full list of fonts and examples, see the
211
- [README font customization section](../README.md#font-customization). The key
212
- configuration point is still the `DIFFLICIOUS_FONT` environment variable.
210
+ Set the `DIFFLICIOUS_FONT` environment variable to choose a programming font:
211
+
212
+ | Key | Font |
213
+ |-----|------|
214
+ | `jetbrains-mono` | JetBrains Mono (default) |
215
+ | `fira-code` | Fira Code |
216
+ | `source-code-pro` | Source Code Pro |
217
+ | `ibm-plex-mono` | IBM Plex Mono |
218
+ | `roboto-mono` | Roboto Mono |
219
+ | `inconsolata` | Inconsolata |
220
+
221
+ ```bash
222
+ DIFFLICIOUS_FONT=fira-code difflicious
223
+
224
+ # List all available fonts
225
+ difflicious --list-fonts
226
+ ```
213
227
 
214
228
  ### Disable Google Fonts
215
229
 
@@ -277,7 +291,6 @@ For more troubleshooting help, see [TROUBLESHOOTING.md](TROUBLESHOOTING.md).
277
291
 
278
292
  ## Next Steps
279
293
 
280
- - Learn how to [contribute](CONTRIBUTING.md) to difflicious
281
294
  - Check [troubleshooting](TROUBLESHOOTING.md) for common issues
282
295
  - Read the main [README](../README.md) for features
283
- - Explore the [development setup](CONTRIBUTING.md#development-setup) for hacking on difflicious
296
+ - Explore [DEVELOPING.md](../DEVELOPING.md) for development setup and workflow
@@ -0,0 +1,112 @@
1
+ Metadata-Version: 2.4
2
+ Name: difflicious
3
+ Version: 0.12.0
4
+ Summary: A sleek web-based git diff visualization tool for developers
5
+ Project-URL: Homepage, https://github.com/insipid/difflicious
6
+ Project-URL: Repository, https://github.com/insipid/difflicious
7
+ Project-URL: Issues, https://github.com/insipid/difflicious/issues
8
+ Project-URL: Documentation, https://github.com/insipid/difflicious#readme
9
+ Project-URL: Changelog, https://github.com/insipid/difflicious/blob/main/CHANGELOG.md
10
+ Author: Drew
11
+ License: MIT
12
+ License-File: LICENSE
13
+ Keywords: development,diff,git,visualization,web
14
+ Classifier: Development Status :: 5 - Production/Stable
15
+ Classifier: Environment :: Web Environment
16
+ Classifier: Framework :: Flask
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: License :: OSI Approved :: MIT License
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Topic :: Software Development :: Version Control :: Git
26
+ Classifier: Topic :: Text Processing :: General
27
+ Requires-Python: >=3.9
28
+ Requires-Dist: click<9.0,>=8.0.0
29
+ Requires-Dist: flask<3.0,>=2.3.0
30
+ Requires-Dist: gitpython<4.0,>=3.1.40
31
+ Requires-Dist: jinja-partials<1.0,>=0.2.0
32
+ Requires-Dist: markupsafe<3.0,>=2.1.0
33
+ Requires-Dist: pygments<3.0,>=2.17.0
34
+ Requires-Dist: unidiff<1.0,>=0.7.5
35
+ Requires-Dist: waitress>=3.0.0
36
+ Requires-Dist: watchdog<4.0,>=3.0.0
37
+ Description-Content-Type: text/markdown
38
+
39
+ # Difflicious
40
+
41
+ [![PyPI version](https://img.shields.io/pypi/v/difflicious.svg)](https://pypi.org/project/difflicious/)
42
+ [![Python versions](https://img.shields.io/pypi/pyversions/difflicious.svg)](https://pypi.org/project/difflicious/)
43
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
44
+
45
+ A local web application for reviewing git diffs. Run it in your working directory and view your changes in a browser with side-by-side visualization, syntax highlighting, and context expansion.
46
+
47
+ ## Screenshots
48
+
49
+ | Light mode | Dark mode |
50
+ |------------|-----------|
51
+ | ![Light mode](docs/screenshots/light.png) | ![Dark mode](docs/screenshots/dark.png) |
52
+
53
+ > To regenerate: `uv run python scripts/screenshot.py`
54
+ > Prerequisites: `uv add --dev playwright && uv run playwright install chromium`
55
+
56
+ ## Installation
57
+
58
+ ```bash
59
+ pip install difflicious
60
+ difflicious
61
+ ```
62
+
63
+ Open `http://localhost:5000` in your browser.
64
+
65
+ See [INSTALLATION.md](INSTALLATION.md) for Docker, source installation, and full configuration options.
66
+
67
+ ## Features
68
+
69
+ - Side-by-side diff view with line numbering
70
+ - Syntax highlighting for 100+ languages (via Pygments)
71
+ - Context expansion to see more surrounding code
72
+ - Search and filter across files
73
+ - Light and dark themes
74
+ - Live auto-reload on file changes (SSE)
75
+ - Font customization via `DIFFLICIOUS_FONT` environment variable
76
+
77
+ ## Configuration
78
+
79
+ Set environment variables to configure behavior:
80
+
81
+ | Variable | Default | Description |
82
+ |----------|---------|-------------|
83
+ | `DIFFLICIOUS_PORT` | `5000` | Port to listen on |
84
+ | `DIFFLICIOUS_HOST` | `127.0.0.1` | Host to bind to |
85
+ | `DIFFLICIOUS_FONT` | `jetbrains-mono` | Code font (see `--list-fonts`) |
86
+ | `DIFFLICIOUS_DISABLE_GOOGLE_FONTS` | `false` | Use system fonts only |
87
+ | `DIFFLICIOUS_AUTO_RELOAD` | `true` | Auto-reload on file changes |
88
+ | `DIFFLICIOUS_DEBUG` | `false` | Verbose debug logging |
89
+
90
+ See [INSTALLATION.md](INSTALLATION.md) for full configuration details.
91
+
92
+ ## Technology
93
+
94
+ - **Backend**: Flask, GitPython, Pygments, unidiff
95
+ - **Frontend**: Alpine.js, Tailwind CSS
96
+ - **Real-time**: Server-Sent Events
97
+
98
+ ## Documentation
99
+
100
+ - [INSTALLATION.md](INSTALLATION.md) — installation options, configuration, environment variables
101
+ - [DEVELOPING.md](DEVELOPING.md) — development setup, testing, code conventions
102
+ - [CHANGELOG.md](CHANGELOG.md) — version history
103
+ - [docs/CSS-STYLE-GUIDE.md](docs/CSS-STYLE-GUIDE.md) — CSS conventions and design tokens
104
+ - [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) — common issues
105
+
106
+ ## Contributing
107
+
108
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
109
+
110
+ ## License
111
+
112
+ MIT License — see [LICENSE](LICENSE) file for details.
@@ -0,0 +1,74 @@
1
+ # Difflicious
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/difflicious.svg)](https://pypi.org/project/difflicious/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/difflicious.svg)](https://pypi.org/project/difflicious/)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ A local web application for reviewing git diffs. Run it in your working directory and view your changes in a browser with side-by-side visualization, syntax highlighting, and context expansion.
8
+
9
+ ## Screenshots
10
+
11
+ | Light mode | Dark mode |
12
+ |------------|-----------|
13
+ | ![Light mode](docs/screenshots/light.png) | ![Dark mode](docs/screenshots/dark.png) |
14
+
15
+ > To regenerate: `uv run python scripts/screenshot.py`
16
+ > Prerequisites: `uv add --dev playwright && uv run playwright install chromium`
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ pip install difflicious
22
+ difflicious
23
+ ```
24
+
25
+ Open `http://localhost:5000` in your browser.
26
+
27
+ See [INSTALLATION.md](INSTALLATION.md) for Docker, source installation, and full configuration options.
28
+
29
+ ## Features
30
+
31
+ - Side-by-side diff view with line numbering
32
+ - Syntax highlighting for 100+ languages (via Pygments)
33
+ - Context expansion to see more surrounding code
34
+ - Search and filter across files
35
+ - Light and dark themes
36
+ - Live auto-reload on file changes (SSE)
37
+ - Font customization via `DIFFLICIOUS_FONT` environment variable
38
+
39
+ ## Configuration
40
+
41
+ Set environment variables to configure behavior:
42
+
43
+ | Variable | Default | Description |
44
+ |----------|---------|-------------|
45
+ | `DIFFLICIOUS_PORT` | `5000` | Port to listen on |
46
+ | `DIFFLICIOUS_HOST` | `127.0.0.1` | Host to bind to |
47
+ | `DIFFLICIOUS_FONT` | `jetbrains-mono` | Code font (see `--list-fonts`) |
48
+ | `DIFFLICIOUS_DISABLE_GOOGLE_FONTS` | `false` | Use system fonts only |
49
+ | `DIFFLICIOUS_AUTO_RELOAD` | `true` | Auto-reload on file changes |
50
+ | `DIFFLICIOUS_DEBUG` | `false` | Verbose debug logging |
51
+
52
+ See [INSTALLATION.md](INSTALLATION.md) for full configuration details.
53
+
54
+ ## Technology
55
+
56
+ - **Backend**: Flask, GitPython, Pygments, unidiff
57
+ - **Frontend**: Alpine.js, Tailwind CSS
58
+ - **Real-time**: Server-Sent Events
59
+
60
+ ## Documentation
61
+
62
+ - [INSTALLATION.md](INSTALLATION.md) — installation options, configuration, environment variables
63
+ - [DEVELOPING.md](DEVELOPING.md) — development setup, testing, code conventions
64
+ - [CHANGELOG.md](CHANGELOG.md) — version history
65
+ - [docs/CSS-STYLE-GUIDE.md](docs/CSS-STYLE-GUIDE.md) — CSS conventions and design tokens
66
+ - [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) — common issues
67
+
68
+ ## Contributing
69
+
70
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
71
+
72
+ ## License
73
+
74
+ MIT License — see [LICENSE](LICENSE) file for details.