From dea8c808770c551279f8f4239a9c4d38fcc06b2a Mon Sep 17 00:00:00 2001 From: Markus Willman <mpewil@utu.fi> Date: Sun, 4 Mar 2018 19:46:57 +0200 Subject: [PATCH] favicon and web app manifest --- server/app.py | 18 ++++++++++++------ static/android-chrome-192x192.png | Bin 0 -> 2177 bytes static/android-chrome-512x512.png | Bin 0 -> 6608 bytes static/apple-touch-icon.png | Bin 0 -> 1995 bytes static/browserconfig.xml | 9 +++++++++ static/favicon-16x16.png | Bin 0 -> 404 bytes static/favicon-32x32.png | Bin 0 -> 508 bytes static/favicon.ico | Bin 0 -> 15086 bytes static/mstile-150x150.png | Bin 0 -> 1587 bytes static/safari-pinned-tab.svg | 1 + static/site.webmanifest | 20 ++++++++++++++++++++ templates/internal/base.html | 13 +++++++++++++ 12 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 static/android-chrome-192x192.png create mode 100644 static/android-chrome-512x512.png create mode 100644 static/apple-touch-icon.png create mode 100644 static/browserconfig.xml create mode 100644 static/favicon-16x16.png create mode 100644 static/favicon-32x32.png create mode 100644 static/favicon.ico create mode 100644 static/mstile-150x150.png create mode 100644 static/safari-pinned-tab.svg create mode 100644 static/site.webmanifest diff --git a/server/app.py b/server/app.py index 018da01..7b0acb0 100644 --- a/server/app.py +++ b/server/app.py @@ -20,7 +20,7 @@ app.jinja_env.add_extension('server.templating.CustomFunctionsExtension') app.config['BABEL_TRANSLATION_DIRECTORIES'] = TRANSLATION_DIR # undocumented Flask-Babel config option # For localization Flask-BabelEx might be better for choice performance (they are api compatible, sans setting custom translation path) -# - Flask-Babel loads the translation catalog every request +# - Flask-Babel loads the translation catalog every request, but it is the more common choice still babel = Babel(app) gtfs = GtfsHandler('gtfs', dir = DATA_DIR, defer = (sys.path[0] == '' and __package__ != None)) locator = FoliLocator(endpointURI = 'http://data.foli.fi/siri/vm', userAgent = APP_VERSION, pollFreq = 3) @@ -96,7 +96,7 @@ def afterRequestHandler(response): @app.url_value_preprocessor def pullUrlGlobals(endpoint, values): - if endpoint == 'static' or values == None: + if endpoint == None or values == None or endpoint == 'static' or endpoint.startswith('root/'): return # stopId is esentially a global routing argument, its absence is an exception @@ -117,7 +117,7 @@ def pullUrlGlobals(endpoint, values): @app.url_defaults def urlDefaults(endpoint, values): - if endpoint == 'static' or values == None: + if endpoint == None or values == None or endpoint == 'static' or endpoint.startswith('root/'): return # inject stop id if the endpoint is expecting it and it is not present @@ -152,9 +152,15 @@ def index(): return redirect(url_for('view', stopId = DEFAULT_STOP)) # avoid needless processing -@app.route('/favicon.ico') -@app.route('/robots.txt') -def sendRootFile(): +@app.route('/favicon.ico', endpoint = 'root/favicon') +@app.route('/robots.txt', endpoint = 'root/robots') +@app.route('/favicon-32x32.png', endpoint = 'root/favicon32') +@app.route('/favicon-16x16.png', endpoint = 'root/favicon16') +@app.route('/apple-touch-icon.png', endpoint = 'root/touch-icon') +@app.route('/safari-pinned-tab.svg', endpoint = 'root/mask-icon') +@app.route('/site.webmanifest', endpoint = 'root/manifest') +@app.route('/<path:path>') +def sendRootFile(path = None): return send_from_directory(STATIC_DIR, request.path[1:]) # catch all route for any views, automatically loads data into template context diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..f91e1a26cca254f32293efb07886a9f5ed092cd4 GIT binary patch literal 2177 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 X1xr3TnNDS3U|{fc^>bP0l+XkKoYed) literal 0 HcmV?d00001 diff --git a/static/android-chrome-512x512.png b/static/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1ee86ea0543fc61c0f5cd3953238830e2ca1b1 GIT binary patch literal 6608 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 FCIGHTsVV>f literal 0 HcmV?d00001 diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cce20c7695c26836d393c72a3f6a4aec09009230 GIT binary patch literal 1995 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 literal 0 HcmV?d00001 diff --git a/static/browserconfig.xml b/static/browserconfig.xml new file mode 100644 index 0000000..951034e --- /dev/null +++ b/static/browserconfig.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<browserconfig> + <msapplication> + <tile> + <square150x150logo src="/mstile-150x150.png"/> + <TileColor>#bfc0c2</TileColor> + </tile> + </msapplication> +</browserconfig> diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a685a583af2ecd89c9f6814e55bbbfa9c5c4d6 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU<L*TmUKs7M+SzC{oH>NSs54@ z7>k44ofy`glX=O&z+f5R6XN=P9pm@)EI$vq{(W=!#}1|67mI$K2=mD-{IP-a#}4@) zn+1OEGyU^m-j59&-&ZsK+-Lsx*`{yv8UB5`!J}Yo&%nUIQxfDC%<}u+zkh%KGBh=@ zG&SvBrp&;=Q0M957$R|bYQHz%VFM1Ajl4_ze*F5^uA8?jbN8#s6C%#=Fw4Xr;FO>9 zVeyV<kI%+EW6g?<+c9y1risjpyA#<tgR&EL#9W@!%CuJG_NIu`jzArgfU8eVoN1gX z8Z=FDaZz%s%L>PApS{L{?^gy~jdQ<pSMZ|t7d^B5vW@@eS2LMOus<^sc{7uNfg!vq zB%&lJv0R~`C_gPTCsm=OvLIC<v!EoIfuUl~<4-&sg<%>Rr~FT!@q8M@z^u%zm&`4! zEbKj5gjra@rNQKI3bXR&5QWn>uADe>=7`J@_R|d>3%v9gUWp5qd~!0K%D}+D;OXk; Jvd$@?2>?DNq<{bb literal 0 HcmV?d00001 diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c0ff7888cd768197905751d1b660f52993d1fd GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I7G?$phQ^Te;|vT8Ea{HEjtmSN`?>!lvNA9* zFct^7J29*~C-ahlfk7+4C&bk!v+(cJb^rhW|GD4d$7cQ?+oZm)Wc;yJ^8f#Tzm5g| zK9}+L*@k~#?*6&eJEJ{EoPmLXtt7}Vn1NCB-^Y(WZbv~j{`Pcn4AD5hcH&ttW<!C7 z@1ixV@rp|~Jv#f1caplsnJZW4i3NRR?U`MrB_ebqc;SSro8KM$e5u*oF=zg<nH!b1 zs2}BLI_&;TeX`DP_P%cxdkXisUo%cqkXX#_Ts$wbAxKc2Va1CH7R85*x15U>vhZ$P z@%KsG-VHl;FhBgdirG_h)m(}9EW3Q=H&m|BtKD?pRb2VGm7W&UspHWz?o~AGsTF5r zy`HNnRj%{P{?V__BS)6^>$O#hImN8s!Og$p->hwu7DYr^pATK<G-2D(%&5Gu!g*ab zSLPUHZM(hQ_3n`(N$JWtt}HW@f(|VH{v{wgYSJ~44^4bwKiczu*v>b4(PO^I{_|o6 z28Qsekcg6?#Bzm#qWrYXoK%I9%7Rpd%z~0+28N0`k3aEn6ozSNobo??#`9?q1G6%> zUNX0^vat7L5oTcpmj;u=Da^{7LljQmxN_pinIkes*iScjEb!7}cqJ}a^2y0`Dgy%p NgQu&X%Q~loCIAyo*?|B6 literal 0 HcmV?d00001 diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f176ecdd2715552e005be1e1572dd3991fbdce08 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/static/mstile-150x150.png b/static/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..96e93b0ec12d33b9d32a3de72a753585a1ba8d68 GIT binary patch literal 1587 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 C9r~95 literal 0 HcmV?d00001 diff --git a/static/safari-pinned-tab.svg b/static/safari-pinned-tab.svg new file mode 100644 index 0000000..e063451 --- /dev/null +++ b/static/safari-pinned-tab.svg @@ -0,0 +1 @@ +<svg version="1" xmlns="http://www.w3.org/2000/svg" width="4996" height="4996" viewBox="0 0 3747.000000 3747.000000"><path d="M20 1873.5V2910h3707V837H20v1036.5zM1964.5 1025c22.6 1.5 43.4 3.7 60.9 6.5 133.7 21.6 232.5 92.1 279.8 199.5 20 45.3 29.9 92 31.5 148.5 1.2 42.8-3.8 78.7-16.2 115.9-23.1 69.8-71.8 130.3-133.4 166-7.2 4.2-26.7 13.6-28.2 13.6-2.2 0-.6 2.3 2.4 3.3 5.4 2 31.7 15.2 40.1 20.1 73.6 43.8 124.1 111.3 145 194.1 8 31.3 11.1 58.6 11 96.5-.1 69.9-13.1 130.5-39 182.3-3 5.9-5.4 11-5.4 11.2 0 .3 144.3.4 320.8.2 292.6-.3 321.6-.4 331.2-1.9 47.9-7.6 82.6-18.6 112.5-35.6 52.9-30.1 83.3-74.2 91.7-132.7 1.7-11.7 1.6-49.1-.1-61.5-6.4-46.6-22.6-79.5-52.6-106.2-33.7-30.1-67.1-42.6-143.5-53.7-25.4-3.7-51.1-7.3-107-15.1-59.3-8.3-74.9-10.6-93-14.1-67.9-13.2-127.2-36.3-175-68.2-35.9-23.9-67.1-55.8-88.9-90.8-26.6-42.7-42.8-96.2-47.1-155.4-1.3-18.2-1.3-53.2.1-70.9 4.5-59.3 22.3-117.1 50.5-163.7 35.1-58.2 85.6-104 149.9-136.1 87.9-44 195.9-60.3 326-49.2 76.8 6.5 146.7 25.3 207.6 55.9 43 21.5 86 51.2 124.4 86l5 4.5-14.5 14.3c-8 7.8-37.2 36.2-64.9 63l-50.3 48.7-6-5.3c-18.5-16.2-38.3-30.8-57.1-42.2-8.6-5.1-29.9-16.2-36.2-18.8-2.2-.8-7.8-3.2-12.5-5.2-21.1-8.8-52.7-17.6-81.1-22.4-23.3-4-42.9-5.9-73.7-7.2-64.2-2.9-116.6 6-160 27.3-49.7 24.2-83.6 62-100 111.3-4.4 13.2-6.2 21.2-8.8 38.5-2.3 16.3-1.6 49.1 1.5 64.5 6.8 33.6 18.9 56.7 41.5 79 21.6 21.4 49 37.3 87.1 50.5 30.9 10.7 45.8 13.7 124 24.9 105.6 15.3 116.4 16.9 141.5 21.7 102.8 19.6 168.9 51 224 106.4 37.9 38 64.2 85.5 79 142.1 12.6 48.7 16.8 104.5 11.5 154.9-1.7 16.3-1.8 16.8-5 34-10.6 56-38.4 117.3-72.4 159.9-47.8 59.7-114.6 103.3-195.6 127.6-35.4 10.6-64.6 16.4-107 21.3l-23 2.6-778.2.3-778.3.3v-183l276.3-.3c257.6-.3 277-.4 287.7-2 40.7-6.3 72-18 100.2-37.7 14.3-9.9 35.6-31.8 45.2-46.3 22.5-34.2 33.6-73.3 33.6-118.7 0-109.3-65.9-185-174.5-200.4-23.6-3.4-36.9-3.6-201.1-3.6H1614v-182.9l167.8-.4 167.7-.3 13.5-2.2c30-5 50.6-11.3 73.5-22.7 18-9 30.4-17.6 44.2-30.8 28.3-27.2 44.7-60.9 50.8-104.4 2.7-18.9 1.7-56-1.9-74.2-9.8-48.5-33.8-85.5-72.6-111.6-11.4-7.7-33.8-18.4-48.5-23.3-22.4-7.5-44.1-11.5-71.9-13.2-12.1-.8-178.4-1-572.6-.8-502.8.4-556.6.6-567 2-41.6 5.8-70.5 15.3-94 31.1-43.9 29.3-71.5 70.6-81.5 122.1-6.2 31.6-4.6 69.8 4.2 98.1 3.6 11.8 14.3 32.8 21.7 42.5 31.6 41.9 94 72.3 172.6 84.1 14.4 2.1 79.6 11.7 102 14.9 78.3 11.3 103.3 15.7 138 24.6 78 19.9 132.1 49.2 180 97.5 51.4 51.7 81.9 123.3 89.5 209.8 2.5 28 2 71.5-1.1 95.1-7.7 59.5-27.9 112.3-60.7 158.4-24.8 34.9-61.2 69.5-99.1 94-97.8 63.4-226.4 90.8-382.6 81.6-107.5-6.4-189.2-26.3-265-64.6-47.9-24.1-95.2-58-136.2-97.6l-10.7-10.3 67.4-65.3c37.1-35.8 67.9-65.2 68.4-65.2.6 0 5 3.7 9.8 8.2 87 81.3 187.6 116.8 330.3 116.8 105.2 0 181.9-24.3 230-73 26.4-26.7 42.5-60.1 48.1-100 1.9-13.4 1.6-47.4-.4-62.6-6.2-44.8-23.3-79-52.4-104.6-30-26.4-57.2-38.4-109.3-48.2-17.2-3.2-26.4-4.6-134-19.6-23.9-3.3-52.9-7.4-64.5-9.1-59.5-8.7-106.3-21.7-152.5-42.2-27.5-12.2-58.3-30.6-80.8-48.3-11.8-9.4-37.4-34.8-46.6-46.4-35.7-44.9-56.6-97.9-65.2-165.5-2.1-16.6-3-68.7-1.5-88.5 8.2-108.5 57.5-201.4 139.6-262.7 72.7-54.4 164.2-83.9 278-89.6 17.9-.9 1111.8-.6 1126 .3zM501 2450.1c11 1.3 22.8 4.3 31.3 8 7.6 3.2 21.1 11.7 27.2 17.2l4 3.6-12.6 12.7-12.7 12.6-5.3-4.2c-10.2-8.1-22.2-12.9-37.2-14.9-23.8-3.3-42.6 1.4-53.6 13.4-7 7.8-9.5 14.5-9.5 26.5-.1 8.5.2 10.1 2.7 15.2 5.8 11.8 17.7 18.4 39.5 21.9 7 1.1 19.3 3.1 27.4 4.4 26.3 4.3 42 11.3 53.4 23.8 6.4 7 9.9 12.9 12.9 21.8 7.4 21.7 5.4 47.7-5.2 65.9-5.2 8.9-17.1 20.5-26.7 25.9-18.3 10.4-39.5 14.8-66.6 13.7-35.9-1.3-57.4-9.2-80.9-29.6l-5.1-4.5 13.4-13.4 13.4-13.4 5.9 5.1c10.3 8.9 21.8 14.5 36.7 17.9 10.1 2.3 36.7 2.3 45.9 0 22.3-5.6 33.7-18.7 33.7-38.8 0-17.8-9.4-30.6-26-35.3-3-.8-16.3-3.1-29.5-5.1-26.3-3.8-26.2-3.8-35.5-6.7-24.7-7.8-40.5-23.3-46.7-45.9-2.5-9-2.5-32.8 0-41.9 5.5-20.4 18.4-36.5 36.7-45.9 10.7-5.5 19.5-8.1 35-10.5 5.5-.8 26.1-.5 34 .5zm1792 0c11 1.3 22.8 4.3 31.3 8 7.6 3.2 21.1 11.7 27.2 17.2l4 3.6-12.6 12.7-12.7 12.6-5.3-4.2c-10.2-8.1-22.2-12.9-37.2-14.9-23.8-3.3-42.6 1.4-53.6 13.4-7 7.8-9.5 14.5-9.5 26.5-.1 8.5.2 10.1 2.7 15.2 5.8 11.8 17.7 18.4 39.5 21.9 7 1.1 19.3 3.1 27.4 4.4 26.3 4.3 42 11.3 53.4 23.8 6.4 7 9.9 12.9 12.9 21.8 7.4 21.7 5.4 47.7-5.2 65.9-5.2 8.9-17.1 20.5-26.7 25.9-18.3 10.4-39.5 14.8-66.6 13.7-35.9-1.3-57.4-9.2-80.9-29.6l-5.1-4.5 13.4-13.4 13.4-13.4 5.9 5.1c10.3 8.9 21.8 14.5 36.7 17.9 10.1 2.3 36.7 2.3 45.9 0 22.3-5.6 33.7-18.7 33.7-38.8 0-17.8-9.4-30.6-26-35.3-3-.8-16.3-3.1-29.5-5.1-26.3-3.8-26.2-3.8-35.5-6.7-24.7-7.8-40.5-23.3-46.7-45.9-2.5-9-2.5-32.8 0-41.9 5.5-20.4 18.4-36.5 36.7-45.9 10.7-5.5 19.5-8.1 35-10.5 5.5-.8 26.1-.5 34 .5zm308 0c11 1.3 22.8 4.3 31.3 8 7.6 3.2 21.1 11.7 27.2 17.2l4 3.6-12.6 12.7-12.7 12.6-5.3-4.2c-10.2-8.1-22.2-12.9-37.2-14.9-23.8-3.3-42.6 1.4-53.6 13.4-7 7.8-9.5 14.5-9.5 26.5-.1 8.5.2 10.1 2.7 15.2 5.8 11.8 17.7 18.4 39.5 21.9 7 1.1 19.3 3.1 27.4 4.4 26.3 4.3 42 11.3 53.4 23.8 6.4 7 9.9 12.9 12.9 21.8 7.4 21.7 5.4 47.7-5.2 65.9-5.2 8.9-17.1 20.5-26.7 25.9-18.3 10.4-39.5 14.8-66.6 13.7-35.9-1.3-57.4-9.2-80.9-29.6l-5.1-4.5 13.4-13.4 13.4-13.4 5.9 5.1c10.3 8.9 21.8 14.5 36.7 17.9 10.1 2.3 36.7 2.3 45.9 0 22.3-5.6 33.7-18.7 33.7-38.8 0-17.8-9.4-30.6-26-35.3-3-.8-16.3-3.1-29.5-5.1-26.3-3.8-26.2-3.8-35.5-6.7-24.7-7.8-40.5-23.3-46.7-45.9-2.5-9-2.5-32.8 0-41.9 5.5-20.4 18.4-36.5 36.7-45.9 10.7-5.5 19.5-8.1 35-10.5 5.5-.8 26.1-.5 34 .5zm435.8 1.3c26.3 6.5 50.2 24.6 60.7 45.9 9 18.3 10.5 30.5 10.5 86.2 0 41.7-.9 56.7-4.1 69.5-7.5 30-33.7 54.2-67.7 62.7-10.3 2.6-38.1 2.3-48.3-.5-17.7-4.8-31.4-12.6-44-25.2-9.3-9.3-14.4-17-18.6-28-6.4-17.1-6.8-21.8-6.8-78.5s.4-61.4 6.8-78.5c10.5-27.9 39.1-50 71.2-55 8.3-1.3 32.7-.4 40.3 1.4zm-2330.6 81.1c20.9 44.5 38.2 81.3 38.6 81.7.4.4 17.6-36.2 38.2-81.2l37.5-81.9 20.3-.1H861v265h-40l-.2-88.1-.3-88.2-30.1 63.9-30.1 63.9h-30.4l-30.7-63.6-30.7-63.7-.3 87.9-.2 87.9h-40v-265l20.2.2 20.1.3 37.9 81zm369.2 49.8c26.4 72.1 48.2 131.8 48.4 132.4.3 1-4.3 1.3-21 1.3h-21.3l-9.1-26.3-9-26.2-52.1-.3-52.1-.2-1.6 4.2c-2 5.6-16.6 48-16.6 48.5 0 .2-9.7.3-21.6.3-20.2 0-21.6-.1-20.9-1.8.3-.9 21.7-59.3 47.5-129.7 25.8-70.4 47.3-129.2 47.9-130.8l1.1-2.7h32.5l47.9 131.3zm214.1-128.4c27.3 7.6 45.4 24.9 53.7 51.1 2 6.6 2.3 9.4 2.2 23.5 0 14.6-.2 16.7-2.7 24-4.6 13.8-12.7 25.5-23.1 33.3-6.4 4.7-21.2 12.2-24.1 12.2-1.2 0-1.5.5-1.1 1.7.4 1 14 27.3 30.1 58.5 16.2 31.2 29.5 57 29.5 57.3 0 .3-10.5.5-23.3.5h-23.2l-28-56-28-56H1202v112h-40v-265.1l59.8.4c58.1.3 59.9.4 67.7 2.6zM1567 2469v18h-73v229h-40v-229h-73v-36h186v18zm264.5-15.2c28.7 8 46.6 26.3 52.1 53.1 2.2 11 1.5 28-1.5 36.4-5.2 14.8-15.2 27.4-26.4 33.2l-5.6 2.9 5.1 2.8c12.7 6.9 21.6 16.2 27.4 28.3 5.2 10.7 6.7 19.6 6.1 35-.9 22.4-5.9 34.7-19.7 48.6-6.9 7.1-10 9.4-17 12.7-4.7 2.3-12.3 5.1-17 6.4-8.3 2.1-10.1 2.2-70.2 2.5l-61.8.4v-265.2l60.3.3c58.7.4 60.4.4 68.2 2.6zm153.7 90.9l.3 93.8 2.8 7.8c6.7 19.1 19 30.1 38.3 34.2 24.9 5.3 50.2-5.2 60.2-25.1 7.1-14.1 6.6-6.7 7-110.7l.3-93.7h40l-.3 96.7-.3 96.8-2.8 8.8c-5.2 16.7-12.7 28.9-25 40.3-31.8 29.6-87.8 32.7-124.3 6.9-18.1-12.9-31.3-34.2-35.3-56.9-.7-3.9-1.1-38.5-1.1-99.3V2451h39.9l.3 93.7zM2889 2469v18h-73v229h-40v-229h-73v-36h186v18zm404.5-15.2c28.7 8 48.8 27.3 56.5 54.2 3.3 11.5 3.8 28.9 1.2 41.3-5 24-19.3 42.8-40.7 53.2-17.1 8.4-19.6 8.8-63.7 9.3l-38.8.4V2716h-40v-265.1l58.8.3c57 .4 58.9.5 66.7 2.6z"/><path d="M2999.2 2487c-10.5 2.8-18.3 7.3-25.1 14.6-10.1 10.8-13.3 20.2-15.1 45.1-2.1 29.2-.8 78.7 2.4 94.3 2.1 9.7 5.9 17.2 12.7 24.4 6.9 7.4 14.7 11.9 25.5 14.6 9.8 2.5 17 2.5 26.8 0 10.8-2.7 18.6-7.2 25.5-14.6 10.1-10.8 13.3-20.2 15.1-45.1 2.1-29.2.8-78.7-2.4-94.3-2.1-9.7-5.9-17.2-12.7-24.4-6.9-7.4-14.7-11.9-25.5-14.6-9.6-2.5-17.7-2.5-27.2 0zM991.6 2569.7c-10.9 31.3-20.1 57.4-20.3 58-.4 1 8 1.3 40.2 1.3s40.6-.3 40.2-1.3c-.2-.6-9.1-26.7-19.7-58-10.7-31.2-19.6-56.7-19.9-56.7-.4 0-9.6 25.5-20.5 56.7zM1202 2528.6v41.6l35.8-.4c33.2-.4 36.1-.6 41.3-2.5 15.5-5.8 24-16.1 26.2-31.9 2.7-18.7-5.1-35.2-20.4-42.9-9.4-4.8-15.6-5.5-50.6-5.5H1202v41.6zM1743 2525v38h32.3c42.2 0 49.4-1.5 59.9-12.2 6.7-6.9 9.2-13.8 9.2-25.8 0-7.5-.5-10.7-2.3-15.3-2.8-7-9.7-14.4-16.5-17.6-9.5-4.4-15.9-5.1-50.3-5.1H1743v38zM1743 2639.5v40.6l37.3-.3c35.8-.3 37.4-.4 42.8-2.6 17.4-7 25.2-18.4 25.3-37.2.1-10.9-1-15.3-5.6-23-4-6.5-11.1-12.2-19.3-15.2-5.7-2.1-7.8-2.2-43.2-2.6l-37.3-.3v40.6zM3208 2531v44h33.8c27.1 0 34.9-.3 39.7-1.5 21.8-5.7 34.1-25.6 30.6-49.4-2.8-18.9-14.9-31.6-33.9-35.7-5-1-15-1.4-38.4-1.4H3208v44z"/></svg> \ No newline at end of file diff --git a/static/site.webmanifest b/static/site.webmanifest new file mode 100644 index 0000000..1e511ab --- /dev/null +++ b/static/site.webmanifest @@ -0,0 +1,20 @@ +{ + "name": "Smart Bus Stop", + "short_name": "Smart Bus Stop", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#bfc0c2", + "background_color": "#bfc0c2", + "display": "standalone", + "orientation": "landscape" +} diff --git a/templates/internal/base.html b/templates/internal/base.html index 0bd960a..6c40f2a 100644 --- a/templates/internal/base.html +++ b/templates/internal/base.html @@ -20,6 +20,19 @@ <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <!-- Favicons --> + <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('root/favicon32', _external = True) }}"> + <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('root/favicon16', _external = True) }}"> + <!-- Web App Manifest --> + <link rel="manifest" href="{{ url_for('root/manifest', _external = True) }}"> + <!-- Apple and Windows phone specific icons --> + <link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('root/touch-icon', _external = True) }}"> + <link rel="mask-icon" href="{{ url_for('root/mask-icon', _external = True) }}" color="#f7ac00"> + <meta name="apple-mobile-web-app-title" content="Smart Bus Stop"> + <meta name="application-name" content="Smart Bus Stop"> + <meta name="msapplication-TileColor" content="#bfc0c2"> + <meta name="theme-color" content="#bfc0c2"> + <!-- Bootstrap CSS --> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> -- GitLab