From 7525ce55fedde39725bd43ab1c1e3b09fc5c9d38 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 8 Nov 2025 15:43:27 -0500 Subject: [PATCH 01/44] update theme --- lua/midnight/theme.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index cf84152..bb334b7 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -69,7 +69,7 @@ function M.apply() hi('NonText', { fg = cs.grey }, { 'SpecialKey' }) hi('LineNr', { fg = cs.light_black }, { 'SignColumn' }) - hi('CursorLine', { bg = cs.dark_grey }, { 'ColorColumn', 'Folded', 'Visual' }) + hi('CursorLine', { bg = cs.med_grey }, { 'ColorColumn', 'Folded', 'Visual' }) hi('CursorLineNr', { fg = cs.medium_emphasis }) hi('Conceal', { fg = cs.light_black, bg = cs.black }) From 7b1c699b28715dcfe8ab91fca0e3e9d040dc3b57 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 8 Nov 2025 17:35:03 -0500 Subject: [PATCH 02/44] feat: daylight theme; --- colors/daylight.lua | 2 ++ colors/midnight.lua | 1 + lua/midnight/palette.lua | 49 +++++++++++++++++++--------------------- 3 files changed, 26 insertions(+), 26 deletions(-) create mode 100644 colors/daylight.lua diff --git a/colors/daylight.lua b/colors/daylight.lua new file mode 100644 index 0000000..daa37f0 --- /dev/null +++ b/colors/daylight.lua @@ -0,0 +1,2 @@ +vim.o.background = 'light' +require('midnight').load() diff --git a/colors/midnight.lua b/colors/midnight.lua index 605553d..dfd2424 100644 --- a/colors/midnight.lua +++ b/colors/midnight.lua @@ -1 +1,2 @@ +vim.o.background = 'dark' require('midnight').load() diff --git a/lua/midnight/palette.lua b/lua/midnight/palette.lua index a322643..735f6b7 100644 --- a/lua/midnight/palette.lua +++ b/lua/midnight/palette.lua @@ -63,34 +63,31 @@ M.midnight = { ---@type Palette M.daylight = { - black = '#000000', - grey = '#666666', - red = '#B22222', - green = '#228B22', - yellow = '#B8860B', - blue = '#27408B', - magenta = '#8B008B', - cyan = '#00BFFF', - white = '#ffffff', + black = '#f5f5f5', + red = '#c7254e', + green = '#2d7f3e', + yellow = '#996800', + blue = '#3b5bdb', + magenta = '#ae3ec9', + cyan = '#1098ad', + orange = '#d9730d', + white = '#1a1a1a', - bright_black = '#555555', - bright_red = '#ff0000', - bright_green = '#00ff00', - bright_yellow = '#ffa500', - bright_blue = '#0000ff', - bright_magenta = '#ff00ff', - bright_cyan = '#00ffff', - bright_white = '#ffffff', + bright_black = '#999999', + bright_red = '#e03e52', + bright_green = '#37b24d', + bright_yellow = '#f59f00', + bright_blue = '#4c6ef5', + bright_magenta = '#da77f2', + bright_cyan = '#15aabf', + bright_white = '#000000', - light_black = '#555555', - light_grey = '#ECECEC', - light_red = '#ff0000', - light_green = '#00ff00', - light_yellow = '#ffa500', - light_blue = '#0000ff', - light_magenta = '#ff00ff', - light_cyan = '#00ffff', - light_white = '#ffffff', + light_black = '#6b6b6b', + grey = '#d0d0d0', + med_grey = '#e8e8e8', + dark_grey = '#ebebeb', + + medium_emphasis = '#666666', } ---@return Palette From 5730695a534384307a3079bafd8e3afa45ec9694 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 8 Nov 2025 17:41:49 -0500 Subject: [PATCH 03/44] feat(ci): script checking; --- .github/workflows/quality.yaml | 47 +++++++ .pre-commit-config.yaml | 20 +++ .python-version | 1 + main.py | 6 + pyproject.toml | 14 +++ scripts/thumbnail.py | 30 +++++ uv.lock | 215 +++++++++++++++++++++++++++++++++ 7 files changed, 333 insertions(+) create mode 100644 .python-version create mode 100644 main.py create mode 100644 pyproject.toml create mode 100755 scripts/thumbnail.py create mode 100644 uv.lock diff --git a/.github/workflows/quality.yaml b/.github/workflows/quality.yaml index dcf74d2..d7be890 100644 --- a/.github/workflows/quality.yaml +++ b/.github/workflows/quality.yaml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest outputs: lua: ${{ steps.changes.outputs.lua }} + python: ${{ steps.changes.outputs.python }} markdown: ${{ steps.changes.outputs.markdown }} steps: - uses: actions/checkout@v4 @@ -24,6 +25,10 @@ jobs: - '*.lua' - '.luarc.json' - '*.toml' + python: + - 'scripts/**/*.py' + - 'pyproject.toml' + - 'uv.lock' markdown: - '*.md' @@ -67,6 +72,48 @@ jobs: directories: lua configpath: .luarc.json + python-format: + name: Python Format Check + runs-on: ubuntu-latest + needs: changes + if: ${{ needs.changes.outputs.python == 'true' }} + steps: + - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v4 + - name: Install ruff + run: uv tool install ruff + - name: Check Python formatting with ruff + run: ruff format --check . + + python-lint: + name: Python Lint Check + runs-on: ubuntu-latest + needs: changes + if: ${{ needs.changes.outputs.python == 'true' }} + steps: + - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v4 + - name: Install ruff + run: uv tool install ruff + - name: Lint Python files with ruff + run: ruff check . + + python-typecheck: + name: Python Type Check + runs-on: ubuntu-latest + needs: changes + if: ${{ needs.changes.outputs.python == 'true' }} + steps: + - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v4 + - name: Install dependencies with mypy + run: uv sync --dev + - name: Type check Python files with mypy + run: uv run mypy . + markdown-format: name: Markdown Format Check runs-on: ubuntu-latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3477598..4706ce4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,6 +9,26 @@ repos: files: \.lua$ pass_filenames: true + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.14.3 + hooks: + - id: ruff-format + name: ruff (format) + files: \.py$ + - id: ruff + name: ruff (lint imports) + args: ['--fix', '--select=I'] + files: \.py$ + + - repo: local + hooks: + - id: mypy + name: mypy (type check) + entry: uv run mypy + language: system + args: ['.'] + pass_filenames: false + - repo: https://github.com/pre-commit/mirrors-prettier rev: v4.0.0-alpha.8 hooks: diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/main.py b/main.py new file mode 100644 index 0000000..c1d6a48 --- /dev/null +++ b/main.py @@ -0,0 +1,6 @@ +def main(): + print("Hello from midnight-nvim!") + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e94045a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "midnight-nvim" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [] + +[dependency-groups] +dev = [ + "mypy>=1.18.2", + "numpy>=2.3.4", + "pillow>=12.0.0", +] diff --git a/scripts/thumbnail.py b/scripts/thumbnail.py new file mode 100755 index 0000000..9118878 --- /dev/null +++ b/scripts/thumbnail.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +import sys + +import numpy as np +from PIL import Image + +if len(sys.argv) != 4: + print("Usage: python thumbnail.py ") + sys.exit(1) + +dark = Image.open(sys.argv[1]).convert("RGBA") +light = Image.open(sys.argv[2]).convert("RGBA") + +if dark.size != light.size: + light = light.resize(dark.size, Image.Resampling.LANCZOS) + +width, height = dark.size +mask = np.zeros((height, width), dtype=np.uint8) + +for y in range(height): + for x in range(width): + progress = (x + (height - y)) / (width + height) + mask[y, x] = int(progress * 255) + +mask_img = Image.fromarray(mask, mode="L") +result = Image.composite(light, dark, mask_img) +result.save(sys.argv[3], "PNG") + +print(f"✓ {sys.argv[3]} ({width}x{height})") diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..7d56eaf --- /dev/null +++ b/uv.lock @@ -0,0 +1,215 @@ +version = 1 +revision = 2 +requires-python = ">=3.12" + +[[package]] +name = "midnight-nvim" +version = "0.1.0" +source = { virtual = "." } + +[package.dev-dependencies] +dev = [ + { name = "mypy" }, + { name = "numpy" }, + { name = "pillow" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "mypy", specifier = ">=1.18.2" }, + { name = "numpy", specifier = ">=2.3.4" }, + { name = "pillow", specifier = ">=12.0.0" }, +] + +[[package]] +name = "mypy" +version = "1.18.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "pathspec" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" }, + { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" }, + { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" }, + { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload-time = "2025-09-19T00:10:28.203Z" }, + { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" }, + { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" }, + { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" }, + { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" }, + { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" }, + { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" }, + { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" }, + { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" }, + { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" }, + { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" }, + { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" }, + { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" }, + { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" }, + { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" }, + { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" }, + { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" }, + { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" }, + { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" }, + { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" }, + { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" }, + { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" }, + { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" }, + { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" }, + { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" }, + { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" }, + { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] From 7a610accd79265da481234e9047ce582a3a8e2a0 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 8 Nov 2025 17:43:36 -0500 Subject: [PATCH 04/44] feat: add ruff --- pyproject.toml | 1 + uv.lock | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index e94045a..4d833e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,4 +11,5 @@ dev = [ "mypy>=1.18.2", "numpy>=2.3.4", "pillow>=12.0.0", + "ruff>=0.14.4", ] diff --git a/uv.lock b/uv.lock index 7d56eaf..1c6ce74 100644 --- a/uv.lock +++ b/uv.lock @@ -12,6 +12,7 @@ dev = [ { name = "mypy" }, { name = "numpy" }, { name = "pillow" }, + { name = "ruff" }, ] [package.metadata] @@ -21,6 +22,7 @@ dev = [ { name = "mypy", specifier = ">=1.18.2" }, { name = "numpy", specifier = ">=2.3.4" }, { name = "pillow", specifier = ">=12.0.0" }, + { name = "ruff", specifier = ">=0.14.4" }, ] [[package]] @@ -205,6 +207,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, ] +[[package]] +name = "ruff" +version = "0.14.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/55/cccfca45157a2031dcbb5a462a67f7cf27f8b37d4b3b1cd7438f0f5c1df6/ruff-0.14.4.tar.gz", hash = "sha256:f459a49fe1085a749f15414ca76f61595f1a2cc8778ed7c279b6ca2e1fd19df3", size = 5587844, upload-time = "2025-11-06T22:07:45.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/b9/67240254166ae1eaa38dec32265e9153ac53645a6c6670ed36ad00722af8/ruff-0.14.4-py3-none-linux_armv6l.whl", hash = "sha256:e6604613ffbcf2297cd5dcba0e0ac9bd0c11dc026442dfbb614504e87c349518", size = 12606781, upload-time = "2025-11-06T22:07:01.841Z" }, + { url = "https://files.pythonhosted.org/packages/46/c8/09b3ab245d8652eafe5256ab59718641429f68681ee713ff06c5c549f156/ruff-0.14.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d99c0b52b6f0598acede45ee78288e5e9b4409d1ce7f661f0fa36d4cbeadf9a4", size = 12946765, upload-time = "2025-11-06T22:07:05.858Z" }, + { url = "https://files.pythonhosted.org/packages/14/bb/1564b000219144bf5eed2359edc94c3590dd49d510751dad26202c18a17d/ruff-0.14.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9358d490ec030f1b51d048a7fd6ead418ed0826daf6149e95e30aa67c168af33", size = 11928120, upload-time = "2025-11-06T22:07:08.023Z" }, + { url = "https://files.pythonhosted.org/packages/a3/92/d5f1770e9988cc0742fefaa351e840d9aef04ec24ae1be36f333f96d5704/ruff-0.14.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b40d27924f1f02dfa827b9c0712a13c0e4b108421665322218fc38caf615c2", size = 12370877, upload-time = "2025-11-06T22:07:10.015Z" }, + { url = "https://files.pythonhosted.org/packages/e2/29/e9282efa55f1973d109faf839a63235575519c8ad278cc87a182a366810e/ruff-0.14.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f5e649052a294fe00818650712083cddc6cc02744afaf37202c65df9ea52efa5", size = 12408538, upload-time = "2025-11-06T22:07:13.085Z" }, + { url = "https://files.pythonhosted.org/packages/8e/01/930ed6ecfce130144b32d77d8d69f5c610e6d23e6857927150adf5d7379a/ruff-0.14.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa082a8f878deeba955531f975881828fd6afd90dfa757c2b0808aadb437136e", size = 13141942, upload-time = "2025-11-06T22:07:15.386Z" }, + { url = "https://files.pythonhosted.org/packages/6a/46/a9c89b42b231a9f487233f17a89cbef9d5acd538d9488687a02ad288fa6b/ruff-0.14.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1043c6811c2419e39011890f14d0a30470f19d47d197c4858b2787dfa698f6c8", size = 14544306, upload-time = "2025-11-06T22:07:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/78/96/9c6cf86491f2a6d52758b830b89b78c2ae61e8ca66b86bf5a20af73d20e6/ruff-0.14.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f3a936ac27fb7c2a93e4f4b943a662775879ac579a433291a6f69428722649", size = 14210427, upload-time = "2025-11-06T22:07:19.832Z" }, + { url = "https://files.pythonhosted.org/packages/71/f4/0666fe7769a54f63e66404e8ff698de1dcde733e12e2fd1c9c6efb689cb5/ruff-0.14.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95643ffd209ce78bc113266b88fba3d39e0461f0cbc8b55fb92505030fb4a850", size = 13658488, upload-time = "2025-11-06T22:07:22.32Z" }, + { url = "https://files.pythonhosted.org/packages/ee/79/6ad4dda2cfd55e41ac9ed6d73ef9ab9475b1eef69f3a85957210c74ba12c/ruff-0.14.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:456daa2fa1021bc86ca857f43fe29d5d8b3f0e55e9f90c58c317c1dcc2afc7b5", size = 13354908, upload-time = "2025-11-06T22:07:24.347Z" }, + { url = "https://files.pythonhosted.org/packages/b5/60/f0b6990f740bb15c1588601d19d21bcc1bd5de4330a07222041678a8e04f/ruff-0.14.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:f911bba769e4a9f51af6e70037bb72b70b45a16db5ce73e1f72aefe6f6d62132", size = 13587803, upload-time = "2025-11-06T22:07:26.327Z" }, + { url = "https://files.pythonhosted.org/packages/c9/da/eaaada586f80068728338e0ef7f29ab3e4a08a692f92eb901a4f06bbff24/ruff-0.14.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:76158a7369b3979fa878612c623a7e5430c18b2fd1c73b214945c2d06337db67", size = 12279654, upload-time = "2025-11-06T22:07:28.46Z" }, + { url = "https://files.pythonhosted.org/packages/66/d4/b1d0e82cf9bf8aed10a6d45be47b3f402730aa2c438164424783ac88c0ed/ruff-0.14.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f3b8f3b442d2b14c246e7aeca2e75915159e06a3540e2f4bed9f50d062d24469", size = 12357520, upload-time = "2025-11-06T22:07:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/04/f4/53e2b42cc82804617e5c7950b7079d79996c27e99c4652131c6a1100657f/ruff-0.14.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c62da9a06779deecf4d17ed04939ae8b31b517643b26370c3be1d26f3ef7dbde", size = 12719431, upload-time = "2025-11-06T22:07:33.831Z" }, + { url = "https://files.pythonhosted.org/packages/a2/94/80e3d74ed9a72d64e94a7b7706b1c1ebaa315ef2076fd33581f6a1cd2f95/ruff-0.14.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5a443a83a1506c684e98acb8cb55abaf3ef725078be40237463dae4463366349", size = 13464394, upload-time = "2025-11-06T22:07:35.905Z" }, + { url = "https://files.pythonhosted.org/packages/54/1a/a49f071f04c42345c793d22f6cf5e0920095e286119ee53a64a3a3004825/ruff-0.14.4-py3-none-win32.whl", hash = "sha256:643b69cb63cd996f1fc7229da726d07ac307eae442dd8974dbc7cf22c1e18fff", size = 12493429, upload-time = "2025-11-06T22:07:38.43Z" }, + { url = "https://files.pythonhosted.org/packages/bc/22/e58c43e641145a2b670328fb98bc384e20679b5774258b1e540207580266/ruff-0.14.4-py3-none-win_amd64.whl", hash = "sha256:26673da283b96fe35fa0c939bf8411abec47111644aa9f7cfbd3c573fb125d2c", size = 13635380, upload-time = "2025-11-06T22:07:40.496Z" }, + { url = "https://files.pythonhosted.org/packages/30/bd/4168a751ddbbf43e86544b4de8b5c3b7be8d7167a2a5cb977d274e04f0a1/ruff-0.14.4-py3-none-win_arm64.whl", hash = "sha256:dd09c292479596b0e6fec8cd95c65c3a6dc68e9ad17b8f2382130f87ff6a75bb", size = 12663065, upload-time = "2025-11-06T22:07:42.603Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" From adc524c8fb0b150e522b9584021e3349a26b4f7c Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 8 Nov 2025 22:46:49 -0500 Subject: [PATCH 05/44] feat: scripts --- README.md | 2 +- scripts/thumbnail.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b143d12..94b1c30 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ neovim theme for code, not colors. -Image +![Image](https://github.com/user-attachments/assets/9abb5126-15d7-4de4-ad6d-ec35975fec03) ## Installation diff --git a/scripts/thumbnail.py b/scripts/thumbnail.py index 9118878..21bf356 100755 --- a/scripts/thumbnail.py +++ b/scripts/thumbnail.py @@ -20,8 +20,10 @@ mask = np.zeros((height, width), dtype=np.uint8) for y in range(height): for x in range(width): - progress = (x + (height - y)) / (width + height) - mask[y, x] = int(progress * 255) + if y * width < x * height: + mask[y, x] = 255 + else: + mask[y, x] = 0 mask_img = Image.fromarray(mask, mode="L") result = Image.composite(light, dark, mask_img) From 04998f2f0cb3a10127c8a6b7828f35169a8f4f1e Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 8 Nov 2025 23:03:32 -0500 Subject: [PATCH 06/44] feat(doc): vimdoc --- doc/midnight.nvim.txt | 90 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 doc/midnight.nvim.txt diff --git a/doc/midnight.nvim.txt b/doc/midnight.nvim.txt new file mode 100644 index 0000000..a4918d3 --- /dev/null +++ b/doc/midnight.nvim.txt @@ -0,0 +1,90 @@ +*midnight.nvim.txt* Neovim theme for code, not colors + +Author: Barrett Ruth +License: Same terms as Vim itself (see |license|) + +============================================================================== +INTRODUCTION *midnight.nvim* + +midnight.nvim is a minimalist colorscheme with two variants: + + midnight Dark theme + daylight Light theme + +============================================================================== +INSTALLATION *midnight-installation* + +>lua + { + 'barrett-ruth/midnight.nvim', + config = function() + vim.cmd.colorscheme('midnight') + end, + } +< + +============================================================================== +COLORSCHEMES *midnight-colorschemes* + +:colorscheme midnight *midnight* *:midnight* +:colorscheme daylight *daylight* *:daylight* + +============================================================================== +PLUGIN INTEGRATION *midnight-integration* + +Built-in support for: + • nvim-treesitter + • nvim-cmp + • blink.cmp + • fzf-lua + • gitsigns.nvim + +============================================================================== +TERMINAL COLORS *midnight-terminal-colors* + +midnight.nvim configures all 16 terminal colors via vim.g.terminal_color_* +variables. These colors are used for: + + • Built-in |:terminal| emulator + • Terminal UI elements + • ANSI color sequences in terminal buffers + +Palette (midnight) ~ + + Color 0 (black): #121212 + Color 1 (red): #ff6b6b + Color 2 (green): #98c379 + Color 3 (yellow): #e5c07b + Color 4 (blue): #7aa2f7 + Color 5 (magenta): #c678dd + Color 6 (cyan): #56b6c2 + Color 7 (white): #e0e0e0 + Color 8 (bright black): #666666 + Color 9 (bright red): #f48771 + Color 10 (bright green): #b5e890 + Color 11 (bright yellow): #f0d197 + Color 12 (bright blue): #9db8f7 + Color 13 (bright magenta): #e298ff + Color 14 (bright cyan): #7dd6e0 + Color 15 (bright white): #ffffff + +Palette (daylight) ~ + + Color 0 (black): #f5f5f5 + Color 1 (red): #c7254e + Color 2 (green): #2d7f3e + Color 3 (yellow): #996800 + Color 4 (blue): #3b5bdb + Color 5 (magenta): #ae3ec9 + Color 6 (cyan): #1098ad + Color 7 (white): #1a1a1a + Color 8 (bright black): #999999 + Color 9 (bright red): #e03e52 + Color 10 (bright green): #37b24d + Color 11 (bright yellow): #f59f00 + Color 12 (bright blue): #4c6ef5 + Color 13 (bright magenta): #da77f2 + Color 14 (bright cyan): #15aabf + Color 15 (bright white): #000000 + + vim:tw=78:ts=8:ft=help:norl: From 720a8d2e8cc6157442e3b520e730c5be4d9aa3f4 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 8 Nov 2025 23:04:24 -0500 Subject: [PATCH 07/44] cleanup --- doc/midnight.nvim.txt | 51 ++++++------------------------------------- 1 file changed, 7 insertions(+), 44 deletions(-) diff --git a/doc/midnight.nvim.txt b/doc/midnight.nvim.txt index a4918d3..459f571 100644 --- a/doc/midnight.nvim.txt +++ b/doc/midnight.nvim.txt @@ -40,51 +40,14 @@ Built-in support for: • gitsigns.nvim ============================================================================== -TERMINAL COLORS *midnight-terminal-colors* +PALETTE *midnight-palette* -midnight.nvim configures all 16 terminal colors via vim.g.terminal_color_* -variables. These colors are used for: +midnight ~ + black: #121212 red: #ff6b6b green: #98c379 yellow: #e5c07b + blue: #7aa2f7 magenta: #c678dd cyan: #56b6c2 white: #e0e0e0 - • Built-in |:terminal| emulator - • Terminal UI elements - • ANSI color sequences in terminal buffers - -Palette (midnight) ~ - - Color 0 (black): #121212 - Color 1 (red): #ff6b6b - Color 2 (green): #98c379 - Color 3 (yellow): #e5c07b - Color 4 (blue): #7aa2f7 - Color 5 (magenta): #c678dd - Color 6 (cyan): #56b6c2 - Color 7 (white): #e0e0e0 - Color 8 (bright black): #666666 - Color 9 (bright red): #f48771 - Color 10 (bright green): #b5e890 - Color 11 (bright yellow): #f0d197 - Color 12 (bright blue): #9db8f7 - Color 13 (bright magenta): #e298ff - Color 14 (bright cyan): #7dd6e0 - Color 15 (bright white): #ffffff - -Palette (daylight) ~ - - Color 0 (black): #f5f5f5 - Color 1 (red): #c7254e - Color 2 (green): #2d7f3e - Color 3 (yellow): #996800 - Color 4 (blue): #3b5bdb - Color 5 (magenta): #ae3ec9 - Color 6 (cyan): #1098ad - Color 7 (white): #1a1a1a - Color 8 (bright black): #999999 - Color 9 (bright red): #e03e52 - Color 10 (bright green): #37b24d - Color 11 (bright yellow): #f59f00 - Color 12 (bright blue): #4c6ef5 - Color 13 (bright magenta): #da77f2 - Color 14 (bright cyan): #15aabf - Color 15 (bright white): #000000 +daylight ~ + black: #f5f5f5 red: #c7254e green: #2d7f3e yellow: #996800 + blue: #3b5bdb magenta: #ae3ec9 cyan: #1098ad white: #1a1a1a vim:tw=78:ts=8:ft=help:norl: From 18fe9c5628ccecc628443fc51435eaa0a6cf51d1 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Mon, 10 Nov 2025 01:21:46 -0500 Subject: [PATCH 08/44] cleanup --- README.md | 3 +++ main.py | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 main.py diff --git a/README.md b/README.md index 94b1c30..244d816 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ neovim theme for code, not colors. ## Installation +Install with any package manager of your choice. For example, with +[lazy.nvim](https://github.com/folke/lazy.nvim): + ```lua { 'barrett-ruth/midnight.nvim', diff --git a/main.py b/main.py deleted file mode 100644 index c1d6a48..0000000 --- a/main.py +++ /dev/null @@ -1,6 +0,0 @@ -def main(): - print("Hello from midnight-nvim!") - - -if __name__ == "__main__": - main() From d95b68b725ba9787e8769f010e46cd2984759997 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 13 Nov 2025 18:02:49 -0500 Subject: [PATCH 09/44] fix: cleanup theme --- lua/midnight/palette.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/midnight/palette.lua b/lua/midnight/palette.lua index 735f6b7..5747212 100644 --- a/lua/midnight/palette.lua +++ b/lua/midnight/palette.lua @@ -56,7 +56,7 @@ M.midnight = { light_black = '#666666', grey = '#3d3d3d', med_grey = '#2d2d2d', - dark_grey = '#1e1e1e', + dark_grey = '#252525', medium_emphasis = '#999999', } From 7f554da3466ec5aae2317f3b79b8cf51e8f40508 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 13 Nov 2025 18:04:07 -0500 Subject: [PATCH 10/44] cleanup --- lua/midnight/palette.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/midnight/palette.lua b/lua/midnight/palette.lua index 5747212..273f371 100644 --- a/lua/midnight/palette.lua +++ b/lua/midnight/palette.lua @@ -56,7 +56,7 @@ M.midnight = { light_black = '#666666', grey = '#3d3d3d', med_grey = '#2d2d2d', - dark_grey = '#252525', + dark_grey = '#222222', medium_emphasis = '#999999', } From 97cd83728259a23e690064c005610d6a2c2f492c Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 25 Nov 2025 00:04:06 -0500 Subject: [PATCH 11/44] feat: cmp theme --- lua/midnight/theme.lua | 53 +++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index cf84152..2825307 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -73,7 +73,7 @@ function M.apply() hi('CursorLineNr', { fg = cs.medium_emphasis }) hi('Conceal', { fg = cs.light_black, bg = cs.black }) - hi('Directory', { fg = cs.white }) + hi('Directory', { fg = cs.blue }) hi('Error', { fg = cs.red }) hi('ErrorMsg', { bold = true, underline = true, fg = cs.red }) hi('MoreMsg', { fg = cs.yellow }, { 'WarningMsg' }) @@ -172,34 +172,29 @@ function M.apply() hi('CmpItemAbbrDeprecated', { fg = cs.light_black, strikethrough = true }) hi('CmpItemMenu', { fg = cs.light_black }) - for hlgroup, color in pairs({ - Key = 'white', - Keyword = 'blue', - Folder = 'white', - File = 'white', - Boolean = 'green', - Class = 'white', - Constant = 'green', - Constructor = 'white', - Enum = 'white', - EnumMember = 'white', - Field = 'white', - Function = 'white', - Interface = 'white', - Method = 'white', - Namespace = 'white', - Null = 'white', - Number = 'green', - Operator = 'white', - Property = 'white', - String = 'green', - Struct = 'white', - Text = 'white', - TypeParameter = 'white', - Variable = 'white', - }) do - hi('CmpItemKind' .. hlgroup, { fg = cs[color] }) - end + link('Boolean', 'CmpItemKindBoolean') + link('Constant', 'CmpItemKindConstant') + link('Function', 'CmpItemKindFunction') + link('Keyword', 'CmpItemKindKeyword') + link('Namespace', 'CmpItemKindNamespace') + link('Number', 'CmpItemKindNumber') + link('Operator', 'CmpItemKindOperator') + link('String', 'CmpItemKindString') + link('Type', 'CmpItemKindClass') + link('Type', 'CmpItemKindEnum') + link('Type', 'CmpItemKindInterface') + link('Type', 'CmpItemKindStruct') + link('Type', 'CmpItemKindConstructor') + link('Type', 'CmpItemKindTypeParameter') + link('Function', 'CmpItemKindMethod') + link('Normal', 'CmpItemKindVariable') + link('Normal', 'CmpItemKindProperty') + link('Normal', 'CmpItemKindField') + link('Normal', 'CmpItemKindText') + link('Normal', 'CmpItemKindFile') + link('String', 'CmpItemKindKey') + link('Directory', 'CmpItemKindFolder') + link('Constant', 'CmpItemKindNull') link('NormalFloat', 'NullLsInfoBorder') From 6f795b8caba274dac28abf9fcdb497def2bd8717 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 25 Nov 2025 00:05:02 -0500 Subject: [PATCH 12/44] feat(doc): update readme to show completion support --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 244d816..fc58fc1 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,6 @@ Install with any package manager of your choice. For example, with - [treesitter](https://github.com/nvim-treesitter/nvim-treesitter) - [fzf-lua](https://github.com/ibhagwan/fzf-lua) -- [nvim-cmp](https://github.com/hrsh7th/nvim-cmp) +- [nvim-cmp](https://github.com/hrsh7th/nvim-cmp), + [blink.cmp](https://github.com/saghen/blink.cmp) - [gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) -- [blink.cmp](https://github.com/saghen/blink.cmp) From bd5119fb7d0d25a7bbdfaad20026e689f73a32cb Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 25 Nov 2025 00:23:36 -0500 Subject: [PATCH 13/44] blink --- lua/midnight/theme.lua | 64 +++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 2825307..323fdc0 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -172,29 +172,47 @@ function M.apply() hi('CmpItemAbbrDeprecated', { fg = cs.light_black, strikethrough = true }) hi('CmpItemMenu', { fg = cs.light_black }) - link('Boolean', 'CmpItemKindBoolean') - link('Constant', 'CmpItemKindConstant') - link('Function', 'CmpItemKindFunction') - link('Keyword', 'CmpItemKindKeyword') - link('Namespace', 'CmpItemKindNamespace') - link('Number', 'CmpItemKindNumber') - link('Operator', 'CmpItemKindOperator') - link('String', 'CmpItemKindString') - link('Type', 'CmpItemKindClass') - link('Type', 'CmpItemKindEnum') - link('Type', 'CmpItemKindInterface') - link('Type', 'CmpItemKindStruct') - link('Type', 'CmpItemKindConstructor') - link('Type', 'CmpItemKindTypeParameter') - link('Function', 'CmpItemKindMethod') - link('Normal', 'CmpItemKindVariable') - link('Normal', 'CmpItemKindProperty') - link('Normal', 'CmpItemKindField') - link('Normal', 'CmpItemKindText') - link('Normal', 'CmpItemKindFile') - link('String', 'CmpItemKindKey') - link('Directory', 'CmpItemKindFolder') - link('Constant', 'CmpItemKindNull') + link('Boolean', { 'CmpItemKindBoolean', 'BlinkCmpKindBoolean' }) + link( + 'Constant', + { 'CmpItemKindConstant', 'BlinkCmpKindConstant', 'CmpItemKindNull', 'BlinkCmpKindNull' } + ) + link( + 'Function', + { 'CmpItemKindFunction', 'BlinkCmpKindFunction', 'CmpItemKindMethod', 'BlinkCmpKindMethod' } + ) + link('Keyword', { 'CmpItemKindKeyword', 'BlinkCmpKindKeyword' }) + link('Namespace', { 'CmpItemKindNamespace', 'BlinkCmpKindNamespace' }) + link('Number', { 'CmpItemKindNumber', 'BlinkCmpKindNumber' }) + link('Operator', { 'CmpItemKindOperator', 'BlinkCmpKindOperator' }) + link('String', { 'CmpItemKindString', 'BlinkCmpKindString', 'CmpItemKindKey', 'BlinkCmpKindKey' }) + link('Type', { + 'CmpItemKindClass', + 'BlinkCmpKindClass', + 'CmpItemKindEnum', + 'BlinkCmpKindEnum', + 'CmpItemKindInterface', + 'BlinkCmpKindInterface', + 'CmpItemKindStruct', + 'BlinkCmpKindStruct', + 'CmpItemKindConstructor', + 'BlinkCmpKindConstructor', + 'CmpItemKindTypeParameter', + 'BlinkCmpKindTypeParameter', + }) + link('Normal', { + 'CmpItemKindVariable', + 'BlinkCmpKindVariable', + 'CmpItemKindProperty', + 'BlinkCmpKindProperty', + 'CmpItemKindField', + 'BlinkCmpKindField', + 'CmpItemKindText', + 'BlinkCmpKindText', + 'CmpItemKindFile', + 'BlinkCmpKindFile', + }) + link('Directory', { 'CmpItemKindFolder', 'BlinkCmpKindFolder' }) link('NormalFloat', 'NullLsInfoBorder') From 5611d57240a20715fa9933c8027c8bac1d5ac2f1 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Wed, 14 Jan 2026 13:09:25 -0500 Subject: [PATCH 14/44] fix(palette): dont default highlight scheme color names --- lua/midnight/theme.lua | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 323fdc0..6c275fd 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -57,10 +57,6 @@ function M.apply() local palette = require('midnight.palette') local cs = palette.get_palette() - for color, hexcode in pairs(cs) do - hi(color, { fg = hexcode }) - end - hi( 'Normal', { fg = cs.white, bg = cs.black }, From 76251ab8a79c3edf80f74d518bb8c65f81866de1 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 15 Jan 2026 17:48:27 -0500 Subject: [PATCH 15/44] feat(readme): include motivation --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index fc58fc1..193e495 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,7 @@ Install with any package manager of your choice. For example, with - [nvim-cmp](https://github.com/hrsh7th/nvim-cmp), [blink.cmp](https://github.com/saghen/blink.cmp) - [gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) + +## Motivation + +I find existing colorschemes to generally be excessively colorful and distracting, rather than informative. I wrote midnight.nvim to focus on code structure, specifically for competitive programming and workplace software development environments. I included highlighting of constants (e.g. strings, numbers, booleans) and language keywords to emphasize the maximally important aspects of code and its structure, respectively. From 0f85eb219d76cba86cb7e122d1a9b88de67b0d1a Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 15 Jan 2026 17:51:28 -0500 Subject: [PATCH 16/44] fix(ci): readme --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 193e495..ea19f09 100644 --- a/README.md +++ b/README.md @@ -28,4 +28,9 @@ Install with any package manager of your choice. For example, with ## Motivation -I find existing colorschemes to generally be excessively colorful and distracting, rather than informative. I wrote midnight.nvim to focus on code structure, specifically for competitive programming and workplace software development environments. I included highlighting of constants (e.g. strings, numbers, booleans) and language keywords to emphasize the maximally important aspects of code and its structure, respectively. +I find existing colorschemes to generally be excessively colorful and +distracting, rather than informative. I wrote midnight.nvim to focus on code +structure, specifically for competitive programming and workplace software +development environments. I included highlighting of constants (e.g. strings, +numbers, booleans) and language keywords to emphasize the maximally important +aspects of code and its structure, respectively. From 6004ca3b1f3c7df27d569395439ed3d6dc1781fc Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 20 Jan 2026 22:23:40 -0500 Subject: [PATCH 17/44] fix: color todo/notes with correct naming scheme --- lua/midnight/theme.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 6c275fd..7725525 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -114,10 +114,10 @@ function M.apply() hi('@text.underline', { underline = true }) hi('@text.uri', { fg = cs.white, underline = true }, { '@text.reference' }) - hi('@text.danger', { fg = cs.red, bold = true, italic = true }) - hi('@text.note', { fg = cs.green, bold = true, italic = true }) - hi('@text.todo', { fg = cs.yellow, bold = true, italic = true }, { 'Todo' }) - hi('@text.warning', { fg = cs.yellow, bold = true, italic = true }) + hi('@comment.danger', { fg = cs.red, bold = true, italic = true }) + hi('@comment.note', { fg = cs.green, bold = true, italic = true }) + hi('@comment.todo', { fg = cs.yellow, bold = true, italic = true }, { 'Todo' }) + hi('@comment.warning', { fg = cs.yellow, bold = true, italic = true }) hi('@variable', { none = true }) From 90e111993b27e1f34808a232032a47a6bf0e4652 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 20 Jan 2026 22:24:40 -0500 Subject: [PATCH 18/44] fix: use blue, not green, for notes --- lua/midnight/theme.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 7725525..a3c6499 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -115,7 +115,7 @@ function M.apply() hi('@text.uri', { fg = cs.white, underline = true }, { '@text.reference' }) hi('@comment.danger', { fg = cs.red, bold = true, italic = true }) - hi('@comment.note', { fg = cs.green, bold = true, italic = true }) + hi('@comment.note', { fg = cs.blue, bold = true, italic = true }) hi('@comment.todo', { fg = cs.yellow, bold = true, italic = true }, { 'Todo' }) hi('@comment.warning', { fg = cs.yellow, bold = true, italic = true }) From c38e0bac50c36bec5ae86b29c58a84722e750db9 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 27 Jan 2026 18:24:57 -0500 Subject: [PATCH 19/44] fix: name black and white to less confusing fg & bg --- lua/midnight/palette.lua | 12 ++++----- lua/midnight/theme.lua | 56 ++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lua/midnight/palette.lua b/lua/midnight/palette.lua index 273f371..2b0ed0b 100644 --- a/lua/midnight/palette.lua +++ b/lua/midnight/palette.lua @@ -1,7 +1,7 @@ local M = {} ---@class Palette ----@field black string +---@field foreground string ---@field red string ---@field green string ---@field yellow string @@ -9,7 +9,7 @@ local M = {} ---@field magenta string ---@field cyan string ---@field orange? string ----@field white string +---@field background string ---@field bright_black string ---@field bright_red string ---@field bright_green string @@ -34,7 +34,7 @@ local M = {} ---@type Palette M.midnight = { - black = '#121212', + foreground = '#121212', red = '#ff6b6b', green = '#98c379', yellow = '#e5c07b', @@ -42,7 +42,7 @@ M.midnight = { magenta = '#c678dd', cyan = '#56b6c2', orange = '#e5a56b', - white = '#e0e0e0', + background = '#e0e0e0', bright_black = '#666666', bright_red = '#f48771', @@ -63,7 +63,7 @@ M.midnight = { ---@type Palette M.daylight = { - black = '#f5f5f5', + foreground = '#f5f5f5', red = '#c7254e', green = '#2d7f3e', yellow = '#996800', @@ -71,7 +71,7 @@ M.daylight = { magenta = '#ae3ec9', cyan = '#1098ad', orange = '#d9730d', - white = '#1a1a1a', + background = '#1a1a1a', bright_black = '#999999', bright_red = '#e03e52', diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index a3c6499..a8d8844 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -59,7 +59,7 @@ function M.apply() hi( 'Normal', - { fg = cs.white, bg = cs.black }, + { fg = cs.background, bg = cs.foreground }, { 'Identifier', 'Special', 'StatusLine', 'StatusLineNC', 'Winbar', 'WinbarNC' } ) hi('NonText', { fg = cs.grey }, { 'SpecialKey' }) @@ -68,13 +68,13 @@ function M.apply() hi('CursorLine', { bg = cs.dark_grey }, { 'ColorColumn', 'Folded', 'Visual' }) hi('CursorLineNr', { fg = cs.medium_emphasis }) - hi('Conceal', { fg = cs.light_black, bg = cs.black }) + hi('Conceal', { fg = cs.light_black, bg = cs.foreground }) hi('Directory', { fg = cs.blue }) hi('Error', { fg = cs.red }) hi('ErrorMsg', { bold = true, underline = true, fg = cs.red }) hi('MoreMsg', { fg = cs.yellow }, { 'WarningMsg' }) hi('MatchParen', { bg = cs.med_grey }) - hi('NormalFloat', { bg = cs.black }, { + hi('NormalFloat', { bg = cs.foreground }, { 'LspInfoBorder', 'FloatBorder', 'FloatShadow', @@ -87,32 +87,32 @@ function M.apply() tshi('Comment', { fg = cs.light_black }) tshi('Constant', { fg = cs.green }) tshi('Define', { fg = cs.blue }) - tshi('Function', { fg = cs.white }, { '@function.builtin', '@function.macro' }) + tshi('Function', { fg = cs.background }, { '@function.builtin', '@function.macro' }) tshi('Include', { fg = cs.blue }) tshi('Keyword', { fg = cs.blue }, { 'Statement' }) - tshi('Namespace', { fg = cs.white }) + tshi('Namespace', { fg = cs.background }) tshi('Number', { fg = cs.green }) - tshi('Operator', { fg = cs.white }, { '@keyword.operator', '@conditional.ternary' }) + tshi('Operator', { fg = cs.background }, { '@keyword.operator', '@conditional.ternary' }) hi('Delimiter', { none = true }) - hi('@punctuation.delimiter', { fg = cs.white }) + hi('@punctuation.delimiter', { fg = cs.background }) tshi('PreProc', { fg = cs.blue }) tshi('String', { fg = cs.green }, { '@character' }) hi('@string.escape', { fg = cs.green }) - tshi('Title', { bold = true, fg = cs.white }) + tshi('Title', { bold = true, fg = cs.background }) - hi('@tag', { fg = cs.white }) - hi('@tag.attribute', { fg = cs.white }) - hi('@tag.delimiter', { fg = cs.white }) + hi('@tag', { fg = cs.background }) + hi('@tag.attribute', { fg = cs.background }) + hi('@tag.delimiter', { fg = cs.background }) - tshi('Type', { fg = cs.white }) - hi('@type.qualifier', { fg = cs.white }, { '@storageclass' }) - hi('@lsp.type.enum', { fg = cs.white }, { '@lsp.type.class' }) + tshi('Type', { fg = cs.background }) + hi('@type.qualifier', { fg = cs.background }, { '@storageclass' }) + hi('@lsp.type.enum', { fg = cs.background }, { '@lsp.type.class' }) hi('@lsp.type.comment', { none = true }, { '@lsp.type.macro' }) hi('@text.emphasis', { italic = true }) hi('@text.strong', { bold = true }) hi('@text.underline', { underline = true }) - hi('@text.uri', { fg = cs.white, underline = true }, { '@text.reference' }) + hi('@text.uri', { fg = cs.background, underline = true }, { '@text.reference' }) hi('@comment.danger', { fg = cs.red, bold = true, italic = true }) hi('@comment.note', { fg = cs.blue, bold = true, italic = true }) @@ -139,18 +139,18 @@ function M.apply() hi('DiagnosticUnderlineInfo', { undercurl = true, special = cs.light_black }) hi('SpellBad', { underline = true, special = cs.red }) - hi('SpellRare', { underline = true, special = cs.white }) - hi('SpellCap', { underline = true, special = cs.white }) - hi('SpellLocal', { underline = true, special = cs.white }) + hi('SpellRare', { underline = true, special = cs.background }) + hi('SpellCap', { underline = true, special = cs.background }) + hi('SpellLocal', { underline = true, special = cs.background }) - hi('gitCommitSummary', { fg = cs.white }) + hi('gitCommitSummary', { fg = cs.background }) - hi('@attribute.diff', { fg = cs.white }) + hi('@attribute.diff', { fg = cs.background }) hi('DiffAdd', { fg = cs.green }, { '@text.diff.add', 'diffAdded' }) hi('DiffDelete', { fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) hi('DiffChange', { fg = cs.yellow }) - hi('@constructor.lua', { fg = cs.white }) + hi('@constructor.lua', { fg = cs.background }) hi('@markup.heading.gitcommit', { none = true }) hi('GitSignsCurrentLineBlame', { italic = true, fg = cs.light_black }) @@ -162,9 +162,9 @@ function M.apply() link('Pmenu', 'CmpPmenu') link('PmenuSel', 'CmpPmenuSel') - hi('CmpItemAbbr', { fg = cs.white }) - hi('CmpItemAbbrMatch', { fg = cs.white, bold = true }) - hi('CmpItemAbbrMatchFuzzy', { fg = cs.white, bold = true }) + hi('CmpItemAbbr', { fg = cs.background }) + hi('CmpItemAbbrMatch', { fg = cs.background, bold = true }) + hi('CmpItemAbbrMatchFuzzy', { fg = cs.background, bold = true }) hi('CmpItemAbbrDeprecated', { fg = cs.light_black, strikethrough = true }) hi('CmpItemMenu', { fg = cs.light_black }) @@ -215,18 +215,18 @@ function M.apply() link('Directory', 'OilDir') link('NormalFloat', 'FzfLuaBorder') - hi('FzfLuaHeaderText', { fg = cs.white }, { 'FzfLuaBufFlagCur' }) - hi('FzfLuaBufFlagAlt', { fg = cs.white }) + hi('FzfLuaHeaderText', { fg = cs.background }, { 'FzfLuaBufFlagCur' }) + hi('FzfLuaBufFlagAlt', { fg = cs.background }) link('Normal', 'FzfLuaLivePrompt') - vim.g.terminal_color_0 = cs.black + vim.g.terminal_color_0 = cs.foreground vim.g.terminal_color_1 = cs.red vim.g.terminal_color_2 = cs.green vim.g.terminal_color_3 = cs.yellow vim.g.terminal_color_4 = cs.blue vim.g.terminal_color_5 = cs.magenta vim.g.terminal_color_6 = cs.cyan - vim.g.terminal_color_7 = cs.white + vim.g.terminal_color_7 = cs.background vim.g.terminal_color_8 = cs.bright_black vim.g.terminal_color_9 = cs.bright_red vim.g.terminal_color_10 = cs.bright_green From f522ac7371b18c9c9f3d25adbfde437118c35282 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 27 Jan 2026 18:25:58 -0500 Subject: [PATCH 20/44] fix: typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea19f09..85735e9 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Install with any package manager of your choice. For example, with ## Motivation I find existing colorschemes to generally be excessively colorful and -distracting, rather than informative. I wrote midnight.nvim to focus on code +distracting rather than informative. I wrote midnight.nvim to focus on code structure, specifically for competitive programming and workplace software development environments. I included highlighting of constants (e.g. strings, numbers, booleans) and language keywords to emphasize the maximally important From 95f377b8dfe7b6ee1716d5857bb5bb61ccaabd30 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 27 Jan 2026 18:27:09 -0500 Subject: [PATCH 21/44] feat: use accent color in diff text --- lua/midnight/theme.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index a8d8844..75615ad 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -149,6 +149,7 @@ function M.apply() hi('DiffAdd', { fg = cs.green }, { '@text.diff.add', 'diffAdded' }) hi('DiffDelete', { fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) hi('DiffChange', { fg = cs.yellow }) + hi('DiffText', { fg = cs.foreground, bg = cs.blue }) hi('@constructor.lua', { fg = cs.background }) hi('@markup.heading.gitcommit', { none = true }) From 593ae1bc2116f39da1f06a7eb2eec6cc97eb76cd Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sun, 1 Feb 2026 17:12:20 -0500 Subject: [PATCH 22/44] fix: username updated --- README.md | 2 +- doc/midnight.nvim.txt | 2 +- midnight.nvim-scm-1.rockspec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 85735e9..6c4fd1b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Install with any package manager of your choice. For example, with ```lua { - 'barrett-ruth/midnight.nvim', + 'barrettruth/midnight.nvim', config = function() vim.cmd.colorscheme('midnight') end, diff --git a/doc/midnight.nvim.txt b/doc/midnight.nvim.txt index 459f571..9ec58e7 100644 --- a/doc/midnight.nvim.txt +++ b/doc/midnight.nvim.txt @@ -16,7 +16,7 @@ INSTALLATION *midnight-installation* >lua { - 'barrett-ruth/midnight.nvim', + 'barrettruth/midnight.nvim', config = function() vim.cmd.colorscheme('midnight') end, diff --git a/midnight.nvim-scm-1.rockspec b/midnight.nvim-scm-1.rockspec index 95763a9..5f8d9a5 100644 --- a/midnight.nvim-scm-1.rockspec +++ b/midnight.nvim-scm-1.rockspec @@ -2,5 +2,5 @@ rockspec_format = '3.0' package = 'midnight.nvim' version = 'scm-1' -source = { url = 'git://github.com/barrett-ruth/midnight.nvim' } +source = { url = 'git://github.com/barrettruth/midnight.nvim' } build = { type = 'builtin' } From 4e72648c2dd164c798e014a21405076580908b87 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Mon, 2 Feb 2026 00:42:11 -0500 Subject: [PATCH 23/44] fix: Diff* ought to hl bg --- lua/midnight/theme.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 75615ad..fc4fe4f 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -146,9 +146,9 @@ function M.apply() hi('gitCommitSummary', { fg = cs.background }) hi('@attribute.diff', { fg = cs.background }) - hi('DiffAdd', { fg = cs.green }, { '@text.diff.add', 'diffAdded' }) - hi('DiffDelete', { fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) - hi('DiffChange', { fg = cs.yellow }) + hi('DiffAdd', { bg = cs.green }, { '@text.diff.add', 'diffAdded' }) + hi('DiffDelete', { bg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) + hi('DiffChange', { bg = cs.yellow }) hi('DiffText', { fg = cs.foreground, bg = cs.blue }) hi('@constructor.lua', { fg = cs.background }) From 733e04f48bf869d27d6c309fc7e4056ec732b722 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Mon, 2 Feb 2026 15:31:46 -0500 Subject: [PATCH 24/44] feat(color): diff change --- lua/midnight/palette.lua | 35 +++++++++++++++++++++++++++++++++++ lua/midnight/theme.lua | 6 +++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/lua/midnight/palette.lua b/lua/midnight/palette.lua index 2b0ed0b..a701c6a 100644 --- a/lua/midnight/palette.lua +++ b/lua/midnight/palette.lua @@ -1,5 +1,22 @@ local M = {} +---@param hex string +---@param bg_hex string +---@param alpha number +---@return string +function M.blend(hex, bg_hex, alpha) + local function parse(h) + h = h:gsub('#', '') + return tonumber(h:sub(1, 2), 16), tonumber(h:sub(3, 4), 16), tonumber(h:sub(5, 6), 16) + end + local r, g, b = parse(hex) + local bg_r, bg_g, bg_b = parse(bg_hex) + local blend_r = math.floor(r * alpha + bg_r * (1 - alpha)) + local blend_g = math.floor(g * alpha + bg_g * (1 - alpha)) + local blend_b = math.floor(b * alpha + bg_b * (1 - alpha)) + return string.format('#%02x%02x%02x', blend_r, blend_g, blend_b) +end + ---@class Palette ---@field foreground string ---@field red string @@ -31,6 +48,9 @@ local M = {} ---@field light_cyan? string ---@field light_white? string ---@field medium_emphasis? string +---@field diff_add? string +---@field diff_delete? string +---@field diff_change? string ---@type Palette M.midnight = { @@ -59,6 +79,15 @@ M.midnight = { dark_grey = '#222222', medium_emphasis = '#999999', + + -- Diff backgrounds: base color blended at 40% with visual bg (#121212) + -- Generated via: M.blend(base_color, '#121212', 0.4) + -- diff_add = M.blend('#98c379', '#121212', 0.4) -- green + -- diff_delete = M.blend('#ff6b6b', '#121212', 0.4) -- red + -- diff_change = M.blend('#e5c07b', '#121212', 0.4) -- yellow + diff_add = '#0c2f1e', + diff_delete = '#291f27', + diff_change = '#66583c', } ---@type Palette @@ -88,6 +117,12 @@ M.daylight = { dark_grey = '#ebebeb', medium_emphasis = '#666666', + + -- Diff backgrounds: base color blended at 40% with visual bg (#f5f5f5) + -- Generated via: M.blend(base_color, '#f5f5f5', 0.4) + diff_add = '#a5c5ab', + diff_delete = '#e2a1b2', + diff_change = '#d0bc93', } ---@return Palette diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index fc4fe4f..3a76ebf 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -146,9 +146,9 @@ function M.apply() hi('gitCommitSummary', { fg = cs.background }) hi('@attribute.diff', { fg = cs.background }) - hi('DiffAdd', { bg = cs.green }, { '@text.diff.add', 'diffAdded' }) - hi('DiffDelete', { bg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) - hi('DiffChange', { bg = cs.yellow }) + hi('DiffAdd', { bg = cs.diff_add, fg = cs.green }, { '@text.diff.add', 'diffAdded' }) + hi('DiffDelete', { bg = cs.diff_delete, fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) + hi('DiffChange', { bg = cs.diff_change, fg = cs.yellow }) hi('DiffText', { fg = cs.foreground, bg = cs.blue }) hi('@constructor.lua', { fg = cs.background }) From 2b32dda9f9b7ea9a2f87ca0a4d6ee5fab06fc491 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 01:18:32 -0500 Subject: [PATCH 25/44] misc cleanups for diffing --- lua/midnight/palette.lua | 6 +++--- lua/midnight/theme.lua | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lua/midnight/palette.lua b/lua/midnight/palette.lua index a701c6a..c531133 100644 --- a/lua/midnight/palette.lua +++ b/lua/midnight/palette.lua @@ -84,10 +84,10 @@ M.midnight = { -- Generated via: M.blend(base_color, '#121212', 0.4) -- diff_add = M.blend('#98c379', '#121212', 0.4) -- green -- diff_delete = M.blend('#ff6b6b', '#121212', 0.4) -- red - -- diff_change = M.blend('#e5c07b', '#121212', 0.4) -- yellow + -- diff_change = M.blend('#7aa2f7', '#121212', 0.4) -- blue diff_add = '#0c2f1e', diff_delete = '#291f27', - diff_change = '#66583c', + diff_change = '#3a4a6d', } ---@type Palette @@ -122,7 +122,7 @@ M.daylight = { -- Generated via: M.blend(base_color, '#f5f5f5', 0.4) diff_add = '#a5c5ab', diff_delete = '#e2a1b2', - diff_change = '#d0bc93', + diff_change = '#a9b7e5', } ---@return Palette diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 3a76ebf..1239f47 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -148,8 +148,13 @@ function M.apply() hi('@attribute.diff', { fg = cs.background }) hi('DiffAdd', { bg = cs.diff_add, fg = cs.green }, { '@text.diff.add', 'diffAdded' }) hi('DiffDelete', { bg = cs.diff_delete, fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) - hi('DiffChange', { bg = cs.diff_change, fg = cs.yellow }) - hi('DiffText', { fg = cs.foreground, bg = cs.blue }) + hi('DiffChange', { bg = cs.diff_change, fg = cs.blue }) + hi('DiffText', { bg = cs.blue, fg = cs.foreground }) + + hi('DiffsDiffAdd', { bg = cs.diff_add }) + hi('DiffsDiffDelete', { bg = cs.diff_delete }) + hi('DiffsDiffChange', { bg = cs.diff_change }) + hi('DiffsDiffText', { bg = cs.blue }) hi('@constructor.lua', { fg = cs.background }) hi('@markup.heading.gitcommit', { none = true }) From b54045f31a78a639962fd4e172b4e25953030728 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 01:23:32 -0500 Subject: [PATCH 26/44] fix: explicitly remove underline from cursor --- lua/midnight/theme.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 1239f47..25a7a15 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -65,7 +65,7 @@ function M.apply() hi('NonText', { fg = cs.grey }, { 'SpecialKey' }) hi('LineNr', { fg = cs.light_black }, { 'SignColumn' }) - hi('CursorLine', { bg = cs.dark_grey }, { 'ColorColumn', 'Folded', 'Visual' }) + hi('CursorLine', { bg = cs.dark_grey, underline = false }, { 'ColorColumn', 'Folded', 'Visual' }) hi('CursorLineNr', { fg = cs.medium_emphasis }) hi('Conceal', { fg = cs.light_black, bg = cs.foreground }) From 8b695453a8d6ba4816a2fda9968e95e9b19125af Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 20:07:56 -0500 Subject: [PATCH 27/44] remove superfluous background setting --- colors/daylight.lua | 1 - colors/midnight.lua | 1 - 2 files changed, 2 deletions(-) diff --git a/colors/daylight.lua b/colors/daylight.lua index daa37f0..605553d 100644 --- a/colors/daylight.lua +++ b/colors/daylight.lua @@ -1,2 +1 @@ -vim.o.background = 'light' require('midnight').load() diff --git a/colors/midnight.lua b/colors/midnight.lua index dfd2424..605553d 100644 --- a/colors/midnight.lua +++ b/colors/midnight.lua @@ -1,2 +1 @@ -vim.o.background = 'dark' require('midnight').load() From 270ba26bce32c6fc561043feaf319a4f179149fd Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 20:12:17 -0500 Subject: [PATCH 28/44] refactor: remove unused setup function Colorschemes load via :colorscheme command, making the setup() no-op redundant. --- lua/midnight/init.lua | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lua/midnight/init.lua b/lua/midnight/init.lua index 7d03715..50a83ba 100644 --- a/lua/midnight/init.lua +++ b/lua/midnight/init.lua @@ -1,14 +1,5 @@ local M = {} ----@class MidnightConfig ----@field [string] any - ----@param opts? MidnightConfig ----@return nil -function M.setup(opts) - opts = opts or {} -end - ---@return nil function M.load() if vim.g.colors_name then From 32c1f23f90cd501be751b9ed6fd3c99b9e6a590a Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 20:48:46 -0500 Subject: [PATCH 29/44] docs: update readme with luarocks installation --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6c4fd1b..1b47a6b 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,21 @@ # midnight.nvim -neovim theme for code, not colors. +Neovim theme for code, not colors. ![Image](https://github.com/user-attachments/assets/9abb5126-15d7-4de4-ad6d-ec35975fec03) ## Installation -Install with any package manager of your choice. For example, with -[lazy.nvim](https://github.com/folke/lazy.nvim): +Install using your package manager of choice or via [luarocks](https://luarocks.org/modules/barrettruth/midnight.nvim): + +``` +luarocks install midnight.nvim +``` + +Then set the colorscheme: ```lua -{ - 'barrettruth/midnight.nvim', - config = function() - vim.cmd.colorscheme('midnight') - end, -} +vim.cmd.colorscheme('midnight') ``` ## Plugin Integration From 6b63011c1c75d101f984f83cf9e51e6c36ecf1d4 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 20:51:56 -0500 Subject: [PATCH 30/44] format --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1b47a6b..234d9d9 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ Neovim theme for code, not colors. ## Installation -Install using your package manager of choice or via [luarocks](https://luarocks.org/modules/barrettruth/midnight.nvim): +Install using your package manager of choice or via +[luarocks](https://luarocks.org/modules/barrettruth/midnight.nvim): ``` luarocks install midnight.nvim @@ -18,7 +19,7 @@ Then set the colorscheme: vim.cmd.colorscheme('midnight') ``` -## Plugin Integration +## Plugin Integrations - [treesitter](https://github.com/nvim-treesitter/nvim-treesitter) - [fzf-lua](https://github.com/ibhagwan/fzf-lua) From 6559261ad57f843dafbee84cc4404aaec7c85ff8 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 21:07:02 -0500 Subject: [PATCH 31/44] chore: add issue templates --- .github/ISSUE_TEMPLATE/bug_report.yaml | 78 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yaml | 5 ++ .github/ISSUE_TEMPLATE/feature_request.yaml | 30 ++++++++ 3 files changed, 113 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yaml create mode 100644 .github/ISSUE_TEMPLATE/config.yaml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yaml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000..4759413 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,78 @@ +name: Bug Report +description: Report a bug +title: 'bug: ' +labels: [bug] +body: + - type: checkboxes + attributes: + label: Prerequisites + options: + - label: + I have searched [existing + issues](https://github.com/barrettruth/midnight.nvim/issues) + required: true + - label: I have updated to the latest version + required: true + + - type: textarea + attributes: + label: 'Neovim version' + description: 'Output of `nvim --version`' + render: text + validations: + required: true + + - type: input + attributes: + label: 'Operating system' + placeholder: 'e.g. Arch Linux, macOS 15, Ubuntu 24.04' + validations: + required: true + + - type: textarea + attributes: + label: Description + description: What happened? What did you expect? + validations: + required: true + + - type: textarea + attributes: + label: Steps to reproduce + description: Minimal steps to trigger the bug + value: | + 1. + 2. + 3. + validations: + required: true + + - type: textarea + attributes: + label: 'Health check' + description: 'Output of `:checkhealth midnight`' + render: text + + - type: textarea + attributes: + label: Minimal reproduction + description: | + Save the script below as `repro.lua`, edit if needed, and run: + ``` + nvim -u repro.lua + ``` + Confirm the bug reproduces with this config before submitting. + render: lua + value: | + vim.env.LAZY_STDPATH = '.repro' + load(vim.fn.system('curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua'))() + require('lazy.nvim').setup({ + spec = { + { + 'barrett-ruth/midnight.nvim', + opts = {}, + }, + }, + }) + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 0000000..92bd099 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Questions + url: https://github.com/barrettruth/midnight.nvim/discussions + about: Ask questions and discuss ideas diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 0000000..77998c2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,30 @@ +name: Feature Request +description: Suggest a feature +title: 'feat: ' +labels: [enhancement] +body: + - type: checkboxes + attributes: + label: Prerequisites + options: + - label: + I have searched [existing + issues](https://github.com/barrettruth/midnight.nvim/issues) + required: true + + - type: textarea + attributes: + label: Problem + description: What problem does this solve? + validations: + required: true + + - type: textarea + attributes: + label: Proposed solution + validations: + required: true + + - type: textarea + attributes: + label: Alternatives considered From 2702caf35222e6824f02e08a29415a6f1618c979 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 21:46:43 -0500 Subject: [PATCH 32/44] fix: add deprecation warning for setup() --- lua/midnight/init.lua | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lua/midnight/init.lua b/lua/midnight/init.lua index 50a83ba..1ed25ca 100644 --- a/lua/midnight/init.lua +++ b/lua/midnight/init.lua @@ -17,4 +17,17 @@ function M.load() theme.apply() end +---@deprecated Use `vim.cmd('colorscheme midnight')` instead +function M.setup(opts) + vim.deprecate( + 'require("midnight").setup()', + 'vim.cmd("colorscheme midnight")', + 'v0.1.0', + 'midnight.nvim', + false + ) + + M.load() +end + return M From 94a373f416f2b9ff3a720fbbc59e1229414e5cab Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 21:51:55 -0500 Subject: [PATCH 33/44] fix: mark opts as intentionally unused --- lua/midnight/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/midnight/init.lua b/lua/midnight/init.lua index 1ed25ca..1055fda 100644 --- a/lua/midnight/init.lua +++ b/lua/midnight/init.lua @@ -18,7 +18,7 @@ function M.load() end ---@deprecated Use `vim.cmd('colorscheme midnight')` instead -function M.setup(opts) +function M.setup(_opts) vim.deprecate( 'require("midnight").setup()', 'vim.cmd("colorscheme midnight")', From 517837c9d36c5ab5c4b22e695359f9b9a4ad0879 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Wed, 4 Feb 2026 15:58:07 -0500 Subject: [PATCH 34/44] feat: add treesitter highlights for diff files Adds support for treesitter-based diff syntax highlighting: - @diff.minus (red) and @diff.plus (green) for changed lines - @attribute.diff (blue) for hunk headers - @string.special.path and @variable.parameter linked to Normal --- lua/midnight/theme.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index 25a7a15..d4dffb7 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -145,7 +145,10 @@ function M.apply() hi('gitCommitSummary', { fg = cs.background }) - hi('@attribute.diff', { fg = cs.background }) + hi('@attribute.diff', { fg = cs.blue }) + hi('@diff.minus', { fg = cs.red }) + hi('@diff.plus', { fg = cs.green }) + link('Normal', { '@string.special.path', '@variable.parameter' }) hi('DiffAdd', { bg = cs.diff_add, fg = cs.green }, { '@text.diff.add', 'diffAdded' }) hi('DiffDelete', { bg = cs.diff_delete, fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) hi('DiffChange', { bg = cs.diff_change, fg = cs.blue }) From f28ffed8d94db0ea3e708b510f8c1c131e45d9c4 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Wed, 4 Feb 2026 16:01:18 -0500 Subject: [PATCH 35/44] fix(ci): remove python --- .github/workflows/quality.yaml | 47 ---------------------------------- .pre-commit-config.yaml | 20 --------------- 2 files changed, 67 deletions(-) diff --git a/.github/workflows/quality.yaml b/.github/workflows/quality.yaml index d7be890..dcf74d2 100644 --- a/.github/workflows/quality.yaml +++ b/.github/workflows/quality.yaml @@ -11,7 +11,6 @@ jobs: runs-on: ubuntu-latest outputs: lua: ${{ steps.changes.outputs.lua }} - python: ${{ steps.changes.outputs.python }} markdown: ${{ steps.changes.outputs.markdown }} steps: - uses: actions/checkout@v4 @@ -25,10 +24,6 @@ jobs: - '*.lua' - '.luarc.json' - '*.toml' - python: - - 'scripts/**/*.py' - - 'pyproject.toml' - - 'uv.lock' markdown: - '*.md' @@ -72,48 +67,6 @@ jobs: directories: lua configpath: .luarc.json - python-format: - name: Python Format Check - runs-on: ubuntu-latest - needs: changes - if: ${{ needs.changes.outputs.python == 'true' }} - steps: - - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v4 - - name: Install ruff - run: uv tool install ruff - - name: Check Python formatting with ruff - run: ruff format --check . - - python-lint: - name: Python Lint Check - runs-on: ubuntu-latest - needs: changes - if: ${{ needs.changes.outputs.python == 'true' }} - steps: - - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v4 - - name: Install ruff - run: uv tool install ruff - - name: Lint Python files with ruff - run: ruff check . - - python-typecheck: - name: Python Type Check - runs-on: ubuntu-latest - needs: changes - if: ${{ needs.changes.outputs.python == 'true' }} - steps: - - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v4 - - name: Install dependencies with mypy - run: uv sync --dev - - name: Type check Python files with mypy - run: uv run mypy . - markdown-format: name: Markdown Format Check runs-on: ubuntu-latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4706ce4..3477598 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,26 +9,6 @@ repos: files: \.lua$ pass_filenames: true - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.3 - hooks: - - id: ruff-format - name: ruff (format) - files: \.py$ - - id: ruff - name: ruff (lint imports) - args: ['--fix', '--select=I'] - files: \.py$ - - - repo: local - hooks: - - id: mypy - name: mypy (type check) - entry: uv run mypy - language: system - args: ['.'] - pass_filenames: false - - repo: https://github.com/pre-commit/mirrors-prettier rev: v4.0.0-alpha.8 hooks: From 9ff64a7b89d01579b2edd11047e0f586188d2283 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 5 Feb 2026 00:39:22 -0500 Subject: [PATCH 36/44] misc highlight fixes --- lua/midnight/theme.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index d4dffb7..c32d23c 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -148,6 +148,9 @@ function M.apply() hi('@attribute.diff', { fg = cs.blue }) hi('@diff.minus', { fg = cs.red }) hi('@diff.plus', { fg = cs.green }) + hi('@diff.delta', { fg = cs.blue }) + hi('@punctuation.special.diff', { fg = cs.blue }) + link('Normal', { '@string.special.path', '@variable.parameter' }) hi('DiffAdd', { bg = cs.diff_add, fg = cs.green }, { '@text.diff.add', 'diffAdded' }) hi('DiffDelete', { bg = cs.diff_delete, fg = cs.red }, { '@text.diff.delete', 'diffRemoved' }) From 130a1899c2d5a0af431f3e41eeac429e90ea1d09 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 10 Feb 2026 13:44:36 -0500 Subject: [PATCH 37/44] fix: recursion loading random issue --- lua/midnight/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lua/midnight/init.lua b/lua/midnight/init.lua index 1055fda..670aaeb 100644 --- a/lua/midnight/init.lua +++ b/lua/midnight/init.lua @@ -1,7 +1,12 @@ local M = {} +local loading = false + ---@return nil function M.load() + if loading then return end + loading = true + if vim.g.colors_name then vim.cmd('hi clear') end @@ -15,6 +20,8 @@ function M.load() local theme = require('midnight.theme') theme.apply() + + loading = false end ---@deprecated Use `vim.cmd('colorscheme midnight')` instead From fc03b940ded5682665278894b45c23559221264a Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 17 Feb 2026 19:24:25 -0500 Subject: [PATCH 38/44] fix: format lua and highlight latex functions --- lua/midnight/init.lua | 4 +++- lua/midnight/theme.lua | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/midnight/init.lua b/lua/midnight/init.lua index 670aaeb..41d066f 100644 --- a/lua/midnight/init.lua +++ b/lua/midnight/init.lua @@ -4,7 +4,9 @@ local loading = false ---@return nil function M.load() - if loading then return end + if loading then + return + end loading = true if vim.g.colors_name then diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index c32d23c..a4d786f 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -165,6 +165,8 @@ function M.apply() hi('@constructor.lua', { fg = cs.background }) hi('@markup.heading.gitcommit', { none = true }) + hi('@function.latex', { fg = cs.blue }) + hi('GitSignsCurrentLineBlame', { italic = true, fg = cs.light_black }) link('DiffAdd', 'GitSignsAdd') link('DiffChange', 'GitSignsChange') From 638a9e65f30e2d49a9fec231bef91a34aca9f0a2 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Wed, 18 Feb 2026 11:21:58 -0500 Subject: [PATCH 39/44] fix: use plain background for gitsigns highlights Problem: gitsigns groups were linked to DiffAdd/DiffChange/DiffDelete, which have tinted backgrounds that look out of place in the sign column. Solution: define GitSignsAdd, GitSignsChange, and GitSignsDelete with foreground-only highlights so they inherit the normal background. --- lua/midnight/theme.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index a4d786f..e039454 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -168,9 +168,9 @@ function M.apply() hi('@function.latex', { fg = cs.blue }) hi('GitSignsCurrentLineBlame', { italic = true, fg = cs.light_black }) - link('DiffAdd', 'GitSignsAdd') - link('DiffChange', 'GitSignsChange') - link('DiffDelete', 'GitSignsDelete') + hi('GitSignsAdd', { fg = cs.green }) + hi('GitSignsChange', { fg = cs.blue }) + hi('GitSignsDelete', { fg = cs.red }) link('Search', 'HighlightUndo') From 7891879b4e7ba183f377369beb094450d115bb4b Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 20 Feb 2026 20:18:23 -0500 Subject: [PATCH 40/44] feat: blink-cmp-git integration --- lua/midnight/theme.lua | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lua/midnight/theme.lua b/lua/midnight/theme.lua index e039454..1fbfa02 100644 --- a/lua/midnight/theme.lua +++ b/lua/midnight/theme.lua @@ -121,9 +121,13 @@ function M.apply() hi('@variable', { none = true }) - hi('Pmenu', { bg = cs.dark_grey }, { 'PmenuSbar' }) + hi('Pmenu', { fg = cs.background, bg = cs.foreground }, { 'PmenuSbar' }) hi('PmenuSel', { bg = cs.med_grey }) hi('PmenuThumb', { bg = cs.grey }) + hi('BlinkCmpMenu', { fg = cs.background, bg = cs.foreground }) + hi('BlinkCmpMenuBorder', { fg = cs.background, bg = cs.foreground }) + hi('BlinkCmpDoc', { fg = cs.background, bg = cs.foreground }) + hi('BlinkCmpDocBorder', { fg = cs.background, bg = cs.foreground }) hi('LspInlayHint', { fg = cs.light_black }) hi('LspSignatureActiveParameter', { underline = true, italic = true }) @@ -179,6 +183,23 @@ function M.apply() hi('CmpItemAbbr', { fg = cs.background }) hi('CmpItemAbbrMatch', { fg = cs.background, bold = true }) hi('CmpItemAbbrMatchFuzzy', { fg = cs.background, bold = true }) + hi('BlinkCmpLabelMatch', { fg = cs.green }) + hi('BlinkCmpGhostText', { fg = cs.light_black }) + hi('BlinkCmpGitKindMR', { fg = cs.magenta }) + hi('BlinkCmpGitKindPR', { fg = cs.magenta }) + hi('BlinkCmpGitKindIssue', { fg = cs.magenta }) + hi('BlinkCmpGitKindCommit', { fg = cs.magenta }) + hi('BlinkCmpGitKindMention', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconMR', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconPR', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconIssue', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconCommit', { fg = cs.magenta }) + hi('BlinkCmpGitKindIconMention', { fg = cs.magenta }) + hi('BlinkCmpGitLabelMRId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelPRId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelIssueId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelCommitId', { fg = cs.magenta }) + hi('BlinkCmpGitLabelMentionId', { fg = cs.magenta }) hi('CmpItemAbbrDeprecated', { fg = cs.light_black, strikethrough = true }) hi('CmpItemMenu', { fg = cs.light_black }) From f52dd06c2660ef66ee8c5aef59f08411410e55b9 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Mon, 23 Feb 2026 17:35:26 -0500 Subject: [PATCH 41/44] build(flake): add nix devShell Problem: no nix dev shell existed, making it harder to get local tooling for formatting, linting, and type checking. Solution: add a flake with a devShell providing prettier, stylua, selene, and lua-language-server. --- flake.nix | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 flake.nix diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..8589f5a --- /dev/null +++ b/flake.nix @@ -0,0 +1,30 @@ +{ + description = "midnight.nvim — a dark colorscheme for Neovim"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + systems.url = "github:nix-systems/default"; + }; + + outputs = + { + nixpkgs, + systems, + ... + }: + let + forEachSystem = f: nixpkgs.lib.genAttrs (import systems) (system: f nixpkgs.legacyPackages.${system}); + in + { + devShells = forEachSystem (pkgs: { + default = pkgs.mkShell { + packages = [ + pkgs.prettier + pkgs.stylua + pkgs.selene + pkgs.lua-language-server + ]; + }; + }); + }; +} From af0a44bec80ed1fb1ff0dbcd3f3336ef8750ec8a Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Mon, 23 Feb 2026 18:14:20 -0500 Subject: [PATCH 42/44] ci: migrate to nix --- .github/workflows/quality.yaml | 29 ++++++----------------- .gitignore | 3 +++ .luarc.json | 2 +- flake.lock | 43 ++++++++++++++++++++++++++++++++++ selene.toml | 3 +++ vim.toml | 30 ------------------------ vim.yaml | 24 +++++++++++++++++++ 7 files changed, 81 insertions(+), 53 deletions(-) create mode 100644 flake.lock delete mode 100644 vim.toml create mode 100644 vim.yaml diff --git a/.github/workflows/quality.yaml b/.github/workflows/quality.yaml index dcf74d2..e43f71c 100644 --- a/.github/workflows/quality.yaml +++ b/.github/workflows/quality.yaml @@ -24,6 +24,7 @@ jobs: - '*.lua' - '.luarc.json' - '*.toml' + - 'vim.yaml' markdown: - '*.md' @@ -34,11 +35,8 @@ jobs: if: ${{ needs.changes.outputs.lua == 'true' }} steps: - uses: actions/checkout@v4 - - uses: JohnnyMorganz/stylua-action@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - version: 2.1.0 - args: --check . + - uses: cachix/install-nix-action@v31 + - run: nix develop --command stylua --check . lua-lint: name: Lua Lint Check @@ -47,11 +45,8 @@ jobs: if: ${{ needs.changes.outputs.lua == 'true' }} steps: - uses: actions/checkout@v4 - - name: Lint with Selene - uses: NTBBloodbath/selene-action@v1.0.0 - with: - token: ${{ secrets.GITHUB_TOKEN }} - args: --display-style quiet . + - uses: cachix/install-nix-action@v31 + - run: nix develop --command selene --display-style quiet . lua-typecheck: name: Lua Type Check @@ -74,15 +69,5 @@ jobs: if: ${{ needs.changes.outputs.markdown == 'true' }} steps: - uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 8 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - name: Install prettier - run: pnpm add -g prettier@3.1.0 - - name: Check markdown formatting with prettier - run: prettier --check . + - uses: cachix/install-nix-action@v31 + - run: nix develop --command prettier --check . diff --git a/.gitignore b/.gitignore index 7451084..d13bcc9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ venv/ CLAUDE.md __pycache__ node_modules/ + +.direnv/ +.envrc diff --git a/.luarc.json b/.luarc.json index 3ccfeda..19558f6 100644 --- a/.luarc.json +++ b/.luarc.json @@ -1,5 +1,5 @@ { - "runtime.version": "Lua 5.1", + "runtime.version": "LuaJIT", "runtime.path": ["lua/?.lua", "lua/?/init.lua"], "diagnostics.globals": ["vim"], "workspace.library": ["$VIMRUNTIME/lua", "${3rd}/luv/library"], diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b6f667a --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1771423170, + "narHash": "sha256-K7Dg9TQ0mOcAtWTO/FX/FaprtWQ8BmEXTpLIaNRhEwU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bcc4a9d9533c033d806a46b37dc444f9b0da49dd", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/selene.toml b/selene.toml index 96cf5ab..f2ada4b 100644 --- a/selene.toml +++ b/selene.toml @@ -1 +1,4 @@ std = 'vim' + +[lints] +bad_string_escape = 'allow' diff --git a/vim.toml b/vim.toml deleted file mode 100644 index 8bf26ea..0000000 --- a/vim.toml +++ /dev/null @@ -1,30 +0,0 @@ -[selene] -base = "lua51" -name = "vim" - -[vim] -any = true - -[jit] -any = true - -[assert] -any = true - -[describe] -any = true - -[it] -any = true - -[before_each] -any = true - -[after_each] -any = true - -[spy] -any = true - -[stub] -any = true diff --git a/vim.yaml b/vim.yaml new file mode 100644 index 0000000..401fce6 --- /dev/null +++ b/vim.yaml @@ -0,0 +1,24 @@ +--- +base: lua51 +name: vim +lua_versions: + - luajit +globals: + vim: + any: true + jit: + any: true + assert: + any: true + describe: + any: true + it: + any: true + before_each: + any: true + after_each: + any: true + spy: + any: true + stub: + any: true From 6b1ba1f056743c91812c770da7086e69001ac9a3 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Wed, 4 Mar 2026 13:50:44 -0500 Subject: [PATCH 43/44] ci: scripts + format --- .luarc.json | 1 + .styluaignore | 1 + scripts/ci.sh | 7 +++++++ vim.yaml | 2 ++ 4 files changed, 11 insertions(+) create mode 100644 .styluaignore create mode 100755 scripts/ci.sh diff --git a/.luarc.json b/.luarc.json index 19558f6..e240dd5 100644 --- a/.luarc.json +++ b/.luarc.json @@ -4,5 +4,6 @@ "diagnostics.globals": ["vim"], "workspace.library": ["$VIMRUNTIME/lua", "${3rd}/luv/library"], "workspace.checkThirdParty": false, + "workspace.ignoreDir": [".direnv"], "completion.callSnippet": "Replace" } diff --git a/.styluaignore b/.styluaignore new file mode 100644 index 0000000..9b42106 --- /dev/null +++ b/.styluaignore @@ -0,0 +1 @@ +.direnv/ diff --git a/scripts/ci.sh b/scripts/ci.sh new file mode 100755 index 0000000..7b5f52b --- /dev/null +++ b/scripts/ci.sh @@ -0,0 +1,7 @@ +#!/bin/sh +set -eu + +nix develop --command stylua --check . +git ls-files '*.lua' | xargs nix develop --command selene --display-style quiet +nix develop --command prettier --check . +nix develop --command lua-language-server --check . --checklevel=Warning diff --git a/vim.yaml b/vim.yaml index 401fce6..3821d25 100644 --- a/vim.yaml +++ b/vim.yaml @@ -22,3 +22,5 @@ globals: any: true stub: any: true + bit: + any: true From 26fb9ca518cc0353bc1f967bfc34ebcc51e0d076 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Wed, 4 Mar 2026 14:12:41 -0500 Subject: [PATCH 44/44] ci: nix --- flake.nix | 5 ++++- scripts/ci.sh | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 8589f5a..18752aa 100644 --- a/flake.nix +++ b/flake.nix @@ -13,9 +13,12 @@ ... }: let - forEachSystem = f: nixpkgs.lib.genAttrs (import systems) (system: f nixpkgs.legacyPackages.${system}); + forEachSystem = + f: nixpkgs.lib.genAttrs (import systems) (system: f nixpkgs.legacyPackages.${system}); in { + formatter = forEachSystem (pkgs: pkgs.nixfmt-tree); + devShells = forEachSystem (pkgs: { default = pkgs.mkShell { packages = [ diff --git a/scripts/ci.sh b/scripts/ci.sh index 7b5f52b..18dc321 100755 --- a/scripts/ci.sh +++ b/scripts/ci.sh @@ -4,4 +4,6 @@ set -eu nix develop --command stylua --check . git ls-files '*.lua' | xargs nix develop --command selene --display-style quiet nix develop --command prettier --check . +nix fmt +git diff --exit-code -- '*.nix' nix develop --command lua-language-server --check . --checklevel=Warning