diff --git a/quote_app/app.py b/quote_app/app.py new file mode 100644 index 0000000..6a6bc2e --- /dev/null +++ b/quote_app/app.py @@ -0,0 +1,22 @@ +from flask import Flask, render_template +import random + +app = Flask(__name__) + +quotes = ['The greatest glory in living lies not in never falling, but in rising every time we fall. -Nelson Mandela', 'The way to get started is to quit talking and begin doing. -Walt Disney', "Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma – which is living with the results of other people's thinking. -Steve Jobs", 'If life were predictable it would cease to be life, and be without flavor. -Eleanor Roosevelt', "If you look at what you have in life, you'll always have more. If you look at what you don't have in life, you'll never have enough. -Oprah Winfrey", "If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success. -James Cameron"] + +@app.route("/health") +def health(): + return int(200) + +@app.route("/") +def home(): + return render_template('index.html') + +@app.route("/quote") +def quote(): + index = random.randrange(len(quotes)) + return render_template('quote.html', quote = str(quotes[index])) + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=80) \ No newline at end of file diff --git a/quote_app/static/css/style.css b/quote_app/static/css/style.css new file mode 100644 index 0000000..9644450 --- /dev/null +++ b/quote_app/static/css/style.css @@ -0,0 +1,351 @@ +:root { + --background-rgb: 29 30 34; + + --blue-rgb: 33 150 243; + --primary-rgb: var(--blue-rgb); + + --blob-color-1: rgb(var(--blue-rgb)); + --blob-color-2: dodgerblue; +} + +* { + box-sizing: border-box; +} + +body { + height: 100vh; + display: grid; + place-items: center; + background-color: rgb(var(--background-rgb)); + margin: 0rem; + overflow: hidden; +} + +.screen { + width: 500px; + display: flex; + border: 3px solid rgb(var(--primary-rgb) / 80%); + aspect-ratio: 10 / 16; + border-radius: 1rem; + background-color: rgb(var(--primary-rgb) / 15%); + overflow: hidden; + position: relative; + z-index: 10; +} + +.screen:after, +.screen:before { + content: ""; + height: 5px; + position: absolute; + z-index: 4; + left: 50%; + translate: -50% 0%; + background-color: white; +} + +.screen:before { + width: 15%; + top: 0rem; + border-bottom-left-radius: 1rem; + border-bottom-right-radius: 1rem; +} + +.screen:after { + width: 25%; + bottom: 0rem; + border-top-left-radius: 1rem; + border-top-right-radius: 1rem; +} + +@keyframes pan-overlay { + from { + background-position: 0% 0%; + } + + to { + background-position: 0% -100%; + } +} + +.screen-overlay { + background: linear-gradient( + rgb(var(--primary-rgb) / 0.15), + rgb(var(--primary-rgb) / 0.15) 3px, + transparent 3px, + transparent 9px + ); + background-size: 100% 9px; + height: 100%; + width: 100%; + animation: pan-overlay 22s infinite linear; + position: absolute; + z-index: 2; + left: 0px; + top: 0px; +} + +@keyframes pan-image { + 0% { + background-position: 36% 42%; + background-size: 200%; + } + + 20% { + background-position: 30% 35%; + background-size: 200%; + } + + 20.0001% { /* -- View 2 -- */ + background-position: 60% 85%; + background-size: 500%; + } + + 40% { + background-position: 49% 81%; + background-size: 500%; + } + + 40.0001% { /* -- View 3 -- */ + background-position: 80% 42%; + background-size: 300%; + } + + 60% { + background-position: 84% 33%; + background-size: 300%; + } + + 60.0001% { /* -- View 4 -- */ + background-position: 0% 0%; + background-size: 300%; + } + + 80% { + background-position: 15% 4%; + background-size: 300%; + } + + 80.0001% { /* -- View 5 -- */ + background-position: 80% 10%; + background-size: 300%; + } + + 100% { + background-position: 72% 14%; + background-size: 300%; + } +} + +.screen > .screen-image { + background-image: url("https://images.unsplash.com/photo-1515266591878-f93e32bc5937?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2574&q=80"); + height: 100%; + width: 100%; + position: absolute; + z-index: 1; + left: 0px; + top: 0px; + background-size: 300%; + background-position: 0% 0%; + filter: sepia(100%) hue-rotate(160deg); + opacity: 0.2; + animation: pan-image 15s linear infinite; +} + +.screen > .screen-content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-end; + flex-grow: 1; + gap: 4rem; + position: relative; + z-index: 3; + margin: 1rem; + padding-bottom: 6rem; + border: 1px solid rgb(var(--primary-rgb) / 50%); + border-radius: 0.6rem; +} + +.screen > .screen-content > .screen-icon { + color: white; + font-size: 4rem; + text-shadow: 0px 0px 0.5rem white; +} + +.screen > .screen-content > .screen-user{ + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + position: relative; +} + +.screen > .screen-content > .screen-user:before, +.screen > .screen-content > .screen-user:after { + content: ""; + position: absolute; + top: 0px; + background-color: rgb(var(--primary-rgb)); + border-radius: 1rem; + box-shadow: 0px 0px 8px 3px rgb(var(--primary-rgb) / 60%); +} + +.screen > .screen-content > .screen-user:before { + height: 2px; + width: 50px; + translate: -20px -1rem; + opacity: 0.75; +} + +.screen > .screen-content > .screen-user:after { + height: 3px; + width: 30px; + translate: 26px calc(-1rem - 0.5px); +} + +.screen > .screen-content > .screen-user > :is(.name, .link) { + font-family: "Source Code Pro", monospace; + color: white; + text-align: center; + text-transform: uppercase; +} + +.screen > .screen-content > .screen-user > .name { + position: relative; + font-size: 4.25rem; + font-weight: 400; +} + +.screen > .screen-content > .screen-user > .name:before, +.screen > .screen-content > .screen-user > .name:after { + content: ""; + height: 4px; + width: 4px; + position: absolute; + border: 2px solid white; + border-radius: 2px; +} + +.screen > .screen-content > .screen-user > .name:before { + top: 55%; + right: -1.5rem; +} + +.screen > .screen-content > .screen-user > .name:after { + top: 45%; + left: -1.5rem; +} + +.screen > .screen-content > .screen-user > .link { + opacity: 0.8; + font-size: 1.5rem; + text-shadow: 0px 0px 0.5rem white; + font-weight: 400; + letter-spacing: 0.3rem; + text-decoration: none; +} + +.screen > .screen-content > .screen-user > .link:is(:hover, :focus) { + text-decoration: underline; +} + +@media(max-width: 700px) { + .screen { + scale: 0.6; + margin-bottom: 0rem; + } +} + +/* -- Blob effect -- */ + +@keyframes rotate { + from { + rotate: 0deg; + } + + 50% { + scale: 1 1.5; + } + + to { + rotate: 360deg; + } +} + +#blob { + background-color: white; + height: 34vmax; + aspect-ratio: 1; + position: absolute; + left: 50%; + top: 50%; + translate: -50% -50%; + border-radius: 50%; + background: linear-gradient(to right, var(--blob-color-1), var(--blob-color-2)); + animation: rotate 20s infinite; + opacity: 0.2; +} + +#blur { + height: 100%; + width: 100%; + position: absolute; + z-index: 2; + backdrop-filter: blur(12vmax); +} + +/* -- Links -- */ +#links { + display: flex; + flex-direction: column; + gap: 0.5rem; + position: absolute; + top: 0px; + left: 0px; + z-index: 10; + padding: 1rem; +} + +.meta-link { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.meta-link > :is(span, a) { + font-family: "Rubik", sans-serif; + font-size: 0.9rem; + color: white; +} + +.meta-link > .label { + width: 160px; + text-align: right; +} + +.meta-link > a { + text-decoration: none; + outline: none; +} + +.meta-link > a.source { + color: rgb(94, 106, 210); +} + +.meta-link > a:is(:hover, :focus) > i { + color: white; +} + +.meta-link > a.youtube { + color: rgb(239, 83, 80); +} + +.meta-link > a.youtube > i { + padding-top: 0.2rem; +} + +.meta-link > a > i { + height: 1rem; + line-height: 1rem; +} \ No newline at end of file diff --git a/quote_app/templates/index.html b/quote_app/templates/index.html new file mode 100644 index 0000000..de65f6b --- /dev/null +++ b/quote_app/templates/index.html @@ -0,0 +1,17 @@ + + + + + + + Docker App + + + + + +

Welcome to Project 1 (Docker App)

+

Click Here for the Quote

+ + + \ No newline at end of file diff --git a/quote_app/templates/quote.html b/quote_app/templates/quote.html new file mode 100644 index 0000000..f816ea7 --- /dev/null +++ b/quote_app/templates/quote.html @@ -0,0 +1,13 @@ + +Docker App Quote +
+
+
+
+ +
+ {{ quote }} + +
+
+
\ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2847890 Binary files /dev/null and b/requirements.txt differ