1from __future__ import annotations
  2
  3import os
  4
  5import click
  6
  7from plain.cli import register_cli
  8from plain.runtime import APP_PATH
  9
 10from .core import Tailwind
 11
 12
 13@register_cli("tailwind")
 14@click.group("tailwind")
 15def cli() -> None:
 16    """Tailwind CSS management"""
 17
 18
 19@cli.command()
 20@click.pass_context
 21def init(ctx: click.Context) -> None:
 22    """Install Tailwind CSS"""
 23    tailwind = Tailwind()
 24
 25    if not tailwind.is_installed():
 26        ctx.invoke(update)
 27
 28    if not tailwind.src_css_path.exists():
 29        click.secho("Creating Tailwind source CSS...", bold=True)
 30        tailwind.create_src_css()
 31
 32    # gitignore
 33
 34
 35@cli.command()
 36@click.option("--force", is_flag=True, help="Reinstall even if up to date")
 37@click.pass_context
 38def install(ctx: click.Context, force: bool) -> None:
 39    """Install Tailwind CSS binary"""
 40    tailwind = Tailwind()
 41
 42    if force or not tailwind.is_installed() or tailwind.needs_update():
 43        version_to_install = tailwind.get_version_from_config()
 44        if version_to_install:
 45            click.secho(
 46                f"Installing Tailwind standalone {version_to_install}...",
 47                bold=True,
 48                nl=False,
 49            )
 50            version = tailwind.install(version_to_install)
 51            click.secho(f"Tailwind {version} installed", fg="green")
 52        else:
 53            ctx.invoke(update)
 54    else:
 55        click.secho("Tailwind already installed", fg="green")
 56
 57
 58@cli.command()
 59def update() -> None:
 60    """Update Tailwind CSS to latest version"""
 61    tailwind = Tailwind()
 62    click.secho("Installing Tailwind standalone...", bold=True, nl=True)
 63    version = tailwind.install()
 64    click.secho(f"Tailwind {version} installed", fg="green")
 65
 66
 67@cli.command()
 68@click.option("--watch", is_flag=True)
 69@click.option("--minify", is_flag=True)
 70@click.pass_context
 71def build(ctx: click.Context, watch: bool, minify: bool) -> None:
 72    """Build Tailwind CSS files"""
 73    tailwind = Tailwind()
 74
 75    ctx.invoke(install)
 76
 77    tailwind.update_plain_sources()
 78
 79    args = []
 80    args.append("-i")
 81    args.append(tailwind.src_css_path)
 82
 83    args.append("-o")
 84    args.append(tailwind.dist_css_path)
 85
 86    click.secho(
 87        f"Compiling {os.path.relpath(tailwind.src_css_path)} to {os.path.relpath(tailwind.dist_css_path)}...",
 88        bold=True,
 89    )
 90
 91    if watch:
 92        args.append("--watch")
 93
 94    if minify:
 95        args.append("--minify")
 96
 97    tailwind.invoke(*args, cwd=os.path.dirname(APP_PATH))
 98
 99
100@cli.command()
101def version() -> None:
102    """Show Tailwind CSS version"""
103    tailwind = Tailwind()
104
105    if not tailwind.is_installed():
106        click.secho("Tailwind CSS is not installed", fg="red")
107        return
108
109    if installed_version := tailwind.get_installed_version():
110        click.echo(installed_version)
111    else:
112        click.secho("Could not determine Tailwind CSS version", fg="red")
113
114
115if __name__ == "__main__":
116    cli()