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