├── .gitignore
├── .mvn
└── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
├── readme.md
└── src
└── main
├── frontend
├── main.css
├── package-lock.json
├── package.json
└── tailwind.config.js
├── java
└── com
│ └── example
│ └── demo
│ └── SpringTailwindApplication.java
└── resources
├── application.properties
├── static
└── main.css
└── templates
└── index.html
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | HELP.md
3 | target/
4 | !.mvn/wrapper/maven-wrapper.jar
5 | !**/src/main/**/target/
6 | !**/src/test/**/target/
7 |
8 | ### STS ###
9 | .apt_generated
10 | .classpath
11 | .factorypath
12 | .project
13 | .settings
14 | .springBeans
15 | .sts4-cache
16 |
17 | ### IntelliJ IDEA ###
18 | .idea
19 | *.iws
20 | *.iml
21 | *.ipr
22 |
23 | ### NetBeans ###
24 | /nbproject/private/
25 | /nbbuild/
26 | /dist/
27 | /nbdist/
28 | /.nb-gradle/
29 | build/
30 | !**/src/main/**/build/
31 | !**/src/test/**/build/
32 |
33 | ### VS Code ###
34 | .vscode/
35 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maciejwalkowiak/spring-boot-thymeleaf-tailwindcss-sample/72c357c86ef2d321749c48be74fb62cd3da9b596/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
2 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
3 |
--------------------------------------------------------------------------------
/mvnw:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # ----------------------------------------------------------------------------
3 | # Licensed to the Apache Software Foundation (ASF) under one
4 | # or more contributor license agreements. See the NOTICE file
5 | # distributed with this work for additional information
6 | # regarding copyright ownership. The ASF licenses this file
7 | # to you under the Apache License, Version 2.0 (the
8 | # "License"); you may not use this file except in compliance
9 | # with the License. You may obtain a copy of the License at
10 | #
11 | # https://www.apache.org/licenses/LICENSE-2.0
12 | #
13 | # Unless required by applicable law or agreed to in writing,
14 | # software distributed under the License is distributed on an
15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 | # KIND, either express or implied. See the License for the
17 | # specific language governing permissions and limitations
18 | # under the License.
19 | # ----------------------------------------------------------------------------
20 |
21 | # ----------------------------------------------------------------------------
22 | # Maven Start Up Batch script
23 | #
24 | # Required ENV vars:
25 | # ------------------
26 | # JAVA_HOME - location of a JDK home dir
27 | #
28 | # Optional ENV vars
29 | # -----------------
30 | # M2_HOME - location of maven2's installed home dir
31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven
32 | # e.g. to debug Maven itself, use
33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35 | # ----------------------------------------------------------------------------
36 |
37 | if [ -z "$MAVEN_SKIP_RC" ] ; then
38 |
39 | if [ -f /usr/local/etc/mavenrc ] ; then
40 | . /usr/local/etc/mavenrc
41 | fi
42 |
43 | if [ -f /etc/mavenrc ] ; then
44 | . /etc/mavenrc
45 | fi
46 |
47 | if [ -f "$HOME/.mavenrc" ] ; then
48 | . "$HOME/.mavenrc"
49 | fi
50 |
51 | fi
52 |
53 | # OS specific support. $var _must_ be set to either true or false.
54 | cygwin=false;
55 | darwin=false;
56 | mingw=false
57 | case "`uname`" in
58 | CYGWIN*) cygwin=true ;;
59 | MINGW*) mingw=true;;
60 | Darwin*) darwin=true
61 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
62 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
63 | if [ -z "$JAVA_HOME" ]; then
64 | if [ -x "/usr/libexec/java_home" ]; then
65 | export JAVA_HOME="`/usr/libexec/java_home`"
66 | else
67 | export JAVA_HOME="/Library/Java/Home"
68 | fi
69 | fi
70 | ;;
71 | esac
72 |
73 | if [ -z "$JAVA_HOME" ] ; then
74 | if [ -r /etc/gentoo-release ] ; then
75 | JAVA_HOME=`java-config --jre-home`
76 | fi
77 | fi
78 |
79 | if [ -z "$M2_HOME" ] ; then
80 | ## resolve links - $0 may be a link to maven's home
81 | PRG="$0"
82 |
83 | # need this for relative symlinks
84 | while [ -h "$PRG" ] ; do
85 | ls=`ls -ld "$PRG"`
86 | link=`expr "$ls" : '.*-> \(.*\)$'`
87 | if expr "$link" : '/.*' > /dev/null; then
88 | PRG="$link"
89 | else
90 | PRG="`dirname "$PRG"`/$link"
91 | fi
92 | done
93 |
94 | saveddir=`pwd`
95 |
96 | M2_HOME=`dirname "$PRG"`/..
97 |
98 | # make it fully qualified
99 | M2_HOME=`cd "$M2_HOME" && pwd`
100 |
101 | cd "$saveddir"
102 | # echo Using m2 at $M2_HOME
103 | fi
104 |
105 | # For Cygwin, ensure paths are in UNIX format before anything is touched
106 | if $cygwin ; then
107 | [ -n "$M2_HOME" ] &&
108 | M2_HOME=`cygpath --unix "$M2_HOME"`
109 | [ -n "$JAVA_HOME" ] &&
110 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
111 | [ -n "$CLASSPATH" ] &&
112 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
113 | fi
114 |
115 | # For Mingw, ensure paths are in UNIX format before anything is touched
116 | if $mingw ; then
117 | [ -n "$M2_HOME" ] &&
118 | M2_HOME="`(cd "$M2_HOME"; pwd)`"
119 | [ -n "$JAVA_HOME" ] &&
120 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
121 | fi
122 |
123 | if [ -z "$JAVA_HOME" ]; then
124 | javaExecutable="`which javac`"
125 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
126 | # readlink(1) is not available as standard on Solaris 10.
127 | readLink=`which readlink`
128 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
129 | if $darwin ; then
130 | javaHome="`dirname \"$javaExecutable\"`"
131 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
132 | else
133 | javaExecutable="`readlink -f \"$javaExecutable\"`"
134 | fi
135 | javaHome="`dirname \"$javaExecutable\"`"
136 | javaHome=`expr "$javaHome" : '\(.*\)/bin'`
137 | JAVA_HOME="$javaHome"
138 | export JAVA_HOME
139 | fi
140 | fi
141 | fi
142 |
143 | if [ -z "$JAVACMD" ] ; then
144 | if [ -n "$JAVA_HOME" ] ; then
145 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
146 | # IBM's JDK on AIX uses strange locations for the executables
147 | JAVACMD="$JAVA_HOME/jre/sh/java"
148 | else
149 | JAVACMD="$JAVA_HOME/bin/java"
150 | fi
151 | else
152 | JAVACMD="`\\unset -f command; \\command -v java`"
153 | fi
154 | fi
155 |
156 | if [ ! -x "$JAVACMD" ] ; then
157 | echo "Error: JAVA_HOME is not defined correctly." >&2
158 | echo " We cannot execute $JAVACMD" >&2
159 | exit 1
160 | fi
161 |
162 | if [ -z "$JAVA_HOME" ] ; then
163 | echo "Warning: JAVA_HOME environment variable is not set."
164 | fi
165 |
166 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
167 |
168 | # traverses directory structure from process work directory to filesystem root
169 | # first directory with .mvn subdirectory is considered project base directory
170 | find_maven_basedir() {
171 |
172 | if [ -z "$1" ]
173 | then
174 | echo "Path not specified to find_maven_basedir"
175 | return 1
176 | fi
177 |
178 | basedir="$1"
179 | wdir="$1"
180 | while [ "$wdir" != '/' ] ; do
181 | if [ -d "$wdir"/.mvn ] ; then
182 | basedir=$wdir
183 | break
184 | fi
185 | # workaround for JBEAP-8937 (on Solaris 10/Sparc)
186 | if [ -d "${wdir}" ]; then
187 | wdir=`cd "$wdir/.."; pwd`
188 | fi
189 | # end of workaround
190 | done
191 | echo "${basedir}"
192 | }
193 |
194 | # concatenates all lines of a file
195 | concat_lines() {
196 | if [ -f "$1" ]; then
197 | echo "$(tr -s '\n' ' ' < "$1")"
198 | fi
199 | }
200 |
201 | BASE_DIR=`find_maven_basedir "$(pwd)"`
202 | if [ -z "$BASE_DIR" ]; then
203 | exit 1;
204 | fi
205 |
206 | ##########################################################################################
207 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
208 | # This allows using the maven wrapper in projects that prohibit checking in binary data.
209 | ##########################################################################################
210 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
211 | if [ "$MVNW_VERBOSE" = true ]; then
212 | echo "Found .mvn/wrapper/maven-wrapper.jar"
213 | fi
214 | else
215 | if [ "$MVNW_VERBOSE" = true ]; then
216 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
217 | fi
218 | if [ -n "$MVNW_REPOURL" ]; then
219 | jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
220 | else
221 | jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
222 | fi
223 | while IFS="=" read key value; do
224 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
225 | esac
226 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
227 | if [ "$MVNW_VERBOSE" = true ]; then
228 | echo "Downloading from: $jarUrl"
229 | fi
230 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
231 | if $cygwin; then
232 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
233 | fi
234 |
235 | if command -v wget > /dev/null; then
236 | if [ "$MVNW_VERBOSE" = true ]; then
237 | echo "Found wget ... using wget"
238 | fi
239 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
240 | wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
241 | else
242 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
243 | fi
244 | elif command -v curl > /dev/null; then
245 | if [ "$MVNW_VERBOSE" = true ]; then
246 | echo "Found curl ... using curl"
247 | fi
248 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
249 | curl -o "$wrapperJarPath" "$jarUrl" -f
250 | else
251 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
252 | fi
253 |
254 | else
255 | if [ "$MVNW_VERBOSE" = true ]; then
256 | echo "Falling back to using Java to download"
257 | fi
258 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
259 | # For Cygwin, switch paths to Windows format before running javac
260 | if $cygwin; then
261 | javaClass=`cygpath --path --windows "$javaClass"`
262 | fi
263 | if [ -e "$javaClass" ]; then
264 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
265 | if [ "$MVNW_VERBOSE" = true ]; then
266 | echo " - Compiling MavenWrapperDownloader.java ..."
267 | fi
268 | # Compiling the Java class
269 | ("$JAVA_HOME/bin/javac" "$javaClass")
270 | fi
271 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
272 | # Running the downloader
273 | if [ "$MVNW_VERBOSE" = true ]; then
274 | echo " - Running MavenWrapperDownloader.java ..."
275 | fi
276 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
277 | fi
278 | fi
279 | fi
280 | fi
281 | ##########################################################################################
282 | # End of extension
283 | ##########################################################################################
284 |
285 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
286 | if [ "$MVNW_VERBOSE" = true ]; then
287 | echo $MAVEN_PROJECTBASEDIR
288 | fi
289 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
290 |
291 | # For Cygwin, switch paths to Windows format before running java
292 | if $cygwin; then
293 | [ -n "$M2_HOME" ] &&
294 | M2_HOME=`cygpath --path --windows "$M2_HOME"`
295 | [ -n "$JAVA_HOME" ] &&
296 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
297 | [ -n "$CLASSPATH" ] &&
298 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
299 | [ -n "$MAVEN_PROJECTBASEDIR" ] &&
300 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
301 | fi
302 |
303 | # Provide a "standardized" way to retrieve the CLI args that will
304 | # work with both Windows and non-Windows executions.
305 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
306 | export MAVEN_CMD_LINE_ARGS
307 |
308 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
309 |
310 | exec "$JAVACMD" \
311 | $MAVEN_OPTS \
312 | $MAVEN_DEBUG_OPTS \
313 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
314 | "-Dmaven.home=${M2_HOME}" \
315 | "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
316 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
317 |
--------------------------------------------------------------------------------
/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM https://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM set title of command window
39 | title %0
40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
42 |
43 | @REM set %HOME% to equivalent of $HOME
44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45 |
46 | @REM Execute a user defined script before this one
47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
49 | if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
50 | if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
51 | :skipRcPre
52 |
53 | @setlocal
54 |
55 | set ERROR_CODE=0
56 |
57 | @REM To isolate internal variables from possible post scripts, we use another setlocal
58 | @setlocal
59 |
60 | @REM ==== START VALIDATION ====
61 | if not "%JAVA_HOME%" == "" goto OkJHome
62 |
63 | echo.
64 | echo Error: JAVA_HOME not found in your environment. >&2
65 | echo Please set the JAVA_HOME variable in your environment to match the >&2
66 | echo location of your Java installation. >&2
67 | echo.
68 | goto error
69 |
70 | :OkJHome
71 | if exist "%JAVA_HOME%\bin\java.exe" goto init
72 |
73 | echo.
74 | echo Error: JAVA_HOME is set to an invalid directory. >&2
75 | echo JAVA_HOME = "%JAVA_HOME%" >&2
76 | echo Please set the JAVA_HOME variable in your environment to match the >&2
77 | echo location of your Java installation. >&2
78 | echo.
79 | goto error
80 |
81 | @REM ==== END VALIDATION ====
82 |
83 | :init
84 |
85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86 | @REM Fallback to current working directory if not found.
87 |
88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90 |
91 | set EXEC_DIR=%CD%
92 | set WDIR=%EXEC_DIR%
93 | :findBaseDir
94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
95 | cd ..
96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
97 | set WDIR=%CD%
98 | goto findBaseDir
99 |
100 | :baseDirFound
101 | set MAVEN_PROJECTBASEDIR=%WDIR%
102 | cd "%EXEC_DIR%"
103 | goto endDetectBaseDir
104 |
105 | :baseDirNotFound
106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107 | cd "%EXEC_DIR%"
108 |
109 | :endDetectBaseDir
110 |
111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112 |
113 | @setlocal EnableExtensions EnableDelayedExpansion
114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116 |
117 | :endReadAdditionalConfig
118 |
119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122 |
123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
124 |
125 | FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
127 | )
128 |
129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data.
131 | if exist %WRAPPER_JAR% (
132 | if "%MVNW_VERBOSE%" == "true" (
133 | echo Found %WRAPPER_JAR%
134 | )
135 | ) else (
136 | if not "%MVNW_REPOURL%" == "" (
137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
138 | )
139 | if "%MVNW_VERBOSE%" == "true" (
140 | echo Couldn't find %WRAPPER_JAR%, downloading it ...
141 | echo Downloading from: %DOWNLOAD_URL%
142 | )
143 |
144 | powershell -Command "&{"^
145 | "$webclient = new-object System.Net.WebClient;"^
146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
148 | "}"^
149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
150 | "}"
151 | if "%MVNW_VERBOSE%" == "true" (
152 | echo Finished downloading %WRAPPER_JAR%
153 | )
154 | )
155 | @REM End of extension
156 |
157 | @REM Provide a "standardized" way to retrieve the CLI args that will
158 | @REM work with both Windows and non-Windows executions.
159 | set MAVEN_CMD_LINE_ARGS=%*
160 |
161 | %MAVEN_JAVA_EXE% ^
162 | %JVM_CONFIG_MAVEN_PROPS% ^
163 | %MAVEN_OPTS% ^
164 | %MAVEN_DEBUG_OPTS% ^
165 | -classpath %WRAPPER_JAR% ^
166 | "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
167 | %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
168 | if ERRORLEVEL 1 goto error
169 | goto end
170 |
171 | :error
172 | set ERROR_CODE=1
173 |
174 | :end
175 | @endlocal & set ERROR_CODE=%ERROR_CODE%
176 |
177 | if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
178 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
179 | if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
180 | if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
181 | :skipRcPost
182 |
183 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
184 | if "%MAVEN_BATCH_PAUSE%"=="on" pause
185 |
186 | if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
187 |
188 | cmd /C exit /B %ERROR_CODE%
189 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.7.5
9 |
10 |
11 | com.example
12 | demo
13 | 0.0.1-SNAPSHOT
14 | spring-tailwind
15 | Demo project for Spring Boot
16 |
17 | 17
18 |
19 |
20 |
21 | org.springframework.boot
22 | spring-boot-starter-web
23 |
24 |
25 | org.springframework.boot
26 | spring-boot-starter-thymeleaf
27 |
28 |
29 |
30 | org.springframework.boot
31 | spring-boot-devtools
32 | runtime
33 |
34 |
35 |
36 |
37 | org.springframework.boot
38 | spring-boot-starter-test
39 | test
40 |
41 |
42 |
43 |
44 |
45 |
46 | org.springframework.boot
47 | spring-boot-maven-plugin
48 |
49 |
50 |
51 | com.maciejwalkowiak.paseq
52 | paseq-maven-plugin
53 | 0.1.0
54 |
55 |
56 |
57 | compile
58 |
59 | exec
60 |
61 |
62 |
63 |
64 |
65 | src/main/frontend
66 | npm install
67 |
68 |
69 |
70 |
71 | src/main/frontend
72 | npm run build
73 |
74 |
75 |
76 |
77 |
78 |
79 | dev
80 |
81 |
82 |
83 |
84 |
85 | src/main/frontend
86 | npm install
87 |
88 |
89 |
90 | true
91 |
92 | src/main/frontend
93 | npm run watch -- -o ../resources/static/main.css
94 |
95 |
96 |
100 |
101 | true
102 |
103 | src/main/frontend
104 | npm run watch -- -o ${project.build.directory}/classes/static/main.css
105 |
106 |
107 |
108 | spring-boot:run
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Spring Boot + Thymeleaf + TailwindCSS Sample
2 |
3 | Follow tutorial 👉 [http://maciejwalkowiak.com/blog/spring-boot-thymeleaf-tailwindcss](http://maciejwalkowiak.com/blog/spring-boot-thymeleaf-tailwindcss)
4 |
5 | CSS file is located in `src/main/frontend/main.css`.
6 |
7 | Building the project:
8 |
9 | ```bash
10 | $ ./mvnw package
11 | ```
12 |
13 | To run in dev mode:
14 |
15 | ```bash
16 | $ ./mvnw paseq:exec@dev
17 | ```
18 |
19 | Live reloading the browser without needing to refresh it possible with [Live Reload Extension](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei/related).
20 |
21 | Look into `pom.xml` for `paseq-maven-plugin` configuration to understand how it works.
22 |
--------------------------------------------------------------------------------
/src/main/frontend/main.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | h1 {
6 | @apply text-5xl mx-16 my-16 underline
7 | }
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/main/frontend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "lockfileVersion": 2,
4 | "requires": true,
5 | "packages": {
6 | "": {
7 | "name": "frontend",
8 | "devDependencies": {
9 | "tailwindcss": "^3.2.2"
10 | }
11 | },
12 | "node_modules/@nodelib/fs.scandir": {
13 | "version": "2.1.5",
14 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
15 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
16 | "dev": true,
17 | "dependencies": {
18 | "@nodelib/fs.stat": "2.0.5",
19 | "run-parallel": "^1.1.9"
20 | },
21 | "engines": {
22 | "node": ">= 8"
23 | }
24 | },
25 | "node_modules/@nodelib/fs.stat": {
26 | "version": "2.0.5",
27 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
28 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
29 | "dev": true,
30 | "engines": {
31 | "node": ">= 8"
32 | }
33 | },
34 | "node_modules/@nodelib/fs.walk": {
35 | "version": "1.2.8",
36 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
37 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
38 | "dev": true,
39 | "dependencies": {
40 | "@nodelib/fs.scandir": "2.1.5",
41 | "fastq": "^1.6.0"
42 | },
43 | "engines": {
44 | "node": ">= 8"
45 | }
46 | },
47 | "node_modules/acorn": {
48 | "version": "7.4.1",
49 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
50 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
51 | "dev": true,
52 | "bin": {
53 | "acorn": "bin/acorn"
54 | },
55 | "engines": {
56 | "node": ">=0.4.0"
57 | }
58 | },
59 | "node_modules/acorn-node": {
60 | "version": "1.8.2",
61 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
62 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
63 | "dev": true,
64 | "dependencies": {
65 | "acorn": "^7.0.0",
66 | "acorn-walk": "^7.0.0",
67 | "xtend": "^4.0.2"
68 | }
69 | },
70 | "node_modules/acorn-walk": {
71 | "version": "7.2.0",
72 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
73 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
74 | "dev": true,
75 | "engines": {
76 | "node": ">=0.4.0"
77 | }
78 | },
79 | "node_modules/anymatch": {
80 | "version": "3.1.2",
81 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
82 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
83 | "dev": true,
84 | "dependencies": {
85 | "normalize-path": "^3.0.0",
86 | "picomatch": "^2.0.4"
87 | },
88 | "engines": {
89 | "node": ">= 8"
90 | }
91 | },
92 | "node_modules/arg": {
93 | "version": "5.0.2",
94 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
95 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
96 | "dev": true
97 | },
98 | "node_modules/binary-extensions": {
99 | "version": "2.2.0",
100 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
101 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
102 | "dev": true,
103 | "engines": {
104 | "node": ">=8"
105 | }
106 | },
107 | "node_modules/braces": {
108 | "version": "3.0.2",
109 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
110 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
111 | "dev": true,
112 | "dependencies": {
113 | "fill-range": "^7.0.1"
114 | },
115 | "engines": {
116 | "node": ">=8"
117 | }
118 | },
119 | "node_modules/camelcase-css": {
120 | "version": "2.0.1",
121 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
122 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
123 | "dev": true,
124 | "engines": {
125 | "node": ">= 6"
126 | }
127 | },
128 | "node_modules/chokidar": {
129 | "version": "3.5.3",
130 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
131 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
132 | "dev": true,
133 | "funding": [
134 | {
135 | "type": "individual",
136 | "url": "https://paulmillr.com/funding/"
137 | }
138 | ],
139 | "dependencies": {
140 | "anymatch": "~3.1.2",
141 | "braces": "~3.0.2",
142 | "glob-parent": "~5.1.2",
143 | "is-binary-path": "~2.1.0",
144 | "is-glob": "~4.0.1",
145 | "normalize-path": "~3.0.0",
146 | "readdirp": "~3.6.0"
147 | },
148 | "engines": {
149 | "node": ">= 8.10.0"
150 | },
151 | "optionalDependencies": {
152 | "fsevents": "~2.3.2"
153 | }
154 | },
155 | "node_modules/chokidar/node_modules/glob-parent": {
156 | "version": "5.1.2",
157 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
158 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
159 | "dev": true,
160 | "dependencies": {
161 | "is-glob": "^4.0.1"
162 | },
163 | "engines": {
164 | "node": ">= 6"
165 | }
166 | },
167 | "node_modules/color-name": {
168 | "version": "1.1.4",
169 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
170 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
171 | "dev": true
172 | },
173 | "node_modules/cssesc": {
174 | "version": "3.0.0",
175 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
176 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
177 | "dev": true,
178 | "bin": {
179 | "cssesc": "bin/cssesc"
180 | },
181 | "engines": {
182 | "node": ">=4"
183 | }
184 | },
185 | "node_modules/defined": {
186 | "version": "1.0.1",
187 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
188 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
189 | "dev": true,
190 | "funding": {
191 | "url": "https://github.com/sponsors/ljharb"
192 | }
193 | },
194 | "node_modules/detective": {
195 | "version": "5.2.1",
196 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
197 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
198 | "dev": true,
199 | "dependencies": {
200 | "acorn-node": "^1.8.2",
201 | "defined": "^1.0.0",
202 | "minimist": "^1.2.6"
203 | },
204 | "bin": {
205 | "detective": "bin/detective.js"
206 | },
207 | "engines": {
208 | "node": ">=0.8.0"
209 | }
210 | },
211 | "node_modules/didyoumean": {
212 | "version": "1.2.2",
213 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
214 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
215 | "dev": true
216 | },
217 | "node_modules/dlv": {
218 | "version": "1.1.3",
219 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
220 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
221 | "dev": true
222 | },
223 | "node_modules/fast-glob": {
224 | "version": "3.2.12",
225 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
226 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
227 | "dev": true,
228 | "dependencies": {
229 | "@nodelib/fs.stat": "^2.0.2",
230 | "@nodelib/fs.walk": "^1.2.3",
231 | "glob-parent": "^5.1.2",
232 | "merge2": "^1.3.0",
233 | "micromatch": "^4.0.4"
234 | },
235 | "engines": {
236 | "node": ">=8.6.0"
237 | }
238 | },
239 | "node_modules/fast-glob/node_modules/glob-parent": {
240 | "version": "5.1.2",
241 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
242 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
243 | "dev": true,
244 | "dependencies": {
245 | "is-glob": "^4.0.1"
246 | },
247 | "engines": {
248 | "node": ">= 6"
249 | }
250 | },
251 | "node_modules/fastq": {
252 | "version": "1.13.0",
253 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
254 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
255 | "dev": true,
256 | "dependencies": {
257 | "reusify": "^1.0.4"
258 | }
259 | },
260 | "node_modules/fill-range": {
261 | "version": "7.0.1",
262 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
263 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
264 | "dev": true,
265 | "dependencies": {
266 | "to-regex-range": "^5.0.1"
267 | },
268 | "engines": {
269 | "node": ">=8"
270 | }
271 | },
272 | "node_modules/fsevents": {
273 | "version": "2.3.2",
274 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
275 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
276 | "dev": true,
277 | "hasInstallScript": true,
278 | "optional": true,
279 | "os": [
280 | "darwin"
281 | ],
282 | "engines": {
283 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
284 | }
285 | },
286 | "node_modules/function-bind": {
287 | "version": "1.1.1",
288 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
289 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
290 | "dev": true
291 | },
292 | "node_modules/glob-parent": {
293 | "version": "6.0.2",
294 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
295 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
296 | "dev": true,
297 | "dependencies": {
298 | "is-glob": "^4.0.3"
299 | },
300 | "engines": {
301 | "node": ">=10.13.0"
302 | }
303 | },
304 | "node_modules/has": {
305 | "version": "1.0.3",
306 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
307 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
308 | "dev": true,
309 | "dependencies": {
310 | "function-bind": "^1.1.1"
311 | },
312 | "engines": {
313 | "node": ">= 0.4.0"
314 | }
315 | },
316 | "node_modules/is-binary-path": {
317 | "version": "2.1.0",
318 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
319 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
320 | "dev": true,
321 | "dependencies": {
322 | "binary-extensions": "^2.0.0"
323 | },
324 | "engines": {
325 | "node": ">=8"
326 | }
327 | },
328 | "node_modules/is-core-module": {
329 | "version": "2.11.0",
330 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
331 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
332 | "dev": true,
333 | "dependencies": {
334 | "has": "^1.0.3"
335 | },
336 | "funding": {
337 | "url": "https://github.com/sponsors/ljharb"
338 | }
339 | },
340 | "node_modules/is-extglob": {
341 | "version": "2.1.1",
342 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
343 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
344 | "dev": true,
345 | "engines": {
346 | "node": ">=0.10.0"
347 | }
348 | },
349 | "node_modules/is-glob": {
350 | "version": "4.0.3",
351 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
352 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
353 | "dev": true,
354 | "dependencies": {
355 | "is-extglob": "^2.1.1"
356 | },
357 | "engines": {
358 | "node": ">=0.10.0"
359 | }
360 | },
361 | "node_modules/is-number": {
362 | "version": "7.0.0",
363 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
364 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
365 | "dev": true,
366 | "engines": {
367 | "node": ">=0.12.0"
368 | }
369 | },
370 | "node_modules/lilconfig": {
371 | "version": "2.0.6",
372 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
373 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
374 | "dev": true,
375 | "engines": {
376 | "node": ">=10"
377 | }
378 | },
379 | "node_modules/merge2": {
380 | "version": "1.4.1",
381 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
382 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
383 | "dev": true,
384 | "engines": {
385 | "node": ">= 8"
386 | }
387 | },
388 | "node_modules/micromatch": {
389 | "version": "4.0.5",
390 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
391 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
392 | "dev": true,
393 | "dependencies": {
394 | "braces": "^3.0.2",
395 | "picomatch": "^2.3.1"
396 | },
397 | "engines": {
398 | "node": ">=8.6"
399 | }
400 | },
401 | "node_modules/minimist": {
402 | "version": "1.2.7",
403 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
404 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
405 | "dev": true,
406 | "funding": {
407 | "url": "https://github.com/sponsors/ljharb"
408 | }
409 | },
410 | "node_modules/nanoid": {
411 | "version": "3.3.4",
412 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
413 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
414 | "dev": true,
415 | "bin": {
416 | "nanoid": "bin/nanoid.cjs"
417 | },
418 | "engines": {
419 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
420 | }
421 | },
422 | "node_modules/normalize-path": {
423 | "version": "3.0.0",
424 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
425 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
426 | "dev": true,
427 | "engines": {
428 | "node": ">=0.10.0"
429 | }
430 | },
431 | "node_modules/object-hash": {
432 | "version": "3.0.0",
433 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
434 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
435 | "dev": true,
436 | "engines": {
437 | "node": ">= 6"
438 | }
439 | },
440 | "node_modules/path-parse": {
441 | "version": "1.0.7",
442 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
443 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
444 | "dev": true
445 | },
446 | "node_modules/picocolors": {
447 | "version": "1.0.0",
448 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
449 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
450 | "dev": true
451 | },
452 | "node_modules/picomatch": {
453 | "version": "2.3.1",
454 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
455 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
456 | "dev": true,
457 | "engines": {
458 | "node": ">=8.6"
459 | },
460 | "funding": {
461 | "url": "https://github.com/sponsors/jonschlinkert"
462 | }
463 | },
464 | "node_modules/pify": {
465 | "version": "2.3.0",
466 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
467 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
468 | "dev": true,
469 | "engines": {
470 | "node": ">=0.10.0"
471 | }
472 | },
473 | "node_modules/postcss": {
474 | "version": "8.4.18",
475 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
476 | "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
477 | "dev": true,
478 | "funding": [
479 | {
480 | "type": "opencollective",
481 | "url": "https://opencollective.com/postcss/"
482 | },
483 | {
484 | "type": "tidelift",
485 | "url": "https://tidelift.com/funding/github/npm/postcss"
486 | }
487 | ],
488 | "dependencies": {
489 | "nanoid": "^3.3.4",
490 | "picocolors": "^1.0.0",
491 | "source-map-js": "^1.0.2"
492 | },
493 | "engines": {
494 | "node": "^10 || ^12 || >=14"
495 | }
496 | },
497 | "node_modules/postcss-import": {
498 | "version": "14.1.0",
499 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
500 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
501 | "dev": true,
502 | "dependencies": {
503 | "postcss-value-parser": "^4.0.0",
504 | "read-cache": "^1.0.0",
505 | "resolve": "^1.1.7"
506 | },
507 | "engines": {
508 | "node": ">=10.0.0"
509 | },
510 | "peerDependencies": {
511 | "postcss": "^8.0.0"
512 | }
513 | },
514 | "node_modules/postcss-js": {
515 | "version": "4.0.0",
516 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
517 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
518 | "dev": true,
519 | "dependencies": {
520 | "camelcase-css": "^2.0.1"
521 | },
522 | "engines": {
523 | "node": "^12 || ^14 || >= 16"
524 | },
525 | "funding": {
526 | "type": "opencollective",
527 | "url": "https://opencollective.com/postcss/"
528 | },
529 | "peerDependencies": {
530 | "postcss": "^8.3.3"
531 | }
532 | },
533 | "node_modules/postcss-load-config": {
534 | "version": "3.1.4",
535 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
536 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
537 | "dev": true,
538 | "dependencies": {
539 | "lilconfig": "^2.0.5",
540 | "yaml": "^1.10.2"
541 | },
542 | "engines": {
543 | "node": ">= 10"
544 | },
545 | "funding": {
546 | "type": "opencollective",
547 | "url": "https://opencollective.com/postcss/"
548 | },
549 | "peerDependencies": {
550 | "postcss": ">=8.0.9",
551 | "ts-node": ">=9.0.0"
552 | },
553 | "peerDependenciesMeta": {
554 | "postcss": {
555 | "optional": true
556 | },
557 | "ts-node": {
558 | "optional": true
559 | }
560 | }
561 | },
562 | "node_modules/postcss-nested": {
563 | "version": "6.0.0",
564 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
565 | "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
566 | "dev": true,
567 | "dependencies": {
568 | "postcss-selector-parser": "^6.0.10"
569 | },
570 | "engines": {
571 | "node": ">=12.0"
572 | },
573 | "funding": {
574 | "type": "opencollective",
575 | "url": "https://opencollective.com/postcss/"
576 | },
577 | "peerDependencies": {
578 | "postcss": "^8.2.14"
579 | }
580 | },
581 | "node_modules/postcss-selector-parser": {
582 | "version": "6.0.10",
583 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
584 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
585 | "dev": true,
586 | "dependencies": {
587 | "cssesc": "^3.0.0",
588 | "util-deprecate": "^1.0.2"
589 | },
590 | "engines": {
591 | "node": ">=4"
592 | }
593 | },
594 | "node_modules/postcss-value-parser": {
595 | "version": "4.2.0",
596 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
597 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
598 | "dev": true
599 | },
600 | "node_modules/queue-microtask": {
601 | "version": "1.2.3",
602 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
603 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
604 | "dev": true,
605 | "funding": [
606 | {
607 | "type": "github",
608 | "url": "https://github.com/sponsors/feross"
609 | },
610 | {
611 | "type": "patreon",
612 | "url": "https://www.patreon.com/feross"
613 | },
614 | {
615 | "type": "consulting",
616 | "url": "https://feross.org/support"
617 | }
618 | ]
619 | },
620 | "node_modules/quick-lru": {
621 | "version": "5.1.1",
622 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
623 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
624 | "dev": true,
625 | "engines": {
626 | "node": ">=10"
627 | },
628 | "funding": {
629 | "url": "https://github.com/sponsors/sindresorhus"
630 | }
631 | },
632 | "node_modules/read-cache": {
633 | "version": "1.0.0",
634 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
635 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
636 | "dev": true,
637 | "dependencies": {
638 | "pify": "^2.3.0"
639 | }
640 | },
641 | "node_modules/readdirp": {
642 | "version": "3.6.0",
643 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
644 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
645 | "dev": true,
646 | "dependencies": {
647 | "picomatch": "^2.2.1"
648 | },
649 | "engines": {
650 | "node": ">=8.10.0"
651 | }
652 | },
653 | "node_modules/resolve": {
654 | "version": "1.22.1",
655 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
656 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
657 | "dev": true,
658 | "dependencies": {
659 | "is-core-module": "^2.9.0",
660 | "path-parse": "^1.0.7",
661 | "supports-preserve-symlinks-flag": "^1.0.0"
662 | },
663 | "bin": {
664 | "resolve": "bin/resolve"
665 | },
666 | "funding": {
667 | "url": "https://github.com/sponsors/ljharb"
668 | }
669 | },
670 | "node_modules/reusify": {
671 | "version": "1.0.4",
672 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
673 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
674 | "dev": true,
675 | "engines": {
676 | "iojs": ">=1.0.0",
677 | "node": ">=0.10.0"
678 | }
679 | },
680 | "node_modules/run-parallel": {
681 | "version": "1.2.0",
682 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
683 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
684 | "dev": true,
685 | "funding": [
686 | {
687 | "type": "github",
688 | "url": "https://github.com/sponsors/feross"
689 | },
690 | {
691 | "type": "patreon",
692 | "url": "https://www.patreon.com/feross"
693 | },
694 | {
695 | "type": "consulting",
696 | "url": "https://feross.org/support"
697 | }
698 | ],
699 | "dependencies": {
700 | "queue-microtask": "^1.2.2"
701 | }
702 | },
703 | "node_modules/source-map-js": {
704 | "version": "1.0.2",
705 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
706 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
707 | "dev": true,
708 | "engines": {
709 | "node": ">=0.10.0"
710 | }
711 | },
712 | "node_modules/supports-preserve-symlinks-flag": {
713 | "version": "1.0.0",
714 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
715 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
716 | "dev": true,
717 | "engines": {
718 | "node": ">= 0.4"
719 | },
720 | "funding": {
721 | "url": "https://github.com/sponsors/ljharb"
722 | }
723 | },
724 | "node_modules/tailwindcss": {
725 | "version": "3.2.2",
726 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.2.tgz",
727 | "integrity": "sha512-c2GtSdqg+harR4QeoTmex0Ngfg8IIHNeLQH5yr2B9uZbZR1Xt1rYbjWOWTcj3YLTZhrmZnPowoQDbSRFyZHQ5Q==",
728 | "dev": true,
729 | "dependencies": {
730 | "arg": "^5.0.2",
731 | "chokidar": "^3.5.3",
732 | "color-name": "^1.1.4",
733 | "detective": "^5.2.1",
734 | "didyoumean": "^1.2.2",
735 | "dlv": "^1.1.3",
736 | "fast-glob": "^3.2.12",
737 | "glob-parent": "^6.0.2",
738 | "is-glob": "^4.0.3",
739 | "lilconfig": "^2.0.6",
740 | "micromatch": "^4.0.5",
741 | "normalize-path": "^3.0.0",
742 | "object-hash": "^3.0.0",
743 | "picocolors": "^1.0.0",
744 | "postcss": "^8.4.18",
745 | "postcss-import": "^14.1.0",
746 | "postcss-js": "^4.0.0",
747 | "postcss-load-config": "^3.1.4",
748 | "postcss-nested": "6.0.0",
749 | "postcss-selector-parser": "^6.0.10",
750 | "postcss-value-parser": "^4.2.0",
751 | "quick-lru": "^5.1.1",
752 | "resolve": "^1.22.1"
753 | },
754 | "bin": {
755 | "tailwind": "lib/cli.js",
756 | "tailwindcss": "lib/cli.js"
757 | },
758 | "engines": {
759 | "node": ">=12.13.0"
760 | },
761 | "peerDependencies": {
762 | "postcss": "^8.0.9"
763 | }
764 | },
765 | "node_modules/to-regex-range": {
766 | "version": "5.0.1",
767 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
768 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
769 | "dev": true,
770 | "dependencies": {
771 | "is-number": "^7.0.0"
772 | },
773 | "engines": {
774 | "node": ">=8.0"
775 | }
776 | },
777 | "node_modules/util-deprecate": {
778 | "version": "1.0.2",
779 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
780 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
781 | "dev": true
782 | },
783 | "node_modules/xtend": {
784 | "version": "4.0.2",
785 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
786 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
787 | "dev": true,
788 | "engines": {
789 | "node": ">=0.4"
790 | }
791 | },
792 | "node_modules/yaml": {
793 | "version": "1.10.2",
794 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
795 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
796 | "dev": true,
797 | "engines": {
798 | "node": ">= 6"
799 | }
800 | }
801 | },
802 | "dependencies": {
803 | "@nodelib/fs.scandir": {
804 | "version": "2.1.5",
805 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
806 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
807 | "dev": true,
808 | "requires": {
809 | "@nodelib/fs.stat": "2.0.5",
810 | "run-parallel": "^1.1.9"
811 | }
812 | },
813 | "@nodelib/fs.stat": {
814 | "version": "2.0.5",
815 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
816 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
817 | "dev": true
818 | },
819 | "@nodelib/fs.walk": {
820 | "version": "1.2.8",
821 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
822 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
823 | "dev": true,
824 | "requires": {
825 | "@nodelib/fs.scandir": "2.1.5",
826 | "fastq": "^1.6.0"
827 | }
828 | },
829 | "acorn": {
830 | "version": "7.4.1",
831 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
832 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
833 | "dev": true
834 | },
835 | "acorn-node": {
836 | "version": "1.8.2",
837 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
838 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
839 | "dev": true,
840 | "requires": {
841 | "acorn": "^7.0.0",
842 | "acorn-walk": "^7.0.0",
843 | "xtend": "^4.0.2"
844 | }
845 | },
846 | "acorn-walk": {
847 | "version": "7.2.0",
848 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
849 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
850 | "dev": true
851 | },
852 | "anymatch": {
853 | "version": "3.1.2",
854 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
855 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
856 | "dev": true,
857 | "requires": {
858 | "normalize-path": "^3.0.0",
859 | "picomatch": "^2.0.4"
860 | }
861 | },
862 | "arg": {
863 | "version": "5.0.2",
864 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
865 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
866 | "dev": true
867 | },
868 | "binary-extensions": {
869 | "version": "2.2.0",
870 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
871 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
872 | "dev": true
873 | },
874 | "braces": {
875 | "version": "3.0.2",
876 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
877 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
878 | "dev": true,
879 | "requires": {
880 | "fill-range": "^7.0.1"
881 | }
882 | },
883 | "camelcase-css": {
884 | "version": "2.0.1",
885 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
886 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
887 | "dev": true
888 | },
889 | "chokidar": {
890 | "version": "3.5.3",
891 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
892 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
893 | "dev": true,
894 | "requires": {
895 | "anymatch": "~3.1.2",
896 | "braces": "~3.0.2",
897 | "fsevents": "~2.3.2",
898 | "glob-parent": "~5.1.2",
899 | "is-binary-path": "~2.1.0",
900 | "is-glob": "~4.0.1",
901 | "normalize-path": "~3.0.0",
902 | "readdirp": "~3.6.0"
903 | },
904 | "dependencies": {
905 | "glob-parent": {
906 | "version": "5.1.2",
907 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
908 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
909 | "dev": true,
910 | "requires": {
911 | "is-glob": "^4.0.1"
912 | }
913 | }
914 | }
915 | },
916 | "color-name": {
917 | "version": "1.1.4",
918 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
919 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
920 | "dev": true
921 | },
922 | "cssesc": {
923 | "version": "3.0.0",
924 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
925 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
926 | "dev": true
927 | },
928 | "defined": {
929 | "version": "1.0.1",
930 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
931 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
932 | "dev": true
933 | },
934 | "detective": {
935 | "version": "5.2.1",
936 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
937 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
938 | "dev": true,
939 | "requires": {
940 | "acorn-node": "^1.8.2",
941 | "defined": "^1.0.0",
942 | "minimist": "^1.2.6"
943 | }
944 | },
945 | "didyoumean": {
946 | "version": "1.2.2",
947 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
948 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
949 | "dev": true
950 | },
951 | "dlv": {
952 | "version": "1.1.3",
953 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
954 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
955 | "dev": true
956 | },
957 | "fast-glob": {
958 | "version": "3.2.12",
959 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
960 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
961 | "dev": true,
962 | "requires": {
963 | "@nodelib/fs.stat": "^2.0.2",
964 | "@nodelib/fs.walk": "^1.2.3",
965 | "glob-parent": "^5.1.2",
966 | "merge2": "^1.3.0",
967 | "micromatch": "^4.0.4"
968 | },
969 | "dependencies": {
970 | "glob-parent": {
971 | "version": "5.1.2",
972 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
973 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
974 | "dev": true,
975 | "requires": {
976 | "is-glob": "^4.0.1"
977 | }
978 | }
979 | }
980 | },
981 | "fastq": {
982 | "version": "1.13.0",
983 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
984 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
985 | "dev": true,
986 | "requires": {
987 | "reusify": "^1.0.4"
988 | }
989 | },
990 | "fill-range": {
991 | "version": "7.0.1",
992 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
993 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
994 | "dev": true,
995 | "requires": {
996 | "to-regex-range": "^5.0.1"
997 | }
998 | },
999 | "fsevents": {
1000 | "version": "2.3.2",
1001 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1002 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1003 | "dev": true,
1004 | "optional": true
1005 | },
1006 | "function-bind": {
1007 | "version": "1.1.1",
1008 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1009 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1010 | "dev": true
1011 | },
1012 | "glob-parent": {
1013 | "version": "6.0.2",
1014 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1015 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1016 | "dev": true,
1017 | "requires": {
1018 | "is-glob": "^4.0.3"
1019 | }
1020 | },
1021 | "has": {
1022 | "version": "1.0.3",
1023 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1024 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1025 | "dev": true,
1026 | "requires": {
1027 | "function-bind": "^1.1.1"
1028 | }
1029 | },
1030 | "is-binary-path": {
1031 | "version": "2.1.0",
1032 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1033 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1034 | "dev": true,
1035 | "requires": {
1036 | "binary-extensions": "^2.0.0"
1037 | }
1038 | },
1039 | "is-core-module": {
1040 | "version": "2.11.0",
1041 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
1042 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
1043 | "dev": true,
1044 | "requires": {
1045 | "has": "^1.0.3"
1046 | }
1047 | },
1048 | "is-extglob": {
1049 | "version": "2.1.1",
1050 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1051 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1052 | "dev": true
1053 | },
1054 | "is-glob": {
1055 | "version": "4.0.3",
1056 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1057 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1058 | "dev": true,
1059 | "requires": {
1060 | "is-extglob": "^2.1.1"
1061 | }
1062 | },
1063 | "is-number": {
1064 | "version": "7.0.0",
1065 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1066 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1067 | "dev": true
1068 | },
1069 | "lilconfig": {
1070 | "version": "2.0.6",
1071 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
1072 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
1073 | "dev": true
1074 | },
1075 | "merge2": {
1076 | "version": "1.4.1",
1077 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1078 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1079 | "dev": true
1080 | },
1081 | "micromatch": {
1082 | "version": "4.0.5",
1083 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
1084 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
1085 | "dev": true,
1086 | "requires": {
1087 | "braces": "^3.0.2",
1088 | "picomatch": "^2.3.1"
1089 | }
1090 | },
1091 | "minimist": {
1092 | "version": "1.2.7",
1093 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
1094 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
1095 | "dev": true
1096 | },
1097 | "nanoid": {
1098 | "version": "3.3.4",
1099 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
1100 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
1101 | "dev": true
1102 | },
1103 | "normalize-path": {
1104 | "version": "3.0.0",
1105 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1106 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1107 | "dev": true
1108 | },
1109 | "object-hash": {
1110 | "version": "3.0.0",
1111 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1112 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1113 | "dev": true
1114 | },
1115 | "path-parse": {
1116 | "version": "1.0.7",
1117 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1118 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1119 | "dev": true
1120 | },
1121 | "picocolors": {
1122 | "version": "1.0.0",
1123 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1124 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
1125 | "dev": true
1126 | },
1127 | "picomatch": {
1128 | "version": "2.3.1",
1129 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1130 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1131 | "dev": true
1132 | },
1133 | "pify": {
1134 | "version": "2.3.0",
1135 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1136 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1137 | "dev": true
1138 | },
1139 | "postcss": {
1140 | "version": "8.4.18",
1141 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
1142 | "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
1143 | "dev": true,
1144 | "requires": {
1145 | "nanoid": "^3.3.4",
1146 | "picocolors": "^1.0.0",
1147 | "source-map-js": "^1.0.2"
1148 | }
1149 | },
1150 | "postcss-import": {
1151 | "version": "14.1.0",
1152 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
1153 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
1154 | "dev": true,
1155 | "requires": {
1156 | "postcss-value-parser": "^4.0.0",
1157 | "read-cache": "^1.0.0",
1158 | "resolve": "^1.1.7"
1159 | }
1160 | },
1161 | "postcss-js": {
1162 | "version": "4.0.0",
1163 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
1164 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
1165 | "dev": true,
1166 | "requires": {
1167 | "camelcase-css": "^2.0.1"
1168 | }
1169 | },
1170 | "postcss-load-config": {
1171 | "version": "3.1.4",
1172 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
1173 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
1174 | "dev": true,
1175 | "requires": {
1176 | "lilconfig": "^2.0.5",
1177 | "yaml": "^1.10.2"
1178 | }
1179 | },
1180 | "postcss-nested": {
1181 | "version": "6.0.0",
1182 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
1183 | "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
1184 | "dev": true,
1185 | "requires": {
1186 | "postcss-selector-parser": "^6.0.10"
1187 | }
1188 | },
1189 | "postcss-selector-parser": {
1190 | "version": "6.0.10",
1191 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
1192 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
1193 | "dev": true,
1194 | "requires": {
1195 | "cssesc": "^3.0.0",
1196 | "util-deprecate": "^1.0.2"
1197 | }
1198 | },
1199 | "postcss-value-parser": {
1200 | "version": "4.2.0",
1201 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
1202 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
1203 | "dev": true
1204 | },
1205 | "queue-microtask": {
1206 | "version": "1.2.3",
1207 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1208 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1209 | "dev": true
1210 | },
1211 | "quick-lru": {
1212 | "version": "5.1.1",
1213 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
1214 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
1215 | "dev": true
1216 | },
1217 | "read-cache": {
1218 | "version": "1.0.0",
1219 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
1220 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
1221 | "dev": true,
1222 | "requires": {
1223 | "pify": "^2.3.0"
1224 | }
1225 | },
1226 | "readdirp": {
1227 | "version": "3.6.0",
1228 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1229 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1230 | "dev": true,
1231 | "requires": {
1232 | "picomatch": "^2.2.1"
1233 | }
1234 | },
1235 | "resolve": {
1236 | "version": "1.22.1",
1237 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
1238 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
1239 | "dev": true,
1240 | "requires": {
1241 | "is-core-module": "^2.9.0",
1242 | "path-parse": "^1.0.7",
1243 | "supports-preserve-symlinks-flag": "^1.0.0"
1244 | }
1245 | },
1246 | "reusify": {
1247 | "version": "1.0.4",
1248 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1249 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1250 | "dev": true
1251 | },
1252 | "run-parallel": {
1253 | "version": "1.2.0",
1254 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1255 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1256 | "dev": true,
1257 | "requires": {
1258 | "queue-microtask": "^1.2.2"
1259 | }
1260 | },
1261 | "source-map-js": {
1262 | "version": "1.0.2",
1263 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1264 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
1265 | "dev": true
1266 | },
1267 | "supports-preserve-symlinks-flag": {
1268 | "version": "1.0.0",
1269 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1270 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1271 | "dev": true
1272 | },
1273 | "tailwindcss": {
1274 | "version": "3.2.2",
1275 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.2.tgz",
1276 | "integrity": "sha512-c2GtSdqg+harR4QeoTmex0Ngfg8IIHNeLQH5yr2B9uZbZR1Xt1rYbjWOWTcj3YLTZhrmZnPowoQDbSRFyZHQ5Q==",
1277 | "dev": true,
1278 | "requires": {
1279 | "arg": "^5.0.2",
1280 | "chokidar": "^3.5.3",
1281 | "color-name": "^1.1.4",
1282 | "detective": "^5.2.1",
1283 | "didyoumean": "^1.2.2",
1284 | "dlv": "^1.1.3",
1285 | "fast-glob": "^3.2.12",
1286 | "glob-parent": "^6.0.2",
1287 | "is-glob": "^4.0.3",
1288 | "lilconfig": "^2.0.6",
1289 | "micromatch": "^4.0.5",
1290 | "normalize-path": "^3.0.0",
1291 | "object-hash": "^3.0.0",
1292 | "picocolors": "^1.0.0",
1293 | "postcss": "^8.4.18",
1294 | "postcss-import": "^14.1.0",
1295 | "postcss-js": "^4.0.0",
1296 | "postcss-load-config": "^3.1.4",
1297 | "postcss-nested": "6.0.0",
1298 | "postcss-selector-parser": "^6.0.10",
1299 | "postcss-value-parser": "^4.2.0",
1300 | "quick-lru": "^5.1.1",
1301 | "resolve": "^1.22.1"
1302 | }
1303 | },
1304 | "to-regex-range": {
1305 | "version": "5.0.1",
1306 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1307 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1308 | "dev": true,
1309 | "requires": {
1310 | "is-number": "^7.0.0"
1311 | }
1312 | },
1313 | "util-deprecate": {
1314 | "version": "1.0.2",
1315 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1316 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1317 | "dev": true
1318 | },
1319 | "xtend": {
1320 | "version": "4.0.2",
1321 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1322 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1323 | "dev": true
1324 | },
1325 | "yaml": {
1326 | "version": "1.10.2",
1327 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
1328 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
1329 | "dev": true
1330 | }
1331 | }
1332 | }
1333 |
--------------------------------------------------------------------------------
/src/main/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "private": true,
4 | "scripts": {
5 | "build": "tailwindcss -i ./main.css -o ../resources/static/main.css",
6 | "watch": "tailwindcss -i ./main.css --watch"
7 | },
8 | "devDependencies": {
9 | "tailwindcss": "^3.2.2"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/frontend/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["../resources/templates/**/*.{html,js}"], // it will be explained later
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/example/demo/SpringTailwindApplication.java:
--------------------------------------------------------------------------------
1 | package com.example.demo;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class SpringTailwindApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(SpringTailwindApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/main/resources/static/main.css:
--------------------------------------------------------------------------------
1 | /*
2 | ! tailwindcss v3.2.2 | MIT License | https://tailwindcss.com
3 | */
4 |
5 | /*
6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
8 | */
9 |
10 | *,
11 | ::before,
12 | ::after {
13 | box-sizing: border-box;
14 | /* 1 */
15 | border-width: 0;
16 | /* 2 */
17 | border-style: solid;
18 | /* 2 */
19 | border-color: #e5e7eb;
20 | /* 2 */
21 | }
22 |
23 | ::before,
24 | ::after {
25 | --tw-content: '';
26 | }
27 |
28 | /*
29 | 1. Use a consistent sensible line-height in all browsers.
30 | 2. Prevent adjustments of font size after orientation changes in iOS.
31 | 3. Use a more readable tab size.
32 | 4. Use the user's configured `sans` font-family by default.
33 | 5. Use the user's configured `sans` font-feature-settings by default.
34 | */
35 |
36 | html {
37 | line-height: 1.5;
38 | /* 1 */
39 | -webkit-text-size-adjust: 100%;
40 | /* 2 */
41 | -moz-tab-size: 4;
42 | /* 3 */
43 | -o-tab-size: 4;
44 | tab-size: 4;
45 | /* 3 */
46 | font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
47 | /* 4 */
48 | font-feature-settings: normal;
49 | /* 5 */
50 | }
51 |
52 | /*
53 | 1. Remove the margin in all browsers.
54 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
55 | */
56 |
57 | body {
58 | margin: 0;
59 | /* 1 */
60 | line-height: inherit;
61 | /* 2 */
62 | }
63 |
64 | /*
65 | 1. Add the correct height in Firefox.
66 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
67 | 3. Ensure horizontal rules are visible by default.
68 | */
69 |
70 | hr {
71 | height: 0;
72 | /* 1 */
73 | color: inherit;
74 | /* 2 */
75 | border-top-width: 1px;
76 | /* 3 */
77 | }
78 |
79 | /*
80 | Add the correct text decoration in Chrome, Edge, and Safari.
81 | */
82 |
83 | abbr:where([title]) {
84 | -webkit-text-decoration: underline dotted;
85 | text-decoration: underline dotted;
86 | }
87 |
88 | /*
89 | Remove the default font size and weight for headings.
90 | */
91 |
92 | h1,
93 | h2,
94 | h3,
95 | h4,
96 | h5,
97 | h6 {
98 | font-size: inherit;
99 | font-weight: inherit;
100 | }
101 |
102 | /*
103 | Reset links to optimize for opt-in styling instead of opt-out.
104 | */
105 |
106 | a {
107 | color: inherit;
108 | text-decoration: inherit;
109 | }
110 |
111 | /*
112 | Add the correct font weight in Edge and Safari.
113 | */
114 |
115 | b,
116 | strong {
117 | font-weight: bolder;
118 | }
119 |
120 | /*
121 | 1. Use the user's configured `mono` font family by default.
122 | 2. Correct the odd `em` font sizing in all browsers.
123 | */
124 |
125 | code,
126 | kbd,
127 | samp,
128 | pre {
129 | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
130 | /* 1 */
131 | font-size: 1em;
132 | /* 2 */
133 | }
134 |
135 | /*
136 | Add the correct font size in all browsers.
137 | */
138 |
139 | small {
140 | font-size: 80%;
141 | }
142 |
143 | /*
144 | Prevent `sub` and `sup` elements from affecting the line height in all browsers.
145 | */
146 |
147 | sub,
148 | sup {
149 | font-size: 75%;
150 | line-height: 0;
151 | position: relative;
152 | vertical-align: baseline;
153 | }
154 |
155 | sub {
156 | bottom: -0.25em;
157 | }
158 |
159 | sup {
160 | top: -0.5em;
161 | }
162 |
163 | /*
164 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
165 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
166 | 3. Remove gaps between table borders by default.
167 | */
168 |
169 | table {
170 | text-indent: 0;
171 | /* 1 */
172 | border-color: inherit;
173 | /* 2 */
174 | border-collapse: collapse;
175 | /* 3 */
176 | }
177 |
178 | /*
179 | 1. Change the font styles in all browsers.
180 | 2. Remove the margin in Firefox and Safari.
181 | 3. Remove default padding in all browsers.
182 | */
183 |
184 | button,
185 | input,
186 | optgroup,
187 | select,
188 | textarea {
189 | font-family: inherit;
190 | /* 1 */
191 | font-size: 100%;
192 | /* 1 */
193 | font-weight: inherit;
194 | /* 1 */
195 | line-height: inherit;
196 | /* 1 */
197 | color: inherit;
198 | /* 1 */
199 | margin: 0;
200 | /* 2 */
201 | padding: 0;
202 | /* 3 */
203 | }
204 |
205 | /*
206 | Remove the inheritance of text transform in Edge and Firefox.
207 | */
208 |
209 | button,
210 | select {
211 | text-transform: none;
212 | }
213 |
214 | /*
215 | 1. Correct the inability to style clickable types in iOS and Safari.
216 | 2. Remove default button styles.
217 | */
218 |
219 | button,
220 | [type='button'],
221 | [type='reset'],
222 | [type='submit'] {
223 | -webkit-appearance: button;
224 | /* 1 */
225 | background-color: transparent;
226 | /* 2 */
227 | background-image: none;
228 | /* 2 */
229 | }
230 |
231 | /*
232 | Use the modern Firefox focus style for all focusable elements.
233 | */
234 |
235 | :-moz-focusring {
236 | outline: auto;
237 | }
238 |
239 | /*
240 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
241 | */
242 |
243 | :-moz-ui-invalid {
244 | box-shadow: none;
245 | }
246 |
247 | /*
248 | Add the correct vertical alignment in Chrome and Firefox.
249 | */
250 |
251 | progress {
252 | vertical-align: baseline;
253 | }
254 |
255 | /*
256 | Correct the cursor style of increment and decrement buttons in Safari.
257 | */
258 |
259 | ::-webkit-inner-spin-button,
260 | ::-webkit-outer-spin-button {
261 | height: auto;
262 | }
263 |
264 | /*
265 | 1. Correct the odd appearance in Chrome and Safari.
266 | 2. Correct the outline style in Safari.
267 | */
268 |
269 | [type='search'] {
270 | -webkit-appearance: textfield;
271 | /* 1 */
272 | outline-offset: -2px;
273 | /* 2 */
274 | }
275 |
276 | /*
277 | Remove the inner padding in Chrome and Safari on macOS.
278 | */
279 |
280 | ::-webkit-search-decoration {
281 | -webkit-appearance: none;
282 | }
283 |
284 | /*
285 | 1. Correct the inability to style clickable types in iOS and Safari.
286 | 2. Change font properties to `inherit` in Safari.
287 | */
288 |
289 | ::-webkit-file-upload-button {
290 | -webkit-appearance: button;
291 | /* 1 */
292 | font: inherit;
293 | /* 2 */
294 | }
295 |
296 | /*
297 | Add the correct display in Chrome and Safari.
298 | */
299 |
300 | summary {
301 | display: list-item;
302 | }
303 |
304 | /*
305 | Removes the default spacing and border for appropriate elements.
306 | */
307 |
308 | blockquote,
309 | dl,
310 | dd,
311 | h1,
312 | h2,
313 | h3,
314 | h4,
315 | h5,
316 | h6,
317 | hr,
318 | figure,
319 | p,
320 | pre {
321 | margin: 0;
322 | }
323 |
324 | fieldset {
325 | margin: 0;
326 | padding: 0;
327 | }
328 |
329 | legend {
330 | padding: 0;
331 | }
332 |
333 | ol,
334 | ul,
335 | menu {
336 | list-style: none;
337 | margin: 0;
338 | padding: 0;
339 | }
340 |
341 | /*
342 | Prevent resizing textareas horizontally by default.
343 | */
344 |
345 | textarea {
346 | resize: vertical;
347 | }
348 |
349 | /*
350 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
351 | 2. Set the default placeholder color to the user's configured gray 400 color.
352 | */
353 |
354 | input::-moz-placeholder, textarea::-moz-placeholder {
355 | opacity: 1;
356 | /* 1 */
357 | color: #9ca3af;
358 | /* 2 */
359 | }
360 |
361 | input::placeholder,
362 | textarea::placeholder {
363 | opacity: 1;
364 | /* 1 */
365 | color: #9ca3af;
366 | /* 2 */
367 | }
368 |
369 | /*
370 | Set the default cursor for buttons.
371 | */
372 |
373 | button,
374 | [role="button"] {
375 | cursor: pointer;
376 | }
377 |
378 | /*
379 | Make sure disabled buttons don't get the pointer cursor.
380 | */
381 |
382 | :disabled {
383 | cursor: default;
384 | }
385 |
386 | /*
387 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
388 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
389 | This can trigger a poorly considered lint error in some tools but is included by design.
390 | */
391 |
392 | img,
393 | svg,
394 | video,
395 | canvas,
396 | audio,
397 | iframe,
398 | embed,
399 | object {
400 | display: block;
401 | /* 1 */
402 | vertical-align: middle;
403 | /* 2 */
404 | }
405 |
406 | /*
407 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
408 | */
409 |
410 | img,
411 | video {
412 | max-width: 100%;
413 | height: auto;
414 | }
415 |
416 | /* Make elements with the HTML hidden attribute stay hidden by default */
417 |
418 | [hidden] {
419 | display: none;
420 | }
421 |
422 | *, ::before, ::after {
423 | --tw-border-spacing-x: 0;
424 | --tw-border-spacing-y: 0;
425 | --tw-translate-x: 0;
426 | --tw-translate-y: 0;
427 | --tw-rotate: 0;
428 | --tw-skew-x: 0;
429 | --tw-skew-y: 0;
430 | --tw-scale-x: 1;
431 | --tw-scale-y: 1;
432 | --tw-pan-x: ;
433 | --tw-pan-y: ;
434 | --tw-pinch-zoom: ;
435 | --tw-scroll-snap-strictness: proximity;
436 | --tw-ordinal: ;
437 | --tw-slashed-zero: ;
438 | --tw-numeric-figure: ;
439 | --tw-numeric-spacing: ;
440 | --tw-numeric-fraction: ;
441 | --tw-ring-inset: ;
442 | --tw-ring-offset-width: 0px;
443 | --tw-ring-offset-color: #fff;
444 | --tw-ring-color: rgb(59 130 246 / 0.5);
445 | --tw-ring-offset-shadow: 0 0 #0000;
446 | --tw-ring-shadow: 0 0 #0000;
447 | --tw-shadow: 0 0 #0000;
448 | --tw-shadow-colored: 0 0 #0000;
449 | --tw-blur: ;
450 | --tw-brightness: ;
451 | --tw-contrast: ;
452 | --tw-grayscale: ;
453 | --tw-hue-rotate: ;
454 | --tw-invert: ;
455 | --tw-saturate: ;
456 | --tw-sepia: ;
457 | --tw-drop-shadow: ;
458 | --tw-backdrop-blur: ;
459 | --tw-backdrop-brightness: ;
460 | --tw-backdrop-contrast: ;
461 | --tw-backdrop-grayscale: ;
462 | --tw-backdrop-hue-rotate: ;
463 | --tw-backdrop-invert: ;
464 | --tw-backdrop-opacity: ;
465 | --tw-backdrop-saturate: ;
466 | --tw-backdrop-sepia: ;
467 | }
468 |
469 | ::backdrop {
470 | --tw-border-spacing-x: 0;
471 | --tw-border-spacing-y: 0;
472 | --tw-translate-x: 0;
473 | --tw-translate-y: 0;
474 | --tw-rotate: 0;
475 | --tw-skew-x: 0;
476 | --tw-skew-y: 0;
477 | --tw-scale-x: 1;
478 | --tw-scale-y: 1;
479 | --tw-pan-x: ;
480 | --tw-pan-y: ;
481 | --tw-pinch-zoom: ;
482 | --tw-scroll-snap-strictness: proximity;
483 | --tw-ordinal: ;
484 | --tw-slashed-zero: ;
485 | --tw-numeric-figure: ;
486 | --tw-numeric-spacing: ;
487 | --tw-numeric-fraction: ;
488 | --tw-ring-inset: ;
489 | --tw-ring-offset-width: 0px;
490 | --tw-ring-offset-color: #fff;
491 | --tw-ring-color: rgb(59 130 246 / 0.5);
492 | --tw-ring-offset-shadow: 0 0 #0000;
493 | --tw-ring-shadow: 0 0 #0000;
494 | --tw-shadow: 0 0 #0000;
495 | --tw-shadow-colored: 0 0 #0000;
496 | --tw-blur: ;
497 | --tw-brightness: ;
498 | --tw-contrast: ;
499 | --tw-grayscale: ;
500 | --tw-hue-rotate: ;
501 | --tw-invert: ;
502 | --tw-saturate: ;
503 | --tw-sepia: ;
504 | --tw-drop-shadow: ;
505 | --tw-backdrop-blur: ;
506 | --tw-backdrop-brightness: ;
507 | --tw-backdrop-contrast: ;
508 | --tw-backdrop-grayscale: ;
509 | --tw-backdrop-hue-rotate: ;
510 | --tw-backdrop-invert: ;
511 | --tw-backdrop-opacity: ;
512 | --tw-backdrop-saturate: ;
513 | --tw-backdrop-sepia: ;
514 | }
515 |
516 | .m-16 {
517 | margin: 4rem;
518 | }
519 |
520 | h1 {
521 | margin-left: 4rem;
522 | margin-right: 4rem;
523 | margin-top: 4rem;
524 | margin-bottom: 4rem;
525 | font-size: 3rem;
526 | line-height: 1;
527 | text-decoration-line: underline;
528 | }
529 |
530 |
531 |
--------------------------------------------------------------------------------
/src/main/resources/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Getting Started: Serving Web Content
5 |
6 |
7 |
8 |
9 |
10 | Have a nice day!
11 |
12 |
13 |
--------------------------------------------------------------------------------