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()