├── .github
├── dependabot.yml
├── release-drafter.yml
└── workflows
│ ├── gradle.yml
│ ├── release-notes.yml
│ └── release.yml
├── .gitignore
├── README.md
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── profile.yml
├── settings.gradle
└── skeleton
├── client
├── .gitignore
├── README.md
├── build.gradle
├── package.json
├── public
│ ├── favicon.ico
│ ├── favicon16.png
│ ├── favicon32.png
│ ├── favicon48.png
│ ├── index.html
│ └── manifest.json
├── src
│ ├── App.js
│ ├── App.test.js
│ ├── AppNav.js
│ ├── Footer.js
│ ├── config.js
│ ├── css
│ │ ├── App.css
│ │ ├── bootstrap.css
│ │ ├── errors.css
│ │ ├── grails.css
│ │ ├── index.css
│ │ ├── main.css
│ │ └── mobile.css
│ ├── images
│ │ ├── advancedgrails.svg
│ │ ├── apple-touch-icon-retina.png
│ │ ├── apple-touch-icon.png
│ │ ├── documentation.svg
│ │ ├── favicon.ico
│ │ ├── favicon16.png
│ │ ├── favicon32.png
│ │ ├── favicon48.png
│ │ ├── grails-cupsonly-logo-white.svg
│ │ ├── grails.png
│ │ ├── grails.svg
│ │ ├── logo.png
│ │ ├── logo.svg
│ │ ├── skin
│ │ │ ├── database_add.png
│ │ │ ├── database_delete.png
│ │ │ ├── database_edit.png
│ │ │ ├── database_save.png
│ │ │ ├── database_table.png
│ │ │ ├── exclamation.png
│ │ │ ├── house.png
│ │ │ ├── information.png
│ │ │ ├── sorted_asc.gif
│ │ │ └── sorted_desc.gif
│ │ ├── slack.svg
│ │ └── spinner.gif
│ ├── index.js
│ └── serviceWorker.js
└── yarn.lock
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── server
├── gradle.properties
└── grails-app
│ └── conf
│ └── application.yml
└── settings.gradle
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: gradle
4 | directory: "/"
5 | schedule:
6 | interval: daily
7 | open-pull-requests-limit: 10
8 | target-branch: master
9 | labels:
10 | - "type: dependency upgrade"
11 |
--------------------------------------------------------------------------------
/.github/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name-template: $NEXT_PATCH_VERSION
2 | tag-template: v$NEXT_PATCH_VERSION
3 | version-resolver:
4 | major:
5 | labels:
6 | - 'type: major'
7 | minor:
8 | labels:
9 | - 'type: minor'
10 | patch:
11 | labels:
12 | - 'type: patch'
13 | default: patch
14 | categories:
15 | - title: 🚀 Features
16 | labels:
17 | - "type: enhancement"
18 | - "type: new feature"
19 | - "type: major"
20 | - title: 🚀 Bug Fixes/Improvements
21 | labels:
22 | - "type: improvement"
23 | - "type: bug"
24 | - "type: minor"
25 | - title: 🛠 Dependency upgrades
26 | labels:
27 | - "type: dependency upgrade"
28 | - "dependencies"
29 | change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
30 | template: |
31 | ## Changes
32 |
33 | $CHANGES
34 |
35 | ## Contributors
36 |
37 | $CONTRIBUTORS
38 |
--------------------------------------------------------------------------------
/.github/workflows/gradle.yml:
--------------------------------------------------------------------------------
1 | name: Java CI
2 | on:
3 | push:
4 | branches:
5 | - '[1-9]+.[0-9]+.x'
6 | - master
7 | pull_request:
8 | branches:
9 | - '[1-9]+.[0-9]+.x'
10 | - master
11 | jobs:
12 | build:
13 | runs-on: ubuntu-latest
14 | strategy:
15 | matrix:
16 | java: ['17']
17 | env:
18 | WORKSPACE: ${{ github.workspace }}
19 | GRADLE_OPTS: -Xmx1500m -Dfile.encoding=UTF-8
20 | MAVEN_PUBLISH_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }}
21 | MAVEN_PUBLISH_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
22 | MAVEN_PUBLISH_URL: 'https://repo.grails.org/grails/libs-snapshots-local'
23 | steps:
24 | - uses: actions/checkout@v2
25 | - uses: actions/cache@v2
26 | with:
27 | path: ~/.gradle/caches
28 | key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
29 | restore-keys: |
30 | ${{ runner.os }}-gradle-
31 | - name: Set up JDK
32 | uses: actions/setup-java@v1
33 | with:
34 | java-version: ${{ matrix.java }}
35 | - name: Run Assemble
36 | if: success() && github.event_name == 'push' && matrix.java == '17'
37 | run: ./gradlew assemble
38 | - name: Publish to repo.grails.org
39 | if: success() && github.event_name == 'push' && matrix.java == '17'
40 | run: |
41 | ./gradlew publish
42 |
--------------------------------------------------------------------------------
/.github/workflows/release-notes.yml:
--------------------------------------------------------------------------------
1 | name: Changelog
2 | on:
3 | issues:
4 | types: [closed,reopened]
5 | push:
6 | branches:
7 | - '[1-9]+.[0-9]+.x'
8 | - master
9 | workflow_dispatch:
10 | jobs:
11 | release_notes:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v2
15 | - name: Check if it has release drafter config file
16 | id: check_release_drafter
17 | run: |
18 | has_release_drafter=$([ -f .github/release-drafter.yml ] && echo "true" || echo "false")
19 | echo ::set-output name=has_release_drafter::${has_release_drafter}
20 |
21 | # If it has release drafter:
22 | - uses: release-drafter/release-drafter@v5.15.0
23 | if: steps.check_release_drafter.outputs.has_release_drafter == 'true'
24 | # env:
25 | # GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
26 | with:
27 | prerelease: false
28 | commitish: master
29 | # Otherwise:
30 | - name: Export Gradle Properties
31 | if: steps.check_release_drafter.outputs.has_release_drafter == 'false'
32 | uses: micronaut-projects/github-actions/export-gradle-properties@master
33 | - uses: micronaut-projects/github-actions/release-notes@master
34 | if: steps.check_release_drafter.outputs.has_release_drafter == 'false'
35 | id: release_notes
36 | # with:
37 | # token: ${{ secrets.GH_TOKEN }}
38 | - uses: ncipollo/release-action@v1
39 | if: steps.check_release_drafter.outputs.has_release_drafter == 'false' && steps.release_notes.outputs.generated_changelog == 'true'
40 | with:
41 | allowUpdates: true
42 | commit: ${{ steps.release_notes.outputs.current_branch }}
43 | draft: true
44 | name: ${{ env.title }} ${{ steps.release_notes.outputs.next_version }}
45 | tag: v${{ steps.release_notes.outputs.next_version }}
46 | bodyFile: CHANGELOG.md
47 | # token: ${{ secrets.GH_TOKEN }}
48 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 | on:
3 | release:
4 | types: [published]
5 | jobs:
6 | release:
7 | runs-on: ubuntu-latest
8 | strategy:
9 | matrix:
10 | java: ['17']
11 | env:
12 | GIT_USER_NAME: 'grails-build'
13 | GIT_USER_EMAIL: 'grails-build@users.noreply.github.com'
14 | steps:
15 | - name: Checkout repository
16 | uses: actions/checkout@v2
17 | with:
18 | token: ${{ secrets.GH_TOKEN }}
19 | - uses: gradle/wrapper-validation-action@v1
20 | - name: Set up JDK
21 | uses: actions/setup-java@v1
22 | with:
23 | java-version: ${{ matrix.java }}
24 | - name: Extract Target Branch
25 | id: extract_branch
26 | run: |
27 | echo "Determining Target Branch"
28 | TARGET_BRANCH=`cat $GITHUB_EVENT_PATH | jq '.release.target_commitish' | sed -e 's/^"\(.*\)"$/\1/g'`
29 | echo $TARGET_BRANCH
30 | echo ::set-output name=value::${TARGET_BRANCH}
31 | - name: Set the current release version
32 | id: release_version
33 | run: echo ::set-output name=release_version::${GITHUB_REF:11}
34 | - name: Run pre-release
35 | uses: micronaut-projects/github-actions/pre-release@master
36 | with:
37 | token: ${{ secrets.GITHUB_TOKEN }}
38 | - name: Publish to Sonatype OSSRH
39 | env:
40 | NEXUS_PUBLISH_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
41 | NEXUS_PUBLISH_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
42 | NEXUS_PUBLISH_URL: ${{ secrets.SONATYPE_NEXUS_URL }}
43 | NEXUS_PUBLISH_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }}
44 | SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
45 | SIGNING_PASSPHRASE: ${{ secrets.SIGNING_PASSPHRASE }}
46 | SECRING_FILE: ${{ secrets.SECRING_FILE }}
47 | run: |
48 | echo $SECRING_FILE | base64 -d > secring.gpg
49 | echo "Publishing Artifacts"
50 | (set -x; ./gradlew -Psigning.secretKeyRingFile="${GITHUB_WORKSPACE}/secring.gpg" publishToSonatype closeAndReleaseSonatypeStagingRepository --no-daemon)
51 | (set -x; ./gradlew assemble --no-daemon)
52 | - name: Export Gradle Properties
53 | uses: micronaut-projects/github-actions/export-gradle-properties@master
54 | - name: Run post-release
55 | if: success()
56 | uses: micronaut-projects/github-actions/post-release@master
57 | with:
58 | token: ${{ secrets.GITHUB_TOKEN }}
59 | env:
60 | SNAPSHOT_SUFFIX: -SNAPSHOT
61 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | .idea
3 | *.iml
4 | build
5 | **/node_modules/
6 | **/.DS_Store
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Relocated to
2 |
3 | https://github.com/grails/grails-profiles
4 |
5 | # Grails React Profile
6 | A profile for creating Grails applications with a React frontend
7 |
8 | [](https://travis-ci.org/grails-profiles/react)
9 |
10 | [Documentation](https://grails-profiles.github.io/react/latest/guide/index.html)
11 |
12 | To improve the documentation edit the [docs branch](https://github.com/grails-profiles/react/tree/docs).
13 |
14 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | gradlePluginPortal()
4 | mavenCentral()
5 | maven { url "https://repo.grails.org/grails/core" }
6 | // mavenLocal() // for local testing, do not commit uncommented
7 | }
8 | dependencies {
9 | classpath "org.grails:grails-gradle-plugin:$grailsGradlePluginVersion"
10 | classpath 'io.spring.gradle:dependency-management-plugin'
11 | }
12 | }
13 |
14 | apply plugin: "org.grails.grails-profile"
15 | apply plugin: "io.spring.dependency-management"
16 |
17 | ext.mavenPublishUrl = 'https://repo.grails.org/grails/libs-snapshots-local'
18 |
19 | group 'org.grails.profiles'
20 | version project.projectVersion
21 |
22 | apply plugin: "org.grails.grails-profile-publish"
23 | grailsPublish {
24 | githubSlug = 'grails-profiles/react'
25 | license = 'Apache-2.0'
26 | title = "React Profile"
27 | desc = "A profile for creating Grails applications with React"
28 | developers = [zacharyklein:"Zachary Klein"]
29 | }
30 |
31 | repositories {
32 | mavenCentral()
33 | maven { url "https://repo.grails.org/grails/core" }
34 | // mavenLocal() // for local testing, do not commit uncommented
35 | }
36 |
37 | dependencies {
38 | profileRuntimeOnly "org.grails.profiles:rest-api:$restApiProfileVersion"
39 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | restApiProfileVersion=7.0.1
2 | projectVersion=7.0.2-SNAPSHOT
3 | grailsGradlePluginVersion=7.0.0-M2
4 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #
4 | # Copyright © 2015-2021 the original authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 | # SPDX-License-Identifier: Apache-2.0
19 | #
20 |
21 | ##############################################################################
22 | #
23 | # Gradle start up script for POSIX generated by Gradle.
24 | #
25 | # Important for running:
26 | #
27 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
28 | # noncompliant, but you have some other compliant shell such as ksh or
29 | # bash, then to run this script, type that shell name before the whole
30 | # command line, like:
31 | #
32 | # ksh Gradle
33 | #
34 | # Busybox and similar reduced shells will NOT work, because this script
35 | # requires all of these POSIX shell features:
36 | # * functions;
37 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
38 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
39 | # * compound commands having a testable exit status, especially «case»;
40 | # * various built-in commands including «command», «set», and «ulimit».
41 | #
42 | # Important for patching:
43 | #
44 | # (2) This script targets any POSIX shell, so it avoids extensions provided
45 | # by Bash, Ksh, etc; in particular arrays are avoided.
46 | #
47 | # The "traditional" practice of packing multiple parameters into a
48 | # space-separated string is a well documented source of bugs and security
49 | # problems, so this is (mostly) avoided, by progressively accumulating
50 | # options in "$@", and eventually passing that to Java.
51 | #
52 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
53 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
54 | # see the in-line comments for details.
55 | #
56 | # There are tweaks for specific operating systems such as AIX, CygWin,
57 | # Darwin, MinGW, and NonStop.
58 | #
59 | # (3) This script is generated from the Groovy template
60 | # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
61 | # within the Gradle project.
62 | #
63 | # You can find Gradle at https://github.com/gradle/gradle/.
64 | #
65 | ##############################################################################
66 |
67 | # Attempt to set APP_HOME
68 |
69 | # Resolve links: $0 may be a link
70 | app_path=$0
71 |
72 | # Need this for daisy-chained symlinks.
73 | while
74 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
75 | [ -h "$app_path" ]
76 | do
77 | ls=$( ls -ld "$app_path" )
78 | link=${ls#*' -> '}
79 | case $link in #(
80 | /*) app_path=$link ;; #(
81 | *) app_path=$APP_HOME$link ;;
82 | esac
83 | done
84 |
85 | # This is normally unused
86 | # shellcheck disable=SC2034
87 | APP_BASE_NAME=${0##*/}
88 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
89 | APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
90 | ' "$PWD" ) || exit
91 |
92 | # Use the maximum available, or set MAX_FD != -1 to use that value.
93 | MAX_FD=maximum
94 |
95 | warn () {
96 | echo "$*"
97 | } >&2
98 |
99 | die () {
100 | echo
101 | echo "$*"
102 | echo
103 | exit 1
104 | } >&2
105 |
106 | # OS specific support (must be 'true' or 'false').
107 | cygwin=false
108 | msys=false
109 | darwin=false
110 | nonstop=false
111 | case "$( uname )" in #(
112 | CYGWIN* ) cygwin=true ;; #(
113 | Darwin* ) darwin=true ;; #(
114 | MSYS* | MINGW* ) msys=true ;; #(
115 | NONSTOP* ) nonstop=true ;;
116 | esac
117 |
118 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
119 |
120 |
121 | # Determine the Java command to use to start the JVM.
122 | if [ -n "$JAVA_HOME" ] ; then
123 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
124 | # IBM's JDK on AIX uses strange locations for the executables
125 | JAVACMD=$JAVA_HOME/jre/sh/java
126 | else
127 | JAVACMD=$JAVA_HOME/bin/java
128 | fi
129 | if [ ! -x "$JAVACMD" ] ; then
130 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
131 |
132 | Please set the JAVA_HOME variable in your environment to match the
133 | location of your Java installation."
134 | fi
135 | else
136 | JAVACMD=java
137 | if ! command -v java >/dev/null 2>&1
138 | then
139 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
140 |
141 | Please set the JAVA_HOME variable in your environment to match the
142 | location of your Java installation."
143 | fi
144 | fi
145 |
146 | # Increase the maximum file descriptors if we can.
147 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
148 | case $MAX_FD in #(
149 | max*)
150 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
151 | # shellcheck disable=SC2039,SC3045
152 | MAX_FD=$( ulimit -H -n ) ||
153 | warn "Could not query maximum file descriptor limit"
154 | esac
155 | case $MAX_FD in #(
156 | '' | soft) :;; #(
157 | *)
158 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
159 | # shellcheck disable=SC2039,SC3045
160 | ulimit -n "$MAX_FD" ||
161 | warn "Could not set maximum file descriptor limit to $MAX_FD"
162 | esac
163 | fi
164 |
165 | # Collect all arguments for the java command, stacking in reverse order:
166 | # * args from the command line
167 | # * the main class name
168 | # * -classpath
169 | # * -D...appname settings
170 | # * --module-path (only if needed)
171 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
172 |
173 | # For Cygwin or MSYS, switch paths to Windows format before running java
174 | if "$cygwin" || "$msys" ; then
175 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
176 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
177 |
178 | JAVACMD=$( cygpath --unix "$JAVACMD" )
179 |
180 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
181 | for arg do
182 | if
183 | case $arg in #(
184 | -*) false ;; # don't mess with options #(
185 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
186 | [ -e "$t" ] ;; #(
187 | *) false ;;
188 | esac
189 | then
190 | arg=$( cygpath --path --ignore --mixed "$arg" )
191 | fi
192 | # Roll the args list around exactly as many times as the number of
193 | # args, so each arg winds up back in the position where it started, but
194 | # possibly modified.
195 | #
196 | # NB: a `for` loop captures its iteration list before it begins, so
197 | # changing the positional parameters here affects neither the number of
198 | # iterations, nor the values presented in `arg`.
199 | shift # remove old arg
200 | set -- "$@" "$arg" # push replacement arg
201 | done
202 | fi
203 |
204 |
205 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
206 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
207 |
208 | # Collect all arguments for the java command:
209 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
210 | # and any embedded shellness will be escaped.
211 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
212 | # treated as '${Hostname}' itself on the command line.
213 |
214 | set -- \
215 | "-Dorg.gradle.appname=$APP_BASE_NAME" \
216 | -classpath "$CLASSPATH" \
217 | org.gradle.wrapper.GradleWrapperMain \
218 | "$@"
219 |
220 | # Stop when "xargs" is not available.
221 | if ! command -v xargs >/dev/null 2>&1
222 | then
223 | die "xargs is not available"
224 | fi
225 |
226 | # Use "xargs" to parse quoted args.
227 | #
228 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
229 | #
230 | # In Bash we could simply go:
231 | #
232 | # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
233 | # set -- "${ARGS[@]}" "$@"
234 | #
235 | # but POSIX shell has neither arrays nor command substitution, so instead we
236 | # post-process each arg (as a line of input to sed) to backslash-escape any
237 | # character that might be a shell metacharacter, then use eval to reverse
238 | # that process (while maintaining the separation between arguments), and wrap
239 | # the whole thing up as a single "set" statement.
240 | #
241 | # This will of course break if any of these variables contains a newline or
242 | # an unmatched quote.
243 | #
244 |
245 | eval "set -- $(
246 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
247 | xargs -n1 |
248 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
249 | tr '\n' ' '
250 | )" '"$@"'
251 |
252 | exec "$JAVACMD" "$@"
253 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 | @rem SPDX-License-Identifier: Apache-2.0
17 | @rem
18 |
19 | @if "%DEBUG%"=="" @echo off
20 | @rem ##########################################################################
21 | @rem
22 | @rem Gradle startup script for Windows
23 | @rem
24 | @rem ##########################################################################
25 |
26 | @rem Set local scope for the variables with windows NT shell
27 | if "%OS%"=="Windows_NT" setlocal
28 |
29 | set DIRNAME=%~dp0
30 | if "%DIRNAME%"=="" set DIRNAME=.
31 | @rem This is normally unused
32 | set APP_BASE_NAME=%~n0
33 | set APP_HOME=%DIRNAME%
34 |
35 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
36 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
37 |
38 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
39 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
40 |
41 | @rem Find java.exe
42 | if defined JAVA_HOME goto findJavaFromJavaHome
43 |
44 | set JAVA_EXE=java.exe
45 | %JAVA_EXE% -version >NUL 2>&1
46 | if %ERRORLEVEL% equ 0 goto execute
47 |
48 | echo. 1>&2
49 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
50 | echo. 1>&2
51 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2
52 | echo location of your Java installation. 1>&2
53 |
54 | goto fail
55 |
56 | :findJavaFromJavaHome
57 | set JAVA_HOME=%JAVA_HOME:"=%
58 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
59 |
60 | if exist "%JAVA_EXE%" goto execute
61 |
62 | echo. 1>&2
63 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
64 | echo. 1>&2
65 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2
66 | echo location of your Java installation. 1>&2
67 |
68 | goto fail
69 |
70 | :execute
71 | @rem Setup the command line
72 |
73 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
74 |
75 |
76 | @rem Execute Gradle
77 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
78 |
79 | :end
80 | @rem End local scope for the variables with windows NT shell
81 | if %ERRORLEVEL% equ 0 goto mainEnd
82 |
83 | :fail
84 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
85 | rem the _cmd.exe /c_ return code!
86 | set EXIT_CODE=%ERRORLEVEL%
87 | if %EXIT_CODE% equ 0 set EXIT_CODE=1
88 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
89 | exit /b %EXIT_CODE%
90 |
91 | :mainEnd
92 | if "%OS%"=="Windows_NT" endlocal
93 |
94 | :omega
95 |
--------------------------------------------------------------------------------
/profile.yml:
--------------------------------------------------------------------------------
1 | description: A profile for creating a Grails application with a React frontend
2 | instructions: |
3 | This profile provides a client/server multi-project build structure. The server Grails app is using the rest-api profile with CORS enabled. It can be started using 'grails run-app' or using the Gradle wrapper:
4 |
5 | ./gradlew server:bootRun
6 |
7 | The React client app has been built using the create-react-app CLI. It can be started via 'npm start' (in which case you will need to run 'npm install' to install npm dependencies) or using the Gradle wrapper (which will install npm dependencies automatically if needed):
8 |
9 | ./gradlew client:start
10 |
11 | The client app's build.gradle defines other tasks to test and build the app using react-scripts. Please see create-react-app's documentation for more information: https://github.com/facebookincubator/create-react-app
12 |
13 | For support, please use the Groovy Community Slack (https://groovycommunity.slack.com/) or open an issue on Github: https://github.com/grails-profiles/react/issues
14 |
15 | skeleton:
16 | excludes:
17 | - gradlew
18 | - gradlew.bat
19 | - gradle/
20 | parent:
21 | target: server
22 | features:
23 | defaults:
24 | - hibernate5
25 | required:
26 | - json-views
27 | build:
28 | repositories:
29 | - "https://plugins.gradle.org/m2/"
30 | plugins:
31 | - war
32 | - org.grails.grails-web
33 | - com.github.node-gradle.node
34 | excludes:
35 | - org.grails.grails-core
36 | dependencies:
37 | - scope: build
38 | coords: "com.github.node-gradle:gradle-node-plugin:1.3.0"
39 |
40 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | import org.apache.tools.ant.DirectoryScanner
2 |
3 | rootProject.name="react"
4 |
5 | // Include .gitignore and other config files
6 | for(String file in DirectoryScanner.defaultExcludes) {
7 | DirectoryScanner.removeDefaultExclude(file)
8 | }
--------------------------------------------------------------------------------
/skeleton/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | node_modules
5 |
6 | # testing
7 | coverage
8 |
9 | # production
10 | build
11 |
12 | # misc
13 | .DS_Store
14 | .env
15 | npm-debug.log
16 |
--------------------------------------------------------------------------------
/skeleton/client/README.md:
--------------------------------------------------------------------------------
1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
2 |
3 | ## Available Scripts
4 |
5 | In the project directory, you can run:
6 |
7 | ### `npm start`
8 |
9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
11 |
12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console.
14 |
15 | ### `npm test`
16 |
17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
19 |
20 | ### `npm run build`
21 |
22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance.
24 |
25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed!
27 |
28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
29 |
30 | ### `npm run eject`
31 |
32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
33 |
34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
35 |
36 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
37 |
38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
39 |
40 | ## Learn More
41 |
42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
43 |
44 | To learn React, check out the [React documentation](https://reactjs.org/).
45 |
46 | ### Code Splitting
47 |
48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
49 |
50 | ### Analyzing the Bundle Size
51 |
52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
53 |
54 | ### Making a Progressive Web App
55 |
56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
57 |
58 | ### Advanced Configuration
59 |
60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
61 |
62 | ### Deployment
63 |
64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
65 |
66 | ### `npm run build` fails to minify
67 |
68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
69 |
--------------------------------------------------------------------------------
/skeleton/client/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id "com.github.node-gradle.node" version "3.5.1"
3 | }
4 |
5 | node {
6 | version = '10.15.0' // https://nodejs.org/en/
7 | yarnVersion = '1.13.0' // https://yarnpkg.com/en/
8 | download = true
9 | }
10 |
11 | task bootRun(dependsOn: 'start') {
12 | group = 'application'
13 | description = 'Run the client app (for use with gradle bootRun -parallel'
14 | }
15 |
16 | task start(type: YarnTask, dependsOn: 'yarn') {
17 | group = 'application'
18 | description = 'Run the client app'
19 | args = ['run', 'start']
20 | }
21 |
22 | task build(type: YarnTask, dependsOn: 'yarn') {
23 | group = 'build'
24 | description = 'Build the client bundle'
25 | args = ['run', 'build']
26 | }
27 |
28 | task test(type: YarnTask, dependsOn: 'yarn') {
29 | group = 'verification'
30 | description = 'Run the client tests'
31 | args = ['run', 'test']
32 | }
33 |
34 | task eject(type: YarnTask, dependsOn: 'yarn') {
35 | group = 'other'
36 | description = 'Eject from the create-react-app scripts'
37 | args = ['run', 'eject']
38 | }
39 |
--------------------------------------------------------------------------------
/skeleton/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "react": "^16.8.2",
7 | "react-dom": "^16.8.2",
8 | "react-scripts": "^3.2.0",
9 | "bootstrap": "^5.0.0",
10 | "reactstrap": "^6.5.0"
11 | },
12 | "scripts": {
13 | "start": "react-scripts start",
14 | "build": "react-scripts build",
15 | "test": "react-scripts test",
16 | "eject": "react-scripts eject"
17 | },
18 | "eslintConfig": {
19 | "extends": "react-app"
20 | },
21 | "browserslist": [
22 | ">0.2%",
23 | "not dead",
24 | "not ie <= 11",
25 | "not op_mini all"
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/skeleton/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/public/favicon.ico
--------------------------------------------------------------------------------
/skeleton/client/public/favicon16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/public/favicon16.png
--------------------------------------------------------------------------------
/skeleton/client/public/favicon32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/public/favicon32.png
--------------------------------------------------------------------------------
/skeleton/client/public/favicon48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/public/favicon48.png
--------------------------------------------------------------------------------
/skeleton/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
15 |
16 |
25 | Welcome to Grails + React
26 |
27 |
28 | You need to enable JavaScript to run this app.
29 |
30 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/skeleton/client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": ".",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/skeleton/client/src/App.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react';
2 | import AppNav from './AppNav';
3 | import {Row} from 'reactstrap'
4 |
5 | import grailsLogo from './images/grails-cupsonly-logo-white.svg';
6 | import reactLogo from './images/logo.svg';
7 | import {CLIENT_VERSION, REACT_VERSION, SERVER_URL} from './config';
8 | import 'whatwg-fetch';
9 | import Footer from "./Footer";
10 |
11 | class App extends Component {
12 |
13 | state = {
14 | serverInfo: {},
15 | clientInfo: {
16 | version: CLIENT_VERSION,
17 | react: REACT_VERSION
18 | },
19 | collapse: false
20 | }
21 |
22 | toggle = () => {
23 | this.setState({collapse: !!this.state.collapse})
24 | }
25 |
26 | componentDidMount() {
27 | fetch(SERVER_URL + '/application')
28 | .then(r => r.json())
29 | .then(json => this.setState({serverInfo: json}))
30 | .catch(error => console.error('Error connecting to server: ' + error));
31 |
32 | }
33 |
34 | render() {
35 | const {serverInfo, clientInfo, collapse} = this.state;
36 |
37 | return [
38 | ,
39 |
40 |
41 |
+
42 |
43 |
,
44 |
45 |
46 |
47 |
48 | Welcome to Grails
49 |
50 |
51 | Congratulations, you have successfully started your Grails & React application! While in
52 | development mode, changes will be loaded automatically when you edit your React app,
53 | without even refreshing the page.
54 | Below is a list of controllers that are currently deployed in
55 | this application, click on each to execute its default action:
56 |
57 |
58 |
59 |
Available Controllers:
60 |
61 | {serverInfo.controllers ? serverInfo.controllers.map(controller => {
62 | return {controller.name}
64 | ;
65 | }) : null}
66 |
67 |
68 |
69 |
70 |
71 |
72 |
,
73 |
74 | ];
75 | }
76 | }
77 |
78 | export default App;
79 |
--------------------------------------------------------------------------------
/skeleton/client/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render( , div);
8 | });
9 |
--------------------------------------------------------------------------------
/skeleton/client/src/AppNav.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import {Collapse, DropdownItem, DropdownMenu, DropdownToggle, Nav, Navbar, NavbarBrand, NavbarToggler, NavLink, UncontrolledDropdown} from 'reactstrap';
3 |
4 | import grailsLogo from './images/grails.svg';
5 |
6 | const NavDropdownItem = props => {
7 | return {props.children}
8 | }
9 |
10 | const AppNav = ({serverInfo, clientInfo, collapse, toggle}) => {
11 |
12 | const {environment, appprofile, appversion, grailsversion, reloadingagentenabled, artefacts, plugins} = serverInfo;
13 |
14 | return (
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | Application Status
28 |
29 |
30 | Environment: {environment}
31 | App
32 | profile: {appprofile ? appprofile.replace('org.grails.profiles:', '') : null}
33 | Server version: {appversion}
34 | Client version: {clientInfo ? clientInfo.version : null}
35 |
36 | Grails version: {grailsversion}
37 | React
38 | version: {clientInfo ? clientInfo.react.replace('^', '') : null}
39 |
40 |
41 | Reloading active: {reloadingagentenabled ? 'true' : 'false'}
42 |
43 |
44 |
45 |
46 |
47 | Artefacts
48 |
49 |
50 | Controllers: {artefacts ? artefacts.controllers : 0}
51 | Domains: {artefacts ? artefacts.domains : 0}
52 | Services: {artefacts ? artefacts.services : 0}
53 |
54 |
55 |
56 |
57 |
58 |
59 | Installed Plugins
60 |
61 |
62 | {plugins ?
63 |
64 | {plugins.map(plugin => {
65 | return {plugin.name} - {plugin.version}
67 | })
68 | }
69 | : null
70 | }
71 |
72 |
73 |
74 |
75 |
76 | );
77 |
78 | };
79 |
80 | export default AppNav;
81 |
--------------------------------------------------------------------------------
/skeleton/client/src/Footer.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import advancedgrails from './images/advancedgrails.svg';
4 | import documentation from './images/documentation.svg';
5 | import slack from './images/slack.svg';
6 | import {Row} from 'reactstrap';
7 |
8 | const Footer = () => {
9 |
10 | return
11 |
22 |
31 |
32 |
41 |
42 |
43 | };
44 |
45 | export default Footer;
46 |
--------------------------------------------------------------------------------
/skeleton/client/src/config.js:
--------------------------------------------------------------------------------
1 | import pjson from './../package.json';
2 |
3 | export const SERVER_URL = 'http://localhost:8080/';
4 | export const CLIENT_VERSION = pjson.version;
5 | export const REACT_VERSION = pjson.dependencies.react;
6 |
--------------------------------------------------------------------------------
/skeleton/client/src/css/App.css:
--------------------------------------------------------------------------------
1 | .container {
2 | color: #484848;
3 | line-height: 1.28;
4 | font-size: 1.2em;
5 | }
6 |
7 |
8 | .grails-icon img {
9 | height: 27px;
10 | background-image: url("../images/grails-cupsonly-logo-white.svg");
11 | }
12 |
13 |
14 | a {
15 | color: #db4800;
16 | text-decoration: underline;
17 | }
18 |
19 | a:hover {
20 | color: #db4800;
21 | text-decoration: none
22 | }
23 |
24 |
25 | #content section h1 {
26 | font-size: 34px;
27 | line-height: 40px;
28 | font-weight: 200;
29 | text-align: center;
30 | margin: 0;
31 | padding: 20px 0;
32 | }
33 |
34 | #content section p {
35 | margin-top: 0;
36 | padding-bottom: 5px;
37 | text-align: center;
38 | color: #222;
39 | font-size: 15px;
40 | line-height: 25px;
41 | }
42 |
43 | #controllers a {
44 | text-decoration: underline;
45 | }
46 |
47 | #controllers a:hover {
48 | text-decoration: none;
49 | }
50 |
51 | .grails-logo-container {
52 | background:#7c7c7c no-repeat 50% 30%;
53 | margin-bottom: 20px;
54 | color: white;
55 | height:300px;
56 | text-align:center;
57 | }
58 |
59 | /*img.grails-logo {*/
60 | /*height:340px;*/
61 | /*margin-top:-10px;*/
62 | /*}*/
63 |
64 | .navbar {
65 | border: none;
66 | border-radius: none;
67 | }
68 |
69 | .nav-link {
70 | padding: .5rem;
71 | border-radius: 3px;
72 | }
73 |
74 | .nav-link:hover, .nav-link:active {
75 | background-color: #db4800;
76 | }
77 |
78 | .grails-icon img {
79 | height: 27px;
80 | background-image: url("../images/grails-cupsonly-logo-white.svg");
81 | }
82 |
83 | .plus-logo {
84 | font-size: 10rem;
85 | margin-left: -100px;
86 | margin-right: -13px;
87 | }
88 |
89 | .hero-logo {
90 | width: 161px;
91 | margin-right: -161px;
92 | margin-bottom: 88px;
93 | }
94 |
95 | .navbar a.dropdown-toggle {
96 | color: white!important;
97 | text-shadow: none;
98 | }
99 |
100 | .navbar .open a.dropdown-toggle {
101 | color: black!important;
102 | text-shadow: none;
103 | }
104 |
105 | .navbar .navbar-brand {
106 | color: white!important;
107 | text-shadow: none;
108 | }
109 |
110 | .navbar-brand {
111 | width: 80px;
112 | height: 88 spx;
113 | padding: 0;
114 | margin: 0;
115 | }
116 |
117 | @media (min-width: 768px) {
118 | .navbar-nav>li>a {
119 | padding-top: 25px;
120 | padding-bottom: 25px;
121 | }
122 | }
123 |
124 | @media (max-width: 767px) {
125 |
126 | .hero-logo {
127 | display: none;
128 | }
129 |
130 | .plus-logo {
131 | display: none;
132 | }
133 |
134 | .navbar-default .navbar-nav .open .dropdown-menu > li > a {
135 | color: white!important;
136 | }
137 |
138 | .navbar-toggle .icon-bar {
139 | background-color: white!important;
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/skeleton/client/src/css/errors.css:
--------------------------------------------------------------------------------
1 | h1, h2 {
2 | margin: 10px 25px 5px;
3 | }
4 |
5 | h2 {
6 | font-size: 1.1em;
7 | }
8 |
9 | .filename {
10 | font-style: italic;
11 | }
12 |
13 | .exceptionMessage {
14 | margin: 10px;
15 | border: 1px solid #000;
16 | padding: 5px;
17 | background-color: #E9E9E9;
18 | }
19 |
20 | .stack,
21 | .snippet {
22 | margin: 0 25px 10px;
23 | }
24 |
25 | .stack,
26 | .snippet {
27 | border: 1px solid #ccc;
28 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2);
29 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2);
30 | box-shadow: 0 0 2px rgba(0,0,0,0.2);
31 | }
32 |
33 | /* error details */
34 | .error-details {
35 | border-top: 1px solid #FFAAAA;
36 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2);
37 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2);
38 | box-shadow: 0 0 2px rgba(0,0,0,0.2);
39 | border-bottom: 1px solid #FFAAAA;
40 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2);
41 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2);
42 | box-shadow: 0 0 2px rgba(0,0,0,0.2);
43 | background-color:#FFF3F3;
44 | line-height: 1.5;
45 | overflow: hidden;
46 | padding: 5px;
47 | padding-left:25px;
48 | }
49 |
50 | .error-details dt {
51 | clear: left;
52 | float: left;
53 | font-weight: bold;
54 | margin-right: 5px;
55 | }
56 |
57 | .error-details dt:after {
58 | content: ":";
59 | }
60 |
61 | .error-details dd {
62 | display: block;
63 | }
64 |
65 | /* stack trace */
66 | .stack {
67 | padding: 5px;
68 | overflow: auto;
69 | height: 150px;
70 | }
71 |
72 | /* code snippet */
73 | .snippet {
74 | background-color: #fff;
75 | font-family: monospace;
76 | }
77 |
78 | .snippet .line {
79 | display: block;
80 | }
81 |
82 | .snippet .lineNumber {
83 | background-color: #ddd;
84 | color: #999;
85 | display: inline-block;
86 | margin-right: 5px;
87 | padding: 0 3px;
88 | text-align: right;
89 | width: 3em;
90 | }
91 |
92 | .snippet .error {
93 | background-color: #fff3f3;
94 | font-weight: bold;
95 | }
96 |
97 | .snippet .error .lineNumber {
98 | background-color: #faa;
99 | color: #333;
100 | font-weight: bold;
101 | }
102 |
103 | .snippet .line:first-child .lineNumber {
104 | padding-top: 5px;
105 | }
106 |
107 | .snippet .line:last-child .lineNumber {
108 | padding-bottom: 5px;
109 | }
--------------------------------------------------------------------------------
/skeleton/client/src/css/grails.css:
--------------------------------------------------------------------------------
1 | html, code, kbd, pre, samp {
2 | -ms-text-size-adjust: 100%;
3 | -webkit-text-size-adjust: 100%;
4 | }
5 |
6 | html, body {
7 | height: 100%;
8 | -webkit-overflow-scrolling: touch;
9 | }
10 |
11 | p, ul, pre, h1, h2, h3, h4, h5, h6, h7, h8 {
12 | margin: 1em 0;
13 | }
14 |
15 | p {
16 | display: block;
17 | }
18 |
19 | h1, h2, h3, h4, h5, h6, h7, h8 {
20 | font-weight: bold;
21 | }
22 |
23 | pre {
24 | border-radius: 0;
25 | border: 0;
26 | font-size: 14px;
27 | }
28 |
29 | /* customizing bootstrap nav bar */
30 | .navbar {
31 | margin-bottom: 0px;
32 | padding-right: 110px;
33 | }
34 | .navbar .container {
35 | margin: 10px;
36 | }
37 | .navbar-dark a {
38 | color: #ffffff !important;
39 | font-size: 18px !important;
40 | text-decoration: none;
41 | }
42 | .grails-icon img {
43 | width: 40px;
44 |
45 | }
46 | .navbar-dark, .navbar-static-top {
47 | background-color: #424649;
48 | border: 0px;
49 | }
50 | a.navbar-brand {
51 | color: white !important;
52 | font-size: 19px !important;
53 | }
54 | .navbar-dark .navbar-nav>.active>a, .navbar-dark .navbar-nav>.active>a:hover, .navbar-dark .navbar-nav>.active>a:focus {
55 | background-color: transparent;
56 | color: white;
57 | }
58 | .navbar-nav>li.active>a {
59 | color: white !important;
60 | }
61 | .navbar-nav>li>a:hover {
62 | background-color: #2559a7 !important;
63 | color: white !important;
64 | }
65 | .navbar-nav>li>a {
66 | color: #c0d3db;
67 | }
68 | .navbar-dark .navbar-toggler .icon-bar {
69 | background-color: white;
70 | }
71 | .navbar-dark .navbar-toggle:hover, .navbar-dark .navbar-toggle:focus {
72 | background-color: #2559a7;
73 | }
74 |
75 | .navbar-toggler {
76 | position: relative;
77 | float: right;
78 | padding: 9px 10px;
79 | margin-top: 8px;
80 | margin-right: 15px;
81 | margin-bottom: 8px;
82 | background-color: transparent;
83 | background-image: none;
84 | border: 1px solid transparent;
85 | border-radius: 4px;
86 | }
87 |
88 | .nav .dropdown a.dropdown-toggle {
89 | padding-top: 25px;
90 | padding-bottom: 25px;
91 | }
92 |
93 | @media (min-width: 768px) {
94 | .container {
95 | width: auto;
96 | }
97 | }
98 |
99 | /* specific to index.html */
100 |
101 | @media (max-width: 999px) {
102 | #fork-me {
103 | display: none;
104 | }
105 |
106 | .navbar {
107 | padding-right: 0px;
108 | }
109 | }
110 |
111 | #fork-me{
112 | position: fixed;
113 | padding: 0px 50px 0px 50px;
114 | top: 40px;
115 | right: -60px;
116 | background-color: #a60000;
117 | color: #ffffff;
118 | font-size: 1em;
119 | z-index: 100;
120 | transform: rotate(+45deg);
121 | text-align: center;
122 | font-weight: bolder;
123 | border: #c14646;
124 | border-style: dashed;
125 | border-width: 1px;
126 | }
127 |
128 | #fork-me p {
129 | margin: 0em 0;
130 | }
131 |
132 | #band {
133 | /*grey =#808080*/
134 | background: #2559a7 no-repeat 50% 30%;
135 | height: 400px;
136 | }
137 |
138 | .svg #band {
139 | background-image: url(../images/grails-cupsonly-logo-white.svg);
140 | }
141 |
142 | .no-svg #band {
143 | /*background-image: url(../images/groovy-logo-white.png);*/
144 | }
145 |
146 | @media (max-width: 1010px) {
147 | #band {
148 | background-size: 90%;
149 | height: 300px;
150 | }
151 | }
152 |
153 | @media (max-width: 690px) {
154 | #band {
155 | background-size: 80%;
156 | height: 200px;
157 | }
158 | }
159 |
160 | @media (max-width: 475px) {
161 | #band {
162 | background-size: 70%;
163 | height: 100px;
164 | }
165 | }
166 |
167 | #they-use-groovy {
168 | width: 100%;
169 | height: 450px;
170 | background-color: #db4800;
171 | margin-bottom: 20px;
172 | text-align: center;
173 | }
174 |
175 | #they-use-groovy .item {
176 | text-align: center;
177 | color: white;
178 | }
179 |
180 | #logos-holder {
181 | display: inline-block;
182 | padding: 0px;
183 | margin: 0px;
184 | text-align: center;
185 | }
186 |
187 | #logos-holder .logo {
188 | padding: 0px;
189 | margin: 0px;
190 | display: inline-block;
191 | width: 100px;
192 | height: 80px;
193 | background-size: 95%;
194 | background-repeat: no-repeat;
195 | background-position: 50% 50%;
196 | }
197 |
198 | @media (min-width: 330px) {
199 | #logos-holder {
200 | width: 320px;
201 | }
202 |
203 | #they-use-groovy {
204 | height: 1130px;
205 | }
206 | }
207 |
208 | @media (min-width: 475px) {
209 | #logos-holder {
210 | width: 420px;
211 | }
212 |
213 | #they-use-groovy {
214 | height: 900px;
215 | }
216 | }
217 |
218 | @media (min-width: 690px) {
219 | #logos-holder {
220 | width: 630px;
221 | }
222 |
223 | #they-use-groovy {
224 | height: 600px;
225 | }
226 | }
227 |
228 | @media (min-width: 1010px) {
229 | #logos-holder {
230 | width: 940px;
231 | }
232 |
233 | #they-use-groovy {
234 | height: 450px;
235 | }
236 | }
237 |
238 | .centered {
239 | text-align: center;
240 | }
241 |
242 | .event-img {
243 | margin: -20px -20px 20px -20px;
244 | background-repeat: no-repeat;
245 | background-position: 50% top;
246 | height: 180px;
247 | }
248 |
249 | .event-logo {
250 | height: 180px;
251 | float: right;
252 | }
253 |
254 | @media (max-width: 1010px) {
255 | .event-logo {
256 | height: 100px;
257 | }
258 | }
259 |
260 | @media (max-width: 690px) {
261 | .event-logo {
262 | height: 60px;
263 | }
264 | }
265 |
266 | @media (max-width: 475px) {
267 | .event-logo {
268 | display: none;
269 | }
270 | }
271 |
272 | article .content time {
273 | font-weight: bold;
274 | }
275 |
276 | .doc-embed {
277 | border: 0;
278 | width: 100%;
279 | min-height: 100%;
280 | }
281 |
282 | .download-table {
283 | width: 100%;
284 | text-align: center;
285 | }
286 |
287 | .download-table td {
288 | width: 20%;
289 | }
290 |
291 | #mc-embedded-subscribe {
292 | width: 200px;
293 | font-weight: bold;
294 | }
295 |
296 | #mc-embedded-subscribe:hover {
297 | background-color: #F2F2F2;
298 | font-weight: bold;
299 | }
300 |
301 | #footer .colset-3-footer .col-1 h1, #footer .colset-3-footer .col-2 h1, #footer .colset-3-footer .col-3 h1 {
302 | font-size: 15px !important;
303 | }
304 |
305 | .anchor-link:before {
306 | content: ' # ';
307 | color: lightgray;
308 | }
309 |
310 | .anchor-link:hover:before {
311 | color: orange;
312 | }
313 |
314 | code, kbd, pre, samp {
315 | font-family: "Source Code Pro", "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
316 | }
317 |
318 | #contribute-btn {
319 | position: absolute;
320 | right: 15px;
321 | }
322 |
323 | @media (max-width: 767px) {
324 | #contribute-btn {
325 | width: 100%;
326 | position: relative;
327 | margin-top: 30px;
328 | right: 0px;
329 | }
330 |
331 | #contribute-btn button {
332 | width: 100%;
333 | right: 15px;
334 | }
335 | }
336 |
337 | @media (min-width: 1200px) {
338 | #contribute-btn {
339 | top: 25px;
340 | right: 15px;
341 | }
342 | }
343 |
344 | #big-download-button {
345 | float: right;
346 | font-size: 30px;
347 | padding: 15px;
348 | margin: 10px 0px 10px 20px;
349 | border: 2px solid #db4800;
350 | border-radius: 6px;
351 | background-color: #db4800;
352 | color: white;
353 | }
354 |
355 | #big-download-button:hover {
356 | background-color: #e6e6e6;
357 | color: #db4800;
358 | }
359 |
360 | .colset-3-footer .col-1, .colset-3-footer .col-2, .colset-3-footer .col-3 {
361 | min-width: 180px;
362 | float: left;
363 | }
364 |
365 | .colset-3-footer .col-3 {
366 | min-width: 220px;
367 | }
368 |
369 | .colset-3-article article {
370 | float: left;
371 | }
372 |
373 | .col1, .col2 {
374 | min-width: 300px;
375 | float: left;
376 | }
377 |
378 | @media (max-width: 988px) {
379 | .col1, .col2 {
380 | width: 98% !important;
381 | max-width: 98%;
382 | }
383 |
384 | .colset-3-article article {
385 | width: 98% !important;
386 | max-width: 98%;
387 | }
388 | }
389 |
390 | body, html {
391 | font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
392 | padding: 0;
393 | margin: 0;
394 | background: #FFF;
395 | color: #343437;
396 | line-height: 25px;
397 | font-weight: normal;
398 | font-size: 14px;
399 | }
400 |
401 | a {
402 | color: #2559a7;
403 | text-decoration: underline;
404 | }
405 |
406 | a:hover {
407 | color: #2559a7;
408 | text-decoration: none
409 | }
410 |
411 | h1 {
412 | font-size: 2.125em;
413 | margin: .67em 0
414 | }
415 |
416 | h2 {
417 | font-size: 1.6875em;
418 | font-weight: bold;
419 | }
420 |
421 | h3, #toctitle, .sidebarblock > .content > .title {
422 | font-size: 1.375em;
423 | font-weight: bold;
424 | }
425 |
426 | h4 {
427 | font-size: 1.125em;
428 | font-weight: bold;
429 | }
430 |
431 | h5 {
432 | font-size: 1.125em;
433 | font-weight: bold;
434 | color: #2559a7;
435 | }
436 |
437 | h6 {
438 | font-size: 1.08em;
439 | font-weight: normal;
440 | color: #2559a7;
441 | }
442 |
443 | h7 {
444 | font-weight: bold;
445 | color: #245f78;
446 | }
447 |
448 | h8 {
449 | color: #245f78;
450 | }
451 |
452 | #footer {
453 | background: #f2f2f2;
454 | text-align: center;
455 | font-size: 14px;
456 | padding: 20px 0 30px;
457 | margin-top: 30px;
458 | color: #AAA
459 | }
460 |
461 | #footer .col-right {
462 | float: right;
463 | width: 300px;
464 | text-align: right;
465 | padding-top: 10px
466 | }
467 |
468 | #footer .colset-3-footer {
469 | color: #222;
470 | font-size: 14px
471 | }
472 |
473 | #footer .colset-3-footer:before, #footer .colset-3-footer:after {
474 | content: " ";
475 | display: table
476 | }
477 |
478 | #footer .colset-3-footer:after {
479 | clear: both
480 | }
481 |
482 | #footer .colset-3-footer .col-1, #footer .colset-3-footer .col-2, #footer .colset-3-footer .col-3 {
483 | width: 18%;
484 | padding: 20px 0 30px;
485 | padding-right: 3%;
486 | float: left;
487 | text-align: left
488 | }
489 |
490 | #footer .colset-3-footer .col-3 {
491 | width: 24%;
492 | }
493 |
494 | #footer .colset-3-footer .col-1 h1, #footer .colset-3-footer .col-2 h1, #footer .colset-3-footer .col-3 h1 {
495 | font-weight: 600;
496 | font-size: 15px;
497 | line-height: 30px;
498 | margin: 0
499 | }
500 |
501 | #footer .colset-3-footer .col-1 ul, #footer .colset-3-footer .col-2 ul, #footer .colset-3-footer .col-3 ul {
502 | list-style-type: none;
503 | margin: 0;
504 | padding: 0
505 | }
506 |
507 | #footer .colset-3-footer .col-1 ul li, #footer .colset-3-footer .col-2 ul li, #footer .colset-3-footer .col-3 ul li {
508 | margin: 0;
509 | padding: 0
510 | }
511 |
512 | #footer .colset-3-footer .col-1 ul li a, #footer .colset-3-footer .col-2 ul li a, #footer .colset-3-footer .col-3 ul li a {
513 | color: #343437;
514 | text-decoration: none
515 | }
516 |
517 | #footer .colset-3-footer .col-1 ul li a:hover, #footer .colset-3-footer .col-2 ul li a:hover, #footer .colset-3-footer .col-3 ul li a:hover {
518 | text-decoration: underline
519 | }
520 |
521 | #footer .second a {
522 | color: #db4800
523 | }
524 |
525 | .row {
526 | position: relative;
527 | max-width: 1400px;
528 | margin: 0 auto;
529 | padding: 0 5%
530 | }
531 |
532 | .row:before, .row:after {
533 | content: " ";
534 | display: table
535 | }
536 |
537 | .row:after {
538 | clear: both
539 | }
540 |
541 | .band {
542 | background: #4298b8;
543 | height: 400px;
544 | margin-bottom: 20px;
545 | color: white
546 | }
547 |
548 | .band .item {
549 | text-align: center
550 | }
551 |
552 | .band .item:before, .band .item:after {
553 | content: " ";
554 | display: table
555 | }
556 |
557 | .band .item:after {
558 | clear: both
559 | }
560 |
561 | #content {
562 | background: white
563 | }
564 |
565 | #content .row:before, #content .row:after {
566 | content: " ";
567 | display: table
568 | }
569 |
570 | #content .row:after {
571 | clear: both
572 | }
573 |
574 | #content .row > h1 {
575 | font-size: 34px;
576 | line-height: 40px;
577 | font-weight: 200;
578 | text-align: center;
579 | margin: 0;
580 | padding: 20px 0;
581 | width: 100%;
582 | }
583 |
584 | #content hr.row, #content hr.divider {
585 | border: 0 none;
586 | border-top: 1px solid #EEE;
587 | margin: 0 5%;
588 | margin-top: 40px
589 | }
590 |
591 | #content hr.divider {
592 | margin: 0;
593 | margin-top: 40px;
594 | margin-bottom: 30px
595 | }
596 |
597 | #content .colset-2-its:before, #content .colset-2-its:after {
598 | content: " ";
599 | display: table
600 | }
601 |
602 | #content .colset-2-its:after {
603 | clear: both
604 | }
605 |
606 | #content .colset-2-its > h1 {
607 | padding-bottom: 15px;
608 | margin-top: 15px;
609 | margin-bottom: 0
610 | }
611 |
612 | #content .colset-2-its > p {
613 | margin-top: 0;
614 | padding-bottom: 5px;
615 | text-align: center;
616 | color: #222;
617 | font-size: 15px
618 | }
619 |
620 | #content .colset-2-its .col1, #content .colset-2-its .col2 {
621 | float: left;
622 | width: 48%;
623 | padding-right: 1%;
624 | padding-left: 1%;
625 | }
626 |
627 | #content .colset-2-its .col2 {
628 | padding-left: 1%;
629 | padding-right: 1%;
630 | }
631 |
632 | #content .colset-2-its article {
633 | padding: 10px 0
634 | }
635 |
636 | #content .colset-2-its article:before, #content .colset-2-its article:after {
637 | content: " ";
638 | display: table
639 | }
640 |
641 | #content .colset-2-its article:after {
642 | clear: both
643 | }
644 |
645 | #content .colset-2-its article .icon {
646 | display: block;
647 | width: 80px;
648 | height: 80px;
649 | /*background-image: url(../images/icons-colset-2-its.png);*/
650 | float: left;
651 | margin-top: 12px;
652 | margin-right: 15px
653 | }
654 |
655 | #content .colset-2-its article .icon.icon-1 {
656 | background-position: 0 0
657 | }
658 |
659 | #content .colset-2-its article .icon.icon-2 {
660 | background-position: 0 -80px
661 | }
662 |
663 | #content .colset-2-its article .icon.icon-3 {
664 | background-position: 0 -160px
665 | }
666 |
667 | #content .colset-2-its article .icon.icon-4 {
668 | background-position: 0 -240px
669 | }
670 |
671 | #content .colset-2-its article .icon.icon-5 {
672 | background-position: 0 -320px
673 | }
674 |
675 | #content .colset-2-its article .icon.icon-6 {
676 | background-position: 0 -400px
677 | }
678 |
679 | #content .colset-2-its article > h1 {
680 | font-size: 19px;
681 | font-weight: 600;
682 | margin-bottom: 0;
683 | line-height: 30px
684 | }
685 |
686 | #content .colset-2-its article p {
687 | margin: 0;
688 | line-height: 24px;
689 | font-size: 14px
690 | }
691 |
692 | #content .first-event-row {
693 | padding-top: 30px;
694 | }
695 |
696 | #content .last-event-row {
697 | padding-bottom: 30px
698 | }
699 |
700 | #content .colset-3-article > h1 {
701 | font-size: 24px
702 | }
703 |
704 | #content .colset-3-article div.content {
705 | padding: 20px;
706 | padding-bottom: 5px
707 | }
708 |
709 | #content .colset-3-article article {
710 | float: left;
711 | width: 29%;
712 | margin: 10px 2%;
713 | -webkit-box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
714 | box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1)
715 | }
716 |
717 | #content .colset-3-article article .img {
718 | margin: -20px -20px 20px -20px;
719 | background-position: center top;
720 | height: 180px
721 | }
722 |
723 | #content .colset-3-article article h1 {
724 | margin: 0;
725 | font-size: 18px;
726 | font-weight: normal;
727 | line-height: 25px
728 | }
729 |
730 | #content .colset-3-article article h1 a {
731 | color: #343437;
732 | cursor: pointer
733 | }
734 |
735 | #content .colset-3-article article h1 a:hover {
736 | color: #46a5c8
737 | }
738 |
739 | #content .colset-3-article article p, #content .colset-3-article article time {
740 | font-size: 13px
741 | }
742 |
743 | #content .colset-3-article article .author a {
744 | color: #db4800
745 | }
746 |
747 | #content .colset-3-article article:first-child {
748 | padding-left: 0
749 | }
750 |
751 | #content .colset-3-article article:last-child {
752 | padding-right: 0
753 | }
754 |
755 | #content.page-1 .row {
756 | padding-top: 10px;
757 | padding-bottom: 10px
758 | }
759 |
760 | #content.page-1 .row h1 {
761 | text-align: left;
762 | font-size: 36px
763 | }
764 |
765 | #content.page-1 .row article {
766 | font-size: 14px
767 | }
768 |
769 | #content.page-1 .row article .desc {
770 | font-size: 16px
771 | }
772 |
773 | #content.page-1 .row article h1 {
774 | margin: 0;
775 | padding: 0;
776 | text-align: left;
777 | font-size: 26px
778 | }
779 |
780 | #content.page-1 .row article h2 {
781 | margin: 0;
782 | padding: 0
783 | }
784 |
785 | #content.page-1 .row article h3 {
786 | font-weight: bold
787 | }
788 |
789 | #content.page-1 .row article pre {
790 | display: block;
791 | background: #f2f2f2;
792 | padding: 12px 20px
793 | }
794 |
795 | ul.nav-sidebar {
796 | margin: 0;
797 | margin-top: 20px;
798 | padding: 5px 0;
799 | border: 1px solid #EEE;
800 | list-style-type: none
801 | }
802 |
803 | ul.nav-sidebar li a {
804 | display: block;
805 | cursor: pointer;
806 | padding: 5px 10px;
807 | font-weight: 400;
808 | text-decoration: none;
809 | color: #343437
810 | }
811 |
812 | ul.nav-sidebar li.active a:hover, ul.nav-sidebar li a:hover {
813 | color: white;
814 | background-color: #db4800;
815 | }
816 |
817 | ul.nav-sidebar li.active a {
818 | background-color: #f2f2f2
819 | }
820 |
821 | .table {
822 | margin: 20px 0
823 | }
824 |
825 | .table thead tr th {
826 | padding: 10px;
827 | font-weight: normal;
828 | font-size: 18px
829 | }
830 |
831 | .table tbody tr td {
832 | vertical-align: top;
833 | font-size: 12px;
834 | padding: 10px;
835 | border-top: 1px solid #EEE
836 | }
837 |
838 | *, *:after, *::before {
839 | -moz-box-sizing: border-box;
840 | box-sizing: border-box
841 | }
842 |
843 | body {
844 | background: #444
845 | }
846 |
847 | html.noScroll {
848 | overflow: hidden
849 | }
850 |
851 | html.noScroll body, html.noScroll .st-container, html.noScroll .st-pusher, html.noScroll .st-content {
852 | overflow: hidden
853 | }
854 |
855 | html, body, .st-container, .st-pusher, .st-content {
856 | overflow: auto
857 | }
858 |
859 | .sign-in-fa-icon:before {
860 | font-family: FontAwesome;
861 | content: '\f090';
862 | padding-right: 10px;
863 | }
864 |
865 | #st-container {
866 | height: 100%;
867 | }
868 |
869 | .st-content {
870 | background: white
871 | }
872 |
873 | .st-content, .st-content-inner {
874 | position: relative;
875 | height: 100%;
876 | }
877 |
878 | .st-container {
879 | position: relative;
880 | overflow: hidden
881 | }
882 |
883 | .st-pusher {
884 | position: relative;
885 | left: 0;
886 | z-index: 99;
887 | height: 100%;
888 | -webkit-transition: -webkit-transform .5s;
889 | transition: transform .5s
890 | }
891 |
892 | .st-pusher::after {
893 | position: absolute;
894 | top: 0;
895 | right: 0;
896 | width: 0;
897 | height: 0;
898 | background: rgba(0, 0, 0, 0.3);
899 | content: '';
900 | opacity: 0;
901 | -webkit-transition: opacity .5s, width .1s .5s, height .1s .5s;
902 | transition: opacity .5s, width .1s .5s, height .1s .5s
903 | }
904 |
905 | .st-menu-open .st-pusher::after {
906 | width: 100%;
907 | height: 100%;
908 | opacity: 1;
909 | -webkit-transition: opacity .5s;
910 | transition: opacity .5s
911 | }
912 |
913 | .st-menu {
914 | position: fixed;
915 | top: 0;
916 | left: auto;
917 | z-index: 100;
918 | visibility: hidden;
919 | width: 300px;
920 | height: 100%;
921 | background: #2559a7;
922 | -webkit-transition: all .5s;
923 | transition: all .5s;
924 | right: -600px
925 | }
926 |
927 | .st-menu::after {
928 | position: absolute;
929 | top: 0;
930 | right: 0;
931 | width: 100%;
932 | height: 100%;
933 | background: rgba(0, 0, 0, 0.2);
934 | content: '';
935 | opacity: 1;
936 | -webkit-transition: opacity .5s;
937 | transition: opacity .5s
938 | }
939 |
940 | .st-menu-open .st-menu::after {
941 | width: 0;
942 | height: 0;
943 | opacity: 0;
944 | -webkit-transition: opacity .5s, width .1s .5s, height .1s .5s;
945 | transition: opacity .5s, width .1s .5s, height .1s .5s
946 | }
947 |
948 | .st-menu ul {
949 | margin: 0;
950 | padding: 0;
951 | list-style: none
952 | }
953 |
954 | .st-menu h2 {
955 | margin: 0;
956 | padding: 1em;
957 | color: white;
958 | text-shadow: 0 0 1px rgba(0, 0, 0, 0.1);
959 | font-weight: 300;
960 | font-size: 2em
961 | }
962 |
963 | .st-menu ul li {
964 | display: block
965 | }
966 |
967 | .st-menu ul li a {
968 | display: block;
969 | position: relative;
970 | padding: 1em 1em 1em 45px;
971 | outline: 0;
972 | box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2);
973 | color: #f3efe0;
974 | text-shadow: 0 0 1px rgba(255, 255, 255, 0.1);
975 | letter-spacing: 1px;
976 | font-weight: 400;
977 | text-decoration: none
978 | }
979 |
980 | .st-menu ul li a span.fa {
981 | display: block;
982 | position: absolute;
983 | left: 12px;
984 | top: 17px;
985 | font-size: 20px;
986 | width: 30px;
987 | text-align: center
988 | }
989 |
990 | .st-menu ul li a span.fa.fa-tasks, .st-menu ul li a span.fa.fa-envelope {
991 | top: 18px;
992 | font-size: 18px
993 | }
994 |
995 | .st-menu ul li:first-child a {
996 | box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2), inset 0 1px rgba(0, 0, 0, 0.2)
997 | }
998 |
999 | .st-menu ul li a:hover {
1000 | background: rgba(0, 0, 0, 0.2);
1001 | box-shadow: inset 0 -1px rgba(0, 0, 0, 0);
1002 | color: #fff
1003 | }
1004 |
1005 | .st-effect-9.st-container {
1006 | -webkit-perspective: 10000px;
1007 | perspective: 10000px
1008 | }
1009 |
1010 | .st-effect-9 .st-pusher {
1011 | -webkit-transform-style: preserve-3d;
1012 | transform-style: preserve-3d
1013 | }
1014 |
1015 | .st-effect-9.st-menu-open .st-pusher {
1016 | -webkit-transform: translate3d(0, 0, -300px);
1017 | transform: translate3d(0, 0, -300px)
1018 | }
1019 |
1020 | .st-effect-9.st-menu {
1021 | right: -600px;
1022 | opacity: 1;
1023 | -webkit-transform: translate3d(-100%, 0, 0);
1024 | transform: translate3d(-100%, 0, 0)
1025 | }
1026 |
1027 | .st-effect-9.st-menu-open .st-effect-9.st-menu {
1028 | visibility: visible;
1029 | right: -300px
1030 | }
1031 |
1032 | .st-effect-9.st-menu::after {
1033 | display: none
1034 | }
1035 |
1036 | /* Video from the learn page */
1037 | .presentations {
1038 | margin-top: 30px;
1039 | margin-bottom: 30px;
1040 | }
1041 |
1042 | .presentations img.screenshot {
1043 | float: left;
1044 | margin-right: 40px;
1045 | margin-top: 1em;
1046 | margin-bottom: 0px;
1047 | width: 300px;
1048 | height: auto;
1049 | }
1050 |
1051 | .presentations .metadata {
1052 | display: table-cell;
1053 | min-width: 328px;
1054 | }
1055 |
1056 | .presentations .title {
1057 | margin-top: 1em !important;
1058 | margin-bottom: 0.5em !important;
1059 | }
1060 |
1061 |
1062 | .presentations .speaker {
1063 | color: #245f78;
1064 | margin-bottom: 0.5em;
1065 | }
1066 |
1067 | .presentations .summary {
1068 | line-height: 1.3;
1069 | }
1070 |
1071 | .presentations .urls {
1072 | }
1073 |
1074 | @media screen and (max-width: 767px) {
1075 | .presentations .img.screenshot, .video .metadata {
1076 | float: none;
1077 | }
1078 | }
1079 |
--------------------------------------------------------------------------------
/skeleton/client/src/css/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
5 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
6 | sans-serif;
7 | -webkit-font-smoothing: antialiased;
8 | -moz-osx-font-smoothing: grayscale;
9 | }
10 |
11 | code {
12 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
13 | monospace;
14 | }
15 |
--------------------------------------------------------------------------------
/skeleton/client/src/css/main.css:
--------------------------------------------------------------------------------
1 | /* FONT STACK */
2 | body,
3 | input, select, textarea {
4 | font-family: "Open Sans", "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
5 | }
6 |
7 | h1, h2, h3, h4, h5, h6 {
8 | line-height: 1.1;
9 | }
10 |
11 | /* BASE LAYOUT */
12 |
13 | html {
14 | background-color: #ddd;
15 | background-image: -moz-linear-gradient(center top, #aaa, #ddd);
16 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #aaa), color-stop(1, #ddd));
17 | background-image: linear-gradient(to bottom, #aaa, #ddd);
18 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#aaaaaa', EndColorStr = '#dddddd');
19 | background-repeat: no-repeat;
20 | height: 100%;
21 | /* change the box model to exclude the padding from the calculation of 100% height (IE8+) */
22 | -webkit-box-sizing: border-box;
23 | -moz-box-sizing: border-box;
24 | box-sizing: border-box;
25 | }
26 |
27 | html.no-cssgradients {
28 | background-color: #aaa;
29 | }
30 |
31 | html * {
32 | margin: 0;
33 | }
34 |
35 | body {
36 | background-color: #F5F5F5;
37 | color: #333333;
38 | overflow-x: hidden; /* prevents box-shadow causing a horizontal scrollbar in firefox when viewport < 960px wide */
39 | -moz-box-shadow: 0 0 0.3em #424649;
40 | -webkit-box-shadow: 0 0 0.3em #424649;
41 | box-shadow: 0 0 0.3em #424649;
42 | }
43 |
44 | #grailsLogo {
45 | background-color: #feb672;
46 | }
47 |
48 | a:hover, a:active {
49 | outline: none; /* prevents outline in webkit on active links but retains it for tab focus */
50 | }
51 |
52 | h1, h2, h3 {
53 | font-weight: normal;
54 | font-size: 1.25em;
55 | margin: 0.8em 0 0.3em 0;
56 | }
57 |
58 | ul {
59 | padding: 0;
60 | }
61 |
62 | img {
63 | border: 0;
64 | }
65 |
66 | /* GENERAL */
67 |
68 | #grailsLogo a {
69 | display: inline-block;
70 | margin: 1em;
71 | }
72 |
73 | .content {
74 | }
75 |
76 | .content h1 {
77 | border-bottom: 1px solid #CCCCCC;
78 | margin: 0.8em 1em 0.3em;
79 | padding: 0 0.25em;
80 | }
81 |
82 | .scaffold-list h1 {
83 | border: none;
84 | }
85 |
86 | .footer img {
87 | height: 80px;
88 | margin-right: 25px;
89 | margin-bottom: 15px;
90 | clear: bottom;
91 | }
92 |
93 | .footer strong a {
94 | color: white;
95 | text-decoration: none;
96 | font-size: 1.1rem;
97 | }
98 |
99 | .footer {
100 | background: #424649;
101 | color: #ffffff;
102 | clear: both;
103 | font-size: 1em;
104 | margin-top: 1.5em;
105 | padding: 1em;
106 | padding-bottom: 2em;
107 | min-height: 1em;
108 | }
109 |
110 | .footer a {
111 | color: #feb672;
112 | }
113 |
114 | .spinner {
115 | background: url(../images/spinner.gif) 50% 50% no-repeat transparent;
116 | height: 16px;
117 | width: 16px;
118 | padding: 0.5em;
119 | position: absolute;
120 | right: 0;
121 | top: 0;
122 | text-indent: -9999px;
123 | }
124 |
125 | /* NAVIGATION MENU */
126 |
127 | .nav {
128 | zoom: 1;
129 | }
130 |
131 | .nav ul {
132 | overflow: hidden;
133 | padding-left: 0;
134 | zoom: 1;
135 | }
136 |
137 | .nav li {
138 | display: block;
139 | float: left;
140 | list-style-type: none;
141 | margin-right: 0.5em;
142 | padding: 0;
143 | }
144 |
145 | .nav a {
146 | color: #666666;
147 | display: block;
148 | padding: 0.25em 0.7em;
149 | text-decoration: none;
150 | -moz-border-radius: 0.3em;
151 | -webkit-border-radius: 0.3em;
152 | border-radius: 0.3em;
153 | }
154 |
155 | .nav li.dropdown-item a {
156 | -webkit-border-radius: 0;
157 | -moz-border-radius: 0;
158 | border-radius: 0;
159 | }
160 |
161 | .nav a:active, .nav a:visited {
162 | color: #666666;
163 | }
164 |
165 | .nav a:focus, .nav a:hover {
166 | background-color: #999999;
167 | color: #ffffff;
168 | outline: none;
169 | text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8);
170 | }
171 |
172 | .no-borderradius .nav a:focus, .no-borderradius .nav a:hover {
173 | background-color: transparent;
174 | color: #444444;
175 | text-decoration: underline;
176 | }
177 |
178 | .nav a.home, .nav a.list, .nav a.create {
179 | background-position: 0.7em center;
180 | background-repeat: no-repeat;
181 | text-indent: 25px;
182 | }
183 |
184 | .nav a.home {
185 | background-image: url(../images/skin/house.png);
186 | }
187 |
188 | .nav a.list {
189 | background-image: url(../images/skin/database_table.png);
190 | }
191 |
192 | .nav a.create {
193 | background-image: url(../images/skin/database_add.png);
194 | }
195 |
196 | .nav li.dropdown.show ul.dropdown-menu {
197 | background-color: #424649;
198 | }
199 |
200 | /* CREATE/EDIT FORMS AND SHOW PAGES */
201 |
202 | fieldset,
203 | .property-list {
204 | margin: 0.6em 1.25em 0 1.25em;
205 | padding: 0.3em 1.8em 1.25em;
206 | position: relative;
207 | zoom: 1;
208 | border: none;
209 | }
210 |
211 | .property-list .fieldcontain {
212 | list-style: none;
213 | overflow: hidden;
214 | zoom: 1;
215 | }
216 |
217 | .fieldcontain {
218 | margin-top: 1em;
219 | }
220 |
221 | .fieldcontain label,
222 | .fieldcontain .property-label {
223 | color: #666666;
224 | text-align: right;
225 | width: 25%;
226 | }
227 |
228 | .fieldcontain .property-label {
229 | float: left;
230 | }
231 |
232 | .fieldcontain .property-value {
233 | display: block;
234 | margin-left: 27%;
235 | }
236 |
237 | label {
238 | cursor: pointer;
239 | display: inline-block;
240 | margin: 0 0.25em 0 0;
241 | }
242 |
243 | input, select, textarea {
244 | background-color: #fcfcfc;
245 | border: 1px solid #cccccc;
246 | font-size: 1em;
247 | padding: 0.2em 0.4em;
248 | }
249 |
250 | select {
251 | padding: 0.2em 0.2em 0.2em 0;
252 | }
253 |
254 | select[multiple] {
255 | vertical-align: top;
256 | }
257 |
258 | textarea {
259 | width: 250px;
260 | height: 150px;
261 | overflow: auto; /* IE always renders vertical scrollbar without this */
262 | vertical-align: top;
263 | }
264 |
265 | input[type=checkbox], input[type=radio] {
266 | background-color: transparent;
267 | border: 0;
268 | padding: 0;
269 | }
270 |
271 | input:focus, select:focus, textarea:focus {
272 | background-color: #ffffff;
273 | border: 1px solid #eeeeee;
274 | outline: 0;
275 | -moz-box-shadow: 0 0 0.5em #ffffff;
276 | -webkit-box-shadow: 0 0 0.5em #ffffff;
277 | box-shadow: 0 0 0.5em #ffffff;
278 | }
279 |
280 | .required-indicator {
281 | color: #cc0000;
282 | display: inline-block;
283 | font-weight: bold;
284 | margin-left: 0.3em;
285 | position: relative;
286 | top: 0.1em;
287 | }
288 |
289 | ul.one-to-many {
290 | display: inline-block;
291 | list-style-position: inside;
292 | vertical-align: top;
293 | }
294 |
295 | ul.one-to-many li.add {
296 | list-style-type: none;
297 | }
298 |
299 | /* EMBEDDED PROPERTIES */
300 |
301 | fieldset.embedded {
302 | background-color: transparent;
303 | border: 1px solid #CCCCCC;
304 | margin-left: 0;
305 | margin-right: 0;
306 | padding-left: 0;
307 | padding-right: 0;
308 | -moz-box-shadow: none;
309 | -webkit-box-shadow: none;
310 | box-shadow: none;
311 | }
312 |
313 | fieldset.embedded legend {
314 | margin: 0 1em;
315 | }
316 |
317 | /* MESSAGES AND ERRORS */
318 |
319 | .errors,
320 | .message {
321 | font-size: 0.8em;
322 | line-height: 2;
323 | margin: 1em 2em;
324 | padding: 0.25em;
325 | }
326 |
327 | .message {
328 | background: #f3f3ff;
329 | border: 1px solid #b2d1ff;
330 | color: #006dba;
331 | -moz-box-shadow: 0 0 0.25em #b2d1ff;
332 | -webkit-box-shadow: 0 0 0.25em #b2d1ff;
333 | box-shadow: 0 0 0.25em #b2d1ff;
334 | }
335 |
336 | .errors {
337 | background: #fff3f3;
338 | border: 1px solid #ffaaaa;
339 | color: #cc0000;
340 | -moz-box-shadow: 0 0 0.25em #ff8888;
341 | -webkit-box-shadow: 0 0 0.25em #ff8888;
342 | box-shadow: 0 0 0.25em #ff8888;
343 | }
344 |
345 | .errors ul,
346 | .message {
347 | padding: 0;
348 | }
349 |
350 | .errors li {
351 | list-style: none;
352 | background: transparent url(../images/skin/exclamation.png) 0.5em 50% no-repeat;
353 | text-indent: 2.2em;
354 | }
355 |
356 | .message {
357 | background: transparent url(../images/skin/information.png) 0.5em 50% no-repeat;
358 | text-indent: 2.2em;
359 | }
360 |
361 | /* form fields with errors */
362 |
363 | .error input, .error select, .error textarea {
364 | background: #fff3f3;
365 | border-color: #ffaaaa;
366 | color: #cc0000;
367 | }
368 |
369 | .error input:focus, .error select:focus, .error textarea:focus {
370 | -moz-box-shadow: 0 0 0.5em #ffaaaa;
371 | -webkit-box-shadow: 0 0 0.5em #ffaaaa;
372 | box-shadow: 0 0 0.5em #ffaaaa;
373 | }
374 |
375 | /* same effects for browsers that support HTML5 client-side validation (these have to be specified separately or IE will ignore the entire rule) */
376 |
377 | input:invalid, select:invalid, textarea:invalid {
378 | background: #fff3f3;
379 | border-color: #ffaaaa;
380 | color: #cc0000;
381 | }
382 |
383 | input:invalid:focus, select:invalid:focus, textarea:invalid:focus {
384 | -moz-box-shadow: 0 0 0.5em #ffaaaa;
385 | -webkit-box-shadow: 0 0 0.5em #ffaaaa;
386 | box-shadow: 0 0 0.5em #ffaaaa;
387 | }
388 |
389 | /* TABLES */
390 |
391 | table {
392 | border-top: 1px solid #DFDFDF;
393 | border-collapse: collapse;
394 | width: 100%;
395 | margin-bottom: 1em;
396 | }
397 |
398 | tr {
399 | border: 0;
400 | }
401 |
402 | tr>td:first-child, tr>th:first-child {
403 | padding-left: 1.25em;
404 | }
405 |
406 | tr>td:last-child, tr>th:last-child {
407 | padding-right: 1.25em;
408 | }
409 |
410 | td, th {
411 | line-height: 1.5em;
412 | padding: 0.5em 0.6em;
413 | text-align: left;
414 | vertical-align: top;
415 | }
416 |
417 | th {
418 | background-color: #efefef;
419 | background-image: -moz-linear-gradient(top, #ffffff, #eaeaea);
420 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(1, #eaeaea));
421 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#ffffff', EndColorStr = '#eaeaea');
422 | -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eaeaea')";
423 | color: #666666;
424 | font-weight: bold;
425 | line-height: 1.7em;
426 | padding: 0.2em 0.6em;
427 | }
428 |
429 | thead th {
430 | white-space: nowrap;
431 | }
432 |
433 | th a {
434 | display: block;
435 | text-decoration: none;
436 | }
437 |
438 | th a:link, th a:visited {
439 | color: #666666;
440 | }
441 |
442 | th a:hover, th a:focus {
443 | color: #333333;
444 | }
445 |
446 | th.sortable a {
447 | background-position: right;
448 | background-repeat: no-repeat;
449 | padding-right: 1.1em;
450 | }
451 |
452 | th.asc a {
453 | background-image: url(../images/skin/sorted_asc.gif);
454 | }
455 |
456 | th.desc a {
457 | background-image: url(../images/skin/sorted_desc.gif);
458 | }
459 |
460 | .odd {
461 | background: #f7f7f7;
462 | }
463 |
464 | .even {
465 | background: #ffffff;
466 | }
467 |
468 | th:hover, tr:hover {
469 | background: #f5f5f5;
470 | }
471 |
472 | /* PAGINATION */
473 |
474 | .pagination {
475 | border-top: 0;
476 | margin: 0.8em 1em 0.3em;
477 | padding: 0.3em 0.2em;
478 | text-align: center;
479 | -moz-box-shadow: 0 0 3px 1px #AAAAAA;
480 | -webkit-box-shadow: 0 0 3px 1px #AAAAAA;
481 | box-shadow: 0 0 3px 1px #AAAAAA;
482 | background-color: #EFEFEF;
483 | }
484 |
485 | .pagination a,
486 | .pagination .currentStep {
487 | color: #666666;
488 | display: inline-block;
489 | margin: 0 0.1em;
490 | padding: 0.25em 0.7em;
491 | text-decoration: none;
492 | -moz-border-radius: 0.3em;
493 | -webkit-border-radius: 0.3em;
494 | border-radius: 0.3em;
495 | }
496 |
497 | .pagination a:hover, .pagination a:focus,
498 | .pagination .currentStep {
499 | background-color: #999999;
500 | color: #ffffff;
501 | outline: none;
502 | text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8);
503 | }
504 |
505 | .no-borderradius .pagination a:hover, .no-borderradius .pagination a:focus,
506 | .no-borderradius .pagination .currentStep {
507 | background-color: transparent;
508 | color: #444444;
509 | text-decoration: underline;
510 | }
511 |
512 | /* ACTION BUTTONS */
513 |
514 | .buttons {
515 | background-color: #efefef;
516 | overflow: hidden;
517 | padding: 0.3em;
518 | -moz-box-shadow: 0 0 3px 1px #aaaaaa;
519 | -webkit-box-shadow: 0 0 3px 1px #aaaaaa;
520 | box-shadow: 0 0 3px 1px #aaaaaa;
521 | margin: 0.1em 0 0 0;
522 | border: none;
523 | }
524 |
525 | .buttons input,
526 | .buttons a {
527 | background-color: transparent;
528 | border: 0;
529 | color: #666666;
530 | cursor: pointer;
531 | display: inline-block;
532 | margin: 0 0.25em 0;
533 | overflow: visible;
534 | padding: 0.25em 0.7em;
535 | text-decoration: none;
536 |
537 | -moz-border-radius: 0.3em;
538 | -webkit-border-radius: 0.3em;
539 | border-radius: 0.3em;
540 | }
541 |
542 | .buttons input:hover, .buttons input:focus,
543 | .buttons a:hover, .buttons a:focus {
544 | background-color: #999999;
545 | color: #ffffff;
546 | outline: none;
547 | text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8);
548 | -moz-box-shadow: none;
549 | -webkit-box-shadow: none;
550 | box-shadow: none;
551 | }
552 |
553 | .no-borderradius .buttons input:hover, .no-borderradius .buttons input:focus,
554 | .no-borderradius .buttons a:hover, .no-borderradius .buttons a:focus {
555 | background-color: transparent;
556 | color: #444444;
557 | text-decoration: underline;
558 | }
559 |
560 | .buttons .delete, .buttons .edit, .buttons .save {
561 | background-position: 0.7em center;
562 | background-repeat: no-repeat;
563 | text-indent: 25px;
564 | }
565 |
566 | .buttons .delete {
567 | background-image: url(../images/skin/database_delete.png);
568 | }
569 |
570 | .buttons .edit {
571 | background-image: url(../images/skin/database_edit.png);
572 | }
573 |
574 | .buttons .save {
575 | background-image: url(../images/skin/database_save.png);
576 | }
577 |
578 | a.skip {
579 | position: absolute;
580 | left: -9999px;
581 | }
582 |
583 | .grails-logo-container {
584 | background: #7c7c7c no-repeat 50% 30%;
585 | margin-bottom: 20px;
586 | color: white;
587 | height:300px;
588 | text-align:center;
589 | }
590 |
591 | img.grails-logo {
592 | height:340px;
593 | margin-top:-10px;
594 | }
595 |
--------------------------------------------------------------------------------
/skeleton/client/src/css/mobile.css:
--------------------------------------------------------------------------------
1 | /* Styles for mobile devices */
2 |
3 | @media screen and (max-width: 480px) {
4 | .nav {
5 | padding: 0.5em;
6 | }
7 |
8 | .nav li {
9 | margin: 0 0.5em 0 0;
10 | padding: 0.25em;
11 | }
12 |
13 | /* Hide individual steps in pagination, just have next & previous */
14 | .pagination .step, .pagination .currentStep {
15 | display: none;
16 | }
17 |
18 | .pagination .prevLink {
19 | float: left;
20 | }
21 |
22 | .pagination .nextLink {
23 | float: right;
24 | }
25 |
26 | /* pagination needs to wrap around floated buttons */
27 | .pagination {
28 | overflow: hidden;
29 | }
30 |
31 | /* slightly smaller margin around content body */
32 | fieldset,
33 | .property-list {
34 | padding: 0.3em 1em 1em;
35 | }
36 |
37 | input, textarea {
38 | width: 100%;
39 | -moz-box-sizing: border-box;
40 | -webkit-box-sizing: border-box;
41 | -ms-box-sizing: border-box;
42 | box-sizing: border-box;
43 | }
44 |
45 | select, input[type=checkbox], input[type=radio], input[type=submit], input[type=button], input[type=reset] {
46 | width: auto;
47 | }
48 |
49 | /* hide all but the first column of list tables */
50 | .scaffold-list td:not(:first-child),
51 | .scaffold-list th:not(:first-child) {
52 | display: none;
53 | }
54 |
55 | .scaffold-list thead th {
56 | text-align: center;
57 | }
58 |
59 | /* stack form elements */
60 | .fieldcontain {
61 | margin-top: 0.6em;
62 | }
63 |
64 | .fieldcontain label,
65 | .fieldcontain .property-label,
66 | .fieldcontain .property-value {
67 | display: block;
68 | float: none;
69 | margin: 0 0 0.25em 0;
70 | text-align: left;
71 | width: auto;
72 | }
73 |
74 | .errors ul,
75 | .message p {
76 | margin: 0.5em;
77 | }
78 |
79 | .error ul {
80 | margin-left: 0;
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/skeleton/client/src/images/advancedgrails.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/skeleton/client/src/images/apple-touch-icon-retina.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/apple-touch-icon-retina.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/apple-touch-icon.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/documentation.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
8 |
9 |
10 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/skeleton/client/src/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/favicon.ico
--------------------------------------------------------------------------------
/skeleton/client/src/images/favicon16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/favicon16.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/favicon32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/favicon32.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/favicon48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/favicon48.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/grails-cupsonly-logo-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/skeleton/client/src/images/grails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/grails.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/grails.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | grails
5 | Created with Sketch.
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/skeleton/client/src/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/logo.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/database_add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/database_add.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/database_delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/database_delete.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/database_edit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/database_edit.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/database_save.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/database_save.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/database_table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/database_table.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/exclamation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/exclamation.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/house.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/house.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/information.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/information.png
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/sorted_asc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/sorted_asc.gif
--------------------------------------------------------------------------------
/skeleton/client/src/images/skin/sorted_desc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/skin/sorted_desc.gif
--------------------------------------------------------------------------------
/skeleton/client/src/images/slack.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | slack_orange
5 | Created with Sketch.
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/skeleton/client/src/images/spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/client/src/images/spinner.gif
--------------------------------------------------------------------------------
/skeleton/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 | import 'bootstrap/dist/css/bootstrap.css';
5 | import './css/App.css';
6 | import './css/grails.css';
7 | import './css/main.css';
8 |
9 | ReactDOM.render( , document.getElementById('root'));
10 | ReactDOM.render( , document.getElementById('root'));
--------------------------------------------------------------------------------
/skeleton/client/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read http://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.1/8 is considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit http://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl)
104 | .then(response => {
105 | // Ensure service worker exists, and that we really are getting a JS file.
106 | const contentType = response.headers.get('content-type');
107 | if (
108 | response.status === 404 ||
109 | (contentType != null && contentType.indexOf('javascript') === -1)
110 | ) {
111 | // No service worker found. Probably a different app. Reload the page.
112 | navigator.serviceWorker.ready.then(registration => {
113 | registration.unregister().then(() => {
114 | window.location.reload();
115 | });
116 | });
117 | } else {
118 | // Service worker found. Proceed as normal.
119 | registerValidSW(swUrl, config);
120 | }
121 | })
122 | .catch(() => {
123 | console.log(
124 | 'No internet connection found. App is running in offline mode.'
125 | );
126 | });
127 | }
128 |
129 | export function unregister() {
130 | if ('serviceWorker' in navigator) {
131 | navigator.serviceWorker.ready.then(registration => {
132 | registration.unregister();
133 | });
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/skeleton/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/skeleton/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/skeleton/gradlew:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #
4 | # Copyright © 2015-2021 the original authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 | # SPDX-License-Identifier: Apache-2.0
19 | #
20 |
21 | ##############################################################################
22 | #
23 | # Gradle start up script for POSIX generated by Gradle.
24 | #
25 | # Important for running:
26 | #
27 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
28 | # noncompliant, but you have some other compliant shell such as ksh or
29 | # bash, then to run this script, type that shell name before the whole
30 | # command line, like:
31 | #
32 | # ksh Gradle
33 | #
34 | # Busybox and similar reduced shells will NOT work, because this script
35 | # requires all of these POSIX shell features:
36 | # * functions;
37 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
38 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
39 | # * compound commands having a testable exit status, especially «case»;
40 | # * various built-in commands including «command», «set», and «ulimit».
41 | #
42 | # Important for patching:
43 | #
44 | # (2) This script targets any POSIX shell, so it avoids extensions provided
45 | # by Bash, Ksh, etc; in particular arrays are avoided.
46 | #
47 | # The "traditional" practice of packing multiple parameters into a
48 | # space-separated string is a well documented source of bugs and security
49 | # problems, so this is (mostly) avoided, by progressively accumulating
50 | # options in "$@", and eventually passing that to Java.
51 | #
52 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
53 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
54 | # see the in-line comments for details.
55 | #
56 | # There are tweaks for specific operating systems such as AIX, CygWin,
57 | # Darwin, MinGW, and NonStop.
58 | #
59 | # (3) This script is generated from the Groovy template
60 | # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
61 | # within the Gradle project.
62 | #
63 | # You can find Gradle at https://github.com/gradle/gradle/.
64 | #
65 | ##############################################################################
66 |
67 | # Attempt to set APP_HOME
68 |
69 | # Resolve links: $0 may be a link
70 | app_path=$0
71 |
72 | # Need this for daisy-chained symlinks.
73 | while
74 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
75 | [ -h "$app_path" ]
76 | do
77 | ls=$( ls -ld "$app_path" )
78 | link=${ls#*' -> '}
79 | case $link in #(
80 | /*) app_path=$link ;; #(
81 | *) app_path=$APP_HOME$link ;;
82 | esac
83 | done
84 |
85 | # This is normally unused
86 | # shellcheck disable=SC2034
87 | APP_BASE_NAME=${0##*/}
88 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
89 | APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
90 | ' "$PWD" ) || exit
91 |
92 | # Use the maximum available, or set MAX_FD != -1 to use that value.
93 | MAX_FD=maximum
94 |
95 | warn () {
96 | echo "$*"
97 | } >&2
98 |
99 | die () {
100 | echo
101 | echo "$*"
102 | echo
103 | exit 1
104 | } >&2
105 |
106 | # OS specific support (must be 'true' or 'false').
107 | cygwin=false
108 | msys=false
109 | darwin=false
110 | nonstop=false
111 | case "$( uname )" in #(
112 | CYGWIN* ) cygwin=true ;; #(
113 | Darwin* ) darwin=true ;; #(
114 | MSYS* | MINGW* ) msys=true ;; #(
115 | NONSTOP* ) nonstop=true ;;
116 | esac
117 |
118 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
119 |
120 |
121 | # Determine the Java command to use to start the JVM.
122 | if [ -n "$JAVA_HOME" ] ; then
123 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
124 | # IBM's JDK on AIX uses strange locations for the executables
125 | JAVACMD=$JAVA_HOME/jre/sh/java
126 | else
127 | JAVACMD=$JAVA_HOME/bin/java
128 | fi
129 | if [ ! -x "$JAVACMD" ] ; then
130 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
131 |
132 | Please set the JAVA_HOME variable in your environment to match the
133 | location of your Java installation."
134 | fi
135 | else
136 | JAVACMD=java
137 | if ! command -v java >/dev/null 2>&1
138 | then
139 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
140 |
141 | Please set the JAVA_HOME variable in your environment to match the
142 | location of your Java installation."
143 | fi
144 | fi
145 |
146 | # Increase the maximum file descriptors if we can.
147 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
148 | case $MAX_FD in #(
149 | max*)
150 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
151 | # shellcheck disable=SC2039,SC3045
152 | MAX_FD=$( ulimit -H -n ) ||
153 | warn "Could not query maximum file descriptor limit"
154 | esac
155 | case $MAX_FD in #(
156 | '' | soft) :;; #(
157 | *)
158 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
159 | # shellcheck disable=SC2039,SC3045
160 | ulimit -n "$MAX_FD" ||
161 | warn "Could not set maximum file descriptor limit to $MAX_FD"
162 | esac
163 | fi
164 |
165 | # Collect all arguments for the java command, stacking in reverse order:
166 | # * args from the command line
167 | # * the main class name
168 | # * -classpath
169 | # * -D...appname settings
170 | # * --module-path (only if needed)
171 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
172 |
173 | # For Cygwin or MSYS, switch paths to Windows format before running java
174 | if "$cygwin" || "$msys" ; then
175 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
176 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
177 |
178 | JAVACMD=$( cygpath --unix "$JAVACMD" )
179 |
180 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
181 | for arg do
182 | if
183 | case $arg in #(
184 | -*) false ;; # don't mess with options #(
185 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
186 | [ -e "$t" ] ;; #(
187 | *) false ;;
188 | esac
189 | then
190 | arg=$( cygpath --path --ignore --mixed "$arg" )
191 | fi
192 | # Roll the args list around exactly as many times as the number of
193 | # args, so each arg winds up back in the position where it started, but
194 | # possibly modified.
195 | #
196 | # NB: a `for` loop captures its iteration list before it begins, so
197 | # changing the positional parameters here affects neither the number of
198 | # iterations, nor the values presented in `arg`.
199 | shift # remove old arg
200 | set -- "$@" "$arg" # push replacement arg
201 | done
202 | fi
203 |
204 |
205 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
206 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
207 |
208 | # Collect all arguments for the java command:
209 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
210 | # and any embedded shellness will be escaped.
211 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
212 | # treated as '${Hostname}' itself on the command line.
213 |
214 | set -- \
215 | "-Dorg.gradle.appname=$APP_BASE_NAME" \
216 | -classpath "$CLASSPATH" \
217 | org.gradle.wrapper.GradleWrapperMain \
218 | "$@"
219 |
220 | # Stop when "xargs" is not available.
221 | if ! command -v xargs >/dev/null 2>&1
222 | then
223 | die "xargs is not available"
224 | fi
225 |
226 | # Use "xargs" to parse quoted args.
227 | #
228 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
229 | #
230 | # In Bash we could simply go:
231 | #
232 | # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
233 | # set -- "${ARGS[@]}" "$@"
234 | #
235 | # but POSIX shell has neither arrays nor command substitution, so instead we
236 | # post-process each arg (as a line of input to sed) to backslash-escape any
237 | # character that might be a shell metacharacter, then use eval to reverse
238 | # that process (while maintaining the separation between arguments), and wrap
239 | # the whole thing up as a single "set" statement.
240 | #
241 | # This will of course break if any of these variables contains a newline or
242 | # an unmatched quote.
243 | #
244 |
245 | eval "set -- $(
246 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
247 | xargs -n1 |
248 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
249 | tr '\n' ' '
250 | )" '"$@"'
251 |
252 | exec "$JAVACMD" "$@"
253 |
--------------------------------------------------------------------------------
/skeleton/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 | @rem SPDX-License-Identifier: Apache-2.0
17 | @rem
18 |
19 | @if "%DEBUG%"=="" @echo off
20 | @rem ##########################################################################
21 | @rem
22 | @rem Gradle startup script for Windows
23 | @rem
24 | @rem ##########################################################################
25 |
26 | @rem Set local scope for the variables with windows NT shell
27 | if "%OS%"=="Windows_NT" setlocal
28 |
29 | set DIRNAME=%~dp0
30 | if "%DIRNAME%"=="" set DIRNAME=.
31 | @rem This is normally unused
32 | set APP_BASE_NAME=%~n0
33 | set APP_HOME=%DIRNAME%
34 |
35 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
36 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
37 |
38 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
39 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
40 |
41 | @rem Find java.exe
42 | if defined JAVA_HOME goto findJavaFromJavaHome
43 |
44 | set JAVA_EXE=java.exe
45 | %JAVA_EXE% -version >NUL 2>&1
46 | if %ERRORLEVEL% equ 0 goto execute
47 |
48 | echo. 1>&2
49 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
50 | echo. 1>&2
51 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2
52 | echo location of your Java installation. 1>&2
53 |
54 | goto fail
55 |
56 | :findJavaFromJavaHome
57 | set JAVA_HOME=%JAVA_HOME:"=%
58 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
59 |
60 | if exist "%JAVA_EXE%" goto execute
61 |
62 | echo. 1>&2
63 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
64 | echo. 1>&2
65 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2
66 | echo location of your Java installation. 1>&2
67 |
68 | goto fail
69 |
70 | :execute
71 | @rem Setup the command line
72 |
73 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
74 |
75 |
76 | @rem Execute Gradle
77 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
78 |
79 | :end
80 | @rem End local scope for the variables with windows NT shell
81 | if %ERRORLEVEL% equ 0 goto mainEnd
82 |
83 | :fail
84 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
85 | rem the _cmd.exe /c_ return code!
86 | set EXIT_CODE=%ERRORLEVEL%
87 | if %EXIT_CODE% equ 0 set EXIT_CODE=1
88 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
89 | exit /b %EXIT_CODE%
90 |
91 | :mainEnd
92 | if "%OS%"=="Windows_NT" endlocal
93 |
94 | :omega
95 |
--------------------------------------------------------------------------------
/skeleton/server/gradle.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/grails-profiles/react/6384668633ecbde4c6847f83a4460ce0c0bfeea5/skeleton/server/gradle.properties
--------------------------------------------------------------------------------
/skeleton/server/grails-app/conf/application.yml:
--------------------------------------------------------------------------------
1 | grails:
2 | cors:
3 | enabled: true
--------------------------------------------------------------------------------
/skeleton/settings.gradle:
--------------------------------------------------------------------------------
1 | include 'client', 'server'
--------------------------------------------------------------------------------