Plain is headed towards 1.0! Subscribe for development updates →

  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"""
 17    pass
 18
 19
 20@cli.command()
 21@click.pass_context
 22def init(ctx: click.Context) -> None:
 23    """Install Tailwind and create tailwind.css"""
 24    tailwind = Tailwind()
 25
 26    if not tailwind.is_installed():
 27        ctx.invoke(update)
 28
 29    if not tailwind.src_css_path.exists():
 30        click.secho("Creating Tailwind source CSS...", bold=True)
 31        tailwind.create_src_css()
 32
 33    # gitignore
 34
 35
 36@cli.command()
 37@click.option("--force", is_flag=True, help="Reinstall even if up to date")
 38@click.pass_context
 39def install(ctx: click.Context, force: bool) -> None:
 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 the Tailwind CSS 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    """Compile a Tailwind CSS file"""
 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 the installed 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()