# Python 3.10+ required (PuiKit, XeFM's UI framework, requires 3.10+)
# pygments for syntax highlighting (will fallback gracefully if not available)
# boto3 for AWS S3 support
# watchdog for automatic file list reloading
# pillow for the built-in image viewer (decode/crop/scale; the viewer degrades
#   to a metadata card without it, and inline terminal images need it too).
#   Pillow's own format registry is half of what the viewer claims to open --
#   11.3+ bundles libavif, so AVIF needs nothing else -- and any Pillow plugin
#   installed alongside it (pillow-heif, pillow-jxl-plugin) is picked up with no
#   entry here and no XeFM-side switch. None of those plugins is required:
#   their wheels bundle LGPL codecs the DMG and MSIX would have to attribute, to
#   serve formats macOS and Windows already read natively. See
#   xefm/image_decoders.py.
# libarchive-c for archive formats the standard library cannot read (.7z, .rar,
#   .iso, .cab, .cpio, .rpm); see the note above the pin for why it is optional
# pymigemo for Migemo (romaji -> Japanese) matching in incremental search
#   (will fallback gracefully to plain matching if not available)
#
# Backend/platform deps (pyobjc on macOS, windows-curses on Windows, numpy on
# Windows) are PuiKit's own requirements and resolve transitively via the puikit
# pin below, so XeFM does not list them here. pillow is listed because XeFM's
# image viewer imports PIL directly, independent of PuiKit.

# PuiKit is XeFM's UI/rendering framework (the TUI/GUI backend layer), published
# on PyPI as of 1.0. For co-development against a local checkout, ``make venv``
# additionally installs it editable from ../puikit, which overrides this pin.
# 1.7.0 is the floor, and a hard one: the image viewer asks the backend which
# formats it draws from a path (``Panel.image_formats()``) and hands it decoded
# pixels for the ones it does not (``puikit.image.RasterImage``) -- an
# AttributeError at startup and an ImportError at import on any older PuiKit.
# That pairing is what widened the supported image formats: HEIC, JPEG XL and
# camera RAW are drawn by the OS's own decoder where there is one, and a format
# only XeFM can decode (a config's IMAGE_DECODERS entry, a Pillow plugin) is
# handed over as pixels rather than written back out as a PNG. 1.7.0 also makes
# every backend answer ``image_size`` through that same native decoder, which is
# what makes the size -- and so the picture -- available for those formats at
# all; and it lets a *terminal* borrow the OS decoder too, which is the whole
# reason the terminal app shows a HEIC the desktop app on the same machine was
# already showing. None of that last part is a floor of its own: on an older
# PuiKit the formats simply are not claimed. See discussion #378 and
# doc/dev/IMAGE_VIEWER_IMPLEMENTATION.md.
# 1.6.0 was the previous floor, and a hard one: on the macOS GUI the main window is
# opened with ``WindowStyle(takes_first_click=True)`` so that a drag out of a
# background XeFM starts on the first press rather than being spent bringing
# the window forward (issue #431) -- an unexpected keyword, so a TypeError at
# startup, on any older PuiKit. 1.6.0 also carries ``MenuBar.set_menu``, which
# a config reload hands the rebuilt menu so it stops naming the key the user
# just bound away from (issue #382), an AttributeError before it existed; and
# the gate that quiets an OS menu bar under a modal layer, which XeFM never
# calls but relies on -- without it a menu item stays live under an open dialog
# and drives the file list behind it (issue #388).
# 1.5.4 was the previous floor, and a hard one: before printing the menu-bar
# row the help dialog asks ``MenuBar.takes_activation_key`` whether that key
# opens anything, an AttributeError on any older PuiKit -- so opening help
# raises instead of drawing. 1.5.4 also carries the Markdown fix the same
# dialog depends on: a table cell holding a lone backslash (what ``go_root``
# is bound to) came back an empty code span, the backslash and its closing
# backtick both eaten as an escape (issue #389).
# 1.5.3 was the floor before that, and a soft one: it carries the UI-thread stall
# detector ``--ui-watchdog`` turns on (issue #407), a developer diagnostic, so an
# older PuiKit costs the switch and nothing else -- XeFM says so at startup
# rather than staying silent. It also carries the fix that makes the switch work
# on the TUI at all: VTBackend never recorded its UI thread, so the detector had
# no subject there (and ``_assert_ui_thread`` nothing to check against).
# 1.5.0 is the hard floor under that one: the TUI cursor cue passes
# ``Style(underline_color=...)``, a TypeError on any older PuiKit, and reads the
# ``colored_underlines`` capability, an AttributeError -- so a file pane cannot
# draw a row at all. Both arrived in puikit 1.5.0 (issue #350).
# The floors underneath it are recorded because they are still the answer to
# "why not lower": 1.4.3 drew the CSV / TSV table viewer's header wrong, a
# full-width (CJK) cell making PuiKit's TableView lay a row out wider than its
# own column rules (issue #355); and 1.2.0 is where the calls XeFM makes
# arrived -- the rich viewers' ``search_matcher`` hook (Migemo in incremental
# search -- issue #302), ``Panel.remove_layer`` (the progress dialog closing
# itself from under a covering confirm box -- issue #333), and
# ``MenuBar.open_menu`` / ``open_menu_mnemonic`` (keyboard menu activation --
# issue #304).
puikit>=1.7.0
pygments
boto3
watchdog
pillow

# The ctypes binding for libarchive, which is how XeFM reads .7z, .rar, .iso,
# .cab, .cpio and .rpm. It is pure Python and carries no binary of its own, so
# the shared library still has to come from somewhere: a bundled copy, the
# LIBARCHIVE environment variable, or the system — macOS and most Linux
# distributions already have one new enough. When none of those answers, XeFM
# logs why at startup and offers zip and tar only; nothing else degrades, which
# is why this is an ordinary requirement rather than a hard dependency with a
# platform marker. See doc/dev/ARCHIVE_SYSTEM.md.
libarchive-c

# Pinned exactly: 0.0.1's dictionary reader breaks on LP64 platforms
# (macOS/Linux) and xefm/migemo_search.py patches it at runtime — a future
# upstream release could move the internals that patch touches. See
# discussion #332 before bumping.
pymigemo==0.0.1
