├── .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 | --------------------------------------------------------------------------------