Plain is headed towards 1.0! Subscribe for development updates →

  1import os
  2
  3import click
  4
  5from plain.cli import register_cli
  6from plain.runtime import APP_PATH
  7
  8from .core import Tailwind
  9
 10
 11@register_cli("tailwind")
 12@click.group("tailwind")
 13def cli():
 14    """Tailwind CSS"""
 15    pass
 16
 17
 18@cli.command()
 19@click.pass_context
 20def init(ctx):
 21    """Install Tailwind, create a tailwind.config.js and app/assets/src/tailwind.css"""
 22    tailwind = Tailwind()
 23
 24    if not tailwind.is_installed():
 25        ctx.invoke(update)
 26
 27    if not tailwind.src_css_path.exists():
 28        click.secho("Creating Tailwind source CSS...", bold=True)
 29        tailwind.create_src_css()
 30
 31    # gitignore
 32
 33
 34@cli.command()
 35@click.pass_context
 36def install(ctx):
 37    tailwind = Tailwind()
 38
 39    if not tailwind.is_installed() or tailwind.needs_update():
 40        version_to_install = tailwind.get_version_from_config()
 41        if version_to_install:
 42            click.secho(
 43                f"Installing Tailwind standalone {version_to_install}...",
 44                bold=True,
 45                nl=False,
 46            )
 47            version = tailwind.install(version_to_install)
 48            click.secho(f"Tailwind {version} installed", fg="green")
 49        else:
 50            ctx.invoke(update)
 51    else:
 52        click.secho("Tailwind already installed", fg="green")
 53
 54
 55@cli.command()
 56def update():
 57    """Update the Tailwind CSS version"""
 58    tailwind = Tailwind()
 59    click.secho("Installing Tailwind standalone...", bold=True, nl=True)
 60    version = tailwind.install()
 61    click.secho(f"Tailwind {version} installed", fg="green")
 62
 63
 64@cli.command()
 65@click.option("--watch", is_flag=True)
 66@click.option("--minify", is_flag=True)
 67@click.pass_context
 68def build(ctx, watch, minify):
 69    """Compile a Tailwind CSS file"""
 70    tailwind = Tailwind()
 71
 72    ctx.invoke(install)
 73
 74    # https://github.com/tailwindlabs/tailwindcss/issues/15452
 75    # Remove the .gitignore inside of .venv if it exists, so the sources
 76    # are picked up correctly...
 77    if os.path.exists(".venv/.gitignore"):
 78        click.secho(
 79            "Removing .venv/.gitignore to fix tailwind bug...", bold=True, fg="yellow"
 80        )
 81        os.remove(".venv/.gitignore")
 82
 83    tailwind.update_plain_sources()
 84
 85    args = []
 86    args.append("-i")
 87    args.append(tailwind.src_css_path)
 88
 89    args.append("-o")
 90    args.append(tailwind.dist_css_path)
 91
 92    click.secho(
 93        f"Compiling {os.path.relpath(tailwind.src_css_path)} to {os.path.relpath(tailwind.dist_css_path)}...",
 94        bold=True,
 95    )
 96
 97    if watch:
 98        args.append("--watch")
 99
100    if minify:
101        args.append("--minify")
102
103    tailwind.invoke(*args, cwd=os.path.dirname(APP_PATH))
104
105
106if __name__ == "__main__":
107    cli()