diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..a26ec2b --- /dev/null +++ b/deno.json @@ -0,0 +1,10 @@ +{ + "deploy": { + "project": "7a93d03e-eabe-4db1-b78e-5f1bbcb460b0", + "exclude": [ + "**/node_modules" + ], + "include": [], + "entrypoint": "server.ts" + } +} \ No newline at end of file diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..b8e12fe --- /dev/null +++ b/deno.lock @@ -0,0 +1,280 @@ +{ + "version": "3", + "packages": { + "specifiers": { + "jsr:@oak/commons@0.11": "jsr:@oak/commons@0.11.0", + "jsr:@oak/oak": "jsr:@oak/oak@16.1.0", + "jsr:@std/assert@0.223": "jsr:@std/assert@0.223.0", + "jsr:@std/assert@0.226": "jsr:@std/assert@0.226.0", + "jsr:@std/assert@^0.223.0": "jsr:@std/assert@0.223.0", + "jsr:@std/assert@^0.224.0": "jsr:@std/assert@0.224.0", + "jsr:@std/bytes@0.223": "jsr:@std/bytes@0.223.0", + "jsr:@std/bytes@0.224": "jsr:@std/bytes@0.224.0", + "jsr:@std/bytes@^0.223.0": "jsr:@std/bytes@0.223.0", + "jsr:@std/crypto@0.223": "jsr:@std/crypto@0.223.0", + "jsr:@std/crypto@0.224": "jsr:@std/crypto@0.224.0", + "jsr:@std/encoding@1.0.0-rc.2": "jsr:@std/encoding@1.0.0-rc.2", + "jsr:@std/encoding@^0.223.0": "jsr:@std/encoding@0.223.0", + "jsr:@std/http@0.223": "jsr:@std/http@0.223.0", + "jsr:@std/http@0.224": "jsr:@std/http@0.224.5", + "jsr:@std/io@0.223": "jsr:@std/io@0.223.0", + "jsr:@std/media-types@0.223": "jsr:@std/media-types@0.223.0", + "jsr:@std/media-types@0.224": "jsr:@std/media-types@0.224.1", + "jsr:@std/path@0.223": "jsr:@std/path@0.223.0", + "npm:path-to-regexp@6.2.1": "npm:path-to-regexp@6.2.1" + }, + "jsr": { + "@oak/commons@0.11.0": { + "integrity": "07702bfe5c07cd8144c422022994da1f9fea466b185824f4be63a2b1b1a65125", + "dependencies": [ + "jsr:@std/assert@0.226", + "jsr:@std/bytes@0.224", + "jsr:@std/crypto@0.224", + "jsr:@std/http@0.224", + "jsr:@std/media-types@0.224" + ] + }, + "@oak/oak@16.1.0": { + "integrity": "ab21506555fffeb08dc8f45ff5d28607e8087949ff58bd2964b27df65994480b", + "dependencies": [ + "jsr:@oak/commons@0.11", + "jsr:@std/assert@0.223", + "jsr:@std/bytes@0.223", + "jsr:@std/crypto@0.223", + "jsr:@std/http@0.223", + "jsr:@std/io@0.223", + "jsr:@std/media-types@0.223", + "jsr:@std/path@0.223", + "npm:path-to-regexp@6.2.1" + ] + }, + "@std/assert@0.223.0": { + "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" + }, + "@std/assert@0.224.0": { + "integrity": "8643233ec7aec38a940a8264a6e3eed9bfa44e7a71cc6b3c8874213ff401967f" + }, + "@std/assert@0.226.0": { + "integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3" + }, + "@std/bytes@0.223.0": { + "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" + }, + "@std/bytes@0.224.0": { + "integrity": "a2250e1d0eb7d1c5a426f21267ab9bdeac2447fa87a3d0d1a467d3f7a6058e49" + }, + "@std/crypto@0.223.0": { + "integrity": "1aa9555ff56b09e197ad988ea200f84bc6781fd4fd83f3a156ee44449af93000", + "dependencies": [ + "jsr:@std/assert@^0.223.0", + "jsr:@std/encoding@^0.223.0" + ] + }, + "@std/crypto@0.224.0": { + "integrity": "154ef3ff08ef535562ef1a718718c5b2c5fc3808f0f9100daad69e829bfcdf2d", + "dependencies": [ + "jsr:@std/assert@^0.224.0" + ] + }, + "@std/encoding@0.223.0": { + "integrity": "2b5615a75e00337ce113f34cf2f9b8c18182c751a8dcc8b1a2c2fc0e117bef00" + }, + "@std/encoding@1.0.0-rc.2": { + "integrity": "160d7674a20ebfbccdf610b3801fee91cf6e42d1c106dd46bbaf46e395cd35ef" + }, + "@std/http@0.223.0": { + "integrity": "15ab8a0c5a7e9d5be017a15b01600f20f66602ceec48b378939fa24fcec522aa", + "dependencies": [ + "jsr:@std/assert@^0.223.0", + "jsr:@std/encoding@^0.223.0" + ] + }, + "@std/http@0.224.5": { + "integrity": "b03b5d1529f6c423badfb82f6640f9f2557b4034cd7c30655ba5bb447ff750a4", + "dependencies": [ + "jsr:@std/encoding@1.0.0-rc.2" + ] + }, + "@std/io@0.223.0": { + "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", + "dependencies": [ + "jsr:@std/bytes@^0.223.0" + ] + }, + "@std/media-types@0.223.0": { + "integrity": "84684680c2eb6bc6d9369c6d6f26a49decaf2c7603ff531862dda575d9d6776e" + }, + "@std/media-types@0.224.1": { + "integrity": "9e69a5daed37c5b5c6d3ce4731dc191f80e67f79bed392b0957d1d03b87f11e1" + }, + "@std/path@0.223.0": { + "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", + "dependencies": [ + "jsr:@std/assert@^0.223.0" + ] + } + }, + "npm": { + "path-to-regexp@6.2.1": { + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dependencies": {} + } + } + }, + "remote": { + "https://deno.land/std@0.205.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.205.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.205.0/html/entities.ts": "43f208131bb847e6e222c9dd50322066491da93ed945a93d778923ef7e975398", + "https://deno.land/std@0.205.0/html/mod.ts": "3f8c71781e32037ab63bd417759d15d31fb9606c6615c85dcabcc515986494ba", + "https://deno.land/std@0.205.0/path/_common/assert_path.ts": "061e4d093d4ba5aebceb2c4da3318bfe3289e868570e9d3a8e327d91c2958946", + "https://deno.land/std@0.205.0/path/_common/basename.ts": "0d978ff818f339cd3b1d09dc914881f4d15617432ae519c1b8fdc09ff8d3789a", + "https://deno.land/std@0.205.0/path/_common/common.ts": "9e4233b2eeb50f8b2ae10ecc2108f58583aea6fd3e8907827020282dc2b76143", + "https://deno.land/std@0.205.0/path/_common/constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.205.0/path/_common/dirname.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397", + "https://deno.land/std@0.205.0/path/_common/format.ts": "11aa62e316dfbf22c126917f5e03ea5fe2ee707386555a8f513d27ad5756cf96", + "https://deno.land/std@0.205.0/path/_common/from_file_url.ts": "ef1bf3197d2efbf0297a2bdbf3a61d804b18f2bcce45548ae112313ec5be3c22", + "https://deno.land/std@0.205.0/path/_common/glob_to_reg_exp.ts": "5c3c2b79fc2294ec803d102bd9855c451c150021f452046312819fbb6d4dc156", + "https://deno.land/std@0.205.0/path/_common/is_glob.ts": "567dce5c6656bdedfc6b3ee6c0833e1e4db2b8dff6e62148e94a917f289c06ad", + "https://deno.land/std@0.205.0/path/_common/normalize.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397", + "https://deno.land/std@0.205.0/path/_common/normalize_string.ts": "88c472f28ae49525f9fe82de8c8816d93442d46a30d6bb5063b07ff8a89ff589", + "https://deno.land/std@0.205.0/path/_common/relative.ts": "1af19d787a2a84b8c534cc487424fe101f614982ae4851382c978ab2216186b4", + "https://deno.land/std@0.205.0/path/_common/strip_trailing_separators.ts": "7ffc7c287e97bdeeee31b155828686967f222cd73f9e5780bfe7dfb1b58c6c65", + "https://deno.land/std@0.205.0/path/_common/to_file_url.ts": "a8cdd1633bc9175b7eebd3613266d7c0b6ae0fb0cff24120b6092ac31662f9ae", + "https://deno.land/std@0.205.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.205.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", + "https://deno.land/std@0.205.0/path/basename.ts": "04bb5ef3e86bba8a35603b8f3b69537112cdd19ce64b77f2522006da2977a5f3", + "https://deno.land/std@0.205.0/path/common.ts": "f4d061c7d0b95a65c2a1a52439edec393e906b40f1caf4604c389fae7caa80f5", + "https://deno.land/std@0.205.0/path/dirname.ts": "88a0a71c21debafc4da7a4cd44fd32e899462df458fbca152390887d41c40361", + "https://deno.land/std@0.205.0/path/extname.ts": "2da4e2490f3b48b7121d19fb4c91681a5e11bd6bd99df4f6f47d7a71bb6ecdf2", + "https://deno.land/std@0.205.0/path/format.ts": "3457530cc85d1b4bab175f9ae73998b34fd456c830d01883169af0681b8894fb", + "https://deno.land/std@0.205.0/path/from_file_url.ts": "e7fa233ea1dff9641e8d566153a24d95010110185a6f418dd2e32320926043f8", + "https://deno.land/std@0.205.0/path/glob.ts": "9c77cf47db1d786e2ebf66670824d03fd84ecc7c807cac24441eb9d5cb6a2986", + "https://deno.land/std@0.205.0/path/is_absolute.ts": "67232b41b860571c5b7537f4954c88d86ae2ba45e883ee37d3dec27b74909d13", + "https://deno.land/std@0.205.0/path/join.ts": "98d3d76c819af4a11a81d5ba2dbb319f1ce9d63fc2b615597d4bcfddd4a89a09", + "https://deno.land/std@0.205.0/path/mod.ts": "2d62a0a8b78a60e8e6f485d881bac6b61d58573b11cf585fb7c8fc50d9b20d80", + "https://deno.land/std@0.205.0/path/normalize.ts": "aa95be9a92c7bd4f9dc0ba51e942a1973e2b93d266cd74f5ca751c136d520b66", + "https://deno.land/std@0.205.0/path/parse.ts": "d87ff0deef3fb495bc0d862278ff96da5a06acf0625ca27769fc52ac0d3d6ece", + "https://deno.land/std@0.205.0/path/posix/_util.ts": "ecf49560fedd7dd376c6156cc5565cad97c1abe9824f4417adebc7acc36c93e5", + "https://deno.land/std@0.205.0/path/posix/basename.ts": "a630aeb8fd8e27356b1823b9dedd505e30085015407caa3396332752f6b8406a", + "https://deno.land/std@0.205.0/path/posix/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b", + "https://deno.land/std@0.205.0/path/posix/dirname.ts": "f48c9c42cc670803b505478b7ef162c7cfa9d8e751b59d278b2ec59470531472", + "https://deno.land/std@0.205.0/path/posix/extname.ts": "ee7f6571a9c0a37f9218fbf510c440d1685a7c13082c348d701396cc795e0be0", + "https://deno.land/std@0.205.0/path/posix/format.ts": "b94876f77e61bfe1f147d5ccb46a920636cd3cef8be43df330f0052b03875968", + "https://deno.land/std@0.205.0/path/posix/from_file_url.ts": "b97287a83e6407ac27bdf3ab621db3fccbf1c27df0a1b1f20e1e1b5acf38a379", + "https://deno.land/std@0.205.0/path/posix/glob.ts": "86c3f06d1c98303613c74650961c3e24bdb871cde2a97c3ae7f0f6d4abbef445", + "https://deno.land/std@0.205.0/path/posix/is_absolute.ts": "159900a3422d11069d48395568217eb7fc105ceda2683d03d9b7c0f0769e01b8", + "https://deno.land/std@0.205.0/path/posix/join.ts": "0c0d84bdc344876930126640011ec1b888e6facf74153ffad9ef26813aa2a076", + "https://deno.land/std@0.205.0/path/posix/mod.ts": "6bfa8a42d85345b12dbe8571028ca2c62d460b6ef968125e498602b43b6cf6b6", + "https://deno.land/std@0.205.0/path/posix/normalize.ts": "11de90a94ab7148cc46e5a288f7d732aade1d616bc8c862f5560fa18ff987b4b", + "https://deno.land/std@0.205.0/path/posix/parse.ts": "199208f373dd93a792e9c585352bfc73a6293411bed6da6d3bc4f4ef90b04c8e", + "https://deno.land/std@0.205.0/path/posix/relative.ts": "e2f230608b0f083e6deaa06e063943e5accb3320c28aef8d87528fbb7fe6504c", + "https://deno.land/std@0.205.0/path/posix/resolve.ts": "51579d83159d5c719518c9ae50812a63959bbcb7561d79acbdb2c3682236e285", + "https://deno.land/std@0.205.0/path/posix/separator.ts": "0b6573b5f3269a3164d8edc9cefc33a02dd51003731c561008c8bb60220ebac1", + "https://deno.land/std@0.205.0/path/posix/to_file_url.ts": "08d43ea839ee75e9b8b1538376cfe95911070a655cd312bc9a00f88ef14967b6", + "https://deno.land/std@0.205.0/path/posix/to_namespaced_path.ts": "c9228a0e74fd37e76622cd7b142b8416663a9b87db643302fa0926b5a5c83bdc", + "https://deno.land/std@0.205.0/path/relative.ts": "23d45ede8b7ac464a8299663a43488aad6b561414e7cbbe4790775590db6349c", + "https://deno.land/std@0.205.0/path/resolve.ts": "5b184efc87155a0af9fa305ff68a109e28de9aee81fc3e77cd01380f19daf867", + "https://deno.land/std@0.205.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", + "https://deno.land/std@0.205.0/path/to_file_url.ts": "edaafa089e0bce386e1b2d47afe7c72e379ff93b28a5829a5885e4b6c626d864", + "https://deno.land/std@0.205.0/path/to_namespaced_path.ts": "cf8734848aac3c7527d1689d2adf82132b1618eff3cc523a775068847416b22a", + "https://deno.land/std@0.205.0/path/windows/_util.ts": "f32b9444554c8863b9b4814025c700492a2b57ff2369d015360970a1b1099d54", + "https://deno.land/std@0.205.0/path/windows/basename.ts": "8a9dbf7353d50afbc5b221af36c02a72c2d1b2b5b9f7c65bf6a5a2a0baf88ad3", + "https://deno.land/std@0.205.0/path/windows/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b", + "https://deno.land/std@0.205.0/path/windows/dirname.ts": "5c2aa541384bf0bd9aca821275d2a8690e8238fa846198ef5c7515ce31a01a94", + "https://deno.land/std@0.205.0/path/windows/extname.ts": "07f4fa1b40d06a827446b3e3bcc8d619c5546b079b8ed0c77040bbef716c7614", + "https://deno.land/std@0.205.0/path/windows/format.ts": "343019130d78f172a5c49fdc7e64686a7faf41553268961e7b6c92a6d6548edf", + "https://deno.land/std@0.205.0/path/windows/from_file_url.ts": "d53335c12b0725893d768be3ac6bf0112cc5b639d2deb0171b35988493b46199", + "https://deno.land/std@0.205.0/path/windows/glob.ts": "0286fb89ecd21db5cbf3b6c79e2b87c889b03f1311e66fb769e6b905d4142332", + "https://deno.land/std@0.205.0/path/windows/is_absolute.ts": "245b56b5f355ede8664bd7f080c910a97e2169972d23075554ae14d73722c53c", + "https://deno.land/std@0.205.0/path/windows/join.ts": "e6600bf88edeeef4e2276e155b8de1d5dec0435fd526ba2dc4d37986b2882f16", + "https://deno.land/std@0.205.0/path/windows/mod.ts": "c3d1a36fbf9f6db1320bcb4fbda8de011d25461be3497105e15cbea1e3726198", + "https://deno.land/std@0.205.0/path/windows/normalize.ts": "9deebbf40c81ef540b7b945d4ccd7a6a2c5a5992f791e6d3377043031e164e69", + "https://deno.land/std@0.205.0/path/windows/parse.ts": "120faf778fe1f22056f33ded069b68e12447668fcfa19540c0129561428d3ae5", + "https://deno.land/std@0.205.0/path/windows/relative.ts": "026855cd2c36c8f28f1df3c6fbd8f2449a2aa21f48797a74700c5d872b86d649", + "https://deno.land/std@0.205.0/path/windows/resolve.ts": "5ff441ab18a2346abadf778121128ee71bda4d0898513d4639a6ca04edca366b", + "https://deno.land/std@0.205.0/path/windows/separator.ts": "ae21f27015f10510ed1ac4a0ba9c4c9c967cbdd9d9e776a3e4967553c397bd5d", + "https://deno.land/std@0.205.0/path/windows/to_file_url.ts": "8e9ea9e1ff364aa06fa72999204229952d0a279dbb876b7b838b2b2fea55cce3", + "https://deno.land/std@0.205.0/path/windows/to_namespaced_path.ts": "e0f4d4a5e77f28a5708c1a33ff24360f35637ba6d8f103d19661255ef7bfd50d", + "https://deno.land/std@0.224.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975", + "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834", + "https://deno.land/std@0.224.0/assert/assert_almost_equals.ts": "9e416114322012c9a21fa68e187637ce2d7df25bcbdbfd957cd639e65d3cf293", + "https://deno.land/std@0.224.0/assert/assert_array_includes.ts": "14c5094471bc8e4a7895fc6aa5a184300d8a1879606574cb1cd715ef36a4a3c7", + "https://deno.land/std@0.224.0/assert/assert_equals.ts": "3bbca947d85b9d374a108687b1a8ba3785a7850436b5a8930d81f34a32cb8c74", + "https://deno.land/std@0.224.0/assert/assert_exists.ts": "43420cf7f956748ae6ed1230646567b3593cb7a36c5a5327269279c870c5ddfd", + "https://deno.land/std@0.224.0/assert/assert_false.ts": "3e9be8e33275db00d952e9acb0cd29481a44fa0a4af6d37239ff58d79e8edeff", + "https://deno.land/std@0.224.0/assert/assert_greater.ts": "5e57b201fd51b64ced36c828e3dfd773412c1a6120c1a5a99066c9b261974e46", + "https://deno.land/std@0.224.0/assert/assert_greater_or_equal.ts": "9870030f997a08361b6f63400273c2fb1856f5db86c0c3852aab2a002e425c5b", + "https://deno.land/std@0.224.0/assert/assert_instance_of.ts": "e22343c1fdcacfaea8f37784ad782683ec1cf599ae9b1b618954e9c22f376f2c", + "https://deno.land/std@0.224.0/assert/assert_is_error.ts": "f856b3bc978a7aa6a601f3fec6603491ab6255118afa6baa84b04426dd3cc491", + "https://deno.land/std@0.224.0/assert/assert_less.ts": "60b61e13a1982865a72726a5fa86c24fad7eb27c3c08b13883fb68882b307f68", + "https://deno.land/std@0.224.0/assert/assert_less_or_equal.ts": "d2c84e17faba4afe085e6c9123a63395accf4f9e00150db899c46e67420e0ec3", + "https://deno.land/std@0.224.0/assert/assert_match.ts": "ace1710dd3b2811c391946954234b5da910c5665aed817943d086d4d4871a8b7", + "https://deno.land/std@0.224.0/assert/assert_not_equals.ts": "78d45dd46133d76ce624b2c6c09392f6110f0df9b73f911d20208a68dee2ef29", + "https://deno.land/std@0.224.0/assert/assert_not_instance_of.ts": "3434a669b4d20cdcc5359779301a0588f941ffdc2ad68803c31eabdb4890cf7a", + "https://deno.land/std@0.224.0/assert/assert_not_match.ts": "df30417240aa2d35b1ea44df7e541991348a063d9ee823430e0b58079a72242a", + "https://deno.land/std@0.224.0/assert/assert_not_strict_equals.ts": "37f73880bd672709373d6dc2c5f148691119bed161f3020fff3548a0496f71b8", + "https://deno.land/std@0.224.0/assert/assert_object_match.ts": "411450fd194fdaabc0089ae68f916b545a49d7b7e6d0026e84a54c9e7eed2693", + "https://deno.land/std@0.224.0/assert/assert_rejects.ts": "4bee1d6d565a5b623146a14668da8f9eb1f026a4f338bbf92b37e43e0aa53c31", + "https://deno.land/std@0.224.0/assert/assert_strict_equals.ts": "b4f45f0fd2e54d9029171876bd0b42dd9ed0efd8f853ab92a3f50127acfa54f5", + "https://deno.land/std@0.224.0/assert/assert_string_includes.ts": "496b9ecad84deab72c8718735373feb6cdaa071eb91a98206f6f3cb4285e71b8", + "https://deno.land/std@0.224.0/assert/assert_throws.ts": "c6508b2879d465898dab2798009299867e67c570d7d34c90a2d235e4553906eb", + "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917", + "https://deno.land/std@0.224.0/assert/equal.ts": "bddf07bb5fc718e10bb72d5dc2c36c1ce5a8bdd3b647069b6319e07af181ac47", + "https://deno.land/std@0.224.0/assert/fail.ts": "0eba674ffb47dff083f02ced76d5130460bff1a9a68c6514ebe0cdea4abadb68", + "https://deno.land/std@0.224.0/assert/mod.ts": "48b8cb8a619ea0b7958ad7ee9376500fe902284bb36f0e32c598c3dc34cbd6f3", + "https://deno.land/std@0.224.0/assert/unimplemented.ts": "8c55a5793e9147b4f1ef68cd66496b7d5ba7a9e7ca30c6da070c1a58da723d73", + "https://deno.land/std@0.224.0/assert/unreachable.ts": "5ae3dbf63ef988615b93eb08d395dda771c96546565f9e521ed86f6510c29e19", + "https://deno.land/std@0.224.0/fmt/colors.ts": "508563c0659dd7198ba4bbf87e97f654af3c34eb56ba790260f252ad8012e1c5", + "https://deno.land/std@0.224.0/internal/diff.ts": "6234a4b493ebe65dc67a18a0eb97ef683626a1166a1906232ce186ae9f65f4e6", + "https://deno.land/std@0.224.0/internal/format.ts": "0a98ee226fd3d43450245b1844b47003419d34d210fa989900861c79820d21c2", + "https://deno.land/std@0.224.0/internal/mod.ts": "534125398c8e7426183e12dc255bb635d94e06d0f93c60a297723abe69d3b22e", + "https://deno.land/std@0.84.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.84.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", + "https://deno.land/std@0.84.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", + "https://deno.land/std@0.84.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", + "https://deno.land/std@0.84.0/path/_util.ts": "f4fa69aa3cbbd8568763bfc43c7236875015ba343602d8bafd332b4b4243681b", + "https://deno.land/std@0.84.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", + "https://deno.land/std@0.84.0/path/glob.ts": "4a524c1c9da3e79a9fdabdc6e850cd9e41bdf31e442856ffa19c5b123268ca95", + "https://deno.land/std@0.84.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.84.0/path/posix.ts": "1408f8ba482a4dc5fc0a7cd7be28bbbff9608d2b3b5ffdcf288ae1228d959add", + "https://deno.land/std@0.84.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", + "https://deno.land/std@0.84.0/path/win32.ts": "6ca052f54500f00cd7a5172fde62900626ab620dcd5bdcf4e6f5695d001ddef6", + "https://deno.land/std@0.99.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.99.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", + "https://deno.land/std@0.99.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", + "https://deno.land/std@0.99.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", + "https://deno.land/std@0.99.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", + "https://deno.land/std@0.99.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", + "https://deno.land/std@0.99.0/path/glob.ts": "314ad9ff263b895795208cdd4d5e35a44618ca3c6dd155e226fb15d065008652", + "https://deno.land/std@0.99.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.99.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b", + "https://deno.land/std@0.99.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", + "https://deno.land/std@0.99.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", + "https://deno.land/x/media_types@v2.7.1/db.ts": "1d95aa3fc1fe076638550640609394f0e157b18b430800e419aa7ece5c151d9c", + "https://deno.land/x/media_types@v2.7.1/deps.ts": "cd4c31e4b5ed8c4d8c61bd2fb38a82d68d3fd2dcf6d43f22511cbe6d9d310e51", + "https://deno.land/x/media_types@v2.7.1/mod.ts": "d63583b978d32eff8b76e1ae5d83cba2fb27baa90cc1bcb0ad15a06122ea8c19", + "https://deno.land/x/static_files@1.1.6/mod.ts": "8a9bb05599e53864c54eb22931fe98507818517e0d69f26e099a1d8f4ef2b638", + "https://deno.land/x/static_files@1.1.6/src/deps.ts": "fb62be7a780339157bf692a619d6d02ea9662490deca275f488f9f9db917fc4a", + "https://deno.land/x/static_files@1.1.6/src/types.ts": "ef201288626294e9e1b8ee85cdfe2cdfb282e4d78af445df1726050dfa0c0988", + "https://deno.land/x/static_files@1.1.6/src/utils.ts": "9e6172dc97fed01e70a6b063c5afff40e20fe726b3bae0c5f0a962bad74b7107", + "https://deno.land/x/vento@v0.9.1/deps.ts": "1fb4acd6b3b6261c308280b09e8feadac7b0fac1e01bd0e0f1e75527a2181a52", + "https://deno.land/x/vento@v0.9.1/mod.ts": "ab690911075158ee3762bd7aefe209cdcb6ead7b492f14b0693d7025244db8e6", + "https://deno.land/x/vento@v0.9.1/plugins/echo.ts": "f7c064fb6d34b29852f46f6e01583ed87656dcbbc5cae51c8f29198d6951d0cf", + "https://deno.land/x/vento@v0.9.1/plugins/escape.ts": "8115ec84c84c13811f4a43263b8954e912df94df6565d6ff9ce7faea7daa50be", + "https://deno.land/x/vento@v0.9.1/plugins/export.ts": "ef54811ed0205aaeef6ad09557c94b8ae98e1457234898da5a1c5461a7dcf424", + "https://deno.land/x/vento@v0.9.1/plugins/for.ts": "6313e139a23ed17ca8b0852031f8d9e11aeb7520b228e68b9233418d25745414", + "https://deno.land/x/vento@v0.9.1/plugins/function.ts": "cdf610a98493e4a093c53473abdad7d47cbcff40aa8362d280e39910620cb8d6", + "https://deno.land/x/vento@v0.9.1/plugins/if.ts": "9de295f8675cacaec7866ad21068b6b089bfcadf72d3c62e1df50ca378c04279", + "https://deno.land/x/vento@v0.9.1/plugins/import.ts": "406204ab9d785db206da5d5cbcffa9a111cef2a39a19574e630cdea89b0691c5", + "https://deno.land/x/vento@v0.9.1/plugins/include.ts": "a9c65ce90354766220c0c9f7b21ea2db97bed99d9ffbe28f8a5ac035d488b163", + "https://deno.land/x/vento@v0.9.1/plugins/js.ts": "2c50d60061e9c5b6280a145266e617181534b8767e91127d59d5cf5febdcfb03", + "https://deno.land/x/vento@v0.9.1/plugins/layout.ts": "b9970b762ba73cf5605e63e585792803a48e326621c6cb2ec216502ba21a90cd", + "https://deno.land/x/vento@v0.9.1/plugins/set.ts": "016235a906f99cbfab78d29dfdfe8ca0925db7a46458fd873adacd0d7c6ed82d", + "https://deno.land/x/vento@v0.9.1/plugins/unescape.ts": "946512835a409815d6ad98ac4529440e9a368f42ca499791d0f25ee0ecc4c4d6", + "https://deno.land/x/vento@v0.9.1/src/environment.ts": "9c28fbf05176297adb93fc688711125b295c69089554d4211cd38a5b04028ec5", + "https://deno.land/x/vento@v0.9.1/src/loader.ts": "eb01b0dca7ea8bcdcdfd30b1f90f2fad28fb7f2cfd943900322a85bfaa86130c", + "https://deno.land/x/vento@v0.9.1/src/tokenizer.ts": "e9918ac58f941e048fe08cea10e65fb6e19c00fe7ed31fb050663445f11c6e9d", + "https://esm.sh/lodash-es@4.17.21": "460848e64379750386465df2bfcbe530dc5be584cabb39816e0dec105e5f9af2", + "https://esm.sh/v135/lodash-es@4.17.21/denonext/lodash-es.mjs": "ca6d37e6a1271d1bd8920da5ff11f7d05465f5d7961d5d09b44db331838981d7" + } +} diff --git a/deploy b/deploy new file mode 100755 index 0000000..1135f20 --- /dev/null +++ b/deploy @@ -0,0 +1 @@ +exec deno run -A https://deno.land/x/deploy/deployctl.ts deploy --prod --project=phenix server.ts diff --git a/my-template.vto b/my-template.vto new file mode 100644 index 0000000..3d6eca7 --- /dev/null +++ b/my-template.vto @@ -0,0 +1 @@ +hello {{ title }} diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..946fa07 --- /dev/null +++ b/server.ts @@ -0,0 +1,218 @@ +import { Application } from "jsr:@oak/oak/application"; +import { Router } from "jsr:@oak/oak/router"; +import { GameService } from "./server/game-service.ts"; +import { Game } from "./server/types.ts"; +import staticFiles from "https://deno.land/x/static_files@1.1.6/mod.ts"; +import vento from "https://deno.land/x/vento@v0.9.1/mod.ts"; +import { LoginService } from "./server/login-service.ts"; + +const env = vento(); +setInterval(() => env.cache.clear(), 1000); +const gameService = new GameService(await Deno.openKv()); +const loginService = LoginService.officialLoginService(); + +const router = new Router(); + +router.get("/", async (ctx) => { + const template = await env.load("templates/home.vto"); + const result = await template({ tab: "home" }); + ctx.response.body = result.content; +}); + +router.get("/calendrier", async (ctx) => { + const template = await env.load("templates/calendrier.vto"); + const result = await template({ + tab: "calendrier", + }); + ctx.response.body = result.content; +}); + +router.get("/nouvelles", async (ctx) => { + const template = await env.load("templates/nouvelles.vto"); + const result = await template({ tab: "nouvelles" }); + ctx.response.body = result.content; +}); + +router.get("/contact", async (ctx) => { + const template = await env.load("templates/contact.vto"); + const result = await template({ tab: "contact" }); + ctx.response.body = result.content; +}); + +router.get("/reglement", async (ctx) => { + const template = await env.load("templates/reglement.vto"); + const result = await template({ tab: "reglement" }); + ctx.response.body = result.content; +}); + +router.get("/login", async (ctx) => { + const username = ctx.request.url.searchParams.get("username") || ""; + const password = ctx.request.url.searchParams.get("password") || ""; + + if (!(await loginService.validateCredentials(username, password))) { + ctx.response.status = 403; + return; + } + await loginService.login(ctx); + ctx.response.redirect("/membre/games-editor/today"); +}); + +const memberRouter = new Router(); + +memberRouter.use(async (ctx, next) => { + const isLoggedIn = await loginService.isLoggedIn(ctx); + if (ctx.request.url.pathname !== "/membre" && !isLoggedIn) { + ctx.response.redirect("/membre"); + return; + } + ctx.params.isLoggedIn = isLoggedIn; + await next(); +}); + +memberRouter.get("/", async (ctx) => { + const template = await env.load("templates/membre.vto"); + const result = await template({ + tab: "membre", + isLoggedIn: ctx.params.isLoggedIn, + }); + ctx.response.body = result.content; +}); + +function today(): Date { + const date = new Date().toLocaleDateString("fr-CA", { + timeZone: "America/New_York", + }); + return new Date(date); +} + +memberRouter.get("/games-editor/today", async (ctx) => { + const template = await env.load("templates/partials/games-editor.vto"); + const games = await gameService.getAllGames(); + const lastGameDay = games + .map((g) => g.date) + .filter((d) => new Date(d) <= today()) + .sort() + .reverse()[0]; + + const result = await template({ + tab: "membre", + selectedYear: null, + isToday: true, + games: games.filter((g) => g.date === lastGameDay), + years: [...new Set(games.map((x) => x.year))].sort().reverse(), + }); + ctx.response.body = result.content; +}); + +memberRouter.get("/games-editor/:year", async (ctx) => { + const template = await env.load("templates/partials/games-editor.vto"); + const games = await gameService.getAllGames(); + const selectedYear = parseInt(ctx.params.year); + const result = await template({ + tab: "membre", + selectedYear: selectedYear, + games: games.filter((g) => g.year === selectedYear), + years: [...new Set(games.map((x) => x.year))].sort().reverse(), + }); + ctx.response.body = result.content; +}); + +memberRouter.get("/new-game-editor", async (ctx) => { + const template = await env.load("templates/partials/new-games-editor.vto"); + const result = await template({ + tab: "membre", + }); + ctx.response.body = result.content; +}); + +memberRouter.post("/new-game", async (ctx) => { + const payload = await ctx.request.body.form(); + const preGame = { + date: payload.get("game-date"), + time: payload.get("game-time"), + away: payload.get("away-team"), + home: payload.get("home-team"), + }; + const [game, error] = await gameService.createNewGame(preGame); + + if (error !== "") { + const template = await env.load("templates/partials/new-game-error.vto"); + const result = await template({ + tab: "membre", + error: error, + }); + ctx.response.status = 500; + ctx.response.body = result.content; + return; + } + + const template = await env.load("templates/partials/single-game-editor.vto"); + const result = await template({ + tab: "membre", + game: game, + }); + ctx.response.headers.set("game-id", game?.id ?? ""); + ctx.response.body = result.content; +}); + +memberRouter.delete("/games/:gameId", async (ctx) => { + if (!(await loginService.isLoggedIn(ctx))) { + ctx.response.redirect("/membre"); + return; + } + const success = await gameService.deleteGameById(ctx.params.gameId); + ctx.response.body = `${success}`; +}); + +memberRouter.post("/games/:gameId", async (ctx) => { + if (!(await loginService.isLoggedIn(ctx))) { + ctx.response.redirect("/membre"); + return; + } + const payload = await ctx.request.body.form(); + let preGame = { + awayScore: payload.get("away-score") ?? null, + homeScore: payload.get("home-score") ?? null, + rain: payload.get("game-type") === "rain", + practice: payload.get("game-type") === "practice", + }; + + preGame = Object.fromEntries( + Object.entries(preGame).filter(([_, v]) => v !== null), + ) as Partial; + + const success = await gameService.updateGame(ctx.params.gameId, preGame); + ctx.response.body = success + ? `` + : ``; +}); + +const apiRouter = new Router(); + +apiRouter.get("/results/:year.json", async (ctx) => { + ctx.response.json = true; + const games = await gameService.getAllGames(); + ctx.response.body = games + .filter((g) => g.year == ctx.params.year) + .map((g) => { + g[g.home] = parseInt(g.homeScore); + g[g.away] = parseInt(g.awayScore); + return g; + }); +}); + +apiRouter.get("/available-years.json", async (ctx) => { + ctx.response.json = true; + const games = await gameService.getAllGames(); + ctx.response.body = [...new Set(games.map((g) => g.year))]; +}); + +router.use("/membre", memberRouter.routes()); +router.use("/api", apiRouter.routes()); + +const app = new Application(); +app.use(router.routes()); + +app.use(staticFiles("static", { brotli: true, fetch: true })); + +await app.listen({ port: 8000 }); diff --git a/server/game-service.ts b/server/game-service.ts new file mode 100644 index 0000000..80bfdd3 --- /dev/null +++ b/server/game-service.ts @@ -0,0 +1,323 @@ +import { Game, PreGame } from "./types.ts"; +import { + assertEquals, + assertNotEquals, +} from "https://deno.land/std@0.224.0/assert/mod.ts"; + +type GamePrimaryKey = ["phenix", "games", string]; + +type date = [number, number, number]; +type time = [number, number]; +type DateIndex = ["phenix", "indexes", "game-date", ...date, ...time]; + +export class GameService { + readonly kv: Deno.Kv; + private readonly DATE_VALIDATOR = + /^(?\d{4})-(?\d{1,2})-(?\d{1,2})$/; + private readonly TIME_VALIDATOR = /^(?\d{1,2})(:|h)(?\d{1,2})$/; + private readonly VALID_TEAMS: string[] = [ + "jaune", + "rouge", + "bleu", + "gris", + "vert", + "noir", + "orange", + "mauve", + ]; + + constructor(kv: Deno.Kv) { + this.kv = kv; + } + + private chronologicalGameOrder(game1: Game, game2: Game): number { + if (game1.date < game2.date) { + return 1; + } + if (game1.date > game2.date) { + return -1; + } + if (game1.time < game2.time) { + return 1; + } + if (game1.time > game2.time) { + return -1; + } + return 0; + } + + async getAllGames(): Promise { + const ite = this.kv.list({ prefix: ["phenix", "games"] }); + return (await Array.fromAsync(ite)) + .map((e) => e.value) + .sort(this.chronologicalGameOrder); + } + + private gamePrimaryKey(id: string): GamePrimaryKey { + return ["phenix", "games", id]; + } + + private dateIndex(date: string, time: string): DateIndex | null { + let destructedDate = this.DATE_VALIDATOR.exec(date)?.groups; + let destructedTime = this.TIME_VALIDATOR.exec(time)?.groups; + + if (!destructedDate || !destructedTime) { + return null; + } + + return [ + "phenix", + "indexes", + "game-date", + parseInt(destructedDate.year), + parseInt(destructedDate.month), + parseInt(destructedDate.day), + parseInt(destructedTime.hour), + parseInt(destructedTime.minute), + ]; + } + + private cleanTime(raw: string): string { + const groups = this.TIME_VALIDATOR.exec(raw)!.groups!; + return `${groups.hour.padStart(2, "0")}:${groups.minute.padStart(2, "0")}`; + } + + private cleanDate(raw: string): string { + const groups = this.DATE_VALIDATOR.exec(raw)!.groups!; + return `${groups.year}-${groups.month.padStart(2, "0")}-${groups.day.padStart(2, "0")}`; + } + + private extractYearFromDate(date: string): number { + return parseInt(this.DATE_VALIDATOR.exec(date)!.groups!.year); + } + + private createGame(preGame: PreGame): Game { + const ret = { + ...preGame, + id: crypto.randomUUID(), + practice: false, + rain: false, + year: this.extractYearFromDate(preGame.date), + homeScore: null, + awayScore: null, + }; + ret.time = this.cleanTime(ret.time); + ret.date = this.cleanDate(ret.date); + + return ret; + } + + private validatePregate(preGame: PreGame): string { + if (!this.DATE_VALIDATOR.test(preGame.date)) { + return `Invalide date format ${preGame.date}`; + } + if (!this.TIME_VALIDATOR.test(preGame.time)) { + return `Invalide time format ${preGame.time}`; + } + if (!this.VALID_TEAMS.includes(preGame.away)) { + return `Invalide away format ${preGame.away}`; + } + if (!this.VALID_TEAMS.includes(preGame.home)) { + return `Invalide home format ${preGame.home}`; + } + if (preGame.home === preGame.away) { + return `Home and away teams must be different (received ${preGame.home} for both)`; + } + return ""; + } + + async createNewGame(preGame: PreGame): Promise<[Game | null, string]> { + if (this.validatePregate(preGame) !== "") { + return [null, this.validatePregate(preGame)]; + } + const game = this.createGame(preGame); + const dateIndex = this.dateIndex(game.date, game.time); + if (!dateIndex) { + return [null, "Cound not parse date or time"]; + } + const precondition = await this.kv.get(dateIndex); + if (precondition.value !== null) { + return [null, "game already exists " + precondition.value]; + } + + const res = await this.kv + .atomic() + .check(precondition) + .set(this.gamePrimaryKey(game.id), game) + .set(dateIndex, game.id) + .commit(); + if (!res.ok) { + return [null, "Transaction failed"]; + } + + return [game, ""]; + } + + async getGameById(id: string): Promise { + const res = await this.kv.get(this.gamePrimaryKey(id)); + return res.value; + } + + async deleteGameById(id: string): Promise { + const precond = await this.kv.get(this.gamePrimaryKey(id)); + if (precond.value === null) { + return false; + } + + const res = await this.kv + .atomic() + .check(precond) + .delete(this.gamePrimaryKey(precond.value.id)) + .delete(this.dateIndex(precond.value.date, precond.value.time)!) + .commit(); + return res.ok; + } + + async updateGame(id: string, partial: Partial): Promise { + delete partial.id; + const precond = await this.kv.get(this.gamePrimaryKey(id)); + if (precond.value === null) { + return false; + } + const res = await this.kv + .atomic() + .check(precond) + .delete(this.gamePrimaryKey(precond.value.id)) + .delete(this.dateIndex(precond.value.date, precond.value.time)!) + .set( + this.dateIndex(precond.value.date, precond.value.time)!, + precond.value.id, + ) + .set(this.gamePrimaryKey(precond.value.id), { + ...precond.value, + ...partial, + }) + .commit(); + return res.ok; + } +} + +Deno.test("saving simple games", async (t) => { + const kv = await Deno.openKv(); + const service = new GameService(kv); + + async function deleteAllKeys() { + const keys = kv.list({ prefix: [] }); + for await (const entry of keys) { + await kv.delete(entry.key); + } + } + + function validePreGame(seed: number): PreGame { + let year = ((645 * seed + 162) % 10000) + 1; + let month = ((335 * seed + 71) % 12) + 1; + let day = ((72625 * seed + 176) % 28) + 1; + return { + date: `${(year + "").padStart(4, "0")}-${(month + "").padStart(2, "0")}-${(day + "").padStart(2, "0")}`, + time: "18:45", + away: "jaune", + home: "rouge", + }; + } + + await deleteAllKeys(); + + await t.step("creating games", async () => { + const preGame = validePreGame(7276); + const [game, error] = await service.createNewGame(preGame); + assertEquals(error, ""); + const ret = await service.getGameById(game!.id); + assertEquals(game, ret); + }); + + await deleteAllKeys(); + + await t.step("creating games with old date format", async () => { + const preGame = validePreGame(7276); + preGame.date = "2017-8-5"; + const [game, error] = await service.createNewGame(preGame); + assertEquals(error, ""); + assertEquals(game?.date, "2017-08-05"); + }); + + await deleteAllKeys(); + + await t.step("creating games with old time format", async () => { + const preGame = validePreGame(7276); + preGame.time = "9:00"; + const [game, error] = await service.createNewGame(preGame); + assertEquals(error, ""); + assertEquals(game?.time, "09:00"); + }); + + await deleteAllKeys(); + + await t.step( + "saving two games in the same timeslot should fail", + async () => { + const preGame = validePreGame(7276); + let [_, error] = await service.createNewGame(preGame); + assertEquals(error, ""); + [_, error] = await service.createNewGame(preGame); + assertNotEquals(error, ""); + }, + ); + + await deleteAllKeys(); + + await t.step("saving games with bad fields", async () => { + let i = 0; + for (const key of Object.keys(validePreGame(7276))) { + let [_, error] = await service.createNewGame({ + ...validePreGame(7262 + i), + [key]: `Broken ${key}`, + }); + assertNotEquals(error, ""); + i++; + } + }); + + await t.step("saving games with the same home and away teams", async () => { + const preGame = validePreGame(7276); + preGame.home = preGame.away; + let [_, error] = await service.createNewGame(preGame); + assertNotEquals(error, ""); + }); + + await deleteAllKeys(); + + await t.step("listing games", async () => { + for (let i = 0; i < 10; i++) { + await service.createNewGame(validePreGame(666 + i)); + } + assertEquals((await service.getAllGames()).length, 10); + }); + + await deleteAllKeys(); + + await t.step("deleting games", async () => { + let [game, error] = await service.createNewGame(validePreGame(8992)); + await service.deleteGameById(game!.id); + assertEquals((await service.getAllGames()).length, 0); + + [game, error] = await service.createNewGame(validePreGame(8992)); + assertEquals(error, ""); + }); + + await deleteAllKeys(); + + await t.step("updating game scores", async () => { + let [game, _] = await service.createNewGame(validePreGame(8992)); + const ret = await service.updateGame(game!.id, { + homeScore: 10, + awayScore: 32, + }); + assertEquals(ret, true); + game = await service.getGameById(game!.id); + assertEquals(game!.homeScore, 10); + assertEquals(game!.awayScore, 32); + }); + + await deleteAllKeys(); + await kv.close(); +}); diff --git a/server/login-service.ts b/server/login-service.ts new file mode 100644 index 0000000..21de93d --- /dev/null +++ b/server/login-service.ts @@ -0,0 +1,95 @@ +import { + assert, + assertFalse, +} from "https://deno.land/std@0.224.0/assert/mod.ts"; + +type User = { username: string; passwordHashWithSalt: string }; + +const officialUsers: User[] = [ + { + username: "marqueur", + passwordHashWithSalt: + "5603007580f73044864e7a0b66744f405406eaaf28fa514d724ccf11d010bd89:070b1a477e6a877d44f31961dc0402a9f3258465eed73ab6a9110c461ac68714", + }, +]; + +export class LoginService { + private readonly users: User[]; + + constructor(users: User[]) { + this.users = users; + } + + public static officialLoginService(): LoginService { + return new LoginService(officialUsers); + } + + private async hashMessage(message: string): Promise { + const msgUint8 = new TextEncoder().encode(message); // encode as (utf-8) Uint8Array + const hashBuffer = await crypto.subtle.digest("SHA-256", msgUint8); // hash the message + const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array + const hashHex = hashArray + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); // convert bytes to hex string + return hashHex; + } + + private async shittyHmac(message: string, salt: string): Promise { + const h1 = await this.hashMessage(message + salt); + const h2 = await this.hashMessage(salt + message); + return await this.hashMessage(h1 + h2); + } + + async hashPassword(password: string): Promise { + const salt = await this.hashMessage(`${Math.random()}`); + const hash = await this.shittyHmac(password, salt); + return `${salt}:${hash}`; + } + + async verifyPassword( + password: string, + passwordHashWithSalt: string, + ): Promise { + const [passwordSalt, passwordHash] = passwordHashWithSalt.split(":"); + return passwordHash === (await this.shittyHmac(password, passwordSalt)); + } + + async validateCredentials( + username: string, + password: string, + ): Promise { + for (const user of this.users) { + if (user.username === username) { + return this.verifyPassword(password, user.passwordHashWithSalt); + } + } + return false; + } + + async login(ctx: any): Promise { + const nDays = 90; + const maxAgesInSecond = nDays * 24 * 3600; + const maxUnixEpoch = Math.floor(Date.now() / 1000) + maxAgesInSecond; + + await ctx.cookies.set("phenix-session", `${maxUnixEpoch}`, { + maxAge: maxAgesInSecond, + }); + } + + async isLoggedIn(ctx: any): Promise { + const expiration = await ctx.cookies.get("phenix-session"); + if (!expiration || !/^\d+$/.test(expiration)) { + return false; + } + return Date.now() < parseInt(expiration) * 1000; + } +} + +Deno.test("login service", async (t) => { + await t.step("hashing password", async () => { + const service = new LoginService([]); + const passwordHashWithSalt = await service.hashPassword("qwerty"); + assert(await service.verifyPassword("qwerty", passwordHashWithSalt)); + assertFalse(await service.verifyPassword("ytrewq", passwordHashWithSalt)); + }); +}); diff --git a/server/types.ts b/server/types.ts new file mode 100644 index 0000000..3a34157 --- /dev/null +++ b/server/types.ts @@ -0,0 +1,19 @@ +export type Game = { + id: string; + date: string; + time: string; + home: string; + away: string; + year: number; + homeScore: number | null; + awayScore: number | null; + practice: boolean; + rain: boolean; +}; + +export type PreGame = { + date: string; + time: string; + home: string; + away: string; +}; diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..8811d57 --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,8413 @@ +@charset "UTF-8"; +/* ======================================================================== + Component: Base + ========================================================================== */ +/* + * 1. Normalize default `font-family` and set `font-size` to support `rem` units + * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom + * 3. Style + */ +html { + /* 1 */ + font: normal 14px / 20px "Helvetica Neue", Helvetica, Arial, sans-serif; + /* 2 */ + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + /* 3 */ + background: #fff; + color: #444; } + +/* + * Removes default margin. + */ +body { + margin: 0; } + +/* Links + ========================================================================== */ +/* + * Remove the gray background color from active links in IE 10. + */ +a { + background: transparent; } + +/* + * Improve readability of focused elements when they are also in an active/hover state. + */ +a:active, +a:hover { + outline: 0; } + +/* + * Style + */ +a, +.uk-link { + color: #07D; + text-decoration: none; + cursor: pointer; } + +a:hover, +.uk-link:hover { + color: #059; + text-decoration: underline; } + +/* Text-level semantics + ========================================================================== */ +/* + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ +abbr[title] { + border-bottom: 1px dotted; } + +/* + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ +b, +strong { + font-weight: bold; } + +/* + * 1. Address odd `em`-unit font size rendering in all browsers. + * 2. Consolas has a better baseline in running text compared to `Courier` + */ +:not(pre) > code, +:not(pre) > kbd, +:not(pre) > samp { + /* 1 */ + font-size: 12px; + /* 2 */ + font-family: Consolas, monospace, serif; + /* 3 */ + color: #D05; + white-space: nowrap; } + +/* + * Emphasize + */ +em { + color: #D05; } + +/* + * Insert + */ +ins { + background: #ffa; + color: #444; + text-decoration: none; } + +/* + * Mark + * Note: Addresses styling not present in IE 8/9. + */ +mark { + background: #ffa; + color: #444; } + +/* + * Quote + */ +q { + font-style: italic; } + +/* + * Addresses inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; } + +/* + * Prevents `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +/* Embedded content + ========================================================================== */ +/* + * Remove the gap between embedded content and the bottom of their containers. + */ +audio, +canvas, +iframe, +img, +svg, +video { + vertical-align: middle; } + +/* + * Responsiveness + * 1. Sets a maximum width relative to the parent and auto scales the height + * 2. Corrects `max-width` behavior if padding and border are used + */ +audio, +canvas, +img, +svg, +video { + /* 1 */ + max-width: 100%; + height: auto; + /* 2 */ + box-sizing: border-box; } + +/* + * Preserve original dimensions + */ +.uk-img-preserve, +.uk-img-preserve audio, +.uk-img-preserve canvas, +.uk-img-preserve img, +.uk-img-preserve svg, +.uk-img-preserve video { + max-width: none; } + +/* + * Remove border when inside `a` element in IE 8/9/10. + */ +img { + border: 0; } + +/* + * Correct overflow not hidden in IE 9/10/11. + */ +svg:not(:root) { + overflow: hidden; } + +/* Block elements + ========================================================================== */ +/* + * Reset margin + */ +blockquote, +figure { + margin: 0; } + +/* + * Margins + */ +p, +ul, +ol, +dl, +blockquote, +pre, +address, +fieldset, +figure { + margin: 0 0 15px 0; } + +* + p, +* + ul, +* + ol, +* + dl, +* + blockquote, +* + pre, +* + address, +* + fieldset, +* + figure { + margin-top: 15px; } + +/* Headings + ========================================================================== */ +h1, h2, h3, h4, h5, h6 { + margin: 0 0 15px 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + color: #444; + text-transform: none; } + +/* + * Margins + */ +* + h1, +* + h2, +* + h3, +* + h4, +* + h5, +* + h6 { + margin-top: 25px; } + +/* + * Sizes + */ +h1, .uk-h1 { + font-size: 36px; + line-height: 42px; } + +h2, .uk-h2 { + font-size: 24px; + line-height: 30px; } + +h3, .uk-h3 { + font-size: 18px; + line-height: 24px; } + +h4, .uk-h4 { + font-size: 16px; + line-height: 22px; } + +h5, .uk-h5 { + font-size: 14px; + line-height: 20px; } + +h6, .uk-h6 { + font-size: 12px; + line-height: 18px; } + +/* Lists + ========================================================================== */ +ul, +ol { + padding-left: 30px; } + +/* + * Reset margin for nested lists + */ +ul > li > ul, +ul > li > ol, +ol > li > ol, +ol > li > ul { + margin: 0; } + +/* Description lists + ========================================================================== */ +dt { + font-weight: bold; } + +dd { + margin-left: 0; } + +/* Horizontal rules + ========================================================================== */ +/* + * 1. Address differences between Firefox and other browsers. + * 2. Style + */ +hr { + /* 1 */ + box-sizing: content-box; + height: 0; + /* 2 */ + margin: 15px 0; + border: 0; + border-top: 1px solid #ddd; } + +/* Address + ========================================================================== */ +address { + font-style: normal; } + +/* Blockquotes + ========================================================================== */ +blockquote { + padding-left: 15px; + border-left: 5px solid #ddd; + font-size: 16px; + line-height: 22px; + font-style: italic; } + +/* Preformatted text + ========================================================================== */ +/* + * 1. Contain overflow in all browsers. + */ +pre { + padding: 10px; + background: #f5f5f5; + font: 12px / 18px Consolas, monospace, serif; + color: #444; + -moz-tab-size: 4; + tab-size: 4; + /* 1 */ + overflow: auto; } + +/* Selection pseudo-element + ========================================================================== */ +::-moz-selection { + background: #39f; + color: #fff; + text-shadow: none; } + +::selection { + background: #39f; + color: #fff; + text-shadow: none; } + +/* HTML5 elements + ========================================================================== */ +/* + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +nav, +section, +summary { + display: block; } + +/* + * Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; } + +/* + * Prevent displaying `audio` without controls in Chrome, Safari and Opera + */ +audio:not([controls]) { + display: none; } + +/* + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. + */ +[hidden], +template { + display: none; } + +/* Iframe + ========================================================================== */ +iframe { + border: 0; } + +/* Fix viewport for IE10 snap mode + ========================================================================== */ +@media screen and (max-width: 400px) { + @-ms-viewport { + width: device-width; } } + +/* ======================================================================== + Component: Grid + ========================================================================== */ +/* + * 1. Makes grid more robust so that it can be used with other block elements like lists + */ +.uk-grid { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + /* 1 */ + margin: 0; + padding: 0; + list-style: none; } + +/* + * DEPRECATED + * Micro clearfix + * Can't use `table` because it creates a 1px gap when it becomes a flex item, only in Webkit + */ +.uk-grid:before, +.uk-grid:after { + content: ""; + display: block; + overflow: hidden; } + +.uk-grid:after { + clear: both; } + +/* + * Grid cell + * 1. Space is allocated solely based on content dimensions + * 2. Makes grid more robust so that it can be used with other block elements + * 3. DEPRECATED Using `float` to support IE9 + */ +.uk-grid > * { + /* 1 */ + -ms-flex: none; + -webkit-flex: none; + flex: none; + /* 2 */ + margin: 0; + /* 3 */ + float: left; } + +/* + * Remove margin from the last-child + */ +.uk-grid > * > :last-child { + margin-bottom: 0; } + +/* Grid gutter + ========================================================================== */ +/* + * Default gutter + */ +/* Horizontal */ +.uk-grid { + margin-left: -25px; } + +.uk-grid > * { + padding-left: 25px; } + +/* Vertical */ +.uk-grid + .uk-grid, +.uk-grid-margin, +.uk-grid > * > .uk-panel + .uk-panel { + margin-top: 25px; } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + /* Horizontal */ + .uk-grid { + margin-left: -35px; } + .uk-grid > * { + padding-left: 35px; } + /* Vertical */ + .uk-grid + .uk-grid, + .uk-grid-margin, + .uk-grid > * > .uk-panel + .uk-panel { + margin-top: 35px; } } + +/* + * Collapse gutter + */ +/* Horizontal */ +.uk-grid-collapse { + margin-left: 0; } + +.uk-grid-collapse > * { + padding-left: 0; } + +/* Vertical */ +.uk-grid-collapse + .uk-grid-collapse, +.uk-grid-collapse > .uk-grid-margin, +.uk-grid-collapse > * > .uk-panel + .uk-panel { + margin-top: 0; } + +/* + * Small gutter + */ +/* Horizontal */ +.uk-grid-small { + margin-left: -10px; } + +.uk-grid-small > * { + padding-left: 10px; } + +/* Vertical */ +.uk-grid-small + .uk-grid-small, +.uk-grid-small > .uk-grid-margin, +.uk-grid-small > * > .uk-panel + .uk-panel { + margin-top: 10px; } + +/* + * Medium gutter + */ +/* Horizontal */ +.uk-grid-medium { + margin-left: -25px; } + +.uk-grid-medium > * { + padding-left: 25px; } + +/* Vertical */ +.uk-grid-medium + .uk-grid-medium, +.uk-grid-medium > .uk-grid-margin, +.uk-grid-medium > * > .uk-panel + .uk-panel { + margin-top: 25px; } + +/* + * Large gutter + */ +/* Large screen and bigger */ +@media (min-width: 960px) { + /* Horizontal */ + .uk-grid-large { + margin-left: -35px; } + .uk-grid-large > * { + padding-left: 35px; } + /* Vertical */ + .uk-grid-large + .uk-grid-large, + .uk-grid-large-margin, + .uk-grid-large > * > .uk-panel + .uk-panel { + margin-top: 35px; } } + +/* Extra Large screens */ +@media (min-width: 1220px) { + /* Horizontal */ + .uk-grid-large { + margin-left: -50px; } + .uk-grid-large > * { + padding-left: 50px; } + /* Vertical */ + .uk-grid-large + .uk-grid-large, + .uk-grid-large-margin, + .uk-grid-large > * > .uk-panel + .uk-panel { + margin-top: 50px; } } + +/* Modifier: `uk-grid-divider` + ========================================================================== */ +/* + * Horizontal divider + * Only works with the default gutter. Does not work with gutter collapse, small or large. + * Does not work with `uk-push-*`, `uk-pull-*` and not if the columns float into the next row. + */ +.uk-grid-divider:not(:empty) { + margin-left: -25px; + margin-right: -25px; } + +.uk-grid-divider > * { + padding-left: 25px; + padding-right: 25px; } + +.uk-grid-divider > [class*='uk-width-1-']:not(.uk-width-1-1):nth-child(n+2), +.uk-grid-divider > [class*='uk-width-2-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-3-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-4-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-5-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-6-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-7-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-8-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-9-']:nth-child(n+2) { + border-left: 1px solid #ddd; } + +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-grid-divider > [class*='uk-width-medium-']:not(.uk-width-medium-1-1):nth-child(n+2) { + border-left: 1px solid #ddd; } } + +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-grid-divider > [class*='uk-width-large-']:not(.uk-width-large-1-1):nth-child(n+2) { + border-left: 1px solid #ddd; } } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + /* + * Large gutter + */ + .uk-grid-divider:not(:empty) { + margin-left: -35px; + margin-right: -35px; } + .uk-grid-divider > * { + padding-left: 35px; + padding-right: 35px; } + .uk-grid-divider:empty { + margin-top: 35px; + margin-bottom: 35px; } } + +/* + * Vertical divider + */ +.uk-grid-divider:empty { + margin-top: 25px; + margin-bottom: 25px; + border-top: 1px solid #ddd; } + +/* Match panels in grids + ========================================================================== */ +/* + * 1. Behave like a block element + */ +.uk-grid-match > * { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + /* 1 */ + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; } + +.uk-grid-match > * > * { + /* 1 */ + -ms-flex: none; + -webkit-flex: none; + flex: none; + box-sizing: border-box; + width: 100%; } + +/* Even grid cell widths + ========================================================================== */ +[class*='uk-grid-width'] > * { + box-sizing: border-box; + width: 100%; } + +.uk-grid-width-1-2 > * { + width: 50%; } + +.uk-grid-width-1-3 > * { + width: 33.333%; } + +.uk-grid-width-1-4 > * { + width: 25%; } + +.uk-grid-width-1-5 > * { + width: 20%; } + +.uk-grid-width-1-6 > * { + width: 16.666%; } + +.uk-grid-width-1-10 > * { + width: 10%; } + +.uk-grid-width-auto > * { + width: auto; } + +/* Phone landscape and bigger */ +@media (min-width: 480px) { + .uk-grid-width-small-1-1 > * { + width: 100%; } + .uk-grid-width-small-1-2 > * { + width: 50%; } + .uk-grid-width-small-1-3 > * { + width: 33.333%; } + .uk-grid-width-small-1-4 > * { + width: 25%; } + .uk-grid-width-small-1-5 > * { + width: 20%; } + .uk-grid-width-small-1-6 > * { + width: 16.666%; } + .uk-grid-width-small-1-10 > * { + width: 10%; } } + +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-grid-width-medium-1-1 > * { + width: 100%; } + .uk-grid-width-medium-1-2 > * { + width: 50%; } + .uk-grid-width-medium-1-3 > * { + width: 33.333%; } + .uk-grid-width-medium-1-4 > * { + width: 25%; } + .uk-grid-width-medium-1-5 > * { + width: 20%; } + .uk-grid-width-medium-1-6 > * { + width: 16.666%; } + .uk-grid-width-medium-1-10 > * { + width: 10%; } } + +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-grid-width-large-1-1 > * { + width: 100%; } + .uk-grid-width-large-1-2 > * { + width: 50%; } + .uk-grid-width-large-1-3 > * { + width: 33.333%; } + .uk-grid-width-large-1-4 > * { + width: 25%; } + .uk-grid-width-large-1-5 > * { + width: 20%; } + .uk-grid-width-large-1-6 > * { + width: 16.666%; } + .uk-grid-width-large-1-10 > * { + width: 10%; } } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-grid-width-xlarge-1-1 > * { + width: 100%; } + .uk-grid-width-xlarge-1-2 > * { + width: 50%; } + .uk-grid-width-xlarge-1-3 > * { + width: 33.333%; } + .uk-grid-width-xlarge-1-4 > * { + width: 25%; } + .uk-grid-width-xlarge-1-5 > * { + width: 20%; } + .uk-grid-width-xlarge-1-6 > * { + width: 16.666%; } + .uk-grid-width-xlarge-1-10 > * { + width: 10%; } } + +/* Sub-objects: `uk-width-*` + ========================================================================== */ +[class*='uk-width'] { + box-sizing: border-box; + width: 100%; } + +/* + * Widths + */ +/* Whole */ +.uk-width-1-1 { + width: 100%; } + +/* Halves */ +.uk-width-1-2, +.uk-width-2-4, +.uk-width-3-6, +.uk-width-5-10 { + width: 50%; } + +/* Thirds */ +.uk-width-1-3, +.uk-width-2-6 { + width: 33.333%; } + +.uk-width-2-3, +.uk-width-4-6 { + width: 66.666%; } + +/* Quarters */ +.uk-width-1-4 { + width: 25%; } + +.uk-width-3-4 { + width: 75%; } + +/* Fifths */ +.uk-width-1-5, +.uk-width-2-10 { + width: 20%; } + +.uk-width-2-5, +.uk-width-4-10 { + width: 40%; } + +.uk-width-3-5, +.uk-width-6-10 { + width: 60%; } + +.uk-width-4-5, +.uk-width-8-10 { + width: 80%; } + +/* Sixths */ +.uk-width-1-6 { + width: 16.666%; } + +.uk-width-5-6 { + width: 83.333%; } + +/* Tenths */ +.uk-width-1-10 { + width: 10%; } + +.uk-width-3-10 { + width: 30%; } + +.uk-width-7-10 { + width: 70%; } + +.uk-width-9-10 { + width: 90%; } + +/* Phone landscape and bigger */ +@media (min-width: 480px) { + /* Whole */ + .uk-width-small-1-1 { + width: 100%; } + /* Halves */ + .uk-width-small-1-2, + .uk-width-small-2-4, + .uk-width-small-3-6, + .uk-width-small-5-10 { + width: 50%; } + /* Thirds */ + .uk-width-small-1-3, + .uk-width-small-2-6 { + width: 33.333%; } + .uk-width-small-2-3, + .uk-width-small-4-6 { + width: 66.666%; } + /* Quarters */ + .uk-width-small-1-4 { + width: 25%; } + .uk-width-small-3-4 { + width: 75%; } + /* Fifths */ + .uk-width-small-1-5, + .uk-width-small-2-10 { + width: 20%; } + .uk-width-small-2-5, + .uk-width-small-4-10 { + width: 40%; } + .uk-width-small-3-5, + .uk-width-small-6-10 { + width: 60%; } + .uk-width-small-4-5, + .uk-width-small-8-10 { + width: 80%; } + /* Sixths */ + .uk-width-small-1-6 { + width: 16.666%; } + .uk-width-small-5-6 { + width: 83.333%; } + /* Tenths */ + .uk-width-small-1-10 { + width: 10%; } + .uk-width-small-3-10 { + width: 30%; } + .uk-width-small-7-10 { + width: 70%; } + .uk-width-small-9-10 { + width: 90%; } } + +/* Tablet and bigger */ +@media (min-width: 768px) { + /* Whole */ + .uk-width-medium-1-1 { + width: 100%; } + /* Halves */ + .uk-width-medium-1-2, + .uk-width-medium-2-4, + .uk-width-medium-3-6, + .uk-width-medium-5-10 { + width: 50%; } + /* Thirds */ + .uk-width-medium-1-3, + .uk-width-medium-2-6 { + width: 33.333%; } + .uk-width-medium-2-3, + .uk-width-medium-4-6 { + width: 66.666%; } + /* Quarters */ + .uk-width-medium-1-4 { + width: 25%; } + .uk-width-medium-3-4 { + width: 75%; } + /* Fifths */ + .uk-width-medium-1-5, + .uk-width-medium-2-10 { + width: 20%; } + .uk-width-medium-2-5, + .uk-width-medium-4-10 { + width: 40%; } + .uk-width-medium-3-5, + .uk-width-medium-6-10 { + width: 60%; } + .uk-width-medium-4-5, + .uk-width-medium-8-10 { + width: 80%; } + /* Sixths */ + .uk-width-medium-1-6 { + width: 16.666%; } + .uk-width-medium-5-6 { + width: 83.333%; } + /* Tenths */ + .uk-width-medium-1-10 { + width: 10%; } + .uk-width-medium-3-10 { + width: 30%; } + .uk-width-medium-7-10 { + width: 70%; } + .uk-width-medium-9-10 { + width: 90%; } } + +/* Desktop and bigger */ +@media (min-width: 960px) { + /* Whole */ + .uk-width-large-1-1 { + width: 100%; } + /* Halves */ + .uk-width-large-1-2, + .uk-width-large-2-4, + .uk-width-large-3-6, + .uk-width-large-5-10 { + width: 50%; } + /* Thirds */ + .uk-width-large-1-3, + .uk-width-large-2-6 { + width: 33.333%; } + .uk-width-large-2-3, + .uk-width-large-4-6 { + width: 66.666%; } + /* Quarters */ + .uk-width-large-1-4 { + width: 25%; } + .uk-width-large-3-4 { + width: 75%; } + /* Fifths */ + .uk-width-large-1-5, + .uk-width-large-2-10 { + width: 20%; } + .uk-width-large-2-5, + .uk-width-large-4-10 { + width: 40%; } + .uk-width-large-3-5, + .uk-width-large-6-10 { + width: 60%; } + .uk-width-large-4-5, + .uk-width-large-8-10 { + width: 80%; } + /* Sixths */ + .uk-width-large-1-6 { + width: 16.666%; } + .uk-width-large-5-6 { + width: 83.333%; } + /* Tenths */ + .uk-width-large-1-10 { + width: 10%; } + .uk-width-large-3-10 { + width: 30%; } + .uk-width-large-7-10 { + width: 70%; } + .uk-width-large-9-10 { + width: 90%; } } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + /* Whole */ + .uk-width-xlarge-1-1 { + width: 100%; } + /* Halves */ + .uk-width-xlarge-1-2, + .uk-width-xlarge-2-4, + .uk-width-xlarge-3-6, + .uk-width-xlarge-5-10 { + width: 50%; } + /* Thirds */ + .uk-width-xlarge-1-3, + .uk-width-xlarge-2-6 { + width: 33.333%; } + .uk-width-xlarge-2-3, + .uk-width-xlarge-4-6 { + width: 66.666%; } + /* Quarters */ + .uk-width-xlarge-1-4 { + width: 25%; } + .uk-width-xlarge-3-4 { + width: 75%; } + /* Fifths */ + .uk-width-xlarge-1-5, + .uk-width-xlarge-2-10 { + width: 20%; } + .uk-width-xlarge-2-5, + .uk-width-xlarge-4-10 { + width: 40%; } + .uk-width-xlarge-3-5, + .uk-width-xlarge-6-10 { + width: 60%; } + .uk-width-xlarge-4-5, + .uk-width-xlarge-8-10 { + width: 80%; } + /* Sixths */ + .uk-width-xlarge-1-6 { + width: 16.666%; } + .uk-width-xlarge-5-6 { + width: 83.333%; } + /* Tenths */ + .uk-width-xlarge-1-10 { + width: 10%; } + .uk-width-xlarge-3-10 { + width: 30%; } + .uk-width-xlarge-7-10 { + width: 70%; } + .uk-width-xlarge-9-10 { + width: 90%; } } + +/* Sub-object: `uk-push-*` and `uk-pull-*` + ========================================================================== */ +/* + * Source ordering + * Works only with `uk-width-medium-*` + */ +/* Tablet and bigger */ +@media (min-width: 768px) { + [class*='uk-push-'], + [class*='uk-pull-'] { + position: relative; } + /* + * Push + */ + /* Halves */ + .uk-push-1-2, + .uk-push-2-4, + .uk-push-3-6, + .uk-push-5-10 { + left: 50%; } + /* Thirds */ + .uk-push-1-3, + .uk-push-2-6 { + left: 33.333%; } + .uk-push-2-3, + .uk-push-4-6 { + left: 66.666%; } + /* Quarters */ + .uk-push-1-4 { + left: 25%; } + .uk-push-3-4 { + left: 75%; } + /* Fifths */ + .uk-push-1-5, + .uk-push-2-10 { + left: 20%; } + .uk-push-2-5, + .uk-push-4-10 { + left: 40%; } + .uk-push-3-5, + .uk-push-6-10 { + left: 60%; } + .uk-push-4-5, + .uk-push-8-10 { + left: 80%; } + /* Sixths */ + .uk-push-1-6 { + left: 16.666%; } + .uk-push-5-6 { + left: 83.333%; } + /* Tenths */ + .uk-push-1-10 { + left: 10%; } + .uk-push-3-10 { + left: 30%; } + .uk-push-7-10 { + left: 70%; } + .uk-push-9-10 { + left: 90%; } + /* + * Pull + */ + /* Halves */ + .uk-pull-1-2, + .uk-pull-2-4, + .uk-pull-3-6, + .uk-pull-5-10 { + left: -50%; } + /* Thirds */ + .uk-pull-1-3, + .uk-pull-2-6 { + left: -33.333%; } + .uk-pull-2-3, + .uk-pull-4-6 { + left: -66.666%; } + /* Quarters */ + .uk-pull-1-4 { + left: -25%; } + .uk-pull-3-4 { + left: -75%; } + /* Fifths */ + .uk-pull-1-5, + .uk-pull-2-10 { + left: -20%; } + .uk-pull-2-5, + .uk-pull-4-10 { + left: -40%; } + .uk-pull-3-5, + .uk-pull-6-10 { + left: -60%; } + .uk-pull-4-5, + .uk-pull-8-10 { + left: -80%; } + /* Sixths */ + .uk-pull-1-6 { + left: -16.666%; } + .uk-pull-5-6 { + left: -83.333%; } + /* Tenths */ + .uk-pull-1-10 { + left: -10%; } + .uk-pull-3-10 { + left: -30%; } + .uk-pull-7-10 { + left: -70%; } + .uk-pull-9-10 { + left: -90%; } } + +/* ======================================================================== + Component: Panel + ========================================================================== */ +/* + * 1. Needed for `a` elements + * 2. Create position context for badges + */ +.uk-panel { + /* 1 */ + display: block; + /* 2 */ + position: relative; } + +/* + * Allow panels to be anchors + */ +.uk-panel, +.uk-panel:hover { + text-decoration: none; } + +/* + * Micro clearfix to make panels more robust + */ +.uk-panel:before, +.uk-panel:after { + content: ""; + display: table; } + +.uk-panel:after { + clear: both; } + +/* + * Remove margin from the last-child if not `uk-widget-title` + */ +.uk-panel > :not(.uk-panel-title):last-child { + margin-bottom: 0; } + +/* Sub-object: `uk-panel-title` + ========================================================================== */ +.uk-panel-title { + margin-top: 0; + margin-bottom: 15px; + font-size: 18px; + line-height: 24px; + font-weight: normal; + text-transform: none; + color: #444; } + +/* Sub-object: `uk-panel-badge` + ========================================================================== */ +.uk-panel-badge { + position: absolute; + top: 0; + right: 0; + z-index: 1; } + +/* Sub-object: `uk-panel-teaser` + ========================================================================== */ +.uk-panel-teaser { + margin-bottom: 15px; } + +/* Sub-object: `uk-panel-body` + ========================================================================== */ +.uk-panel-body { + padding: 15px; } + +/* Modifier: `uk-panel-box` + ========================================================================== */ +.uk-panel-box { + padding: 15px; + background: #fce3ca; + color: #444; } + +.uk-panel-box-hover:hover { + color: #444; } + +.uk-panel-box .uk-panel-title { + color: #444; } + +.uk-panel-box .uk-panel-badge { + top: 10px; + right: 10px; } + +.uk-panel-box > .uk-panel-teaser { + margin-top: -15px; + margin-left: -15px; + margin-right: -15px; } + +/* + * Nav in panel + */ +.uk-panel-box > .uk-nav-side { + margin: 0 -15px; } + +/* + * Sub-modifier: `uk-panel-box-primary` + */ +.uk-panel-box-primary { + background-color: #ebf7fd; + color: #2d7091; } + +.uk-panel-box-primary-hover:hover { + color: #2d7091; } + +.uk-panel-box-primary .uk-panel-title { + color: #2d7091; } + +/* + * Sub-modifier: `uk-panel-box-secondary` + */ +.uk-panel-box-secondary { + background-color: #fce3ca; + color: #444; } + +.uk-panel-box-secondary-hover:hover { + color: #444; } + +.uk-panel-box-secondary .uk-panel-title { + color: #444; } + +/* Modifier: `uk-panel-hover` + ========================================================================== */ +.uk-panel-hover { + padding: 15px; + color: #444; } + +.uk-panel-hover:hover { + background: #f5f5f5; + color: #444; } + +.uk-panel-hover .uk-panel-badge { + top: 10px; + right: 10px; } + +.uk-panel-hover > .uk-panel-teaser { + margin-top: -15px; + margin-left: -15px; + margin-right: -15px; } + +/* Modifier: `uk-panel-header` + ========================================================================== */ +.uk-panel-header .uk-panel-title { + padding-bottom: 10px; + border-bottom: 1px solid #ddd; + color: #444; } + +/* Modifier: `uk-panel-space` + ========================================================================== */ +.uk-panel-space { + padding: 30px; } + +.uk-panel-space .uk-panel-badge { + top: 30px; + right: 30px; } + +/* Modifier: `uk-panel-divider` + ========================================================================== */ +.uk-panel + .uk-panel-divider { + margin-top: 50px !important; } + +.uk-panel + .uk-panel-divider:before { + content: ""; + display: block; + position: absolute; + top: -25px; + left: 0; + right: 0; + border-top: 1px solid #ddd; } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-panel + .uk-panel-divider { + margin-top: 70px !important; } + .uk-panel + .uk-panel-divider:before { + top: -35px; } } + +/* ======================================================================== + Component: Block + ========================================================================== */ +.uk-block { + position: relative; + box-sizing: border-box; + padding-top: 20px; + padding-bottom: 20px; } + +/* Phone landscape and bigger */ +@media (min-width: 768px) { + .uk-block { + padding-top: 50px; + padding-bottom: 50px; } } + +/* + * Micro clearfix to make blocks more robust + */ +.uk-block:before, +.uk-block:after { + content: ""; + display: table; } + +.uk-block:after { + clear: both; } + +/* + * Remove margin from the last-child + */ +.uk-block > :last-child { + margin-bottom: 0; } + +/* Padding Modifier + ========================================================================== */ +/* + * Large padding + */ +.uk-block-large { + padding-top: 20px; + padding-bottom: 20px; } + +/* Tablets and bigger */ +@media (min-width: 768px) { + .uk-block-large { + padding-top: 50px; + padding-bottom: 50px; } } + +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-block-large { + padding-top: 100px; + padding-bottom: 100px; } } + +/* Color Modifier + ========================================================================== */ +/* + * Default + */ +.uk-block-default { + background: #fff; } + +/* + * Muted + */ +.uk-block-muted { + background: #f9f9f9; } + +/* + * Primary + */ +.uk-block-primary { + background: #00a8e6; } + +/* + * Secondary + */ +.uk-block-secondary { + background: #222; } + +/* ======================================================================== + Component: Article + ========================================================================== */ +/* + * Micro clearfix to make articles more robust + */ +.uk-article:before, +.uk-article:after { + content: ""; + display: table; } + +.uk-article:after { + clear: both; } + +/* + * Remove margin from the last-child + */ +.uk-article > :last-child { + margin-bottom: 0; } + +/* + * Vertical gutter for articles + */ +.uk-article + .uk-article { + margin-top: 25px; } + +/* Sub-object `uk-article-title` + ========================================================================== */ +.uk-article-title { + font-size: 36px; + line-height: 42px; + font-weight: normal; + text-transform: none; } + +.uk-article-title a { + color: inherit; + text-decoration: none; } + +/* Sub-object `uk-article-meta` + ========================================================================== */ +.uk-article-meta { + font-size: 12px; + line-height: 18px; + color: #999; } + +/* Sub-object `uk-article-lead` + ========================================================================== */ +.uk-article-lead { + color: #444; + font-size: 18px; + line-height: 24px; + font-weight: normal; } + +/* Sub-object `uk-article-divider` + ========================================================================== */ +.uk-article-divider { + margin-bottom: 25px; + border-color: #ddd; } + +* + .uk-article-divider { + margin-top: 25px; } + +/* ======================================================================== + Component: Comment + ========================================================================== */ +/* Sub-object `uk-comment-header` + ========================================================================== */ +.uk-comment-header { + margin-bottom: 15px; } + +/* + * Micro clearfix + */ +.uk-comment-header:before, +.uk-comment-header:after { + content: ""; + display: table; } + +.uk-comment-header:after { + clear: both; } + +/* Sub-object `uk-comment-avatar` + ========================================================================== */ +.uk-comment-avatar { + margin-right: 15px; + float: left; } + +/* Sub-object `uk-comment-title` + ========================================================================== */ +.uk-comment-title { + margin: 5px 0 0 0; + font-size: 16px; + line-height: 22px; } + +/* Sub-object `uk-comment-meta` + ========================================================================== */ +.uk-comment-meta { + margin: 2px 0 0 0; + font-size: 11px; + line-height: 16px; + color: #999; } + +/* Sub-object `uk-comment-body` + ========================================================================== */ +/* + * Remove margin from the last-child + */ +.uk-comment-body > :last-child { + margin-bottom: 0; } + +/* Sub-object `uk-comment-list` + ========================================================================== */ +.uk-comment-list { + padding: 0; + list-style: none; } + +.uk-comment-list .uk-comment + ul { + margin: 15px 0 0 0; + list-style: none; } + +.uk-comment-list > li:nth-child(n+2), +.uk-comment-list .uk-comment + ul > li:nth-child(n+2) { + margin-top: 15px; } + +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-comment-list .uk-comment + ul { + padding-left: 100px; } } + +/* Modifier `uk-comment-primary` + ========================================================================== */ +/* ======================================================================== + Component: Cover + ========================================================================== */ +/* + * Background image always covers and centers its element + */ +.uk-cover-background { + background-position: 50% 50%; + background-size: cover; + background-repeat: no-repeat; } + +/* + * Emulates image cover, works with video and image elements + * 1. Parent container which clips resized object + * 2. Resizes the object to always covers its container + * 3. Reset the responsive image CSS + * 4. Center object + */ +/* 1 */ +.uk-cover { + overflow: hidden; } + +.uk-cover-object { + /* 2 */ + width: auto; + height: auto; + min-width: 100%; + min-height: 100%; + /* 3 */ + max-width: none; + /* 4 */ + position: relative; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } + +/* + * To center iframes use `data-uk-cover` JavaScript + */ +[data-uk-cover] { + position: relative; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } + +/* ======================================================================== + Component: Nav + ========================================================================== */ +.uk-nav, +.uk-nav ul { + margin: 0; + padding: 0; + list-style: none; } + +/* + * Items + */ +.uk-nav li > a { + display: block; + text-decoration: none; } + +.uk-nav > li > a { + padding: 5px 15px; } + +/* + * Nested items + */ +.uk-nav ul { + padding-left: 15px; } + +.uk-nav ul a { + padding: 2px 0; } + +/* + * Item subtitle + */ +.uk-nav li > a > div { + font-size: 12px; + line-height: 18px; } + +/* Sub-object: `uk-nav-header` + ========================================================================== */ +.uk-nav-header { + padding: 5px 15px; + text-transform: uppercase; + font-weight: bold; + font-size: 12px; } + +.uk-nav-header:not(:first-child) { + margin-top: 15px; } + +/* Sub-object: `uk-nav-divider` + ========================================================================== */ +.uk-nav-divider { + margin: 9px 15px; } + +/* Sub-object: `uk-nav-sub` + ========================================================================== */ +/* + * `ul` needed for higher specificity to override padding + */ +ul.uk-nav-sub { + padding: 5px 0 5px 15px; } + +/* Modifier: `uk-nav-parent-icon` + ========================================================================== */ +.uk-nav-parent-icon > .uk-parent > a:after { + content: ""; + width: 20px; + margin-right: -10px; + float: right; + font-family: FontAwesome; + text-align: center; } + +.uk-nav-parent-icon > .uk-parent.uk-open > a:after { + content: ""; } + +/* Modifier `uk-nav-side` + ========================================================================== */ +/* + * Items + */ +.uk-nav-side > li > a { + color: #444; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-side > li > a:hover, +.uk-nav-side > li > a:focus { + background: rgba(0, 0, 0, 0.05); + color: #444; + /* 2 */ + outline: none; } + +/* Active */ +.uk-nav-side > li.uk-active > a { + background: #00a8e6; + color: #fff; } + +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-side .uk-nav-header { + color: #444; } + +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-side .uk-nav-divider { + border-top: 1px solid #ddd; } + +/* + * Nested items + */ +.uk-nav-side ul a { + color: #07D; } + +.uk-nav-side ul a:hover { + color: #059; } + +/* Modifier `uk-nav-dropdown` + ========================================================================== */ +/* + * Items + */ +.uk-nav-dropdown > li > a { + color: #444; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-dropdown > li > a:hover, +.uk-nav-dropdown > li > a:focus { + background: #00a8e6; + color: #fff; + /* 2 */ + outline: none; } + +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-dropdown .uk-nav-header { + color: #999; } + +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-dropdown .uk-nav-divider { + border-top: 1px solid #ddd; } + +/* + * Nested items + */ +.uk-nav-dropdown ul a { + color: #07D; } + +.uk-nav-dropdown ul a:hover { + color: #059; } + +/* Modifier `uk-nav-navbar` + ========================================================================== */ +/* + * Items + */ +.uk-nav-navbar > li > a { + color: #444; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-navbar > li > a:hover, +.uk-nav-navbar > li > a:focus { + background: #00a8e6; + color: #fff; + /* 2 */ + outline: none; } + +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-navbar .uk-nav-header { + color: #999; } + +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-navbar .uk-nav-divider { + border-top: 1px solid #ddd; } + +/* + * Nested items + */ +.uk-nav-navbar ul a { + color: #07D; } + +.uk-nav-navbar ul a:hover { + color: #059; } + +/* Modifier `uk-nav-offcanvas` + ========================================================================== */ +/* + * Items + */ +.uk-nav-offcanvas > li > a { + color: #ccc; + padding: 10px 15px; } + +/* + * Hover + * No hover on touch devices because it behaves buggy in fixed offcanvas + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-offcanvas > .uk-open > a, +html:not(.uk-touch) .uk-nav-offcanvas > li > a:hover, +html:not(.uk-touch) .uk-nav-offcanvas > li > a:focus { + background: #404040; + color: #fff; + /* 2 */ + outline: none; } + +/* + * Active + * `html .uk-nav` needed for higher specificity to override hover + */ +html .uk-nav.uk-nav-offcanvas > li.uk-active > a { + background: #1a1a1a; + color: #fff; } + +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-offcanvas .uk-nav-header { + color: #777; } + +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-offcanvas .uk-nav-divider { + border-top: 1px solid #1a1a1a; } + +/* + * Nested items + * No hover on touch devices because it behaves buggy in fixed offcanvas + */ +.uk-nav-offcanvas ul a { + color: #ccc; } + +html:not(.uk-touch) .uk-nav-offcanvas ul a:hover { + color: #fff; } + +/* ======================================================================== + Component: Navbar + ========================================================================== */ +.uk-navbar { + background: #f08d28; + color: #444; } + +/* + * Micro clearfix + */ +.uk-navbar:before, +.uk-navbar:after { + content: ""; + display: table; } + +.uk-navbar:after { + clear: both; } + +/* Sub-object: `uk-navbar-nav` + ========================================================================== */ +.uk-navbar-nav { + margin: 0; + padding: 0; + list-style: none; + float: left; } + +/* + * 1. Create position context for dropdowns + */ +.uk-navbar-nav > li { + float: left; + /* 1 */ + position: relative; } + +/* + * 1. Dimensions + * 2. Style + */ +.uk-navbar-nav > li > a { + display: block; + box-sizing: border-box; + text-decoration: none; + /* 1 */ + height: 40px; + padding: 0 15px; + line-height: 40px; + /* 2 */ + color: #444; + font-size: 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; } + +/* Appear not as link */ +.uk-navbar-nav > li > a[href='#'] { + cursor: text; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Also apply if dropdown is opened + * 3. Remove default focus style + */ +.uk-navbar-nav > li:hover > a, +.uk-navbar-nav > li > a:focus, +.uk-navbar-nav > li.uk-open > a { + background-color: #fce3ca; + color: #444; + /* 3 */ + outline: none; } + +/* OnClick */ +.uk-navbar-nav > li > a:active { + background-color: #ddd; + color: #444; } + +/* Active */ +.uk-navbar-nav > li.uk-active > a { + background-color: #fce3ca; + color: #444; } + +/* Sub-objects: `uk-navbar-nav-subtitle` + ========================================================================== */ +.uk-navbar-nav .uk-navbar-nav-subtitle { + line-height: 28px; } + +.uk-navbar-nav-subtitle > div { + margin-top: -6px; + font-size: 10px; + line-height: 12px; } + +/* Sub-objects: `uk-navbar-content`, `uk-navbar-brand`, `uk-navbar-toggle` + ========================================================================== */ +/* + * Imitate navbar items + */ +.uk-navbar-content, +.uk-navbar-brand, +.uk-navbar-toggle { + box-sizing: border-box; + display: block; + height: 40px; + padding: 0 15px; + float: left; } + +/* + * Helper to center all child elements vertically + */ +.uk-navbar-content:before, +.uk-navbar-brand:before, +.uk-navbar-toggle:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +/* Sub-objects: `uk-navbar-content` + ========================================================================== */ +/* + * Better sibling spacing + */ +.uk-navbar-content + .uk-navbar-content:not(.uk-navbar-center) { + padding-left: 0; } + +/* + * Link colors + */ +.uk-navbar-content > a:not([class]) { + color: #07D; } + +.uk-navbar-content > a:not([class]):hover { + color: #059; } + +/* Sub-objects: `uk-navbar-brand` + ========================================================================== */ +.uk-navbar-brand { + font-size: 18px; + color: #444; + text-decoration: none; } + +/* + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-navbar-brand:hover, +.uk-navbar-brand:focus { + color: #444; + text-decoration: none; + /* 2 */ + outline: none; } + +/* Sub-object: `uk-navbar-toggle` + ========================================================================== */ +.uk-navbar-toggle { + font-size: 18px; + color: #444; + text-decoration: none; } + +/* + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-navbar-toggle:hover, +.uk-navbar-toggle:focus { + color: #444; + text-decoration: none; + /* 2 */ + outline: none; } + +/* + * 1. Center icon vertically + */ +.uk-navbar-toggle:after { + content: ""; + font-family: FontAwesome; + /* 1 */ + vertical-align: middle; } + +.uk-navbar-toggle-alt:after { + content: ""; } + +/* Sub-object: `uk-navbar-center` + ========================================================================== */ +/* + * The element with this class needs to be last child in the navbar + * 1. This hack is needed because other float elements shift centered text + */ +.uk-navbar-center { + float: none; + text-align: center; + /* 1 */ + max-width: 50%; + margin-left: auto; + margin-right: auto; } + +/* Sub-object: `uk-navbar-flip` + ========================================================================== */ +.uk-navbar-flip { + float: right; } + +/* ======================================================================== + Component: Subnav + ========================================================================== */ +/* + * 1. Gutter + * 2. Remove default list style + */ +.uk-subnav { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + /* 1 */ + margin-left: -10px; + margin-top: -10px; + /* 2 */ + padding: 0; + list-style: none; } + +/* + * 1. Space is allocated solely based on content dimensions + * 2. Horizontal gutter is using `padding` so `uk-width-*` classes can be applied + * 3. Create position context for dropdowns + */ +.uk-subnav > * { + /* 1 */ + -ms-flex: none; + -webkit-flex: none; + flex: none; + /* 2 */ + padding-left: 10px; + margin-top: 10px; + /* 3 */ + position: relative; } + +/* + * DEPRECATED IE9 Support + */ +.uk-subnav:before, +.uk-subnav:after { + content: ""; + display: block; + overflow: hidden; } + +.uk-subnav:after { + clear: both; } + +.uk-subnav > * { + float: left; } + +/* Items + ========================================================================== */ +.uk-subnav > * > * { + display: inline-block; + color: #444; } + +/* + * Hover + * 1. Apply hover style also to focus state + */ +.uk-subnav > * > :hover, +.uk-subnav > * > :focus { + color: #07D; + text-decoration: none; } + +/* + * Active + */ +.uk-subnav > .uk-active > * { + color: #07D; } + +/* Modifier: 'subnav-line' + ========================================================================== */ +.uk-subnav-line > :before { + content: ""; + display: inline-block; + height: 10px; + vertical-align: middle; } + +.uk-subnav-line > :nth-child(n+2):before { + margin-right: 10px; + border-left: 1px solid #ddd; } + +/* Modifier: 'subnav-pill' + ========================================================================== */ +.uk-subnav-pill > * > * { + padding: 3px 9px; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-subnav-pill > * > :hover, +.uk-subnav-pill > * > :focus { + background: #eee; + color: #444; + text-decoration: none; + /* 2 */ + outline: none; } + +/* + * Active + * `li` needed for higher specificity to override hover + */ +.uk-subnav-pill > .uk-active > * { + background: #00a8e6; + color: #fff; } + +/* Disabled state + ========================================================================== */ +.uk-subnav > .uk-disabled > * { + background: none; + color: #999; + text-decoration: none; + cursor: text; } + +/* ======================================================================== + Component: Breadcrumb + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Remove whitespace between child elements when using `inline-block` + */ +.uk-breadcrumb { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + font-size: 0.001px; } + +/* Items + ========================================================================== */ +/* + * Reset whitespace hack + */ +.uk-breadcrumb > li { + font-size: 1rem; + vertical-align: top; } + +.uk-breadcrumb > li, +.uk-breadcrumb > li > a, +.uk-breadcrumb > li > span { + display: inline-block; } + +.uk-breadcrumb > li:nth-child(n+2):before { + content: "/"; + display: inline-block; + margin: 0 8px; } + +/* + * Disabled + */ +.uk-breadcrumb > li:not(.uk-active) > span { + color: #999; } + +/* ======================================================================== + Component: Pagination + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Center pagination by default + * 3. Remove whitespace between child elements when using `inline-block` + */ +.uk-pagination { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + text-align: center; + /* 3 */ + font-size: 0.001px; } + +/* + * Micro clearfix + * Needed if `uk-pagination-previous` or `uk-pagination-next` sub-objects are used + */ +.uk-pagination:before, +.uk-pagination:after { + content: ""; + display: table; } + +.uk-pagination:after { + clear: both; } + +/* Items + ========================================================================== */ +/* + * 1. Reset whitespace hack + * 2. Remove the gap at the bottom of it container + */ +.uk-pagination > li { + display: inline-block; + /* 1 */ + font-size: 1rem; + /* 2 */ + vertical-align: top; } + +.uk-pagination > li:nth-child(n+2) { + margin-left: 5px; } + +/* + * 1. Makes pagination more robust against different box-sizing use + * 2. Reset text-align to center if alignment modifier is used + */ +.uk-pagination > li > a, +.uk-pagination > li > span { + display: inline-block; + min-width: 16px; + padding: 3px 5px; + line-height: 20px; + text-decoration: none; + /* 1 */ + box-sizing: content-box; + /* 2 */ + text-align: center; } + +/* + * Links + */ +.uk-pagination > li > a { + background: #eee; + color: #444; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-pagination > li > a:hover, +.uk-pagination > li > a:focus { + background-color: #f5f5f5; + color: #444; + /* 2 */ + outline: none; } + +/* OnClick */ +.uk-pagination > li > a:active { + background-color: #ddd; + color: #444; } + +/* + * Active + */ +.uk-pagination > .uk-active > span { + background: #00a8e6; + color: #fff; } + +/* + * Disabled + */ +.uk-pagination > .uk-disabled > span { + background-color: #f5f5f5; + color: #999; } + +/* Previous and next navigation + ========================================================================== */ +.uk-pagination-previous { + float: left; } + +.uk-pagination-next { + float: right; } + +/* Alignment modifiers + ========================================================================== */ +.uk-pagination-left { + text-align: left; } + +.uk-pagination-right { + text-align: right; } + +/* ======================================================================== + Component: Tab + ========================================================================== */ +.uk-tab { + margin: 0; + padding: 0; + list-style: none; + border-bottom: 1px solid #ddd; } + +/* + * Micro clearfix on the deepest container + */ +.uk-tab:before, +.uk-tab:after { + content: ""; + display: table; } + +.uk-tab:after { + clear: both; } + +/* + * Items + * 1. Create position context for dropdowns + */ +.uk-tab > li { + margin-bottom: -1px; + float: left; + /* 1 */ + position: relative; } + +.uk-tab > li > a { + display: block; + padding: 8px 12px 8px 12px; + border: 1px solid transparent; + border-bottom-width: 0; + color: #07D; + text-decoration: none; } + +.uk-tab > li:nth-child(n+2) > a { + margin-left: 5px; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Also apply if dropdown is opened + * 3. Remove default focus style + */ +.uk-tab > li > a:hover, +.uk-tab > li > a:focus, +.uk-tab > li.uk-open > a { + border-color: #f5f5f5; + background: #f5f5f5; + color: #059; + /* 2 */ + outline: none; } + +.uk-tab > li:not(.uk-active) > a:hover, +.uk-tab > li:not(.uk-active) > a:focus, +.uk-tab > li.uk-open:not(.uk-active) > a { + margin-bottom: 1px; + padding-bottom: 7px; } + +/* Active */ +.uk-tab > li.uk-active > a { + border-color: #ddd; + border-bottom-color: transparent; + background: #fff; + color: #444; } + +/* Disabled */ +.uk-tab > li.uk-disabled > a { + color: #999; + cursor: text; } + +.uk-tab > li.uk-disabled > a:hover, +.uk-tab > li.uk-disabled > a:focus, +.uk-tab > li.uk-disabled.uk-active > a { + background: none; + border-color: transparent; } + +/* Modifier: 'tab-flip' + ========================================================================== */ +.uk-tab-flip > li { + float: right; } + +.uk-tab-flip > li:nth-child(n+2) > a { + margin-left: 0; + margin-right: 5px; } + +/* Modifier: 'tab-responsive' + ========================================================================== */ +.uk-tab > li.uk-tab-responsive > a { + margin-left: 0; + margin-right: 0; } + +/* + * Icon + */ +.uk-tab-responsive > a:before { + content: "\f0c9\00a0"; + font-family: FontAwesome; } + +/* Modifier: 'tab-center' + ========================================================================== */ +.uk-tab-center { + border-bottom: 1px solid #ddd; } + +.uk-tab-center-bottom { + border-bottom: none; + border-top: 1px solid #ddd; } + +.uk-tab-center:before, +.uk-tab-center:after { + content: ""; + display: table; } + +.uk-tab-center:after { + clear: both; } + +/* + * 1. Using `right` to prevent vertical scrollbar caused by centering if to many tabs + */ +.uk-tab-center .uk-tab { + position: relative; + right: 50%; + border: none; + float: right; } + +.uk-tab-center .uk-tab > li { + position: relative; + right: -50%; } + +.uk-tab-center .uk-tab > li > a { + text-align: center; } + +/* Modifier: 'tab-bottom' + ========================================================================== */ +.uk-tab-bottom { + border-top: 1px solid #ddd; + border-bottom: none; } + +.uk-tab-bottom > li { + margin-top: -1px; + margin-bottom: 0; } + +.uk-tab-bottom > li > a { + padding-top: 8px; + padding-bottom: 8px; + border-bottom-width: 1px; + border-top-width: 0; } + +.uk-tab-bottom > li:not(.uk-active) > a:hover, +.uk-tab-bottom > li:not(.uk-active) > a:focus, +.uk-tab-bottom > li.uk-open:not(.uk-active) > a { + margin-bottom: 0; + margin-top: 1px; + padding-bottom: 8px; + padding-top: 7px; } + +.uk-tab-bottom > li.uk-active > a { + border-top-color: transparent; + border-bottom-color: #ddd; } + +/* Modifier: 'tab-grid' + ========================================================================== */ +/* + * 1. Create position context to prevent hidden border because of negative `z-index` + */ +.uk-tab-grid { + margin-left: -5px; + border-bottom: none; + /* 1 */ + position: relative; + z-index: 0; } + +.uk-tab-grid:before { + display: block; + position: absolute; + left: 5px; + right: 0; + bottom: -1px; + border-top: 1px solid #ddd; + /* 1 */ + z-index: -1; } + +.uk-tab-grid > li:first-child > a { + margin-left: 5px; } + +.uk-tab-grid > li > a { + text-align: center; } + +/* + * If `uk-tab-bottom` + */ +.uk-tab-grid.uk-tab-bottom { + border-top: none; } + +.uk-tab-grid.uk-tab-bottom:before { + top: -1px; + bottom: auto; } + +/* Modifier: 'tab-left', 'tab-right' + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-tab-left, + .uk-tab-right { + border-bottom: none; } + .uk-tab-left > li, + .uk-tab-right > li { + margin-bottom: 0; + float: none; } + .uk-tab-left > li > a, + .uk-tab-right > li > a { + padding-top: 8px; + padding-bottom: 8px; } + .uk-tab-left > li:nth-child(n+2) > a, + .uk-tab-right > li:nth-child(n+2) > a { + margin-left: 0; + margin-top: 5px; } + .uk-tab-left > li.uk-active > a, + .uk-tab-right > li.uk-active > a { + border-color: #ddd; } + /* + * Modifier: 'tab-left' + */ + .uk-tab-left { + border-right: 1px solid #ddd; } + .uk-tab-left > li { + margin-right: -1px; } + .uk-tab-left > li > a { + border-bottom-width: 1px; + border-right-width: 0; } + .uk-tab-left > li:not(.uk-active) > a:hover, + .uk-tab-left > li:not(.uk-active) > a:focus { + margin-bottom: 0; + margin-right: 1px; + padding-bottom: 8px; + padding-right: 11px; } + .uk-tab-left > li.uk-active > a { + border-right-color: transparent; } + /* + * Modifier: 'tab-right' + */ + .uk-tab-right { + border-left: 1px solid #ddd; } + .uk-tab-right > li { + margin-left: -1px; } + .uk-tab-right > li > a { + border-bottom-width: 1px; + border-left-width: 0; } + .uk-tab-right > li:not(.uk-active) > a:hover, + .uk-tab-right > li:not(.uk-active) > a:focus { + margin-bottom: 0; + margin-left: 1px; + padding-bottom: 8px; + padding-left: 11px; } + .uk-tab-right > li.uk-active > a { + border-left-color: transparent; } } + +/* ======================================================================== + Component: Thumbnav + ========================================================================== */ +/* + * 1. Gutter + * 2. Remove default list style + */ +.uk-thumbnav { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + /* 1 */ + margin-left: -10px; + margin-top: -10px; + /* 2 */ + padding: 0; + list-style: none; } + +/* + * 1. Space is allocated solely based on content dimensions + * 2. Horizontal gutter is using `padding` so `uk-width-*` classes can be applied + */ +.uk-thumbnav > * { + /* 1 */ + -ms-flex: none; + -webkit-flex: none; + flex: none; + /* 2 */ + padding-left: 10px; + margin-top: 10px; } + +/* + * DEPRECATED IE9 Support + */ +.uk-thumbnav:before, +.uk-thumbnav:after { + content: ""; + display: block; + overflow: hidden; } + +.uk-thumbnav:after { + clear: both; } + +.uk-thumbnav > * { + float: left; } + +/* Items + ========================================================================== */ +.uk-thumbnav > * > * { + display: block; + background: #fff; } + +.uk-thumbnav > * > * > img { + opacity: 0.7; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; } + +/* + * Hover + */ +.uk-thumbnav > * > :hover > img, +.uk-thumbnav > * > :focus > img { + opacity: 1; } + +/* + * Active + */ +.uk-thumbnav > .uk-active > * > img { + opacity: 1; } + +/* ======================================================================== + Component: List + ========================================================================== */ +.uk-list { + padding: 0; + list-style: none; } + +/* + * Micro clearfix to make list more robust + */ +.uk-list > li:before, +.uk-list > li:after { + content: ""; + display: table; } + +.uk-list > li:after { + clear: both; } + +/* + * Remove margin from the last-child + */ +.uk-list > li > :last-child { + margin-bottom: 0; } + +/* + * Nested lists + */ +.uk-list ul { + margin: 0; + padding-left: 20px; + list-style: none; } + +/* Modifier: `uk-list-line` + ========================================================================== */ +.uk-list-line > li:nth-child(n+2) { + margin-top: 5px; + padding-top: 5px; + border-top: 1px solid #ddd; } + +/* Modifier: `uk-list-striped` + ========================================================================== */ +.uk-list-striped > li { + padding: 5px 5px; } + +.uk-list-striped > li:nth-of-type(odd) { + background: #f5f5f5; } + +/* Modifier: `uk-list-space` + ========================================================================== */ +.uk-list-space > li:nth-child(n+2) { + margin-top: 10px; } + +/* ======================================================================== + Component: Description list + ========================================================================== */ +/* Modifier: `uk-description-list-horizontal` + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-description-list-horizontal { + overflow: hidden; } + .uk-description-list-horizontal > dt { + width: 160px; + float: left; + clear: both; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .uk-description-list-horizontal > dd { + margin-left: 180px; } } + +/* Modifier: `uk-description-list-line` + ========================================================================== */ +.uk-description-list-line > dt { + font-weight: normal; } + +.uk-description-list-line > dt:nth-child(n+2) { + margin-top: 5px; + padding-top: 5px; + border-top: 1px solid #ddd; } + +.uk-description-list-line > dd { + color: #999; } + +/* ======================================================================== + Component: Table + ========================================================================== */ +/* + * 1. Remove most spacing between table cells. + * 2. Block element behavior + * 3. Style + */ +.uk-table { + /* 1 */ + border-collapse: collapse; + border-spacing: 0; + /* 2 */ + width: 100%; + /* 3 */ + margin-bottom: 15px; } + +/* + * Add margin if adjacent element + */ +* + .uk-table { + margin-top: 15px; } + +.uk-table th, +.uk-table td { + padding: 8px 8px; } + +/* + * Set alignment + */ +.uk-table th { + text-align: left; } + +.uk-table td { + vertical-align: top; } + +.uk-table thead th { + vertical-align: bottom; } + +/* + * Caption and footer + */ +.uk-table caption, +.uk-table tfoot { + font-size: 12px; + font-style: italic; } + +.uk-table caption { + text-align: left; + color: #999; } + +/* + * Active State + */ +.uk-table tbody tr.uk-active { + background: #EEE; } + +/* Sub-modifier: `uk-table-middle` + ========================================================================== */ +.uk-table-middle, +.uk-table-middle td { + vertical-align: middle !important; } + +/* Modifier: `uk-table-striped` + ========================================================================== */ +.uk-table-striped tbody tr:nth-of-type(odd) { + background: #fce3ca; } + +/* Modifier: `uk-table-condensed` + ========================================================================== */ +.uk-table-condensed td { + padding: 4px 8px; } + +/* Modifier: `uk-table-hover` + ========================================================================== */ +.uk-table-hover tbody tr:hover { + background: #EEE; } + +/* ======================================================================== + Component: Form + ========================================================================== */ +/* + * 1. Define consistent box sizing. + * Default is `content-box` with following exceptions set to `border-box` + * `button`, `select`, `input[type="checkbox"]` and `input[type="radio"]` + * `input[type="search"]` in Chrome, Safari and Opera + * `input[type="color"]` in Firefox + * 2. Address margins set differently in Firefox/IE and Chrome/Safari/Opera. + * 3. Remove `border-radius` in iOS. + * 4. Correct `font` properties and `color` not being inherited. + */ +.uk-form input, +.uk-form select, +.uk-form textarea { + /* 1 */ + box-sizing: border-box; + /* 2 */ + margin: 0; + /* 3 */ + border-radius: 0; + /* 4 */ + font: inherit; + color: inherit; } + +/* + * Address inconsistent `text-transform` inheritance which is only inherit in Firefox + */ +.uk-form select { + text-transform: none; } + +/* + * 1. Correct `font` properties not being inherited. + * 2. Don't inherit the `font-weight` and use `bold` instead. + * NOTE: Both declarations don't work in Chrome, Safari and Opera. + */ +.uk-form optgroup { + /* 1 */ + font: inherit; + /* 2 */ + font-weight: bold; } + +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-form input::-moz-focus-inner { + border: 0; + padding: 0; } + +/* + * Removes excess padding in IE 8/9/10. + */ +.uk-form input[type="checkbox"], +.uk-form input[type="radio"] { + padding: 0; } + +/* + * Improves consistency of cursor style for clickable elements + */ +.uk-form input[type="checkbox"]:not(:disabled), +.uk-form input[type="radio"]:not(:disabled) { + cursor: pointer; } + +/* + * Remove default style in iOS. + */ +.uk-form textarea, +.uk-form input:not([type]), +.uk-form input[type="text"], +.uk-form input[type="password"], +.uk-form input[type="email"], +.uk-form input[type="url"], +.uk-form input[type="search"], +.uk-form input[type="tel"], +.uk-form input[type="number"], +.uk-form input[type="datetime"] { + -webkit-appearance: none; } + +/* + * Remove inner padding and search cancel button in Chrome, Safari and Opera on OS X. + */ +.uk-form input[type="search"]::-webkit-search-cancel-button, +.uk-form input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +/* + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ +.uk-form input[type="number"]::-webkit-inner-spin-button, +.uk-form input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +/* + * Define consistent border, margin, and padding. + */ +.uk-form fieldset { + border: none; + margin: 0; + padding: 0; } + +/* + * 1. Remove default vertical scrollbar in IE 8/9/10/11. + * 2. Improve readability and alignment in all browsers. + */ +.uk-form textarea { + /* 1 */ + overflow: auto; + /* 2 */ + vertical-align: top; } + +/* + * Removes placeholder transparency in Firefox. + */ +.uk-form ::-moz-placeholder { + opacity: 1; } + +/* + * Removes `box-shadow` for invalid controls in Firefox. + */ +.uk-form :invalid { + box-shadow: none; } + +/* + * Vertical alignment + */ +.uk-form input:not([type="radio"]):not([type="checkbox"]), +.uk-form select { + vertical-align: middle; } + +/* Style + ========================================================================== */ +/* + * Remove margin from the last-child + */ +.uk-form > :last-child { + margin-bottom: 0; } + +/* + * Controls + * Except for `range`, `radio`, `checkbox`, `file`, `submit`, `reset`, `button` and `image` + * 1. Must be `height` because `min-height` is not working in OSX + * 2. Responsiveness: Sets a maximum width relative to the parent to scale on narrower viewports + * 3. Vertical `padding` needed for `select` elements in Firefox + * 4. Style + */ +.uk-form select, +.uk-form textarea, +.uk-form input:not([type]), +.uk-form input[type="text"], +.uk-form input[type="password"], +.uk-form input[type="datetime"], +.uk-form input[type="datetime-local"], +.uk-form input[type="date"], +.uk-form input[type="month"], +.uk-form input[type="time"], +.uk-form input[type="week"], +.uk-form input[type="number"], +.uk-form input[type="email"], +.uk-form input[type="url"], +.uk-form input[type="search"], +.uk-form input[type="tel"], +.uk-form input[type="color"] { + /* 1 */ + height: 30px; + /* 2 */ + max-width: 100%; + /* 3 */ + padding: 4px 6px; + /* 4 */ + border: 1px solid #ddd; + background: #fff; + color: #444; + -webkit-transition: all 0.2s linear; + -webkit-transition-property: border, background, color, box-shadow, padding; + transition: all 0.2s linear; + transition-property: border, background, color, box-shadow, padding; } + .uk-form select:focus, + .uk-form textarea:focus, + .uk-form input:not([type]):focus, + .uk-form input[type="text"]:focus, + .uk-form input[type="password"]:focus, + .uk-form input[type="datetime"]:focus, + .uk-form input[type="datetime-local"]:focus, + .uk-form input[type="date"]:focus, + .uk-form input[type="month"]:focus, + .uk-form input[type="time"]:focus, + .uk-form input[type="week"]:focus, + .uk-form input[type="number"]:focus, + .uk-form input[type="email"]:focus, + .uk-form input[type="url"]:focus, + .uk-form input[type="search"]:focus, + .uk-form input[type="tel"]:focus, + .uk-form input[type="color"]:focus { + border-color: #99baca; + outline: 0; + background: #f5fbfe; + color: #444; } + .uk-form select:disabled, + .uk-form textarea:disabled, + .uk-form input:not([type]):disabled, + .uk-form input[type="text"]:disabled, + .uk-form input[type="password"]:disabled, + .uk-form input[type="datetime"]:disabled, + .uk-form input[type="datetime-local"]:disabled, + .uk-form input[type="date"]:disabled, + .uk-form input[type="month"]:disabled, + .uk-form input[type="time"]:disabled, + .uk-form input[type="week"]:disabled, + .uk-form input[type="number"]:disabled, + .uk-form input[type="email"]:disabled, + .uk-form input[type="url"]:disabled, + .uk-form input[type="search"]:disabled, + .uk-form input[type="tel"]:disabled, + .uk-form input[type="color"]:disabled { + border-color: #ddd; + background-color: #f5f5f5; + color: #999; } + +/* + * Placeholder + */ +.uk-form :-ms-input-placeholder { + color: #999 !important; } + +.uk-form ::-moz-placeholder { + color: #999; } + +.uk-form ::-webkit-input-placeholder { + color: #999; } + +.uk-form :disabled:-ms-input-placeholder { + color: #999 !important; } + +.uk-form :disabled::-moz-placeholder { + color: #999; } + +.uk-form :disabled::-webkit-input-placeholder { + color: #999; } + +/* + * Legend + * 1. Behave like block element + * 2. Correct `color` not being inherited in IE 8/9/10/11. + * 3. Remove padding + * 4. `margin-bottom` is not working in Safari and Opera. + * Using `padding` and :after instead to create the border + * 5. Style + */ +.uk-form legend { + /* 1 */ + width: 100%; + /* 2 */ + border: 0; + /* 3 */ + padding: 0; + /* 4 */ + padding-bottom: 15px; + /* 5 */ + font-size: 18px; + line-height: 30px; } + +/* + * 1. Fixes IE9 + */ +.uk-form legend:after { + content: ""; + display: block; + border-bottom: 1px solid #ddd; + /* 1 */ + width: 100%; } + +/* Size modifiers + * Higher specificity needed to override defaults + ========================================================================== */ +select.uk-form-small, +textarea.uk-form-small, +input[type].uk-form-small, +input:not([type]).uk-form-small { + height: 25px; + padding: 3px 3px; + font-size: 12px; } + +select.uk-form-large, +textarea.uk-form-large, +input[type].uk-form-large, +input:not([type]).uk-form-large { + height: 40px; + padding: 8px 6px; + font-size: 16px; } + +/* Reset height + * Must be after size modifiers + ========================================================================== */ +.uk-form textarea, +.uk-form select[multiple], +.uk-form select[size] { + height: auto; } + +/* Validation states + * Using !important to keep the selector simple + ========================================================================== */ +/* + * Error state + */ +.uk-form-danger { + border-color: #dc8d99 !important; + background: #fff7f8 !important; + color: #d85030 !important; } + +/* + * Success state + */ +.uk-form-success { + border-color: #8ec73b !important; + background: #fafff2 !important; + color: #659f13 !important; } + +/* Style modifiers + * Using !important to keep the selector simple + ========================================================================== */ +/* + * Blank form + */ +.uk-form-blank { + border-color: transparent !important; + border-style: dashed !important; + background: none !important; } + +.uk-form-blank:focus { + border-color: #ddd !important; } + +/* Size sub-modifiers + ========================================================================== */ +/* + * Fixed widths + * Different widths for mini sized `input` and `select` elements + */ +input.uk-form-width-mini { + width: 40px; } + +select.uk-form-width-mini { + width: 65px; } + +.uk-form-width-small { + width: 130px; } + +.uk-form-width-medium { + width: 200px; } + +.uk-form-width-large { + width: 500px; } + +/* Sub-objects: `uk-form-row` + * Groups labels and controls in rows + ========================================================================== */ +/* + * Micro clearfix + * Needed for `uk-form-horizontal` modifier + */ +.uk-form-row:before, +.uk-form-row:after { + content: ""; + display: table; } + +.uk-form-row:after { + clear: both; } + +/* + * Vertical gutter + */ +.uk-form-row + .uk-form-row { + margin-top: 15px; } + +/* Help text + * Sub-object: `uk-form-help-inline`, `uk-form-help-block` + ========================================================================== */ +.uk-form-help-inline { + display: inline-block; + margin: 0 0 0 10px; } + +.uk-form-help-block { + margin: 5px 0 0 0; } + +/* Controls content + * Sub-object: `uk-form-controls`, `uk-form-controls-condensed` + ========================================================================== */ +/* + * Remove margins + */ +.uk-form-controls > :first-child { + margin-top: 0; } + +.uk-form-controls > :last-child { + margin-bottom: 0; } + +/* + * Group controls and text into blocks with a small spacing between blocks + */ +.uk-form-controls-condensed { + margin: 5px 0; } + +/* Modifier: `uk-form-stacked` + * Requires sub-object: `uk-form-label` + ========================================================================== */ +.uk-form-stacked .uk-form-label { + display: block; + margin-bottom: 5px; + font-weight: bold; } + +/* Modifier: `uk-form-horizontal` + * Requires sub-objects: `uk-form-label`, `uk-form-controls` + ========================================================================== */ +/* Tablet portrait and smaller */ +@media (max-width: 959px) { + /* Behave like `uk-form-stacked` */ + .uk-form-horizontal .uk-form-label { + display: block; + margin-bottom: 5px; + font-weight: bold; } } + +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-form-horizontal .uk-form-label { + width: 200px; + margin-top: 5px; + float: left; } + .uk-form-horizontal .uk-form-controls { + margin-left: 215px; } + /* Better vertical alignment if controls are checkboxes and radio buttons with text */ + .uk-form-horizontal .uk-form-controls-text { + padding-top: 5px; } } + +/* Sub-object: `uk-form-icon` + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Create position context + * 3. Prevent `inline-block` consequences + */ +.uk-form-icon { + /* 1 */ + display: inline-block; + /* 2 */ + position: relative; + /* 3 */ + max-width: 100%; } + +/* + * 1. Make form element clickable through icon + */ +.uk-form-icon > [class*='uk-icon-'] { + position: absolute; + top: 50%; + width: 30px; + margin-top: -7px; + font-size: 14px; + color: #999; + text-align: center; + /* 1 */ + pointer-events: none; } + +.uk-form-icon:not(.uk-form-icon-flip) > input { + padding-left: 30px !important; } + +/* + * Sub-modifier: `uk-form-icon-flip` + */ +.uk-form-icon-flip > [class*='uk-icon-'] { + right: 0; } + +.uk-form-icon-flip > input { + padding-right: 30px !important; } + +/* ======================================================================== + Component: Button + ========================================================================== */ +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-button::-moz-focus-inner { + border: 0; + padding: 0; } + +/* + * 1. Correct inability to style clickable `input` types in iOS. + * 2. Remove margins in Chrome, Safari and Opera. + * 3. Remove borders for `button`. + * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. + * 5. Correct `font` properties and `color` not being inherited for `button`. + * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE + * 7. Style + * 8. `line-height` is used to create a height + * 9. `min-height` is necessary for `input` elements in Firefox and Opera because `line-height` is not working. + * 10. Reset button group whitespace hack + * 11. Required for `a`. + */ +.uk-button { + /* 1 */ + -webkit-appearance: none; + /* 2 */ + margin: 0; + /* 3 */ + border: none; + /* 4 */ + overflow: visible; + /* 5 */ + font: inherit; + color: #444; + /* 6 */ + text-transform: none; + /* 7 */ + display: inline-block; + box-sizing: border-box; + padding: 0 12px; + background: #eee; + vertical-align: middle; + /* 8 */ + line-height: 30px; + /* 9 */ + min-height: 30px; + /* 10 */ + font-size: 1rem; + /* 11 */ + text-decoration: none; + text-align: center; } + +.uk-button:not(:disabled) { + cursor: pointer; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + * 3. Required for `a` elements + */ +.uk-button:hover, +.uk-button:focus { + background-color: #f5f5f5; + color: #444; + /* 2 */ + outline: none; + /* 3 */ + text-decoration: none; } + +/* Active */ +.uk-button:active, +.uk-button.uk-active { + background-color: #ddd; + color: #444; } + +/* Color modifiers + ========================================================================== */ +/* + * Modifier: `uk-button-primary` + */ +.uk-button-primary { + background-color: #00a8e6; + color: #fff; } + +/* Hover */ +.uk-button-primary:hover, +.uk-button-primary:focus { + background-color: #35b3ee; + color: #fff; } + +/* Active */ +.uk-button-primary:active, +.uk-button-primary.uk-active { + background-color: #0091ca; + color: #fff; } + +/* + * Modifier: `uk-button-success` + */ +.uk-button-success { + background-color: #8cc14c; + color: #fff; } + +/* Hover */ +.uk-button-success:hover, +.uk-button-success:focus { + background-color: #8ec73b; + color: #fff; } + +/* Active */ +.uk-button-success:active, +.uk-button-success.uk-active { + background-color: #72ae41; + color: #fff; } + +/* + * Modifier: `uk-button-danger` + */ +.uk-button-danger { + background-color: #da314b; + color: #fff; } + +/* Hover */ +.uk-button-danger:hover, +.uk-button-danger:focus { + background-color: #e4354f; + color: #fff; } + +/* Active */ +.uk-button-danger:active, +.uk-button-danger.uk-active { + background-color: #c91032; + color: #fff; } + +/* Disabled state + * Overrides also the color modifiers + ========================================================================== */ +/* Equal for all button types */ +.uk-button:disabled { + background-color: #f5f5f5; + color: #999; } + +/* Modifier: `uk-button-link` + ========================================================================== */ +/* Reset */ +.uk-button-link, +.uk-button-link:hover, +.uk-button-link:focus, +.uk-button-link:active, +.uk-button-link.uk-active, +.uk-button-link:disabled { + border-color: transparent; + background: none; } + +/* Color */ +.uk-button-link { + color: #07D; } + +.uk-button-link:hover, +.uk-button-link:focus, +.uk-button-link:active, +.uk-button-link.uk-active { + color: #059; + text-decoration: underline; } + +.uk-button-link:disabled { + color: #999; } + +/* Focus */ +.uk-button-link:focus { + outline: 1px dotted; } + +/* Size modifiers + ========================================================================== */ +.uk-button-mini { + min-height: 20px; + padding: 0 6px; + line-height: 20px; + font-size: 11px; } + +.uk-button-small { + min-height: 25px; + padding: 0 10px; + line-height: 25px; + font-size: 12px; } + +.uk-button-large { + min-height: 40px; + padding: 0 15px; + line-height: 40px; + font-size: 16px; } + +/* Sub-object `uk-button-group` + ========================================================================== */ +/* + * 1. Behave like buttons + * 2. Create position context for dropdowns + * 3. Remove whitespace between child elements when using `inline-block` + * 4. Prevent buttons from wrapping + * 5. Remove whitespace between child elements when using `inline-block` + */ +.uk-button-group { + /* 1 */ + display: inline-block; + vertical-align: middle; + /* 2 */ + position: relative; + /* 3 */ + font-size: 0.001px; + /* 4 */ + white-space: nowrap; } + +.uk-button-group > * { + display: inline-block; } + +/* 5 */ +.uk-button-group .uk-button { + vertical-align: top; } + +/* Sub-object: `uk-button-dropdown` + ========================================================================== */ +/* + * 1. Behave like buttons + * 2. Create position context for dropdowns + */ +.uk-button-dropdown { + /* 1 */ + display: inline-block; + vertical-align: middle; + /* 2 */ + position: relative; } + +/* ======================================================================== + Component: Icon + ========================================================================== */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.woff2") format("woff2"), url("../fonts/fontawesome-webfont.woff") format("woff"), url("../fonts/fontawesome-webfont.ttf") format("truetype"); + font-weight: normal; + font-style: normal; } + +/* + * 1. Allow margin + * 2. Prevent inherit font style + * 4. Correct line-height + * 5. Better font rendering + * 6. Remove `text-decoration` for anchors + */ +[class*='uk-icon-'] { + font-family: FontAwesome; + /* 1 */ + display: inline-block; + /* 2 */ + font-weight: normal; + font-style: normal; + /* 4 */ + line-height: 1; + /* 5 */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +/* 6 */ +[class*='uk-icon-'], +[class*='uk-icon-']:hover, +[class*='uk-icon-']:focus { + text-decoration: none; } + +/* Size modifiers + ========================================================================== */ +.uk-icon-small { + font-size: 150%; + vertical-align: -10%; } + +.uk-icon-medium { + font-size: 200%; + vertical-align: -16%; } + +.uk-icon-large { + font-size: 250%; + vertical-align: -22%; } + +/* Modifier: `uk-icon-justify` + ========================================================================== */ +.uk-icon-justify { + width: 1em; + text-align: center; } + +/* Modifier: `uk-icon-spin` + ========================================================================== */ +.uk-icon-spin { + display: inline-block; + -webkit-animation: uk-rotate 2s infinite linear; + animation: uk-rotate 2s infinite linear; } + +/* Modifier: `uk-icon-hover` + ========================================================================== */ +.uk-icon-hover { + color: #999; } + +/* + * Hover + */ +.uk-icon-hover:hover { + color: #444; } + +/* Modifier: `uk-icon-button` + ========================================================================== */ +.uk-icon-button { + box-sizing: border-box; + display: inline-block; + width: 35px; + height: 35px; + border-radius: 100%; + background: #eee; + line-height: 35px; + color: #444; + font-size: 18px; + text-align: center; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-icon-button:hover, +.uk-icon-button:focus { + background-color: #f5f5f5; + color: #444; + /* 2 */ + outline: none; } + +/* Active */ +.uk-icon-button:active { + background-color: #ddd; + color: #444; } + +/* Icon mapping + ========================================================================== */ +.uk-icon-glass:before { + content: "\f000"; } + +.uk-icon-music:before { + content: "\f001"; } + +.uk-icon-search:before { + content: "\f002"; } + +.uk-icon-envelope-o:before { + content: "\f003"; } + +.uk-icon-heart:before { + content: "\f004"; } + +.uk-icon-star:before { + content: "\f005"; } + +.uk-icon-star-o:before { + content: "\f006"; } + +.uk-icon-user:before { + content: "\f007"; } + +.uk-icon-film:before { + content: "\f008"; } + +.uk-icon-th-large:before { + content: "\f009"; } + +.uk-icon-th:before { + content: "\f00a"; } + +.uk-icon-th-list:before { + content: "\f00b"; } + +.uk-icon-check:before { + content: "\f00c"; } + +.uk-icon-remove:before, +.uk-icon-close:before, +.uk-icon-times:before { + content: "\f00d"; } + +.uk-icon-search-plus:before { + content: "\f00e"; } + +.uk-icon-search-minus:before { + content: "\f010"; } + +.uk-icon-power-off:before { + content: "\f011"; } + +.uk-icon-signal:before { + content: "\f012"; } + +.uk-icon-gear:before, +.uk-icon-cog:before { + content: "\f013"; } + +.uk-icon-trash-o:before { + content: "\f014"; } + +.uk-icon-home:before { + content: "\f015"; } + +.uk-icon-file-o:before { + content: "\f016"; } + +.uk-icon-clock-o:before { + content: "\f017"; } + +.uk-icon-road:before { + content: "\f018"; } + +.uk-icon-download:before { + content: "\f019"; } + +.uk-icon-arrow-circle-o-down:before { + content: "\f01a"; } + +.uk-icon-arrow-circle-o-up:before { + content: "\f01b"; } + +.uk-icon-inbox:before { + content: "\f01c"; } + +.uk-icon-play-circle-o:before { + content: "\f01d"; } + +.uk-icon-rotate-right:before, +.uk-icon-repeat:before { + content: "\f01e"; } + +.uk-icon-refresh:before { + content: "\f021"; } + +.uk-icon-list-alt:before { + content: "\f022"; } + +.uk-icon-lock:before { + content: "\f023"; } + +.uk-icon-flag:before { + content: "\f024"; } + +.uk-icon-headphones:before { + content: "\f025"; } + +.uk-icon-volume-off:before { + content: "\f026"; } + +.uk-icon-volume-down:before { + content: "\f027"; } + +.uk-icon-volume-up:before { + content: "\f028"; } + +.uk-icon-qrcode:before { + content: "\f029"; } + +.uk-icon-barcode:before { + content: "\f02a"; } + +.uk-icon-tag:before { + content: "\f02b"; } + +.uk-icon-tags:before { + content: "\f02c"; } + +.uk-icon-book:before { + content: "\f02d"; } + +.uk-icon-bookmark:before { + content: "\f02e"; } + +.uk-icon-print:before { + content: "\f02f"; } + +.uk-icon-camera:before { + content: "\f030"; } + +.uk-icon-font:before { + content: "\f031"; } + +.uk-icon-bold:before { + content: "\f032"; } + +.uk-icon-italic:before { + content: "\f033"; } + +.uk-icon-text-height:before { + content: "\f034"; } + +.uk-icon-text-width:before { + content: "\f035"; } + +.uk-icon-align-left:before { + content: "\f036"; } + +.uk-icon-align-center:before { + content: "\f037"; } + +.uk-icon-align-right:before { + content: "\f038"; } + +.uk-icon-align-justify:before { + content: "\f039"; } + +.uk-icon-list:before { + content: "\f03a"; } + +.uk-icon-dedent:before, +.uk-icon-outdent:before { + content: "\f03b"; } + +.uk-icon-indent:before { + content: "\f03c"; } + +.uk-icon-video-camera:before { + content: "\f03d"; } + +.uk-icon-photo:before, +.uk-icon-image:before, +.uk-icon-picture-o:before { + content: "\f03e"; } + +.uk-icon-pencil:before { + content: "\f040"; } + +.uk-icon-map-marker:before { + content: "\f041"; } + +.uk-icon-adjust:before { + content: "\f042"; } + +.uk-icon-tint:before { + content: "\f043"; } + +.uk-icon-edit:before, +.uk-icon-pencil-square-o:before { + content: "\f044"; } + +.uk-icon-share-square-o:before { + content: "\f045"; } + +.uk-icon-check-square-o:before { + content: "\f046"; } + +.uk-icon-arrows:before { + content: "\f047"; } + +.uk-icon-step-backward:before { + content: "\f048"; } + +.uk-icon-fast-backward:before { + content: "\f049"; } + +.uk-icon-backward:before { + content: "\f04a"; } + +.uk-icon-play:before { + content: "\f04b"; } + +.uk-icon-pause:before { + content: "\f04c"; } + +.uk-icon-stop:before { + content: "\f04d"; } + +.uk-icon-forward:before { + content: "\f04e"; } + +.uk-icon-fast-forward:before { + content: "\f050"; } + +.uk-icon-step-forward:before { + content: "\f051"; } + +.uk-icon-eject:before { + content: "\f052"; } + +.uk-icon-chevron-left:before { + content: "\f053"; } + +.uk-icon-chevron-right:before { + content: "\f054"; } + +.uk-icon-plus-circle:before { + content: "\f055"; } + +.uk-icon-minus-circle:before { + content: "\f056"; } + +.uk-icon-times-circle:before { + content: "\f057"; } + +.uk-icon-check-circle:before { + content: "\f058"; } + +.uk-icon-question-circle:before { + content: "\f059"; } + +.uk-icon-info-circle:before { + content: "\f05a"; } + +.uk-icon-crosshairs:before { + content: "\f05b"; } + +.uk-icon-times-circle-o:before { + content: "\f05c"; } + +.uk-icon-check-circle-o:before { + content: "\f05d"; } + +.uk-icon-ban:before { + content: "\f05e"; } + +.uk-icon-arrow-left:before { + content: "\f060"; } + +.uk-icon-arrow-right:before { + content: "\f061"; } + +.uk-icon-arrow-up:before { + content: "\f062"; } + +.uk-icon-arrow-down:before { + content: "\f063"; } + +.uk-icon-mail-forward:before, +.uk-icon-share:before { + content: "\f064"; } + +.uk-icon-expand:before { + content: "\f065"; } + +.uk-icon-compress:before { + content: "\f066"; } + +.uk-icon-plus:before { + content: "\f067"; } + +.uk-icon-minus:before { + content: "\f068"; } + +.uk-icon-asterisk:before { + content: "\f069"; } + +.uk-icon-exclamation-circle:before { + content: "\f06a"; } + +.uk-icon-gift:before { + content: "\f06b"; } + +.uk-icon-leaf:before { + content: "\f06c"; } + +.uk-icon-fire:before { + content: "\f06d"; } + +.uk-icon-eye:before { + content: "\f06e"; } + +.uk-icon-eye-slash:before { + content: "\f070"; } + +.uk-icon-warning:before, +.uk-icon-exclamation-triangle:before { + content: "\f071"; } + +.uk-icon-plane:before { + content: "\f072"; } + +.uk-icon-calendar:before { + content: "\f073"; } + +.uk-icon-random:before { + content: "\f074"; } + +.uk-icon-comment:before { + content: "\f075"; } + +.uk-icon-magnet:before { + content: "\f076"; } + +.uk-icon-chevron-up:before { + content: "\f077"; } + +.uk-icon-chevron-down:before { + content: "\f078"; } + +.uk-icon-retweet:before { + content: "\f079"; } + +.uk-icon-shopping-cart:before { + content: "\f07a"; } + +.uk-icon-folder:before { + content: "\f07b"; } + +.uk-icon-folder-open:before { + content: "\f07c"; } + +.uk-icon-arrows-v:before { + content: "\f07d"; } + +.uk-icon-arrows-h:before { + content: "\f07e"; } + +.uk-icon-bar-chart-o:before, +.uk-icon-bar-chart:before { + content: "\f080"; } + +.uk-icon-twitter-square:before { + content: "\f081"; } + +.uk-icon-facebook-square:before { + content: "\f082"; } + +.uk-icon-camera-retro:before { + content: "\f083"; } + +.uk-icon-key:before { + content: "\f084"; } + +.uk-icon-gears:before, +.uk-icon-cogs:before { + content: "\f085"; } + +.uk-icon-comments:before { + content: "\f086"; } + +.uk-icon-thumbs-o-up:before { + content: "\f087"; } + +.uk-icon-thumbs-o-down:before { + content: "\f088"; } + +.uk-icon-star-half:before { + content: "\f089"; } + +.uk-icon-heart-o:before { + content: "\f08a"; } + +.uk-icon-sign-out:before { + content: "\f08b"; } + +.uk-icon-linkedin-square:before { + content: "\f08c"; } + +.uk-icon-thumb-tack:before { + content: "\f08d"; } + +.uk-icon-external-link:before { + content: "\f08e"; } + +.uk-icon-sign-in:before { + content: "\f090"; } + +.uk-icon-trophy:before { + content: "\f091"; } + +.uk-icon-github-square:before { + content: "\f092"; } + +.uk-icon-upload:before { + content: "\f093"; } + +.uk-icon-lemon-o:before { + content: "\f094"; } + +.uk-icon-phone:before { + content: "\f095"; } + +.uk-icon-square-o:before { + content: "\f096"; } + +.uk-icon-bookmark-o:before { + content: "\f097"; } + +.uk-icon-phone-square:before { + content: "\f098"; } + +.uk-icon-twitter:before { + content: "\f099"; } + +.uk-icon-facebook-f:before, +.uk-icon-facebook:before { + content: "\f09a"; } + +.uk-icon-github:before { + content: "\f09b"; } + +.uk-icon-unlock:before { + content: "\f09c"; } + +.uk-icon-credit-card:before { + content: "\f09d"; } + +.uk-icon-rss:before { + content: "\f09e"; } + +.uk-icon-hdd-o:before { + content: "\f0a0"; } + +.uk-icon-bullhorn:before { + content: "\f0a1"; } + +.uk-icon-bell:before { + content: "\f0f3"; } + +.uk-icon-certificate:before { + content: "\f0a3"; } + +.uk-icon-hand-o-right:before { + content: "\f0a4"; } + +.uk-icon-hand-o-left:before { + content: "\f0a5"; } + +.uk-icon-hand-o-up:before { + content: "\f0a6"; } + +.uk-icon-hand-o-down:before { + content: "\f0a7"; } + +.uk-icon-arrow-circle-left:before { + content: "\f0a8"; } + +.uk-icon-arrow-circle-right:before { + content: "\f0a9"; } + +.uk-icon-arrow-circle-up:before { + content: "\f0aa"; } + +.uk-icon-arrow-circle-down:before { + content: "\f0ab"; } + +.uk-icon-globe:before { + content: "\f0ac"; } + +.uk-icon-wrench:before { + content: "\f0ad"; } + +.uk-icon-tasks:before { + content: "\f0ae"; } + +.uk-icon-filter:before { + content: "\f0b0"; } + +.uk-icon-briefcase:before { + content: "\f0b1"; } + +.uk-icon-arrows-alt:before { + content: "\f0b2"; } + +.uk-icon-group:before, +.uk-icon-users:before { + content: "\f0c0"; } + +.uk-icon-chain:before, +.uk-icon-link:before { + content: "\f0c1"; } + +.uk-icon-cloud:before { + content: "\f0c2"; } + +.uk-icon-flask:before { + content: "\f0c3"; } + +.uk-icon-cut:before, +.uk-icon-scissors:before { + content: "\f0c4"; } + +.uk-icon-copy:before, +.uk-icon-files-o:before { + content: "\f0c5"; } + +.uk-icon-paperclip:before { + content: "\f0c6"; } + +.uk-icon-save:before, +.uk-icon-floppy-o:before { + content: "\f0c7"; } + +.uk-icon-square:before { + content: "\f0c8"; } + +.uk-icon-navicon:before, +.uk-icon-reorder:before, +.uk-icon-bars:before { + content: "\f0c9"; } + +.uk-icon-list-ul:before { + content: "\f0ca"; } + +.uk-icon-list-ol:before { + content: "\f0cb"; } + +.uk-icon-strikethrough:before { + content: "\f0cc"; } + +.uk-icon-underline:before { + content: "\f0cd"; } + +.uk-icon-table:before { + content: "\f0ce"; } + +.uk-icon-magic:before { + content: "\f0d0"; } + +.uk-icon-truck:before { + content: "\f0d1"; } + +.uk-icon-pinterest:before { + content: "\f0d2"; } + +.uk-icon-pinterest-square:before { + content: "\f0d3"; } + +.uk-icon-google-plus-square:before { + content: "\f0d4"; } + +.uk-icon-google-plus:before { + content: "\f0d5"; } + +.uk-icon-money:before { + content: "\f0d6"; } + +.uk-icon-caret-down:before { + content: "\f0d7"; } + +.uk-icon-caret-up:before { + content: "\f0d8"; } + +.uk-icon-caret-left:before { + content: "\f0d9"; } + +.uk-icon-caret-right:before { + content: "\f0da"; } + +.uk-icon-columns:before { + content: "\f0db"; } + +.uk-icon-unsorted:before, +.uk-icon-sort:before { + content: "\f0dc"; } + +.uk-icon-sort-down:before, +.uk-icon-sort-desc:before { + content: "\f0dd"; } + +.uk-icon-sort-up:before, +.uk-icon-sort-asc:before { + content: "\f0de"; } + +.uk-icon-envelope:before { + content: "\f0e0"; } + +.uk-icon-linkedin:before { + content: "\f0e1"; } + +.uk-icon-rotate-left:before, +.uk-icon-undo:before { + content: "\f0e2"; } + +.uk-icon-legal:before, +.uk-icon-gavel:before { + content: "\f0e3"; } + +.uk-icon-dashboard:before, +.uk-icon-tachometer:before { + content: "\f0e4"; } + +.uk-icon-comment-o:before { + content: "\f0e5"; } + +.uk-icon-comments-o:before { + content: "\f0e6"; } + +.uk-icon-flash:before, +.uk-icon-bolt:before { + content: "\f0e7"; } + +.uk-icon-sitemap:before { + content: "\f0e8"; } + +.uk-icon-umbrella:before { + content: "\f0e9"; } + +.uk-icon-paste:before, +.uk-icon-clipboard:before { + content: "\f0ea"; } + +.uk-icon-lightbulb-o:before { + content: "\f0eb"; } + +.uk-icon-exchange:before { + content: "\f0ec"; } + +.uk-icon-cloud-download:before { + content: "\f0ed"; } + +.uk-icon-cloud-upload:before { + content: "\f0ee"; } + +.uk-icon-user-md:before { + content: "\f0f0"; } + +.uk-icon-stethoscope:before { + content: "\f0f1"; } + +.uk-icon-suitcase:before { + content: "\f0f2"; } + +.uk-icon-bell-o:before { + content: "\f0a2"; } + +.uk-icon-coffee:before { + content: "\f0f4"; } + +.uk-icon-cutlery:before { + content: "\f0f5"; } + +.uk-icon-file-text-o:before { + content: "\f0f6"; } + +.uk-icon-building-o:before { + content: "\f0f7"; } + +.uk-icon-hospital-o:before { + content: "\f0f8"; } + +.uk-icon-ambulance:before { + content: "\f0f9"; } + +.uk-icon-medkit:before { + content: "\f0fa"; } + +.uk-icon-fighter-jet:before { + content: "\f0fb"; } + +.uk-icon-beer:before { + content: "\f0fc"; } + +.uk-icon-h-square:before { + content: "\f0fd"; } + +.uk-icon-plus-square:before { + content: "\f0fe"; } + +.uk-icon-angle-double-left:before { + content: "\f100"; } + +.uk-icon-angle-double-right:before { + content: "\f101"; } + +.uk-icon-angle-double-up:before { + content: "\f102"; } + +.uk-icon-angle-double-down:before { + content: "\f103"; } + +.uk-icon-angle-left:before { + content: "\f104"; } + +.uk-icon-angle-right:before { + content: "\f105"; } + +.uk-icon-angle-up:before { + content: "\f106"; } + +.uk-icon-angle-down:before { + content: "\f107"; } + +.uk-icon-desktop:before { + content: "\f108"; } + +.uk-icon-laptop:before { + content: "\f109"; } + +.uk-icon-tablet:before { + content: "\f10a"; } + +.uk-icon-mobile-phone:before, +.uk-icon-mobile:before { + content: "\f10b"; } + +.uk-icon-circle-o:before { + content: "\f10c"; } + +.uk-icon-quote-left:before { + content: "\f10d"; } + +.uk-icon-quote-right:before { + content: "\f10e"; } + +.uk-icon-spinner:before { + content: "\f110"; } + +.uk-icon-circle:before { + content: "\f111"; } + +.uk-icon-mail-reply:before, +.uk-icon-reply:before { + content: "\f112"; } + +.uk-icon-github-alt:before { + content: "\f113"; } + +.uk-icon-folder-o:before { + content: "\f114"; } + +.uk-icon-folder-open-o:before { + content: "\f115"; } + +.uk-icon-smile-o:before { + content: "\f118"; } + +.uk-icon-frown-o:before { + content: "\f119"; } + +.uk-icon-meh-o:before { + content: "\f11a"; } + +.uk-icon-gamepad:before { + content: "\f11b"; } + +.uk-icon-keyboard-o:before { + content: "\f11c"; } + +.uk-icon-flag-o:before { + content: "\f11d"; } + +.uk-icon-flag-checkered:before { + content: "\f11e"; } + +.uk-icon-terminal:before { + content: "\f120"; } + +.uk-icon-code:before { + content: "\f121"; } + +.uk-icon-mail-reply-all:before, +.uk-icon-reply-all:before { + content: "\f122"; } + +.uk-icon-star-half-empty:before, +.uk-icon-star-half-full:before, +.uk-icon-star-half-o:before { + content: "\f123"; } + +.uk-icon-location-arrow:before { + content: "\f124"; } + +.uk-icon-crop:before { + content: "\f125"; } + +.uk-icon-code-fork:before { + content: "\f126"; } + +.uk-icon-unlink:before, +.uk-icon-chain-broken:before { + content: "\f127"; } + +.uk-icon-question:before { + content: "\f128"; } + +.uk-icon-info:before { + content: "\f129"; } + +.uk-icon-exclamation:before { + content: "\f12a"; } + +.uk-icon-superscript:before { + content: "\f12b"; } + +.uk-icon-subscript:before { + content: "\f12c"; } + +.uk-icon-eraser:before { + content: "\f12d"; } + +.uk-icon-puzzle-piece:before { + content: "\f12e"; } + +.uk-icon-microphone:before { + content: "\f130"; } + +.uk-icon-microphone-slash:before { + content: "\f131"; } + +.uk-icon-shield:before { + content: "\f132"; } + +.uk-icon-calendar-o:before { + content: "\f133"; } + +.uk-icon-fire-extinguisher:before { + content: "\f134"; } + +.uk-icon-rocket:before { + content: "\f135"; } + +.uk-icon-maxcdn:before { + content: "\f136"; } + +.uk-icon-chevron-circle-left:before { + content: "\f137"; } + +.uk-icon-chevron-circle-right:before { + content: "\f138"; } + +.uk-icon-chevron-circle-up:before { + content: "\f139"; } + +.uk-icon-chevron-circle-down:before { + content: "\f13a"; } + +.uk-icon-html5:before { + content: "\f13b"; } + +.uk-icon-css3:before { + content: "\f13c"; } + +.uk-icon-anchor:before { + content: "\f13d"; } + +.uk-icon-unlock-alt:before { + content: "\f13e"; } + +.uk-icon-bullseye:before { + content: "\f140"; } + +.uk-icon-ellipsis-h:before { + content: "\f141"; } + +.uk-icon-ellipsis-v:before { + content: "\f142"; } + +.uk-icon-rss-square:before { + content: "\f143"; } + +.uk-icon-play-circle:before { + content: "\f144"; } + +.uk-icon-ticket:before { + content: "\f145"; } + +.uk-icon-minus-square:before { + content: "\f146"; } + +.uk-icon-minus-square-o:before { + content: "\f147"; } + +.uk-icon-level-up:before { + content: "\f148"; } + +.uk-icon-level-down:before { + content: "\f149"; } + +.uk-icon-check-square:before { + content: "\f14a"; } + +.uk-icon-pencil-square:before { + content: "\f14b"; } + +.uk-icon-external-link-square:before { + content: "\f14c"; } + +.uk-icon-share-square:before { + content: "\f14d"; } + +.uk-icon-compass:before { + content: "\f14e"; } + +.uk-icon-toggle-down:before, +.uk-icon-caret-square-o-down:before { + content: "\f150"; } + +.uk-icon-toggle-up:before, +.uk-icon-caret-square-o-up:before { + content: "\f151"; } + +.uk-icon-toggle-right:before, +.uk-icon-caret-square-o-right:before { + content: "\f152"; } + +.uk-icon-euro:before, +.uk-icon-eur:before { + content: "\f153"; } + +.uk-icon-gbp:before { + content: "\f154"; } + +.uk-icon-dollar:before, +.uk-icon-usd:before { + content: "\f155"; } + +.uk-icon-rupee:before, +.uk-icon-inr:before { + content: "\f156"; } + +.uk-icon-cny:before, +.uk-icon-rmb:before, +.uk-icon-yen:before, +.uk-icon-jpy:before { + content: "\f157"; } + +.uk-icon-ruble:before, +.uk-icon-rouble:before, +.uk-icon-rub:before { + content: "\f158"; } + +.uk-icon-won:before, +.uk-icon-krw:before { + content: "\f159"; } + +.uk-icon-bitcoin:before, +.uk-icon-btc:before { + content: "\f15a"; } + +.uk-icon-file:before { + content: "\f15b"; } + +.uk-icon-file-text:before { + content: "\f15c"; } + +.uk-icon-sort-alpha-asc:before { + content: "\f15d"; } + +.uk-icon-sort-alpha-desc:before { + content: "\f15e"; } + +.uk-icon-sort-amount-asc:before { + content: "\f160"; } + +.uk-icon-sort-amount-desc:before { + content: "\f161"; } + +.uk-icon-sort-numeric-asc:before { + content: "\f162"; } + +.uk-icon-sort-numeric-desc:before { + content: "\f163"; } + +.uk-icon-thumbs-up:before { + content: "\f164"; } + +.uk-icon-thumbs-down:before { + content: "\f165"; } + +.uk-icon-youtube-square:before { + content: "\f166"; } + +.uk-icon-youtube:before { + content: "\f167"; } + +.uk-icon-xing:before { + content: "\f168"; } + +.uk-icon-xing-square:before { + content: "\f169"; } + +.uk-icon-youtube-play:before { + content: "\f16a"; } + +.uk-icon-dropbox:before { + content: "\f16b"; } + +.uk-icon-stack-overflow:before { + content: "\f16c"; } + +.uk-icon-instagram:before { + content: "\f16d"; } + +.uk-icon-flickr:before { + content: "\f16e"; } + +.uk-icon-adn:before { + content: "\f170"; } + +.uk-icon-bitbucket:before { + content: "\f171"; } + +.uk-icon-bitbucket-square:before { + content: "\f172"; } + +.uk-icon-tumblr:before { + content: "\f173"; } + +.uk-icon-tumblr-square:before { + content: "\f174"; } + +.uk-icon-long-arrow-down:before { + content: "\f175"; } + +.uk-icon-long-arrow-up:before { + content: "\f176"; } + +.uk-icon-long-arrow-left:before { + content: "\f177"; } + +.uk-icon-long-arrow-right:before { + content: "\f178"; } + +.uk-icon-apple:before { + content: "\f179"; } + +.uk-icon-windows:before { + content: "\f17a"; } + +.uk-icon-android:before { + content: "\f17b"; } + +.uk-icon-linux:before { + content: "\f17c"; } + +.uk-icon-dribbble:before { + content: "\f17d"; } + +.uk-icon-skype:before { + content: "\f17e"; } + +.uk-icon-foursquare:before { + content: "\f180"; } + +.uk-icon-trello:before { + content: "\f181"; } + +.uk-icon-female:before { + content: "\f182"; } + +.uk-icon-male:before { + content: "\f183"; } + +.uk-icon-gittip:before, +.uk-icon-gratipay:before { + content: "\f184"; } + +.uk-icon-sun-o:before { + content: "\f185"; } + +.uk-icon-moon-o:before { + content: "\f186"; } + +.uk-icon-archive:before { + content: "\f187"; } + +.uk-icon-bug:before { + content: "\f188"; } + +.uk-icon-vk:before { + content: "\f189"; } + +.uk-icon-weibo:before { + content: "\f18a"; } + +.uk-icon-renren:before { + content: "\f18b"; } + +.uk-icon-pagelines:before { + content: "\f18c"; } + +.uk-icon-stack-exchange:before { + content: "\f18d"; } + +.uk-icon-arrow-circle-o-right:before { + content: "\f18e"; } + +.uk-icon-arrow-circle-o-left:before { + content: "\f190"; } + +.uk-icon-toggle-left:before, +.uk-icon-caret-square-o-left:before { + content: "\f191"; } + +.uk-icon-dot-circle-o:before { + content: "\f192"; } + +.uk-icon-wheelchair:before { + content: "\f193"; } + +.uk-icon-vimeo-square:before { + content: "\f194"; } + +.uk-icon-turkish-lira:before, +.uk-icon-try:before { + content: "\f195"; } + +.uk-icon-plus-square-o:before { + content: "\f196"; } + +.uk-icon-space-shuttle:before { + content: "\f197"; } + +.uk-icon-slack:before { + content: "\f198"; } + +.uk-icon-envelope-square:before { + content: "\f199"; } + +.uk-icon-wordpress:before { + content: "\f19a"; } + +.uk-icon-openid:before { + content: "\f19b"; } + +.uk-icon-institution:before, +.uk-icon-bank:before, +.uk-icon-university:before { + content: "\f19c"; } + +.uk-icon-mortar-board:before, +.uk-icon-graduation-cap:before { + content: "\f19d"; } + +.uk-icon-yahoo:before { + content: "\f19e"; } + +.uk-icon-google:before { + content: "\f1a0"; } + +.uk-icon-reddit:before { + content: "\f1a1"; } + +.uk-icon-reddit-square:before { + content: "\f1a2"; } + +.uk-icon-stumbleupon-circle:before { + content: "\f1a3"; } + +.uk-icon-stumbleupon:before { + content: "\f1a4"; } + +.uk-icon-delicious:before { + content: "\f1a5"; } + +.uk-icon-digg:before { + content: "\f1a6"; } + +.uk-icon-pied-piper:before { + content: "\f1a7"; } + +.uk-icon-pied-piper-alt:before { + content: "\f1a8"; } + +.uk-icon-drupal:before { + content: "\f1a9"; } + +.uk-icon-joomla:before { + content: "\f1aa"; } + +.uk-icon-language:before { + content: "\f1ab"; } + +.uk-icon-fax:before { + content: "\f1ac"; } + +.uk-icon-building:before { + content: "\f1ad"; } + +.uk-icon-child:before { + content: "\f1ae"; } + +.uk-icon-paw:before { + content: "\f1b0"; } + +.uk-icon-spoon:before { + content: "\f1b1"; } + +.uk-icon-cube:before { + content: "\f1b2"; } + +.uk-icon-cubes:before { + content: "\f1b3"; } + +.uk-icon-behance:before { + content: "\f1b4"; } + +.uk-icon-behance-square:before { + content: "\f1b5"; } + +.uk-icon-steam:before { + content: "\f1b6"; } + +.uk-icon-steam-square:before { + content: "\f1b7"; } + +.uk-icon-recycle:before { + content: "\f1b8"; } + +.uk-icon-automobile:before, +.uk-icon-car:before { + content: "\f1b9"; } + +.uk-icon-cab:before, +.uk-icon-taxi:before { + content: "\f1ba"; } + +.uk-icon-tree:before { + content: "\f1bb"; } + +.uk-icon-spotify:before { + content: "\f1bc"; } + +.uk-icon-deviantart:before { + content: "\f1bd"; } + +.uk-icon-soundcloud:before { + content: "\f1be"; } + +.uk-icon-database:before { + content: "\f1c0"; } + +.uk-icon-file-pdf-o:before { + content: "\f1c1"; } + +.uk-icon-file-word-o:before { + content: "\f1c2"; } + +.uk-icon-file-excel-o:before { + content: "\f1c3"; } + +.uk-icon-file-powerpoint-o:before { + content: "\f1c4"; } + +.uk-icon-file-photo-o:before, +.uk-icon-file-picture-o:before, +.uk-icon-file-image-o:before { + content: "\f1c5"; } + +.uk-icon-file-zip-o:before, +.uk-icon-file-archive-o:before { + content: "\f1c6"; } + +.uk-icon-file-sound-o:before, +.uk-icon-file-audio-o:before { + content: "\f1c7"; } + +.uk-icon-file-movie-o:before, +.uk-icon-file-video-o:before { + content: "\f1c8"; } + +.uk-icon-file-code-o:before { + content: "\f1c9"; } + +.uk-icon-vine:before { + content: "\f1ca"; } + +.uk-icon-codepen:before { + content: "\f1cb"; } + +.uk-icon-jsfiddle:before { + content: "\f1cc"; } + +.uk-icon-life-bouy:before, +.uk-icon-life-buoy:before, +.uk-icon-life-saver:before, +.uk-icon-support:before, +.uk-icon-life-ring:before { + content: "\f1cd"; } + +.uk-icon-circle-o-notch:before { + content: "\f1ce"; } + +.uk-icon-ra:before, +.uk-icon-rebel:before { + content: "\f1d0"; } + +.uk-icon-ge:before, +.uk-icon-empire:before { + content: "\f1d1"; } + +.uk-icon-git-square:before { + content: "\f1d2"; } + +.uk-icon-git:before { + content: "\f1d3"; } + +.uk-icon-hacker-news:before { + content: "\f1d4"; } + +.uk-icon-tencent-weibo:before { + content: "\f1d5"; } + +.uk-icon-qq:before { + content: "\f1d6"; } + +.uk-icon-wechat:before, +.uk-icon-weixin:before { + content: "\f1d7"; } + +.uk-icon-send:before, +.uk-icon-paper-plane:before { + content: "\f1d8"; } + +.uk-icon-send-o:before, +.uk-icon-paper-plane-o:before { + content: "\f1d9"; } + +.uk-icon-history:before { + content: "\f1da"; } + +.uk-icon-genderless:before, +.uk-icon-circle-thin:before { + content: "\f1db"; } + +.uk-icon-header:before { + content: "\f1dc"; } + +.uk-icon-paragraph:before { + content: "\f1dd"; } + +.uk-icon-sliders:before { + content: "\f1de"; } + +.uk-icon-share-alt:before { + content: "\f1e0"; } + +.uk-icon-share-alt-square:before { + content: "\f1e1"; } + +.uk-icon-bomb:before { + content: "\f1e2"; } + +.uk-icon-soccer-ball-o:before, +.uk-icon-futbol-o:before { + content: "\f1e3"; } + +.uk-icon-tty:before { + content: "\f1e4"; } + +.uk-icon-binoculars:before { + content: "\f1e5"; } + +.uk-icon-plug:before { + content: "\f1e6"; } + +.uk-icon-slideshare:before { + content: "\f1e7"; } + +.uk-icon-twitch:before { + content: "\f1e8"; } + +.uk-icon-yelp:before { + content: "\f1e9"; } + +.uk-icon-newspaper-o:before { + content: "\f1ea"; } + +.uk-icon-wifi:before { + content: "\f1eb"; } + +.uk-icon-calculator:before { + content: "\f1ec"; } + +.uk-icon-paypal:before { + content: "\f1ed"; } + +.uk-icon-google-wallet:before { + content: "\f1ee"; } + +.uk-icon-cc-visa:before { + content: "\f1f0"; } + +.uk-icon-cc-mastercard:before { + content: "\f1f1"; } + +.uk-icon-cc-discover:before { + content: "\f1f2"; } + +.uk-icon-cc-amex:before { + content: "\f1f3"; } + +.uk-icon-cc-paypal:before { + content: "\f1f4"; } + +.uk-icon-cc-stripe:before { + content: "\f1f5"; } + +.uk-icon-bell-slash:before { + content: "\f1f6"; } + +.uk-icon-bell-slash-o:before { + content: "\f1f7"; } + +.uk-icon-trash:before { + content: "\f1f8"; } + +.uk-icon-copyright:before { + content: "\f1f9"; } + +.uk-icon-at:before { + content: "\f1fa"; } + +.uk-icon-eyedropper:before { + content: "\f1fb"; } + +.uk-icon-paint-brush:before { + content: "\f1fc"; } + +.uk-icon-birthday-cake:before { + content: "\f1fd"; } + +.uk-icon-area-chart:before { + content: "\f1fe"; } + +.uk-icon-pie-chart:before { + content: "\f200"; } + +.uk-icon-line-chart:before { + content: "\f201"; } + +.uk-icon-lastfm:before { + content: "\f202"; } + +.uk-icon-lastfm-square:before { + content: "\f203"; } + +.uk-icon-toggle-off:before { + content: "\f204"; } + +.uk-icon-toggle-on:before { + content: "\f205"; } + +.uk-icon-bicycle:before { + content: "\f206"; } + +.uk-icon-bus:before { + content: "\f207"; } + +.uk-icon-ioxhost:before { + content: "\f208"; } + +.uk-icon-angellist:before { + content: "\f209"; } + +.uk-icon-cc:before { + content: "\f20a"; } + +.uk-icon-shekel:before, +.uk-icon-sheqel:before, +.uk-icon-ils:before { + content: "\f20b"; } + +.uk-icon-meanpath:before { + content: "\f20c"; } + +.uk-icon-buysellads:before { + content: "\f20d"; } + +.uk-icon-connectdevelop:before { + content: "\f20e"; } + +.uk-icon-dashcube:before { + content: "\f210"; } + +.uk-icon-forumbee:before { + content: "\f211"; } + +.uk-icon-leanpub:before { + content: "\f212"; } + +.uk-icon-sellsy:before { + content: "\f213"; } + +.uk-icon-shirtsinbulk:before { + content: "\f214"; } + +.uk-icon-simplybuilt:before { + content: "\f215"; } + +.uk-icon-skyatlas:before { + content: "\f216"; } + +.uk-icon-cart-plus:before { + content: "\f217"; } + +.uk-icon-cart-arrow-down:before { + content: "\f218"; } + +.uk-icon-diamond:before { + content: "\f219"; } + +.uk-icon-ship:before { + content: "\f21a"; } + +.uk-icon-user-secret:before { + content: "\f21b"; } + +.uk-icon-motorcycle:before { + content: "\f21c"; } + +.uk-icon-street-view:before { + content: "\f21d"; } + +.uk-icon-heartbeat:before { + content: "\f21e"; } + +.uk-icon-venus:before { + content: "\f221"; } + +.uk-icon-mars:before { + content: "\f222"; } + +.uk-icon-mercury:before { + content: "\f223"; } + +.uk-icon-transgender:before { + content: "\f224"; } + +.uk-icon-transgender-alt:before { + content: "\f225"; } + +.uk-icon-venus-double:before { + content: "\f226"; } + +.uk-icon-mars-double:before { + content: "\f227"; } + +.uk-icon-venus-mars:before { + content: "\f228"; } + +.uk-icon-mars-stroke:before { + content: "\f229"; } + +.uk-icon-mars-stroke-v:before { + content: "\f22a"; } + +.uk-icon-mars-stroke-h:before { + content: "\f22b"; } + +.uk-icon-neuter:before { + content: "\f22c"; } + +.uk-icon-facebook-official:before { + content: "\f230"; } + +.uk-icon-pinterest-p:before { + content: "\f231"; } + +.uk-icon-whatsapp:before { + content: "\f232"; } + +.uk-icon-server:before { + content: "\f233"; } + +.uk-icon-user-plus:before { + content: "\f234"; } + +.uk-icon-user-times:before { + content: "\f235"; } + +.uk-icon-hotel:before, +.uk-icon-bed:before { + content: "\f236"; } + +.uk-icon-viacoin:before { + content: "\f237"; } + +.uk-icon-train:before { + content: "\f238"; } + +.uk-icon-subway:before { + content: "\f239"; } + +.uk-icon-medium-logo:before { + content: "\f23a"; } + +.uk-icon-500px:before { + content: "\f26e"; } + +.uk-icon-amazon:before { + content: "\f270"; } + +.uk-icon-balance-scale:before { + content: "\f24e"; } + +.uk-icon-battery-empty:before, +.uk-icon-battery-0:before { + content: "\f244"; } + +.uk-icon-battery-quarter:before, +.uk-icon-battery-1:before { + content: "\f243"; } + +.uk-icon-battery-half:before, +.uk-icon-battery-2:before { + content: "\f242"; } + +.uk-icon-battery-three-quarters:before, +.uk-icon-battery-3:before { + content: "\f241"; } + +.uk-icon-battery-full:before, +.uk-icon-battery-4:before { + content: "\f240"; } + +.uk-icon-black-tie:before { + content: "\f27e"; } + +.uk-icon-calendar-check-o:before { + content: "\f274"; } + +.uk-icon-calendar-minus-o:before { + content: "\f272"; } + +.uk-icon-calendar-plus-o:before { + content: "\f271"; } + +.uk-icon-calendar-times-o:before { + content: "\f273"; } + +.uk-icon-cc-diners-club:before { + content: "\f24c"; } + +.uk-icon-cc-jcb:before { + content: "\f24b"; } + +.uk-icon-chrome:before { + content: "\f268"; } + +.uk-icon-clone:before { + content: "\f24d"; } + +.uk-icon-commenting:before { + content: "\f27a"; } + +.uk-icon-commenting-o:before { + content: "\f27b"; } + +.uk-icon-contao:before { + content: "\f26d"; } + +.uk-icon-creative-commons:before { + content: "\f25e"; } + +.uk-icon-expeditedssl:before { + content: "\f23e"; } + +.uk-icon-firefox:before { + content: "\f269"; } + +.uk-icon-fonticons:before { + content: "\f280"; } + +.uk-icon-get-pocket:before { + content: "\f265"; } + +.uk-icon-gg:before { + content: "\f260"; } + +.uk-icon-gg-circle:before { + content: "\f261"; } + +.uk-icon-hand-lizard-o:before { + content: "\f258"; } + +.uk-icon-hand-stop-o:before, +.uk-icon-hand-paper-o:before { + content: "\f256"; } + +.uk-icon-hand-peace-o:before { + content: "\f25b"; } + +.uk-icon-hand-pointer-o:before { + content: "\f25a"; } + +.uk-icon-hand-grab-o:before, +.uk-icon-hand-rock-o:before { + content: "\f255"; } + +.uk-icon-hand-scissors-o:before { + content: "\f257"; } + +.uk-icon-hand-spock-o:before { + content: "\f259"; } + +.uk-icon-hourglass:before { + content: "\f254"; } + +.uk-icon-hourglass-o:before { + content: "\f250"; } + +.uk-icon-hourglass-1:before, +.uk-icon-hourglass-start:before { + content: "\f251"; } + +.uk-icon-hourglass-2:before, +.uk-icon-hourglass-half:before { + content: "\f252"; } + +.uk-icon-hourglass-3:before, +.uk-icon-hourglass-end:before { + content: "\f253"; } + +.uk-icon-houzz:before { + content: "\f27c"; } + +.uk-icon-i-cursor:before { + content: "\f246"; } + +.uk-icon-industry:before { + content: "\f275"; } + +.uk-icon-internet-explorer:before { + content: "\f26b"; } + +.uk-icon-map:before { + content: "\f279"; } + +.uk-icon-map-o:before { + content: "\f278"; } + +.uk-icon-map-pin:before { + content: "\f276"; } + +.uk-icon-map-signs:before { + content: "\f277"; } + +.uk-icon-mouse-pointer:before { + content: "\f245"; } + +.uk-icon-object-group:before { + content: "\f247"; } + +.uk-icon-object-ungroup:before { + content: "\f248"; } + +.uk-icon-odnoklassniki:before { + content: "\f263"; } + +.uk-icon-odnoklassniki-square:before { + content: "\f264"; } + +.uk-icon-opencart:before { + content: "\f23d"; } + +.uk-icon-opera:before { + content: "\f26a"; } + +.uk-icon-optin-monster:before { + content: "\f23c"; } + +.uk-icon-registered:before { + content: "\f25d"; } + +.uk-icon-safari:before { + content: "\f267"; } + +.uk-icon-sticky-note:before { + content: "\f249"; } + +.uk-icon-sticky-note-o:before { + content: "\f24a"; } + +.uk-icon-tv:before, +.uk-icon-television:before { + content: "\f26c"; } + +.uk-icon-trademark:before { + content: "\f25c"; } + +.uk-icon-tripadvisor:before { + content: "\f262"; } + +.uk-icon-vimeo:before { + content: "\f27d"; } + +.uk-icon-wikipedia-w:before { + content: "\f266"; } + +.uk-icon-yc:before, +.uk-icon-y-combinator:before { + content: "\f23b"; } + +.uk-icon-yc-square:before, +.uk-icon-y-combinator-square:before { + content: "\f1d4"; } + +.uk-icon-bluetooth:before { + content: "\f293"; } + +.uk-icon-bluetooth-b:before { + content: "\f294"; } + +.uk-icon-codiepie:before { + content: "\f284"; } + +.uk-icon-credit-card-alt:before { + content: "\f283"; } + +.uk-icon-edge:before { + content: "\f282"; } + +.uk-icon-fort-awesome:before { + content: "\f286"; } + +.uk-icon-hashtag:before { + content: "\f292"; } + +.uk-icon-mixcloud:before { + content: "\f289"; } + +.uk-icon-modx:before { + content: "\f285"; } + +.uk-icon-pause-circle:before { + content: "\f28b"; } + +.uk-icon-pause-circle-o:before { + content: "\f28c"; } + +.uk-icon-percent:before { + content: "\f295"; } + +.uk-icon-product-hunt:before { + content: "\f288"; } + +.uk-icon-reddit-alien:before { + content: "\f281"; } + +.uk-icon-scribd:before { + content: "\f28a"; } + +.uk-icon-shopping-bag:before { + content: "\f290"; } + +.uk-icon-shopping-basket:before { + content: "\f291"; } + +.uk-icon-stop-circle:before { + content: "\f28d"; } + +.uk-icon-stop-circle-o:before { + content: "\f28e"; } + +.uk-icon-usb:before { + content: "\f287"; } + +.uk-icon-american-sign-language-interpreting:before, +.uk-icon-asl-interpreting:before { + content: "\f2a3"; } + +.uk-icon-assistive-listening-systems:before { + content: "\f2a2"; } + +.uk-icon-audio-description:before { + content: "\f29e"; } + +.uk-icon-blind:before { + content: "\f29d"; } + +.uk-icon-braille:before { + content: "\f2a1"; } + +.uk-icon-deaf:before, +.uk-icon-deafness:before { + content: "\f2a4"; } + +.uk-icon-envira:before { + content: "\f299"; } + +.uk-icon-font-awesome:before, +.uk-icon-fa:before { + content: "\f2b4"; } + +.uk-icon-first-order:before { + content: "\f2b0"; } + +.uk-icon-gitlab:before { + content: "\f296"; } + +.uk-icon-glide:before { + content: "\f2a5"; } + +.uk-icon-glide-g:before { + content: "\f2a6"; } + +.uk-icon-hard-of-hearing:before { + content: "\f2a4"; } + +.uk-icon-low-vision:before { + content: "\f2a8"; } + +.uk-icon-question-circle-o:before { + content: "\f29c"; } + +.uk-icon-sign-language:before, +.uk-icon-signing:before { + content: "\f2a7"; } + +.uk-icon-snapchat:before { + content: "\f2ab"; } + +.uk-icon-snapchat-ghost:before { + content: "\f2ac"; } + +.uk-icon-snapchat-square:before { + content: "\f2ad"; } + +.uk-icon-themeisle:before { + content: "\f2b2"; } + +.uk-icon-universal-access:before { + content: "\f29a"; } + +.uk-icon-viadeo:before { + content: "\f2a9"; } + +.uk-icon-viadeo-square:before { + content: "\f2aa"; } + +.uk-icon-volume-control-phone:before { + content: "\f2a0"; } + +.uk-icon-wheelchair-alt:before { + content: "\f29b"; } + +.uk-icon-wpbeginner:before { + content: "\f297"; } + +.uk-icon-wpforms:before { + content: "\f298"; } + +.uk-icon-yoast:before { + content: "\f2b1"; } + +/* ======================================================================== + Component: Close + ========================================================================== */ +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-close::-moz-focus-inner { + border: 0; + padding: 0; } + +/* + * 1. Correct inability to style clickable `input` types in iOS. + * 2. Remove margins in Chrome, Safari and Opera. + * 3. Remove borders for `button`. + * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. + * 5. Correct `font` properties and `color` not being inherited for `button`. + * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE + * 7. Remove default `button` padding and background color + * 8. Style + */ +.uk-close { + /* 1 */ + -webkit-appearance: none; + /* 2 */ + margin: 0; + /* 3 */ + border: none; + /* 4 */ + overflow: visible; + /* 5 */ + font: inherit; + color: inherit; + /* 6 */ + text-transform: none; + /* 7. */ + padding: 0; + background: transparent; + /* 8 */ + display: inline-block; + box-sizing: content-box; + width: 20px; + line-height: 20px; + text-align: center; + vertical-align: middle; + opacity: 0.3; } + +/* Icon */ +.uk-close:after { + display: block; + content: "\f00d"; + font-family: FontAwesome; } + +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + * 3. Required for `a` elements + */ +.uk-close:hover, +.uk-close:focus { + opacity: 0.5; + /* 2 */ + outline: none; + /* 3 */ + color: inherit; + text-decoration: none; + cursor: pointer; } + +/* Modifier + ========================================================================== */ +.uk-close-alt { + padding: 2px; + border-radius: 50%; + background: #eee; + opacity: 1; } + +/* Hover */ +.uk-close-alt:hover, +.uk-close-alt:focus { + opacity: 1; } + +/* Icon */ +.uk-close-alt:after { + opacity: 0.5; } + +.uk-close-alt:hover:after, +.uk-close-alt:focus:after { + opacity: 0.8; } + +/* ======================================================================== + Component: Badge + ========================================================================== */ +.uk-badge { + display: inline-block; + padding: 0 5px; + background: #fce3ca; + font-size: 10px; + font-weight: bold; + line-height: 14px; + color: black; + text-align: center; + vertical-align: middle; + text-transform: none; } + +/* + * Keep color when badge is a link + */ +a.uk-badge:hover { + color: #fff; } + +/* Modifier: `uk-badge-notification`; + ========================================================================== */ +.uk-badge-notification { + box-sizing: border-box; + min-width: 18px; + border-radius: 500px; + font-size: 12px; + line-height: 18px; } + +/* Color modifier + ========================================================================== */ +/* + * Modifier: `uk-badge-success` + */ +.uk-badge-success { + background-color: #8cc14c; } + +/* + * Modifier: `uk-badge-warning` + */ +.uk-badge-warning { + background-color: #faa732; } + +/* + * Modifier: `uk-badge-danger` + */ +.uk-badge-danger { + background-color: #da314b; } + +/* ======================================================================== + Component: Alert + ========================================================================== */ +.uk-alert { + margin-bottom: 15px; + padding: 10px; + background: #ebf7fd; + color: #2d7091; } + +/* + * Add margin if adjacent element + */ +* + .uk-alert { + margin-top: 15px; } + +/* + * Remove margin from the last-child + */ +.uk-alert > :last-child { + margin-bottom: 0; } + +/* + * Keep color for headings if the default heading color is changed + */ +.uk-alert h1, +.uk-alert h2, +.uk-alert h3, +.uk-alert h4, +.uk-alert h5, +.uk-alert h6 { + color: inherit; } + +/* Close in alert + ========================================================================== */ +.uk-alert > .uk-close:first-child { + float: right; } + +/* + * Remove margin from adjacent element + */ +.uk-alert > .uk-close:first-child + * { + margin-top: 0; } + +/* Modifier: `uk-alert-success` + ========================================================================== */ +.uk-alert-success { + background: #f2fae3; + color: #659f13; } + +/* Modifier: `uk-alert-warning` + ========================================================================== */ +.uk-alert-warning { + background: #fffceb; + color: #e28327; } + +/* Modifier: `uk-alert-danger` + ========================================================================== */ +.uk-alert-danger { + background: #fff1f0; + color: #d85030; } + +/* Modifier: `uk-alert-large` + ========================================================================== */ +.uk-alert-large { + padding: 20px; } + +.uk-alert-large > .uk-close:first-child { + margin: -10px -10px 0 0; } + +/* ======================================================================== + Component: Thumbnail + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Responsive behavior + * 3. Corrects `max-width` behavior sed + * 4. Required for `figure` element + * 5. Style + */ +.uk-thumbnail { + /* 1 */ + display: inline-block; + /* 2 */ + max-width: 100%; + /* 3 */ + box-sizing: border-box; + /* 3 */ + margin: 0; + /* 4 */ + padding: 4px; + border: 1px solid #ddd; + background: #fff; } + +/* + * Hover state for `a` elements + * 1. Apply hover style also to focus state + * 2. Needed for caption + * 3. Remove default focus style + */ +a.uk-thumbnail:hover, +a.uk-thumbnail:focus { + border-color: #aaa; + background-color: #fff; + /* 2 */ + text-decoration: none; + /* 3 */ + outline: none; } + +/* Caption + ========================================================================== */ +.uk-thumbnail-caption { + padding-top: 4px; + text-align: center; + color: #444; } + +/* Sizes + ========================================================================== */ +.uk-thumbnail-mini { + width: 150px; } + +.uk-thumbnail-small { + width: 200px; } + +.uk-thumbnail-medium { + width: 300px; } + +.uk-thumbnail-large { + width: 400px; } + +.uk-thumbnail-expand, +.uk-thumbnail-expand > img { + width: 100%; } + +/* ======================================================================== + Component: Overlay + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Create position context + * 3. Set max-width for responsive images to prevent `inline-block` consequences + * 4. Remove the gap between the container and its child element + * 5. Needed for transitions and to fixed wrong scaling calculation for images in Chrome + * 6. Fixed `overflow: hidden` to be ignored with border-radius and CSS transforms in Webkit + * 7. Reset margin + */ +.uk-overlay { + /* 1 */ + display: inline-block; + /* 2 */ + position: relative; + /* 3 */ + max-width: 100%; + /* 4 */ + vertical-align: middle; + /* 5 */ + overflow: hidden; + /* 6 */ + -webkit-transform: translateZ(0); + /* 7 */ + margin: 0; } + +/* 6 for Safari */ +.uk-overlay.uk-border-circle { + -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); } + +/* + * Remove margin from content + */ +.uk-overlay > :first-child { + margin-bottom: 0; } + +/* Sub-object `uk-overlay-panel` + ========================================================================== */ +/* + * 1. Position cover + * 2. Style + */ +.uk-overlay-panel { + /* 1 */ + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + /* 2 */ + padding: 20px; + color: #fff; } + +/* + * Remove margin from the last-child + */ +.uk-overlay-panel > :last-child, +.uk-overlay-panel.uk-flex > * > :last-child { + margin-bottom: 0; } + +/* + * Keep color for headings if the default heading color is changed + */ +.uk-overlay-panel h1, +.uk-overlay-panel h2, +.uk-overlay-panel h3, +.uk-overlay-panel h4, +.uk-overlay-panel h5, +.uk-overlay-panel h6 { + color: inherit; } + +.uk-overlay-panel a:not([class]) { + color: inherit; + text-decoration: underline; } + +.uk-overlay-panel a[class*='uk-icon-']:not(.uk-icon-button) { + color: inherit; } + +/* Sub-object `uk-overlay-hover` and `uk-overlay-active` + ========================================================================== */ +.uk-overlay-hover:not(:hover):not(.uk-hover) .uk-overlay-panel:not(.uk-ignore) { + opacity: 0; } + +.uk-overlay-active :not(.uk-active) > .uk-overlay-panel:not(.uk-ignore) { + opacity: 0; } + +/* Modifier `uk-overlay-background` + ========================================================================== */ +.uk-overlay-background { + background: rgba(0, 0, 0, 0.5); } + +/* Modifier `uk-overlay-image` + ========================================================================== */ +/* + * Reset panel + */ +.uk-overlay-image { + padding: 0; } + +/* Position modifiers + ========================================================================== */ +.uk-overlay-top { + bottom: auto; } + +.uk-overlay-bottom { + top: auto; } + +.uk-overlay-left { + right: auto; } + +.uk-overlay-right { + left: auto; } + +/* Sub-object `uk-overlay-icon` + ========================================================================== */ +.uk-overlay-icon:before { + content: ""; + position: absolute; + top: 50%; + left: 50%; + width: 50px; + height: 50px; + margin-top: -25px; + margin-left: -25px; + font-size: 50px; + line-height: 1; + font-family: FontAwesome; + text-align: center; + color: #fff; } + +/* Transitions + ========================================================================== */ +.uk-overlay-fade, +.uk-overlay-scale, +.uk-overlay-spin, +.uk-overlay-grayscale, +.uk-overlay-blur, +[class*='uk-overlay-slide'] { + transition-duration: 0.3s; + transition-timing-function: ease-out; + transition-property: opacity, transform, filter; } + +.uk-overlay-active .uk-overlay-fade, +.uk-overlay-active .uk-overlay-scale, +.uk-overlay-active .uk-overlay-spin, +.uk-overlay-active [class*='uk-overlay-slide'] { + transition-duration: 0.8s; } + +/* + * Fade + */ +.uk-overlay-fade { + opacity: 0.7; } + +.uk-overlay-hover:hover .uk-overlay-fade, +.uk-overlay-hover.uk-hover .uk-overlay-fade, +.uk-overlay-active .uk-active > .uk-overlay-fade { + opacity: 1; } + +/* + * Scale + */ +.uk-overlay-scale { + -webkit-transform: scale(1); + transform: scale(1); } + +.uk-overlay-hover:hover .uk-overlay-scale, +.uk-overlay-hover.uk-hover .uk-overlay-scale, +.uk-overlay-active .uk-active > .uk-overlay-scale { + -webkit-transform: scale(1.1); + transform: scale(1.1); } + +/* + * Spin + */ +.uk-overlay-spin { + -webkit-transform: scale(1) rotate(0deg); + transform: scale(1) rotate(0deg); } + +.uk-overlay-hover:hover .uk-overlay-spin, +.uk-overlay-hover.uk-hover .uk-overlay-spin, +.uk-overlay-active .uk-active > .uk-overlay-spin { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); } + +/* + * Grayscale + */ +.uk-overlay-grayscale { + -webkit-filter: grayscale(100%); + filter: grayscale(100%); } + +.uk-overlay-hover:hover .uk-overlay-grayscale, +.uk-overlay-hover.uk-hover .uk-overlay-grayscale, +.uk-overlay-active .uk-active > .uk-overlay-grayscale { + -webkit-filter: grayscale(0%); + filter: grayscale(0%); } + +/* + * Slide + */ +[class*='uk-overlay-slide'] { + opacity: 0; } + +/* Top */ +.uk-overlay-slide-top { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); } + +/* Bottom */ +.uk-overlay-slide-bottom { + -webkit-transform: translateY(100%); + transform: translateY(100%); } + +/* Left */ +.uk-overlay-slide-left { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); } + +/* Right */ +.uk-overlay-slide-right { + -webkit-transform: translateX(100%); + transform: translateX(100%); } + +/* Hover */ +.uk-overlay-hover:hover [class*='uk-overlay-slide'], +.uk-overlay-hover.uk-hover [class*='uk-overlay-slide'], +.uk-overlay-active .uk-active > [class*='uk-overlay-slide'] { + opacity: 1; + -webkit-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); } + +/* DEPRECATED + * Sub-object `uk-overlay-area` + ========================================================================== */ +/* + * 1. Set position + * 2. Set style + * 3. Fade-in transition + */ +.uk-overlay-area { + /* 1 */ + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + /* 2 */ + background: rgba(0, 0, 0, 0.3); + /* 3 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + -webkit-transform: translate3d(0, 0, 0); } + +/* + * Hover + * 1. `uk-hover` to support touch devices + * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier + */ +.uk-overlay:hover .uk-overlay-area, +.uk-overlay.uk-hover .uk-overlay-area, +.uk-overlay-toggle:hover .uk-overlay-area, +.uk-overlay-toggle.uk-hover .uk-overlay-area { + opacity: 1; } + +/* + * Icon + */ +.uk-overlay-area:empty:before { + content: ""; + position: absolute; + top: 50%; + left: 50%; + width: 50px; + height: 50px; + margin-top: -25px; + margin-left: -25px; + font-size: 50px; + line-height: 1; + font-family: FontAwesome; + text-align: center; + color: #fff; } + +/* DEPRECATED + * Sub-object `uk-overlay-area-content` + ========================================================================== */ +/* + * Remove whitespace between child elements when using `inline-block` + * Needed for Firefox + */ +.uk-overlay-area:not(:empty) { + font-size: 0.001px; } + +/* + * 1. Needed for vertical alignment + */ +.uk-overlay-area:not(:empty):before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +/* + * 1. Set vertical alignment + * 2. Reset whitespace hack + * 3. Set horizontal alignment + * 4. Set style + */ +.uk-overlay-area-content { + /* 1 */ + display: inline-block; + box-sizing: border-box; + width: 100%; + vertical-align: middle; + /* 2 */ + font-size: 1rem; + /* 3 */ + text-align: center; + /* 4 */ + padding: 0 15px; + color: #fff; } + +/* + * Remove margin from the last-child + */ +.uk-overlay-area-content > :last-child { + margin-bottom: 0; } + +/* + * Links in overlay area + */ +.uk-overlay-area-content a:not([class]), +.uk-overlay-area-content a:not([class]):hover { + color: inherit; } + +/* DEPRECATED + * Sub-object `uk-overlay-caption` + ========================================================================== */ +/* + * 1. Set position + * 2. Set style + * 3. Fade-in transition + */ +.uk-overlay-caption { + /* 1 */ + position: absolute; + bottom: 0; + left: 0; + right: 0; + /* 2 */ + padding: 15px; + background: rgba(0, 0, 0, 0.5); + color: #fff; + /* 3 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + -webkit-transform: translate3d(0, 0, 0); } + +/* + * Hover + * 1. `uk-hover` to support touch devices + * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier + */ +.uk-overlay:hover .uk-overlay-caption, +.uk-overlay.uk-hover .uk-overlay-caption, +.uk-overlay-toggle:hover .uk-overlay-caption, +.uk-overlay-toggle.uk-hover .uk-overlay-caption { + opacity: 1; } + +/* ======================================================================== + Component: Column + ========================================================================== */ +[class*='uk-column-'] { + -webkit-column-gap: 25px; + -moz-column-gap: 25px; + column-gap: 25px; } + +/* Width modifiers + ========================================================================== */ +.uk-column-1-2 { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; } + +.uk-column-1-3 { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; } + +.uk-column-1-4 { + -webkit-column-count: 4; + -moz-column-count: 4; + column-count: 4; } + +.uk-column-1-5 { + -webkit-column-count: 5; + -moz-column-count: 5; + column-count: 5; } + +.uk-column-1-6 { + -webkit-column-count: 6; + -moz-column-count: 6; + column-count: 6; } + +/* Phone landscape and bigger */ +@media (min-width: 480px) { + .uk-column-small-1-2 { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; } + .uk-column-small-1-3 { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; } + .uk-column-small-1-4 { + -webkit-column-count: 4; + -moz-column-count: 4; + column-count: 4; } + .uk-column-small-1-5 { + -webkit-column-count: 5; + -moz-column-count: 5; + column-count: 5; } + .uk-column-small-1-6 { + -webkit-column-count: 6; + -moz-column-count: 6; + column-count: 6; } } + +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-column-medium-1-2 { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; } + .uk-column-medium-1-3 { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; } + .uk-column-medium-1-4 { + -webkit-column-count: 4; + -moz-column-count: 4; + column-count: 4; } + .uk-column-medium-1-5 { + -webkit-column-count: 5; + -moz-column-count: 5; + column-count: 5; } + .uk-column-medium-1-6 { + -webkit-column-count: 6; + -moz-column-count: 6; + column-count: 6; } } + +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-column-large-1-2 { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; } + .uk-column-large-1-3 { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; } + .uk-column-large-1-4 { + -webkit-column-count: 4; + -moz-column-count: 4; + column-count: 4; } + .uk-column-large-1-5 { + -webkit-column-count: 5; + -moz-column-count: 5; + column-count: 5; } + .uk-column-large-1-6 { + -webkit-column-count: 6; + -moz-column-count: 6; + column-count: 6; } } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-column-xlarge-1-2 { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; } + .uk-column-xlarge-1-3 { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; } + .uk-column-xlarge-1-4 { + -webkit-column-count: 4; + -moz-column-count: 4; + column-count: 4; } + .uk-column-xlarge-1-5 { + -webkit-column-count: 5; + -moz-column-count: 5; + column-count: 5; } + .uk-column-xlarge-1-6 { + -webkit-column-count: 6; + -moz-column-count: 6; + column-count: 6; } } + +/* ======================================================================== + Component: Animation + ========================================================================== */ +[class*='uk-animation-'] { + -webkit-animation-duration: 0.5s; + animation-duration: 0.5s; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; } + +/* Hide animated element if scrollspy is used */ +@media screen { + [data-uk-scrollspy*='uk-animation-']:not([data-uk-scrollspy*='target']) { + opacity: 0; } } + +/* + * Fade + * Higher specificity (!important) needed because of reverse modifier + */ +.uk-animation-fade { + -webkit-animation-name: uk-fade; + animation-name: uk-fade; + -webkit-animation-duration: 0.8s; + animation-duration: 0.8s; + -webkit-animation-timing-function: linear !important; + animation-timing-function: linear !important; } + +/* + * Fade with scale + */ +.uk-animation-scale-up { + -webkit-animation-name: uk-fade-scale-02; + animation-name: uk-fade-scale-02; } + +.uk-animation-scale-down { + -webkit-animation-name: uk-fade-scale-18; + animation-name: uk-fade-scale-18; } + +/* + * Fade with slide + */ +.uk-animation-slide-top { + -webkit-animation-name: uk-fade-top; + animation-name: uk-fade-top; } + +.uk-animation-slide-bottom { + -webkit-animation-name: uk-fade-bottom; + animation-name: uk-fade-bottom; } + +.uk-animation-slide-left { + -webkit-animation-name: uk-fade-left; + animation-name: uk-fade-left; } + +.uk-animation-slide-right { + -webkit-animation-name: uk-fade-right; + animation-name: uk-fade-right; } + +/* + * Scale + */ +.uk-animation-scale { + -webkit-animation-name: uk-scale-12; + animation-name: uk-scale-12; } + +/* + * Shake + */ +.uk-animation-shake { + -webkit-animation-name: uk-shake; + animation-name: uk-shake; } + +/* Direction modifiers + ========================================================================== */ +.uk-animation-reverse { + -webkit-animation-direction: reverse; + animation-direction: reverse; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; } + +/* Duration modifiers +========================================================================== */ +.uk-animation-15 { + -webkit-animation-duration: 15s; + animation-duration: 15s; } + +/* Origin modifiers +========================================================================== */ +.uk-animation-top-left { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; } + +.uk-animation-top-center { + -webkit-transform-origin: 50% 0; + transform-origin: 50% 0; } + +.uk-animation-top-right { + -webkit-transform-origin: 100% 0; + transform-origin: 100% 0; } + +.uk-animation-middle-left { + -webkit-transform-origin: 0 50%; + transform-origin: 0 50%; } + +.uk-animation-middle-right { + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; } + +.uk-animation-bottom-left { + -webkit-transform-origin: 0 100%; + transform-origin: 0 100%; } + +.uk-animation-bottom-center { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; } + +.uk-animation-bottom-right { + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; } + +/* Sub-object: `uk-animation-hover` +========================================================================== */ +/* + * Enable animation only on hover + * Note: Firefox also needs this because animations are not triggered when switching between display `hidden` and `block` + */ +.uk-animation-hover:not(:hover), +.uk-animation-hover:not(:hover) [class*='uk-animation-'], +.uk-touch .uk-animation-hover:not(.uk-hover), +.uk-touch .uk-animation-hover:not(.uk-hover) [class*='uk-animation-'] { + -webkit-animation-name: none; + animation-name: none; } + +/* Keyframes: Fade + * Used by dropdown, datepicker and slideshow component + ========================================================================== */ +@-webkit-keyframes uk-fade { + 0% { + opacity: 0; } + 100% { + opacity: 1; } } + +@keyframes uk-fade { + 0% { + opacity: 0; } + 100% { + opacity: 1; } } + +/* Keyframes: Fade with slide + ========================================================================== */ +/* + * Top + */ +@-webkit-keyframes uk-fade-top { + 0% { + opacity: 0; + -webkit-transform: translateY(-100%); } + 100% { + opacity: 1; + -webkit-transform: translateY(0); } } + +@keyframes uk-fade-top { + 0% { + opacity: 0; + transform: translateY(-100%); } + 100% { + opacity: 1; + transform: translateY(0); } } + +/* + * Bottom + */ +@-webkit-keyframes uk-fade-bottom { + 0% { + opacity: 0; + -webkit-transform: translateY(100%); } + 100% { + opacity: 1; + -webkit-transform: translateY(0); } } + +@keyframes uk-fade-bottom { + 0% { + opacity: 0; + transform: translateY(100%); } + 100% { + opacity: 1; + transform: translateY(0); } } + +/* + * Left + */ +@-webkit-keyframes uk-fade-left { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%); } + 100% { + opacity: 1; + -webkit-transform: translateX(0); } } + +@keyframes uk-fade-left { + 0% { + opacity: 0; + transform: translateX(-100%); } + 100% { + opacity: 1; + transform: translateX(0); } } + +/* + * Right + */ +@-webkit-keyframes uk-fade-right { + 0% { + opacity: 0; + -webkit-transform: translateX(100%); } + 100% { + opacity: 1; + -webkit-transform: translateX(0); } } + +@keyframes uk-fade-right { + 0% { + opacity: 0; + transform: translateX(100%); } + 100% { + opacity: 1; + transform: translateX(0); } } + +/* Keyframes: Fade with scale + ========================================================================== */ +/* + * Scale by 0.2 + */ +@-webkit-keyframes uk-fade-scale-02 { + 0% { + opacity: 0; + -webkit-transform: scale(0.2); } + 100% { + opacity: 1; + -webkit-transform: scale(1); } } + +@keyframes uk-fade-scale-02 { + 0% { + opacity: 0; + transform: scale(0.2); } + 100% { + opacity: 1; + transform: scale(1); } } + +/* + * Scale by 1.5 + * Used by slideshow component + */ +@-webkit-keyframes uk-fade-scale-15 { + 0% { + opacity: 0; + -webkit-transform: scale(1.5); } + 100% { + opacity: 1; + -webkit-transform: scale(1); } } + +@keyframes uk-fade-scale-15 { + 0% { + opacity: 0; + transform: scale(1.5); } + 100% { + opacity: 1; + transform: scale(1); } } + +/* + * Scale by 1.8 + */ +@-webkit-keyframes uk-fade-scale-18 { + 0% { + opacity: 0; + -webkit-transform: scale(1.8); } + 100% { + opacity: 1; + -webkit-transform: scale(1); } } + +@keyframes uk-fade-scale-18 { + 0% { + opacity: 0; + transform: scale(1.8); } + 100% { + opacity: 1; + transform: scale(1); } } + +/* Keyframes: Slide + * Used by slideshow component + ========================================================================== */ +/* + * Left + */ +@-webkit-keyframes uk-slide-left { + 0% { + -webkit-transform: translateX(-100%); } + 100% { + -webkit-transform: translateX(0); } } + +@keyframes uk-slide-left { + 0% { + transform: translateX(-100%); } + 100% { + transform: translateX(0); } } + +/* + * Right + */ +@-webkit-keyframes uk-slide-right { + 0% { + -webkit-transform: translateX(100%); } + 100% { + -webkit-transform: translateX(0); } } + +@keyframes uk-slide-right { + 0% { + transform: translateX(100%); } + 100% { + transform: translateX(0); } } + +/* + * Left third + */ +@-webkit-keyframes uk-slide-left-33 { + 0% { + -webkit-transform: translateX(33%); } + 100% { + -webkit-transform: translateX(0); } } + +@keyframes uk-slide-left-33 { + 0% { + transform: translateX(33%); } + 100% { + transform: translateX(0); } } + +/* + * Right third + */ +@-webkit-keyframes uk-slide-right-33 { + 0% { + -webkit-transform: translateX(-33%); } + 100% { + -webkit-transform: translateX(0); } } + +@keyframes uk-slide-right-33 { + 0% { + transform: translateX(-33%); } + 100% { + transform: translateX(0); } } + +/* Keyframes: Scale + ========================================================================== */ +@-webkit-keyframes uk-scale-12 { + 0% { + -webkit-transform: scale(1.2); } + 100% { + -webkit-transform: scale(1); } } + +@keyframes uk-scale-12 { + 0% { + transform: scale(1.2); } + 100% { + transform: scale(1); } } + +/* Keyframes: Rotate + * Used by icon component + ========================================================================== */ +@-webkit-keyframes uk-rotate { + 0% { + -webkit-transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); } } + +@keyframes uk-rotate { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(359deg); } } + +/* Keyframes: Shake + ========================================================================== */ +@-webkit-keyframes uk-shake { + 0%, 100% { + -webkit-transform: translateX(0); } + 10% { + -webkit-transform: translateX(-9px); } + 20% { + -webkit-transform: translateX(8px); } + 30% { + -webkit-transform: translateX(-7px); } + 40% { + -webkit-transform: translateX(6px); } + 50% { + -webkit-transform: translateX(-5px); } + 60% { + -webkit-transform: translateX(4px); } + 70% { + -webkit-transform: translateX(-3px); } + 80% { + -webkit-transform: translateX(2px); } + 90% { + -webkit-transform: translateX(-1px); } } + +@keyframes uk-shake { + 0%, 100% { + transform: translateX(0); } + 10% { + transform: translateX(-9px); } + 20% { + transform: translateX(8px); } + 30% { + transform: translateX(-7px); } + 40% { + transform: translateX(6px); } + 50% { + transform: translateX(-5px); } + 60% { + transform: translateX(4px); } + 70% { + transform: translateX(-3px); } + 80% { + transform: translateX(2px); } + 90% { + transform: translateX(-1px); } } + +/* Keyframes: Fade with slide fixed + * Used by dropdown and search component + ========================================================================== */ +/* + * Top fixed + */ +@-webkit-keyframes uk-slide-top-fixed { + 0% { + opacity: 0; + -webkit-transform: translateY(-10px); } + 100% { + opacity: 1; + -webkit-transform: translateY(0); } } + +@keyframes uk-slide-top-fixed { + 0% { + opacity: 0; + transform: translateY(-10px); } + 100% { + opacity: 1; + transform: translateY(0); } } + +/* + * Bottom fixed + */ +@-webkit-keyframes uk-slide-bottom-fixed { + 0% { + opacity: 0; + -webkit-transform: translateY(10px); } + 100% { + opacity: 1; + -webkit-transform: translateY(0); } } + +@keyframes uk-slide-bottom-fixed { + 0% { + opacity: 0; + transform: translateY(10px); } + 100% { + opacity: 1; + transform: translateY(0); } } + +/* ======================================================================== + Component: Dropdown + ========================================================================== */ +/* + * 1. Hide by default + * 2. Set position + * 3. Box-sizing is needed for `uk-dropdown-justify` + * 4. Set width + */ +.uk-dropdown, +.uk-dropdown-blank { + /* 1 */ + display: none; + /* 2 */ + position: absolute; + z-index: 970; + /* 3 */ + box-sizing: border-box; + /* 4 */ + width: 200px; } + +/* + * Dropdown style + * 1. Reset button group whitespace hack + */ +.uk-dropdown { + padding: 15px; + background: #f5f5f5; + color: #444; + /* 1 */ + font-size: 1rem; + vertical-align: top; } + +/* Focus */ +.uk-dropdown:focus { + outline: none; } + +/* + * 1. Show dropdown + * 2. Set animation + * 3. Needed for scale animation + */ +.uk-open > .uk-dropdown, +.uk-open > .uk-dropdown-blank { + /* 1 */ + display: block; + /* 2 */ + -webkit-animation: uk-fade 0.2s ease-in-out; + animation: uk-fade 0.2s ease-in-out; + /* 3 */ + -webkit-transform-origin: 0 0; + transform-origin: 0 0; } + +/* Alignment modifiers + ========================================================================== */ +/* + * Modifier + */ +.uk-dropdown-top { + margin-top: -5px; } + +.uk-dropdown-bottom { + margin-top: 5px; } + +.uk-dropdown-left { + margin-left: -5px; } + +.uk-dropdown-right { + margin-left: 5px; } + +/* Nav in dropdown + ========================================================================== */ +.uk-dropdown .uk-nav { + margin: 0 -15px; } + +/* Grid and panel in dropdown + ========================================================================== */ +/* +* Vertical gutter +*/ +/* + * Grid + * Higher specificity to override large gutter + */ +.uk-grid .uk-dropdown-grid + .uk-dropdown-grid { + margin-top: 15px; } + +/* Panels */ +.uk-dropdown-grid > [class*='uk-width-'] > .uk-panel + .uk-panel { + margin-top: 15px; } + +/* Tablet and bigger */ +@media (min-width: 768px) { + /* + * Horizontal gutter + */ + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid { + margin-left: -15px; + margin-right: -15px; } + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-'] { + padding-left: 15px; + padding-right: 15px; } + /* + * Column divider + */ + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + border-left: 1px solid #ddd; } + /* + * Width multiplier for dropdown columns + */ + .uk-dropdown-width-2:not(.uk-dropdown-stack) { + width: 400px; } + .uk-dropdown-width-3:not(.uk-dropdown-stack) { + width: 600px; } + .uk-dropdown-width-4:not(.uk-dropdown-stack) { + width: 800px; } + .uk-dropdown-width-5:not(.uk-dropdown-stack) { + width: 1000px; } } + +/* Phone landscape and smaller */ +@media (max-width: 767px) { + /* + * Stack columns and take full width + */ + .uk-dropdown-grid > [class*='uk-width-'] { + width: 100%; } + /* + * Vertical gutter + */ + .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + margin-top: 15px; } } + +/* +* Stack grid columns +*/ +.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-'] { + width: 100%; } + +.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + margin-top: 15px; } + +/* Modifier `uk-dropdown-small` + ========================================================================== */ +/* + * Set min-width and text expands dropdown if needed + */ +.uk-dropdown-small { + min-width: 150px; + width: auto; + padding: 5px; + white-space: nowrap; } + +/* + * Nav in dropdown + */ +.uk-dropdown-small .uk-nav { + margin: 0 -5px; } + +/* Modifier: `uk-dropdown-navbar` + ========================================================================== */ +.uk-dropdown-navbar { + margin-top: 0; + background: #f5f5f5; + color: #444; } + +.uk-open > .uk-dropdown-navbar { + -webkit-animation: uk-slide-top-fixed 0.2s ease-in-out; + animation: uk-slide-top-fixed 0.2s ease-in-out; } + +/* Modifier `uk-dropdown-scrollable` + ========================================================================== */ +/* + * Usefull for long lists + */ +.uk-dropdown-scrollable { + overflow-y: auto; + max-height: 200px; } + +/* Sub-object: `uk-dropdown-overlay` + ========================================================================== */ +/* ======================================================================== + Component: Modal + ========================================================================== */ +/* + * This is the modal overlay and modal dialog container + * 1. Hide by default + * 2. Set fixed position + * 3. Allow scrolling for the modal dialog + * 4. Mask the background page + * 5. Fade-in transition + * 6. Deactivate browser history navigation in IE11 + * 7. force hardware acceleration to prevent browser rendering hiccups + */ +.uk-modal { + /* 1 */ + display: none; + /* 2 */ + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1010; + /* 3 */ + overflow-y: auto; + -webkit-overflow-scrolling: touch; + /* 4 */ + background: rgba(0, 0, 0, 0.6); + /* 5 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + /* 6 */ + touch-action: cross-slide-y pinch-zoom double-tap-zoom; + /* 7 */ + -webkit-transform: translateZ(0); + transform: translateZ(0); } + +/* + * Open state + */ +.uk-modal.uk-open { + opacity: 1; } + +/* + * Prevents duplicated scrollbar caused by 4. + */ +.uk-modal-page, +.uk-modal-page body { + overflow: hidden; } + +/* Sub-object: `uk-modal-dialog` + ========================================================================== */ +/* + * 1. Create position context for caption, spinner and close button + * 2. Set box sizing + * 3. Set style + * 4. Slide-in transition + */ +.uk-modal-dialog { + /* 1 */ + position: relative; + /* 2 */ + box-sizing: border-box; + margin: 50px auto; + padding: 20px; + width: 600px; + max-width: 100%; + max-width: calc(100% - 20px); + /* 3 */ + background: #fff; + /* 4 */ + opacity: 0; + -webkit-transform: translateY(-100px); + transform: translateY(-100px); + -webkit-transition: opacity 0.3s linear, -webkit-transform 0.3s ease-out; + transition: opacity 0.3s linear, transform 0.3s ease-out; } + +/* Phone landscape and smaller */ +@media (max-width: 767px) { + /* + * Fit in small screen + */ + .uk-modal-dialog { + width: auto; + margin: 10px auto; } } + +/* + * Open state + */ +.uk-open .uk-modal-dialog { + /* 4 */ + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); } + +/* + * Remove margin from the last-child + */ +.uk-modal-dialog > :not([class*='uk-modal-']):last-child { + margin-bottom: 0; } + +/* Close in modal + ========================================================================== */ +.uk-modal-dialog > .uk-close:first-child { + margin: -10px -10px 0 0; + float: right; } + +/* + * Remove margin from adjacent element + */ +.uk-modal-dialog > .uk-close:first-child + :not([class*='uk-modal-']) { + margin-top: 0; } + +/* Modifier: `uk-modal-dialog-lightbox` + ========================================================================== */ +.uk-modal-dialog-lightbox { + margin: 15px auto; + padding: 0; + max-width: 95%; + max-width: calc(100% - 30px); + min-height: 50px; } + +/* + * Close button + */ +.uk-modal-dialog-lightbox > .uk-close:first-child { + position: absolute; + top: -12px; + right: -12px; + margin: 0; + float: none; } + +/* Phone landscape and smaller */ +@media (max-width: 767px) { + .uk-modal-dialog-lightbox > .uk-close:first-child { + top: -7px; + right: -7px; } } + +/* Modifier: `uk-modal-dialog-blank` + ========================================================================== */ +.uk-modal-dialog-blank { + margin: 0; + padding: 0; + width: 100%; + max-width: 100%; + -webkit-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; } + +/* +* Close button +*/ +.uk-modal-dialog-blank > .uk-close:first-child { + position: absolute; + top: 20px; + right: 20px; + z-index: 1; + margin: 0; + float: none; } + +/* Modifier: `uk-modal-dialog-large` + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-modal-dialog-large { + width: 930px; } } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-modal-dialog-large { + width: 1130px; } } + +/* Sub-Object: `uk-modal-header` and `uk-modal-footer` + ========================================================================== */ +.uk-modal-header { + margin-bottom: 15px; } + +.uk-modal-footer { + margin-top: 15px; } + +/* + * Remove margin from the last-child + */ +.uk-modal-header > :last-child, +.uk-modal-footer > :last-child { + margin-bottom: 0; } + +/* Sub-Object: `uk-modal-caption` + ========================================================================== */ +.uk-modal-caption { + position: absolute; + left: 0; + right: 0; + bottom: -20px; + margin-bottom: -10px; + color: #fff; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +/* Sub-Object: `uk-modal-spinner` + ========================================================================== */ +.uk-modal-spinner { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + font-size: 25px; + color: #ddd; } + +.uk-modal-spinner:after { + content: "\f110"; + display: block; + font-family: FontAwesome; + -webkit-animation: uk-rotate 2s infinite linear; + animation: uk-rotate 2s infinite linear; } + +/* ======================================================================== + Component: Off-canvas + ========================================================================== */ +/* + * This is the offcanvas overlay and bar container + * 1. Hide by default + * 2. Set fixed position + * 3. Deactivate browser touch actions in IE11 + * 4. Mask the background page + */ +.uk-offcanvas { + /* 1 */ + display: none; + /* 2 */ + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + /* 3 */ + touch-action: none; + /* 4 */ + background: rgba(0, 0, 0, 0.1); } + +.uk-offcanvas.uk-active { + display: block; } + +/* Sub-object `uk-offcanvas-page` + ========================================================================== */ +/* + * Prepares the whole HTML page to slide-out + * 1. Fix the main page and disallow scrolling + * 2. Side-out transition + * 3. Needed for the transition to work instead of just letting it pop to the side + */ +.uk-offcanvas-page { + /* 1 */ + position: fixed; + /* 2 */ + -webkit-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; + /* 3 */ + margin-left: 0; } + +/* Sub-object `uk-offcanvas-bar` + ========================================================================== */ +/* + * This is the offcanvas bar + * 1. Set fixed position + * 2. Size and style + * 3. Allow scrolling + * 4. Side-out transition + * 5. Deactivate scroll chaining in IE11 + */ +.uk-offcanvas-bar { + /* 1 */ + position: fixed; + top: 0; + bottom: 0; + left: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + z-index: 1001; + /* 2 */ + width: 270px; + max-width: 100%; + background: #333; + /* 3 */ + overflow-y: auto; + -webkit-overflow-scrolling: touch; + /* 4 */ + -webkit-transition: -webkit-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; + /* 5 */ + -ms-scroll-chaining: none; } + +.uk-offcanvas.uk-active .uk-offcanvas-bar.uk-offcanvas-bar-show { + -webkit-transform: translateX(0%); + transform: translateX(0%); } + +/* Modifier `uk-offcanvas-bar-flip` + ========================================================================== */ +.uk-offcanvas-bar-flip { + left: auto; + right: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); } + +/* Offcanvase modes + ========================================================================== */ +.uk-offcanvas-bar[mode='none'] { + -webkit-transition: none; + transition: none; } + +.uk-offcanvas-bar[mode='reveal'] { + -webkit-transform: translateX(0%); + transform: translateX(0%); + clip: rect(0, 0, 100vh, 0); + -webkit-transition: -webkit-transform 0.3s ease-in-out, clip 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, clip 0.3s ease-in-out; } + +.uk-offcanvas-bar-flip[mode='reveal'] { + clip: none; + -webkit-transform: translateX(100%); + transform: translateX(100%); } + +.uk-offcanvas-bar-flip[mode='reveal'] > * { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + -webkit-transition: -webkit-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; } + +.uk-offcanvas.uk-active .uk-offcanvas-bar-flip[mode='reveal'].uk-offcanvas-bar-show > * { + -webkit-transform: translateX(0%); + transform: translateX(0%); } + +/* Panel in offcanvas + ========================================================================== */ +.uk-offcanvas .uk-panel { + margin: 20px 15px; + color: #777; } + +.uk-offcanvas .uk-panel-title { + color: #ccc; } + +.uk-offcanvas .uk-panel a:not([class]) { + color: #ccc; } + +.uk-offcanvas .uk-panel a:not([class]):hover { + color: #fff; } + +/* ======================================================================== + Component: Switcher + ========================================================================== */ +/* + * 1. Deactivate browser history navigation in IE11 + */ +.uk-switcher { + margin: 0; + padding: 0; + list-style: none; + /* 1 */ + touch-action: cross-slide-y pinch-zoom double-tap-zoom; } + +/* + * Items + */ +.uk-switcher > :not(.uk-active) { + display: none; } + +/* ======================================================================== + Component: Text + ========================================================================== */ +/* Size modifiers + ========================================================================== */ +.uk-text-small { + font-size: 11px; + line-height: 16px; } + +.uk-text-large { + font-size: 18px; + line-height: 24px; + font-weight: normal; } + +/* Weight modifiers + ========================================================================== */ +.uk-text-bold { + font-weight: bold; } + +/* Color modifiers + ========================================================================== */ +.uk-text-muted { + color: #999 !important; } + +.uk-text-primary { + color: #2d7091 !important; } + +.uk-text-success { + color: #659f13 !important; } + +.uk-text-warning { + color: #e28327 !important; } + +.uk-text-danger { + color: #d85030 !important; } + +.uk-text-contrast { + color: #fff !important; } + +/* Alignment modifiers + ========================================================================== */ +.uk-text-left { + text-align: left !important; } + +.uk-text-right { + text-align: right !important; } + +.uk-text-center { + text-align: center !important; } + +.uk-text-justify { + text-align: justify !important; } + +.uk-text-top { + vertical-align: top !important; } + +.uk-text-middle { + vertical-align: middle !important; } + +.uk-text-bottom { + vertical-align: bottom !important; } + +/* Only tablets portrait and smaller */ +@media (max-width: 959px) { + .uk-text-center-medium { + text-align: center !important; } + .uk-text-left-medium { + text-align: left !important; } } + +/* Phone landscape and smaller */ +@media (max-width: 767px) { + .uk-text-center-small { + text-align: center !important; } + .uk-text-left-small { + text-align: left !important; } } + +/* Wrap modifiers + ========================================================================== */ +/* + * Prevent text from wrapping onto multiple lines + */ +.uk-text-nowrap { + white-space: nowrap; } + +/* + * Prevent text from wrapping onto multiple lines, and truncate with an ellipsis + */ +.uk-text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +/* + * Break strings if their length exceeds the width of their container + */ +.uk-text-break { + word-wrap: break-word; + -webkit-hyphens: auto; + -ms-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; } + +/* Transform modifiers + ========================================================================== */ +.uk-text-capitalize { + text-transform: capitalize !important; } + +.uk-text-lowercase { + text-transform: lowercase !important; } + +.uk-text-uppercase { + text-transform: uppercase !important; } + +/* ======================================================================== + Component: Utility + ========================================================================== */ +/* Container + ========================================================================== */ +.uk-container { + box-sizing: border-box; + max-width: 980px; + padding: 0 25px; } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-container { + max-width: 1200px; + padding: 0 35px; } } + +/* + * Micro clearfix + */ +.uk-container:before, +.uk-container:after { + content: ""; + display: table; } + +.uk-container:after { + clear: both; } + +/* + * Center container + */ +.uk-container-center { + margin-left: auto; + margin-right: auto; } + +/* Clearing + ========================================================================== */ +/* + * Micro clearfix +* `table-cell` is used with `:before` because `table` creates a 1px gap when it becomes a flex item, only in Webkit + * `table` is used again with `:after` because `clear` only works with block elements. + * Note: `display: block` with `overflow: hidden` is currently not working in the latest Safari + */ +.uk-clearfix:before { + content: ""; + display: table-cell; } + +.uk-clearfix:after { + content: ""; + display: table; + clear: both; } + +/* + * Create a new block formatting context + */ +.uk-nbfc { + overflow: hidden; } + +.uk-nbfc-alt { + display: table-cell; + width: 10000px; } + +/* Alignment of block elements + ========================================================================== */ +/* + * Float blocks + * 1. Prevent content overflow on small devices + */ +.uk-float-left { + float: left; } + +.uk-float-right { + float: right; } + +/* 1 */ +[class*='uk-float-'] { + max-width: 100%; } + +/* Alignment of images and objects + ========================================================================== */ +/* + * Alignment + */ +[class*='uk-align-'] { + display: block; + margin-bottom: 15px; } + +.uk-align-left { + margin-right: 15px; + float: left; } + +.uk-align-right { + margin-left: 15px; + float: right; } + +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-align-medium-left { + margin-right: 15px; + float: left; } + .uk-align-medium-right { + margin-left: 15px; + float: right; } } + +.uk-align-center { + margin-left: auto; + margin-right: auto; } + +/* Vertical alignment + ========================================================================== */ +/* + * Remove whitespace between child elements when using `inline-block` + */ +.uk-vertical-align { + font-size: 0.001px; } + +/* + * The `uk-vertical-align` container needs a specific height + */ +.uk-vertical-align:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +/* + * Sub-object which can have any height + * 1. Reset whitespace hack + */ +.uk-vertical-align-middle, +.uk-vertical-align-bottom { + display: inline-block; + max-width: 100%; + /* 1 */ + font-size: 1rem; } + +.uk-vertical-align-middle { + vertical-align: middle; } + +.uk-vertical-align-bottom { + vertical-align: bottom; } + +/* Height + ========================================================================== */ +/* + * More robust if padding and border are used + */ +[class*='uk-height'] { + box-sizing: border-box; } + +/* + * Useful to extend the `html` and `body` element to the full height of the page. + */ +.uk-height-1-1 { + height: 100%; } + +/* + * Useful to create image teasers + */ +.uk-height-viewport { + height: 100vh; + min-height: 600px; } + +/* Responsive objects + * Note: Images are already responsive by default, see Base component + ========================================================================== */ +/* + * 1. Corrects `max-width` and `max-height` behavior if padding and border are used + */ +.uk-responsive-width, +.uk-responsive-height { + box-sizing: border-box; } + +/* + * Responsiveness: Sets a maximum width relative to the parent and auto scales the height + * `important` needed to override `uk-img-preserve img` + */ +.uk-responsive-width { + max-width: 100% !important; + height: auto; } + +/* + * Responsiveness: Sets a maximum height relative to the parent and auto scales the width + * Only works if the parent element has a fixed height. + */ +.uk-responsive-height { + max-height: 100%; + width: auto; } + +/* Margin + ========================================================================== */ +/* + * Create a block with the same margin of a paragraph + * Add margin if adjacent element + */ +.uk-margin { + margin-bottom: 15px; } + +* + .uk-margin { + margin-top: 15px; } + +.uk-margin-top { + margin-top: 15px !important; } + +.uk-margin-bottom { + margin-bottom: 15px !important; } + +.uk-margin-left { + margin-left: 15px !important; } + +.uk-margin-right { + margin-right: 15px !important; } + +/* + * Larger margins + */ +.uk-margin-large { + margin-bottom: 50px; } + +* + .uk-margin-large { + margin-top: 50px; } + +.uk-margin-large-top { + margin-top: 50px !important; } + +.uk-margin-large-bottom { + margin-bottom: 50px !important; } + +.uk-margin-large-left { + margin-left: 50px !important; } + +.uk-margin-large-right { + margin-right: 50px !important; } + +/* + * Smaller margins + */ +.uk-margin-small { + margin-bottom: 5px; } + +* + .uk-margin-small { + margin-top: 5px; } + +.uk-margin-small-top { + margin-top: 5px !important; } + +.uk-margin-small-bottom { + margin-bottom: 5px !important; } + +.uk-margin-small-left { + margin-left: 5px !important; } + +.uk-margin-small-right { + margin-right: 5px !important; } + +/* + * Remove margins + */ +.uk-margin-remove { + margin: 0 !important; } + +.uk-margin-top-remove { + margin-top: 0 !important; } + +.uk-margin-bottom-remove { + margin-bottom: 0 !important; } + +/* Padding + ========================================================================== */ +.uk-padding-remove { + padding: 0 !important; } + +.uk-padding-top-remove { + padding-top: 0 !important; } + +.uk-padding-bottom-remove { + padding-bottom: 0 !important; } + +.uk-padding-vertical-remove { + padding-top: 0 !important; + padding-bottom: 0 !important; } + +/* Border + ========================================================================== */ +.uk-border-circle { + border-radius: 50%; } + +.uk-border-rounded { + border-radius: 5px; } + +/* Headings + ========================================================================== */ +.uk-heading-large { + font-size: 36px; + line-height: 42px; } + +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-heading-large { + font-size: 52px; + line-height: 64px; } } + +/* Link + ========================================================================== */ +/* + * Let links appear in default text color + */ +.uk-link-muted, +.uk-link-muted a { + color: #444; } + +.uk-link-muted:hover, +.uk-link-muted a:hover { + color: #444; } + +/* + * Reset link style + */ +.uk-link-reset, +.uk-link-reset a, +.uk-link-reset:hover, +.uk-link-reset a:hover, +.uk-link-reset:focus, +.uk-link-reset a:focus { + color: inherit; + text-decoration: none; } + +/* Scrollable + ========================================================================== */ +/* + * Enable scrolling for preformatted text + */ +.uk-scrollable-text { + height: 300px; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + resize: both; } + +/* + * Box with scrolling enabled + */ +.uk-scrollable-box { + box-sizing: border-box; + height: 170px; + padding: 10px; + border: 1px solid #ddd; + overflow: auto; + -webkit-overflow-scrolling: touch; + resize: both; } + +.uk-scrollable-box > :last-child { + margin-bottom: 0; } + +/* Overflow + ========================================================================== */ +.uk-overflow-hidden { + overflow: hidden; } + +/* + * Enable scrollbars if content is clipped + */ +.uk-overflow-container { + overflow: auto; + -webkit-overflow-scrolling: touch; } + +.uk-overflow-container > :last-child { + margin-bottom: 0; } + +/* Position + ========================================================================== */ +.uk-position-absolute, +[class*='uk-position-top'], +[class*='uk-position-bottom'] { + position: absolute !important; } + +/* Don't use `width: 100%` because it is wrong if the parent has padding. */ +.uk-position-top { + top: 0; + left: 0; + right: 0; } + +.uk-position-bottom { + bottom: 0; + left: 0; + right: 0; } + +.uk-position-top-left { + top: 0; + left: 0; } + +.uk-position-top-right { + top: 0; + right: 0; } + +.uk-position-bottom-left { + bottom: 0; + left: 0; } + +.uk-position-bottom-right { + bottom: 0; + right: 0; } + +/* + * Cover + */ +.uk-position-cover { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; } + +/* + * Relative + */ +.uk-position-relative { + position: relative !important; } + +/* + * Z-index + */ +.uk-position-z-index { + z-index: 1; } + +/* Display + ========================================================================== */ +/* + * Display + * 1. Required if child is a responsive image + */ +.uk-display-block { + display: block !important; } + +.uk-display-inline { + display: inline !important; } + +.uk-display-inline-block { + display: inline-block !important; + /* 1 */ + max-width: 100%; } + +/* + * Visibility + * Avoids setting display to `block` so it works also with `inline-block` and `table` + */ +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-visible-small { + display: none !important; } + .uk-visible-medium { + display: none !important; } + .uk-hidden-large { + display: none !important; } } + +/* Tablets portrait */ +@media (min-width: 768px) and (max-width: 959px) { + .uk-visible-small { + display: none !important; } + .uk-visible-large { + display: none !important; } + .uk-hidden-medium { + display: none !important; } } + +/* Phone landscape and smaller*/ +@media (max-width: 767px) { + .uk-visible-medium { + display: none !important; } + .uk-visible-large { + display: none !important; } + .uk-hidden-small { + display: none !important; } } + +/* Remove from the flow and screen readers on any device */ +.uk-hidden { + display: none !important; + visibility: hidden !important; } + +/* It's hidden, but still affects layout */ +.uk-invisible { + visibility: hidden !important; } + +/* Show on hover */ +.uk-visible-hover:hover .uk-hidden, +.uk-visible-hover:hover .uk-invisible { + display: block !important; + visibility: visible !important; } + +.uk-visible-hover-inline:hover .uk-hidden, +.uk-visible-hover-inline:hover .uk-invisible { + display: inline-block !important; + visibility: visible !important; } + +/* Hide on touch */ +.uk-touch .uk-hidden-touch, +.uk-notouch .uk-hidden-notouch { + display: none !important; } + +/* ======================================================================== + Component: Flex + ========================================================================== */ +.uk-flex { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; } + +.uk-flex-inline { + display: -ms-inline-flexbox; + display: -webkit-inline-flex; + display: inline-flex; } + +/* + * Fixes initial flex-shrink value in IE10 + */ +.uk-flex > *, +.uk-flex-inline > * { + -ms-flex-negative: 1; } + +/* Alignment + ========================================================================== */ +/* + * Vertical alignment + * Default value is `stretch` + */ +.uk-flex-top { + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; } + +.uk-flex-middle { + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; } + +.uk-flex-bottom { + -ms-flex-align: end; + -webkit-align-items: flex-end; + align-items: flex-end; } + +/* + * Horizontal alignment + * Default value is `flex-start` + */ +.uk-flex-center { + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; } + +.uk-flex-right { + -ms-flex-pack: end; + -webkit-justify-content: flex-end; + justify-content: flex-end; } + +.uk-flex-space-between { + -ms-flex-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; } + +.uk-flex-space-around { + -ms-flex-pack: distribute; + -webkit-justify-content: space-around; + justify-content: space-around; } + +/* Direction + ========================================================================== */ +.uk-flex-row-reverse { + -ms-flex-direction: row-reverse; + -webkit-flex-direction: row-reverse; + flex-direction: row-reverse; } + +.uk-flex-column { + -ms-flex-direction: column; + -webkit-flex-direction: column; + flex-direction: column; } + +.uk-flex-column-reverse { + -ms-flex-direction: column-reverse; + -webkit-flex-direction: column-reverse; + flex-direction: column-reverse; } + +/* Wrap + ========================================================================== */ +.uk-flex-nowrap { + -ms-flex-wrap: nowrap; + -webkit-flex-wrap: nowrap; + flex-wrap: nowrap; } + +.uk-flex-wrap { + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; } + +.uk-flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse; + -webkit-flex-wrap: wrap-reverse; + flex-wrap: wrap-reverse; } + +/* + * Horizontal alignment + * Default value is `stretch` + */ +.uk-flex-wrap-top { + -ms-flex-line-pack: start; + -webkit-align-content: flex-start; + align-content: flex-start; } + +.uk-flex-wrap-middle { + -ms-flex-line-pack: center; + -webkit-align-content: center; + align-content: center; } + +.uk-flex-wrap-bottom { + -ms-flex-line-pack: end; + -webkit-align-content: flex-end; + align-content: flex-end; } + +.uk-flex-wrap-space-between { + -ms-flex-line-pack: justify; + -webkit-align-content: space-between; + align-content: space-between; } + +.uk-flex-wrap-space-around { + -ms-flex-line-pack: distribute; + -webkit-align-content: space-around; + align-content: space-around; } + +/* Item ordering + ========================================================================== */ +/* + * Default is 0 + */ +.uk-flex-order-first { + -ms-flex-order: -1; + -webkit-order: -1; + order: -1; } + +.uk-flex-order-last { + -ms-flex-order: 99; + -webkit-order: 99; + order: 99; } + +/* Phone landscape and bigger */ +@media (min-width: 480px) { + .uk-flex-order-first-small { + -ms-flex-order: -1; + -webkit-order: -1; + order: -1; } + .uk-flex-order-last-small { + -ms-flex-order: 99; + -webkit-order: 99; + order: 99; } } + +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-flex-order-first-medium { + -ms-flex-order: -1; + -webkit-order: -1; + order: -1; } + .uk-flex-order-last-medium { + -ms-flex-order: 99; + -webkit-order: 99; + order: 99; } } + +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-flex-order-first-large { + -ms-flex-order: -1; + -webkit-order: -1; + order: -1; } + .uk-flex-order-last-large { + -ms-flex-order: 99; + -webkit-order: 99; + order: 99; } } + +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-flex-order-first-xlarge { + -ms-flex-order: -1; + -webkit-order: -1; + order: -1; } + .uk-flex-order-last-xlarge { + -ms-flex-order: 99; + -webkit-order: 99; + order: 99; } } + +/* Item dimensions + ========================================================================== */ +/* + * Initial: 0 1 auto + * Content dimensions, but shrinks + */ +/* + * No Flex: 0 0 auto + * Content dimensions + */ +.uk-flex-item-none { + -ms-flex: none; + -webkit-flex: none; + flex: none; } + +/* + * Relative Flex: 1 1 auto + * Space is allocated considering content + * 1. Fixes flex-shrink value in IE10 + */ +.uk-flex-item-auto { + -ms-flex: auto; + -webkit-flex: auto; + flex: auto; + /* 1 */ + -ms-flex-negative: 1; } + +/* + * Absolute Flex: 1 1 0% + * Space is allocated solely based on flex + */ +.uk-flex-item-1 { + -ms-flex: 1; + -webkit-flex: 1; + flex: 1; } + +/* ======================================================================== + Component: Contrast + ========================================================================== */ +.uk-contrast { + color: #fff; + /* Active */ } + .uk-contrast a:not([class]), + .uk-contrast .uk-link { + color: fade(#fff, 70%); + text-decoration: none; } + .uk-contrast a:not([class]):hover, + .uk-contrast .uk-link:hover { + color: #fff; + text-decoration: underline; } + .uk-contrast :not(pre) > code, + .uk-contrast :not(pre) > kbd, + .uk-contrast :not(pre) > samp { + color: #fff; } + .uk-contrast em { + color: #fff; } + .uk-contrast h1, .uk-contrast h2, .uk-contrast h3, .uk-contrast h4, .uk-contrast h5, .uk-contrast h6 { + color: #fff; } + .uk-contrast hr { + border-top-color: fade(#fff, 20%); } + .uk-contrast .uk-nav li > a, + .uk-contrast .uk-nav li > a:hover { + text-decoration: none; } + .uk-contrast .uk-nav-side > li > a { + color: #fff; } + .uk-contrast .uk-nav-side > li > a:hover, + .uk-contrast .uk-nav-side > li > a:focus { + background: fade(#fff, 10%); + color: #fff; } + .uk-contrast .uk-nav-side > li.uk-active > a { + background: #fff; + color: #444; } + .uk-contrast .uk-nav-side .uk-nav-header { + color: #fff; } + .uk-contrast .uk-nav-side .uk-nav-divider { + border-top-color: fade(#fff, 20%); } + .uk-contrast .uk-nav-side ul a { + color: fade(#fff, 70%); } + .uk-contrast .uk-nav-side ul a:hover { + color: #fff; } + .uk-contrast .uk-subnav > * > a { + color: fade(#fff, 70%); + text-decoration: none; } + .uk-contrast .uk-subnav > * > a:hover, + .uk-contrast .uk-subnav > * > a:focus { + color: #fff; + text-decoration: none; } + .uk-contrast .uk-subnav > .uk-active > a { + color: #fff; } + .uk-contrast .uk-subnav-line > :nth-child(n+2):before { + border-left-color: fade(#fff, 20%); } + .uk-contrast .uk-subnav-pill > * > a:hover, + .uk-contrast .uk-subnav-pill > * > a:focus { + background: fade(#fff, 70%); + color: #444; + text-decoration: none; } + .uk-contrast .uk-subnav-pill > .uk-active > a { + background: #fff; + color: #444; } + .uk-contrast .uk-tab { + border-bottom-color: fade(#fff, 20%); } + .uk-contrast .uk-tab > li > a { + border-color: transparent; + color: fade(#fff, 70%); } + .uk-contrast .uk-tab > li > a:hover, + .uk-contrast .uk-tab > li > a:focus, + .uk-contrast .uk-tab > li.uk-open > a { + border-color: fade(#fff, 70%); + background: fade(#fff, 70%); + color: #444; + text-decoration: none; } + .uk-contrast .uk-tab > li.uk-active > a { + border-color: fade(#fff, 20%); + border-bottom-color: transparent; + background: #fff; + color: #444; } + .uk-contrast .uk-tab-center { + border-bottom-color: fade(#fff, 20%); } + .uk-contrast .uk-tab-grid:before { + border-top-color: fade(#fff, 20%); } + .uk-contrast .uk-list-line > li:nth-child(n+2) { + border-top-color: fade(#fff, 20%); } + .uk-contrast .uk-form select, + .uk-contrast .uk-form textarea, + .uk-contrast .uk-form input:not([type]), + .uk-contrast .uk-form input[type="text"], + .uk-contrast .uk-form input[type="password"], + .uk-contrast .uk-form input[type="datetime"], + .uk-contrast .uk-form input[type="datetime-local"], + .uk-contrast .uk-form input[type="date"], + .uk-contrast .uk-form input[type="month"], + .uk-contrast .uk-form input[type="time"], + .uk-contrast .uk-form input[type="week"], + .uk-contrast .uk-form input[type="number"], + .uk-contrast .uk-form input[type="email"], + .uk-contrast .uk-form input[type="url"], + .uk-contrast .uk-form input[type="search"], + .uk-contrast .uk-form input[type="tel"], + .uk-contrast .uk-form input[type="color"] { + border-color: fade(#fff, 80%); + background: fade(#fff, 80%); + color: #444; + background-clip: padding-box; } + .uk-contrast .uk-form select:focus, + .uk-contrast .uk-form textarea:focus, + .uk-contrast .uk-form input:not([type]):focus, + .uk-contrast .uk-form input[type="text"]:focus, + .uk-contrast .uk-form input[type="password"]:focus, + .uk-contrast .uk-form input[type="datetime"]:focus, + .uk-contrast .uk-form input[type="datetime-local"]:focus, + .uk-contrast .uk-form input[type="date"]:focus, + .uk-contrast .uk-form input[type="month"]:focus, + .uk-contrast .uk-form input[type="time"]:focus, + .uk-contrast .uk-form input[type="week"]:focus, + .uk-contrast .uk-form input[type="number"]:focus, + .uk-contrast .uk-form input[type="email"]:focus, + .uk-contrast .uk-form input[type="url"]:focus, + .uk-contrast .uk-form input[type="search"]:focus, + .uk-contrast .uk-form input[type="tel"]:focus, + .uk-contrast .uk-form input[type="color"]:focus { + border-color: #fff; + background: #fff; + color: #444; } + .uk-contrast .uk-form :-ms-input-placeholder { + color: fade(#444, 70%) !important; } + .uk-contrast .uk-form ::-moz-placeholder { + color: fade(#444, 70%); } + .uk-contrast .uk-form ::-webkit-input-placeholder { + color: fade(#444, 70%); } + .uk-contrast .uk-button { + color: #444; + background: #fff; } + .uk-contrast .uk-button:hover, + .uk-contrast .uk-button:focus { + background-color: fade(#fff, 80%); + color: #444; } + .uk-contrast .uk-button:active, + .uk-contrast .uk-button.uk-active { + background-color: fade(#fff, 70%); + color: #444; } + .uk-contrast .uk-button-primary { + background-color: #00a8e6; + color: #fff; } + .uk-contrast .uk-button-primary:hover, + .uk-contrast .uk-button-primary:focus { + background-color: #35b3ee; + color: #fff; } + .uk-contrast .uk-button-primary:active, + .uk-contrast .uk-button-primary.uk-active { + background-color: #0091ca; + color: #fff; } + .uk-contrast .uk-icon-hover { + color: fade(#fff, 70%); } + .uk-contrast .uk-icon-hover:hover { + color: #fff; } + .uk-contrast .uk-icon-button { + background: #fff; + color: #444; } + .uk-contrast .uk-icon-button:hover, + .uk-contrast .uk-icon-button:focus { + background-color: fade(#fff, 80%); + color: #444; } + .uk-contrast .uk-icon-button:active { + background-color: fade(#fff, 70%); + color: #444; } + .uk-contrast .uk-text-muted { + color: fade(#fff, 60%) !important; } + .uk-contrast .uk-text-primary { + color: #2d7091 !important; } + +/* ======================================================================== + Component: Print + ========================================================================== */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: black !important; + box-shadow: none !important; + text-shadow: none !important; } + a, + a:visited { + text-decoration: underline; } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr, + img { + page-break-inside: avoid; } + img { + max-width: 100% !important; } + @page { + margin: 0.5cm; } + p, + h2, + h3 { + orphans: 3; + widows: 3; } + h2, + h3 { + page-break-after: avoid; } } + +.foo { + border: solid; } + +.ph-footer { + background-color: #f08d28; } diff --git a/static/images/logosansfond.JPG b/static/images/logosansfond.JPG new file mode 100644 index 0000000..b250744 Binary files /dev/null and b/static/images/logosansfond.JPG differ diff --git a/static/scripts/calendar.js b/static/scripts/calendar.js new file mode 100644 index 0000000..65d3997 --- /dev/null +++ b/static/scripts/calendar.js @@ -0,0 +1,26 @@ +import * as util from "./util.js"; +import m from "https://esm.sh/mithril@2.2.2" +import _ from "https://esm.sh/lodash-es@4.17.21" +import {statsView, tabView, schedulView } from './schedule.js' + +const calendarPage = { + view: function(){ + const availableYears = util.getAvailableYears(); + const year = _.get(m.route.param(), 'year', util.getDefaultYear()); + + return m('div.uk-grid.uk-margin-top.uk-margin-bottom', + m('div.uk-width-large-3-5.uk-width-medium-4-5.uk-width-small-1-1.uk-container-center', + [ + m(statsView, {year}), + m(tabView, {year, availableYears}), + m(schedulView, {year}), + ]), + ) + } +} + +m.route.mode = "hash"; +m.route(document.getElementById('mithril-content'), "/", { + "/": calendarPage, + "/:year": calendarPage, +}); diff --git a/static/scripts/images.js b/static/scripts/images.js new file mode 100644 index 0000000..5c98c93 --- /dev/null +++ b/static/scripts/images.js @@ -0,0 +1,19 @@ +import m from "https://esm.sh/mithril@2.2.2" + +export function rainSvg (size){ + return m("svg[viewBox='0 0 107.95 87.723']",{width: size, height: size}, [ + m("defs[id='defs16']"), + m("g[id='layer1'][transform='translate(-310.1 -167.39)']", [ + m("g[id='g13542'][transform='translate(-2.4761 19.309)']", [ + m("path[d='m378.31 207.24c15.43-1.4 26.66-5.66 26.66-10.69 0-0.41-0.27-0.8-0.42-1.2 0.91 0.23 1.83 0.46 2.83 0.46 5.57 0 10.07-3.78 10.07-8.44 0-4.65-4.5-8.41-10.07-8.41-0.68 0-1.29 0.22-1.93 0.33 0.56-1.86 0.95-3.77 0.95-5.79 0-12.33-11.17-22.34-24.95-22.34-9.77 0-18.13 5.09-22.23 12.4-1.64-0.92-3.47-1.48-5.4-1.48-5.83 0-10.68 4.69-12.18 11.06-2.56-1.01-5.52-1.64-8.7-1.64-9.54 0-17.29 5.23-17.29 11.67 0 5.81 6.35 10.59 14.6 11.47-0.37 0.63-0.66 1.25-0.66 1.91 0 4.25 8.01 7.94 19.79 9.83'][id='path8749']", {style: {"stroke-linejoin": "round", "stroke": "#6798e9", "stroke-linecap": "round", "stroke-miterlimit": ".5", "stroke-width": "12.154", "fill": "none"}}), + m("path[d='m338.14 223.91c-8.25 7.27 1.43 13.47 5.12 3.49l2.83-9.26-7.95 5.77z'][id='path8734']", {style: {"stroke": "#6798e9", "stroke-miterlimit": "3.2", "stroke-width": "8", "fill": "#6798e9"}}), + m("path[d='m367.18 225.11c-8.25 7.27 1.44 13.47 5.13 3.49l2.83-9.26-7.96 5.77z'][id='path8736']", {style: {"stroke": "#6798e9", "stroke-miterlimit": "3.2", "stroke-width": "8", "fill": "#6798e9"}}), + m("path[d='m360.42 209.77c-8.25 7.27 1.44 13.47 5.12 3.49l2.83-9.26-7.95 5.77z'][id='path8738']", {style: {"stroke": "#6798e9", "stroke-miterlimit": "3.2", "stroke-width": "8", "fill": "#6798e9"}}), + m("path[d='m378.31 207.24c15.43-1.4 26.66-5.66 26.66-10.69 0-0.41-0.27-0.8-0.42-1.2 0.91 0.23 1.83 0.46 2.83 0.46 5.57 0 10.07-3.78 10.07-8.44 0-4.65-4.5-8.41-10.07-8.41-0.68 0-1.29 0.22-1.93 0.33 0.56-1.86 0.95-3.77 0.95-5.79 0-12.33-11.17-22.34-24.95-22.34-9.77 0-18.13 5.09-22.23 12.4-1.64-0.92-3.47-1.48-5.4-1.48-5.83 0-10.68 4.69-12.18 11.06-2.56-1.01-5.52-1.64-8.7-1.64-9.54 0-17.29 5.23-17.29 11.67 0 5.81 6.35 10.59 14.6 11.47-0.37 0.63-0.66 1.25-0.66 1.91 0 4.25 8.01 7.94 19.79 9.83'][id='path10281']", {style: {"stroke-linejoin": "round", "stroke": "#6798e9", "stroke-linecap": "round", "stroke-miterlimit": ".5", "stroke-width": "12.154", "fill": "none"}}), + m("path[d='m338.14 223.91c-8.25 7.27 1.43 13.47 5.12 3.49l2.83-9.26-7.95 5.77z'][id='path10283']", {style: {"stroke": "#6798e9", "stroke-miterlimit": "3.2", "stroke-width": "8", "fill": "#6798e9"}}), + m("path[d='m367.18 225.11c-8.25 7.27 1.44 13.47 5.13 3.49l2.83-9.26-7.96 5.77z'][id='path10285']", {style: {"stroke": "#6798e9", "stroke-miterlimit": "3.2", "stroke-width": "8", "fill": "#6798e9"}}), + m("path[d='m360.42 209.77c-8.25 7.27 1.44 13.47 5.12 3.49l2.83-9.26-7.95 5.77z'][id='path10287']", {style: {"stroke": "#6798e9", "stroke-miterlimit": "3.2", "stroke-width": "8", "fill": "#6798e9"}}) + ]) + ]) + ]); + } diff --git a/static/scripts/jquery-3.7.1.min.js b/static/scripts/jquery-3.7.1.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/static/scripts/jquery-3.7.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 g.jsDate.getTime() >= date.getTime()) + .last() + .games + .sort((g1, g2) => g1.jsDate - g2.jsDate); +}; + +nextGameDaySchedule._getTableHead = function(){ + return m('thead', m('tr', [ + m('td', 'Date'), + m('td', 'Heure'), + m('td', 'Receveur'), + m('td', 'Visiteur') + ])); +}; + +nextGameDaySchedule._responsoveText = function(largeText, smallText, game){ + var ret = []; + if(game.rain){ + ret.push(rainSvg('1.5em')); + ret.push(' '); + } else if(game.practice){ + ret.push(m('span.uk-badge.uk-badge-success', 'pratique!')); + ret.push(' '); + } + ret.push(m('span.uk-visible-large', largeText)); + ret.push(m('span.uk-hidden-large', smallText)); + return ret; +}; + +nextGameDaySchedule._getGamesRow = function(game){ + return m('tr', [ + m('td', nextGameDaySchedule._responsoveText(util.formatDate(game.jsDate), + util.formatDateSmall(game.jsDate), + game)), + m('td', game.time), + m('td', scheduleTeamTags.getHomeTeamTag(game)), + m('td',scheduleTeamTags.getAwayTeamTag(game)) + ]); +}; + +nextGameDaySchedule._getGamesRows = function(games){ + return _.map(games, nextGameDaySchedule._getGamesRow); +}; + +nextGameDaySchedule.view = function(){ + return m('table.uk-table.uk-table-hover.uk-table-striped.uk-table-condensed',[ + nextGameDaySchedule._getTableHead(), + m('tbody', + nextGameDaySchedule._getGamesRows(nextGameDaySchedule.games) + )]); +}; + + + + + +const LittleCalendar = {} + +LittleCalendar.view = function(){ + return m(nextGameDaySchedule); +} + +const containerIds = ['large-mithril-container', + 'medium-mithril-container', + 'small-mithril-container'] + +for(const id of containerIds){ + m.mount(document.getElementById(id), LittleCalendar); +} diff --git a/static/scripts/resultParser.js b/static/scripts/resultParser.js new file mode 100644 index 0000000..5dc0a86 --- /dev/null +++ b/static/scripts/resultParser.js @@ -0,0 +1,136 @@ +import * as _ from "https://esm.sh/lodash-es@4.17.21" + + +let resultParser = {}; + +resultParser._addJSDateToResult = function(res){ + let date = res.date.split('-'); + let time = _.isString(res.time) ? res.time.split(':'): [0, 0]; + res.jsDate = new Date( + Number(date[0]), + Number(date[1]) - 1, + Number(date[2]), + Number(time[0]), + Number(time[1]) + ); + return res; +}; + +resultParser._setCanonicalPoints = function(res){ + if(!_.isNumber(res.home_points) && _.isNumber(_.get(res, res.home))){ + res.home_points = res[res.home]; + } + if(!_.isNumber(res.away_points) && _.isNumber(_.get(res, res.away))){ + res.away_points = res[res.away]; + } + return res; +} + +resultParser.parseResults = function(rawResults){ + rawResults = _.map(rawResults, resultParser._setCanonicalPoints); + rawResults = _.map(rawResults, resultParser._addJSDateToResult); + rawResults = _.map(rawResults, resultParser._addCustomStyle); + return rawResults; +}; + +resultParser.getNightGames = function(rawResults){ + let ret = {}; + _.each(resultParser.parseResults(rawResults), function(res){ + if(_.has(ret, res.date)){ + ret[res.date].push(res); + }else{ + ret[res.date] = [res]; + } + }); + return _.map(ret, function(games, date){ + return resultParser._addJSDateToResult({date: date, games: games}); + }); +}; + +resultParser._getAllTeams = function(rawResults){ + let homeTeams = _.map(rawResults, 'home'); + let awayTeams = _.map(rawResults, 'away'); + return _.uniq(_.concat(homeTeams, awayTeams)); +}; + +resultParser._getWinner = function(res){ + if(res.home_points > res.away_points){ + return res.home; + } + if(res.home_points < res.away_points){ + return res.away; + } +}; + +resultParser._hasWon = function(res, team){ + return resultParser._getWinner(res) == team; +}; + +resultParser._hasLost = function(res, team){ + return !resultParser._isDraw(res) && resultParser._getWinner(res) != team; +}; + +resultParser._isDraw = function(res){ + return res.home_points == res.away_points; +}; + +resultParser._getPointsFor = function(res, team){ + if(res.home == team){ + return res.home_points; + } + return res.away_points; +}; + +resultParser._getPointsForOpponent = function(res, team){ + if(res.home == team){ + return res.away_points; + } + return res.home_points; +}; + +resultParser._getPointsForGame = function(res, team){ + if(resultParser._hasWon(res, team)){ + return 2; + } + return resultParser._isDraw(res) ? 1: 0; +}; + +resultParser._getTeamStats = function(rawResults, team){ + let ret = { + team: team, gamePlayed: 0, victories: 0, points: 0, + defeats: 0, draws: 0, pointsFor: 0, pointsAgaint: 0}; + _.each(rawResults, function(res){ + if((team != res.home && team != res.away) || !_.isNumber(res.home_points)){ + return; + } + ret.gamePlayed += 1; + ret.victories += resultParser._hasWon(res, team) ? 1: 0; + ret.defeats += resultParser._hasLost(res, team) ? 1: 0; + ret.draws += resultParser._isDraw(res) ? 1: 0; + ret.pointsFor += resultParser._getPointsFor(res, team); + ret.pointsAgaint += resultParser._getPointsForOpponent(res, team); + ret.points += resultParser._getPointsForGame(res, team); + }); + return ret; +}; + +resultParser._removeTemporaryResults = function(rawResults){ + return _.filter(rawResults, function(rawResult){ + return !rawResult.temporary; + }); +}; + +resultParser._isValidGame = function(game){ + return !game.rain && ! game.practice; +}; + +resultParser.getStats = function(rawResults){ + rawResults = _.filter(rawResults, resultParser._isValidGame); + rawResults = _.map(rawResults, resultParser._setCanonicalPoints); + let allTeams = resultParser._getAllTeams(resultParser._removeTemporaryResults(rawResults)); + let getTeamStats = _.partial(resultParser._getTeamStats, rawResults); + return _.map(allTeams, getTeamStats); +}; + +export const getStats = resultParser.getStats; +export const getNightGames = resultParser.getNightGames; diff --git a/static/scripts/schedule.js b/static/scripts/schedule.js new file mode 100644 index 0000000..56745e9 --- /dev/null +++ b/static/scripts/schedule.js @@ -0,0 +1,218 @@ +import * as util from "./util.js"; +import * as resultParser from './resultParser.js' +import * as teams from './teams.js' +import m from "https://esm.sh/mithril@2.2.2" +import {rainSvg} from "./images.js"; +import _ from "https://esm.sh/lodash-es@4.17.21" + +function ppYear(year, availableYears) { + return _.last(availableYears) === year ? "" : year; +} + + +export const scheduleTeamTags = {}; + +scheduleTeamTags._getTeamTag = function(teamName){ + var teamColor = teams.getTeamColor(teamName); + return [ + m('i.fa.fa-flag', {style: {color: teamColor}}), + m('span', ' ' + teamName) + ]; +}; + +scheduleTeamTags._getAwayPracticeTeamTag = function(){ + return [ + m('i.fa.fa-hand-spock-o', {style: {color: ' #ff1493'}, title: 'pratique'}), + m('span', ' Amis #1') + ]; +}; + +scheduleTeamTags._getHomePracticeTeamTag = function(){ + return [ + m('i.fa.fa-hand-spock-o', {style: {color: '#acbf60'}, title: 'pratique'}), + m('span', ' Amis #2') + ]; +}; + +scheduleTeamTags.getAwayTeamTag = function(game){ + if(game.practice){ + return scheduleTeamTags._getAwayPracticeTeamTag(); + } + return scheduleTeamTags._getTeamTag(game.away); +}; + +scheduleTeamTags.getHomeTeamTag = function(game){ + if(game.practice){ + return scheduleTeamTags._getHomePracticeTeamTag(); + } + return scheduleTeamTags._getTeamTag(game.home); +}; + + + +export const statsView = {}; +statsView.stats = []; + +statsView.oninit = async function(vnode){ + if(statsView.currentYear === vnode.attrs.year){ + return; + } + statsView.currentYear = vnode.attrs.year; + const result = await m.request({ + method: "GET", + url: `/api/results/${vnode.attrs.year}.json` + }); + statsView.stats = resultParser.getStats(result) + return result; +}; + +statsView.onupdate = statsView.oninit; + + +statsView.getStatRow = function(teamStats){ + var formatStat = function(n){ + return teamStats.gamePlayed === 0 ? '-' : n; + }; + return m('tr', [ + m('td', teamStats.team), + m('td', teamStats.gamePlayed), + m('td', formatStat(teamStats.victories)), + m('td', formatStat(teamStats.defeats)), + m('td', formatStat(teamStats.draws)), + m('td', formatStat(teamStats.pointsFor)), + m('td', formatStat(teamStats.pointsAgaint)), + m('td', formatStat(teamStats.pointsFor - teamStats.pointsAgaint)), + m('td', formatStat(teamStats.points)) + ]); +}; + +statsView.isStatForValidTeam = function(stat){ + var teamNames = _.map(teams.teams(), 'name'); + return _.includes(teamNames, stat.team); +} + + +statsView.mainTable = function(stats){ + var orderedStats = _.reverse(_.sortBy(stats, ['points', 'pointsFor'])); + return m('table.uk-table.uk-table-hover.uk-table-striped',[ + m('thead', m('tr', [ + m('th', 'Équipes'), + m('th', 'PJ'), + m('th', 'V'), + m('th', 'D'), + m('th', 'N'), + m('th', 'PP'), + m('th', 'PC'), + m('th', 'DIF'), + m('th', 'PTS') + ])), + m('tbody', _(orderedStats) + .filter(statsView.isStatForValidTeam) + .map(statsView.getStatRow) + .value()) + ]); +}; + +statsView.legend = function(){ + var items = ["PJ : Parties joués", "V : Victoire", "D : Défaite", + "N : Nul", "PP : Points pour", "PC : Points contre", + "DIF : Diférenciel","PTS : Points"]; + return m('ul.uk-subnav.uk-subnav-line.uk-flex-center',[ + _.map(items, function(itm){ + return m('li', itm); + }) + ]); +}; + +statsView.view = function(vnode){ + return m('div.uk-grid', + m('div.uk-width-medium-1-1.uk-width-large-1-1.uk-container-center',[ + m('h2', 'Classement ' + vnode.attrs.year), + statsView.mainTable(statsView.stats), + statsView.legend() + ])); + +}; + + + +export const schedulView = {}; + +schedulView.oninit = async function(vnode){ + if(vnode.attrs.year === schedulView.currentYear){ + return; + } + schedulView.currentYear = vnode.attrs.year; + const result = await m.request({ + method: "GET", + url: `/api/results/${vnode.attrs.year}.json` + }); + schedulView.games = resultParser.getNightGames(result) + +}; + +schedulView.onupdate = schedulView.oninit; + + +schedulView._asGamePoints = function(points){ + return !_.isNumber(points) ? '-' : points + ''; +}; + +schedulView._rainIcon = function(game){ + if(game.rain){ + return m('span', {title: 'pluie, partie annulée.'}, rainSvg('1.5em')); + } + return m('span', {style: {visibility: 'hidden'}}, rainSvg('1.5em')); +}; + +schedulView._gameName = function(game){ + return [schedulView._rainIcon(game), + " ", + game.time]; +}; + +schedulView._gameRow = function(game){ + + return m('tr',[ + m('td', schedulView._gameName(game)), + m('td', scheduleTeamTags.getAwayTeamTag(game)), + m('td', schedulView._asGamePoints(game.away_points)), + m('td', 'vs'), + m('td', scheduleTeamTags.getHomeTeamTag(game)), + m('td', schedulView._asGamePoints(game.home_points)) + ]); +}; + +schedulView._gameView = function(gameNight){ + return m('div', [m('h3', util.formatDate(gameNight.jsDate)), + m('table.uk-table.uk-table-hover.uk-table-condensed.uk-table-striped', + m('tbody',[ + _.map(gameNight.games, schedulView._gameRow), + ]) + ) + ]); + +}; + +schedulView.view = function(){ + return m('div.uk-grid', + m('div.uk-width-large-3-5.uk-width-medium-1-1', + _.map(schedulView.games, schedulView._gameView))); +}; + + +export const tabView = {}; + +tabView._createTab = function(activeYear, availableYears, year){ + const isActive = (activeYear == year) || (activeYear == ppYear(year, availableYears)); + return m('li', {'class': isActive ? 'uk-active': ''}, // 'uk-active' + m('a', {href: '#/' + ppYear(year, availableYears)}, 'Saison ' + year)); +} + +tabView.view = function(vnode){ + const activeYear = vnode.attrs.year; + const availableYears = vnode.attrs.availableYears; + const createTab = _.partial(tabView._createTab, activeYear, availableYears); + return m('div.uk-margin', m('h2', 'Calendrier ' + ppYear(activeYear, availableYears)), + m('ul.uk-tab', _.reverse(_.map(availableYears, createTab)))); +}; diff --git a/static/scripts/teams.js b/static/scripts/teams.js new file mode 100644 index 0000000..144122b --- /dev/null +++ b/static/scripts/teams.js @@ -0,0 +1,20 @@ +import * as _ from "https://esm.sh/lodash-es@4.17.21" + + +export function teams(){ + return [ + {name: 'remplaçants', color: '#FFA500'}, + {name: 'jaune', color: '#FF0'}, + {name:'rouge', color: '#F00'}, + {name:'bleu', color: '#00F'}, + {name:'gris', color: '#808080'}, + {name:'vert', color: '#008000'}, + {name: 'noir', color: '#000000'}, + {name: 'orange', color: '#FFA500'}, + {name: 'mauve', color: '#E0B0FF'} + ]; +}; + +export function getTeamColor(teamName){ + return teams().filter(t => t.name == teamName)[0]?.color; +}; diff --git a/static/scripts/uikit.min.js b/static/scripts/uikit.min.js new file mode 100644 index 0000000..325d602 --- /dev/null +++ b/static/scripts/uikit.min.js @@ -0,0 +1,3 @@ +/*! UIkit 2.27.2 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ +!function(t){if("function"==typeof define&&define.amd&&define("uikit",function(){var i=window.UIkit||t(window,window.jQuery,window.document);return i.load=function(t,e,n,o){var s,a=t.split(","),r=[],l=(o.config&&o.config.uikit&&o.config.uikit.base?o.config.uikit.base:"").replace(/\/+$/g,"");if(!l)throw new Error("Please define base path to UIkit in the requirejs config.");for(s=0;s0||t.navigator.pointerEnabled&&t.navigator.maxTouchPoints>0||!1,n.support.mutationobserver=t.MutationObserver||t.WebKitMutationObserver||null,n.Utils={},n.Utils.isFullscreen=function(){return document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.fullscreenElement||!1},n.Utils.str2json=function(t,i){try{return i?JSON.parse(t.replace(/([\$\w]+)\s*:/g,function(t,i){return'"'+i+'":'}).replace(/'([^']+)'/g,function(t,i){return'"'+i+'"'})):new Function("","var json = "+t+"; return JSON.parse(JSON.stringify(json));")()}catch(e){return!1}},n.Utils.debounce=function(t,i,e){var n;return function(){var o=this,s=arguments,a=function(){n=null,e||t.apply(o,s)},r=e&&!n;clearTimeout(n),n=setTimeout(a,i),r&&t.apply(o,s)}},n.Utils.throttle=function(t,i){var e=!1;return function(){e||(t.call(),e=!0,setTimeout(function(){e=!1},i))}},n.Utils.removeCssRules=function(t){var i,e,n,o,s,a,r,l,c,u;t&&setTimeout(function(){try{for(u=document.styleSheets,o=0,r=u.length;r>o;o++){for(n=u[o],e=[],n.cssRules=n.cssRules,i=s=0,l=n.cssRules.length;l>s;i=++s)n.cssRules[i].type===CSSRule.STYLE_RULE&&t.test(n.cssRules[i].selectorText)&&e.unshift(i);for(a=0,c=e.length;c>a;a++)n.deleteRule(e[a])}}catch(d){}},0)},n.Utils.isInView=function(t,e){var o=i(t);if(!o.is(":visible"))return!1;var s=n.$win.scrollLeft(),a=n.$win.scrollTop(),r=o.offset(),l=r.left,c=r.top;return e=i.extend({topoffset:0,leftoffset:0},e),c+o.height()>=a&&c-e.topoffset<=a+n.$win.height()&&l+o.width()>=s&&l-e.leftoffset<=s+n.$win.width()?!0:!1},n.Utils.checkDisplay=function(t,e){var o=n.$("[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]",t||document);return t&&!o.length&&(o=i(t)),o.trigger("display.uk.check"),e&&("string"!=typeof e&&(e='[class*="uk-animation-"]'),o.find(e).each(function(){var t=n.$(this),i=t.attr("class"),e=i.match(/uk-animation-(.+)/);t.removeClass(e[0]).width(),t.addClass(e[0])})),o},n.Utils.options=function(t){if("string"!=i.type(t))return t;-1!=t.indexOf(":")&&"}"!=t.trim().substr(-1)&&(t="{"+t+"}");var e=t?t.indexOf("{"):-1,o={};if(-1!=e)try{o=n.Utils.str2json(t.substr(e))}catch(s){}return o},n.Utils.animate=function(t,e){var o=i.Deferred();return t=n.$(t),t.css("display","none").addClass(e).one(n.support.animation.end,function(){t.removeClass(e),o.resolve()}),t.css("display",""),o.promise()},n.Utils.uid=function(t){return(t||"id")+(new Date).getTime()+"RAND"+Math.ceil(1e5*Math.random())},n.Utils.template=function(t,i){for(var e,n,o,s,a=t.replace(/\n/g,"\\n").replace(/\{\{\{\s*(.+?)\s*\}\}\}/g,"{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),r=0,l=[],c=0;r/g, '>');}"].join("\n")),i?s(i):s},n.Utils.focus=function(t,e){if(t=i(t),!t.length)return t;var n,o=t.find("[autofocus]:first");return o.length?o.focus():(o=t.find(":input"+(e&&","+e||"")).first(),o.length?o.focus():(t.attr("tabindex")||(n=1e3,t.attr("tabindex",n)),t[0].focus(),n&&t.attr("tabindex",""),t))},n.Utils.events={},n.Utils.events.click=n.support.touch?"tap":"click",t.UIkit=n,n.fn=function(t,e){var o=arguments,s=t.match(/^([a-z\-]+)(?:\.([a-z]+))?/i),a=s[1],r=s[2];return n[a]?this.each(function(){var t=i(this),s=t.data(a);s||t.data(a,s=n[a](this,r?void 0:e)),r&&s[r].apply(s,Array.prototype.slice.call(o,1))}):(i.error("UIkit component ["+a+"] does not exist."),this)},i.UIkit=n,i.fn.uk=n.fn,n.langdirection="rtl"==n.$html.attr("dir")?"right":"left",n.components={},n.component=function(t,e){var o=function(e,s){var a=this;return this.UIkit=n,this.element=e?n.$(e):null,this.options=i.extend(!0,{},this.defaults,s),this.plugins={},this.element&&this.element.data(t,this),this.init(),(this.options.plugins.length?this.options.plugins:Object.keys(o.plugins)).forEach(function(t){o.plugins[t].init&&(o.plugins[t].init(a),a.plugins[t]=!0)}),this.trigger("init.uk.component",[t,this]),this};return o.plugins={},i.extend(!0,o.prototype,{defaults:{plugins:[]},boot:function(){},init:function(){},on:function(t,i,e){return n.$(this.element||this).on(t,i,e)},one:function(t,i,e){return n.$(this.element||this).one(t,i,e)},off:function(t){return n.$(this.element||this).off(t)},trigger:function(t,i){return n.$(this.element||this).trigger(t,i)},find:function(t){return n.$(this.element?this.element:[]).find(t)},proxy:function(t,i){var e=this;i.split(" ").forEach(function(i){e[i]||(e[i]=function(){return t[i].apply(t,arguments)})})},mixin:function(t,i){var e=this;i.split(" ").forEach(function(i){e[i]||(e[i]=t[i].bind(e))})},option:function(){return 1==arguments.length?this.options[arguments[0]]||void 0:(2==arguments.length&&(this.options[arguments[0]]=arguments[1]),void 0)}},e),this.components[t]=o,this[t]=function(){var e,o;if(arguments.length)switch(arguments.length){case 1:"string"==typeof arguments[0]||arguments[0].nodeType||arguments[0]instanceof jQuery?e=i(arguments[0]):o=arguments[0];break;case 2:e=i(arguments[0]),o=arguments[1]}return e&&e.data(t)?e.data(t):new n.components[t](e,o)},n.domready&&n.component.boot(t),o},n.plugin=function(t,i,e){this.components[t].plugins[i]=e},n.component.boot=function(t){n.components[t].prototype&&n.components[t].prototype.boot&&!n.components[t].booted&&(n.components[t].prototype.boot.apply(n,[]),n.components[t].booted=!0)},n.component.bootComponents=function(){for(var t in n.components)n.component.boot(t)},n.domObservers=[],n.domready=!1,n.ready=function(t){n.domObservers.push(t),n.domready&&t(document)},n.on=function(t,i,e){return t&&t.indexOf("ready.uk.dom")>-1&&n.domready&&i.apply(n.$doc),n.$doc.on(t,i,e)},n.one=function(t,i,e){return t&&t.indexOf("ready.uk.dom")>-1&&n.domready?(i.apply(n.$doc),n.$doc):n.$doc.one(t,i,e)},n.trigger=function(t,i){return n.$doc.trigger(t,i)},n.domObserve=function(t,i){n.support.mutationobserver&&(i=i||function(){},n.$(t).each(function(){var t=this,e=n.$(t);if(!e.data("observer"))try{var o=new n.support.mutationobserver(n.Utils.debounce(function(){i.apply(t,[e]),e.trigger("changed.uk.dom")},50),{childList:!0,subtree:!0});o.observe(t,{childList:!0,subtree:!0}),e.data("observer",o)}catch(s){}}))},n.init=function(t){t=t||document,n.domObservers.forEach(function(i){i(t)})},n.on("domready.uk.dom",function(){n.init(),n.domready&&n.Utils.checkDisplay()}),document.addEventListener("DOMContentLoaded",function(){var t=function(){n.$body=n.$("body"),n.trigger("beforeready.uk.dom"),n.component.bootComponents();var t=requestAnimationFrame(function(){var i={dir:{x:0,y:0},x:window.pageXOffset,y:window.pageYOffset},e=function(){var o=window.pageXOffset,s=window.pageYOffset;(i.x!=o||i.y!=s)&&(i.dir.x=o!=i.x?o>i.x?1:-1:0,i.dir.y=s!=i.y?s>i.y?1:-1:0,i.x=o,i.y=s,n.$doc.trigger("scrolling.uk.document",[{dir:{x:i.dir.x,y:i.dir.y},x:o,y:s}])),cancelAnimationFrame(t),t=requestAnimationFrame(e)};return n.support.touch&&n.$html.on("touchmove touchend MSPointerMove MSPointerUp pointermove pointerup",e),(i.x||i.y)&&e(),e}());if(n.trigger("domready.uk.dom"),n.support.touch&&navigator.userAgent.match(/(iPad|iPhone|iPod)/g)&&n.$win.on("load orientationchange resize",n.Utils.debounce(function(){var t=function(){return i(".uk-height-viewport").css("height",window.innerHeight),t};return t()}(),100)),n.trigger("afterready.uk.dom"),n.domready=!0,n.support.mutationobserver){var e=n.Utils.debounce(function(){requestAnimationFrame(function(){n.init(document.body)})},10);new n.support.mutationobserver(function(t){var i=!1;t.every(function(t){if("childList"!=t.type)return!0;for(var e,n=0;n=Math.abs(e-n)?t-i>0?"Left":"Right":e-n>0?"Up":"Down"}function e(){c=null,d.last&&(void 0!==d.el&&d.el.trigger("longTap"),d={})}function n(){c&&clearTimeout(c),c=null}function o(){a&&clearTimeout(a),r&&clearTimeout(r),l&&clearTimeout(l),c&&clearTimeout(c),a=r=l=c=null,d={}}function s(t){return t.pointerType==t.MSPOINTER_TYPE_TOUCH&&t.isPrimary}if(!t.fn.swipeLeft){var a,r,l,c,u,d={},h=750;t(function(){var p,f,m,g=0,v=0;"MSGesture"in window&&(u=new MSGesture,u.target=document.body),t(document).on("MSGestureEnd gestureend",function(t){var i=t.originalEvent.velocityX>1?"Right":t.originalEvent.velocityX<-1?"Left":t.originalEvent.velocityY>1?"Down":t.originalEvent.velocityY<-1?"Up":null;i&&void 0!==d.el&&(d.el.trigger("swipe"),d.el.trigger("swipe"+i))}).on("touchstart MSPointerDown pointerdown",function(i){("MSPointerDown"!=i.type||s(i.originalEvent))&&(m="MSPointerDown"==i.type||"pointerdown"==i.type?i:i.originalEvent.touches[0],p=Date.now(),f=p-(d.last||p),d.el=t("tagName"in m.target?m.target:m.target.parentNode),a&&clearTimeout(a),d.x1=m.pageX,d.y1=m.pageY,f>0&&250>=f&&(d.isDoubleTap=!0),d.last=p,c=setTimeout(e,h),i.originalEvent&&i.originalEvent.pointerId&&u&&("MSPointerDown"==i.type||"pointerdown"==i.type||"touchstart"==i.type)&&u.addPointer(i.originalEvent.pointerId))}).on("touchmove MSPointerMove pointermove",function(t){("MSPointerMove"!=t.type||s(t.originalEvent))&&(m="MSPointerMove"==t.type||"pointermove"==t.type?t:t.originalEvent.touches[0],n(),d.x2=m.pageX,d.y2=m.pageY,g+=Math.abs(d.x1-d.x2),v+=Math.abs(d.y1-d.y2))}).on("touchend MSPointerUp pointerup",function(e){("MSPointerUp"!=e.type||s(e.originalEvent))&&(n(),d.x2&&Math.abs(d.x1-d.x2)>30||d.y2&&Math.abs(d.y1-d.y2)>30?l=setTimeout(function(){void 0!==d.el&&(d.el.trigger("swipe"),d.el.trigger("swipe"+i(d.x1,d.x2,d.y1,d.y2))),d={}},0):"last"in d&&(isNaN(g)||30>g&&30>v?r=setTimeout(function(){var i=t.Event("tap");i.cancelTouch=o,void 0!==d.el&&d.el.trigger(i),d.isDoubleTap?(void 0!==d.el&&d.el.trigger("doubleTap"),d={}):a=setTimeout(function(){a=null,void 0!==d.el&&d.el.trigger("singleTap"),d={}},250)},0):d={},g=v=0))}).on("touchcancel MSPointerCancel pointercancel",o),t(window).on("scroll",o)}),["swipe","swipeLeft","swipeRight","swipeUp","swipeDown","doubleTap","tap","singleTap","longTap"].forEach(function(i){t.fn[i]=function(e){return t(this).on(i,e)}})}}(jQuery),function(t){"use strict";var i=[];t.component("stackMargin",{defaults:{cls:"uk-margin-small-top",rowfirst:!1,observe:!1},boot:function(){t.ready(function(i){t.$("[data-uk-margin]",i).each(function(){var i=t.$(this);i.data("stackMargin")||t.stackMargin(i,t.Utils.options(i.attr("data-uk-margin")))})})},init:function(){var e=this;t.$win.on("resize orientationchange",function(){var i=function(){e.process()};return t.$(function(){i(),t.$win.on("load",i)}),t.Utils.debounce(i,20)}()),this.on("display.uk.check",function(){this.element.is(":visible")&&this.process()}.bind(this)),this.options.observe&&t.domObserve(this.element,function(){e.element.is(":visible")&&e.process()}),i.push(this)},process:function(){var i=this.element.children();if(t.Utils.stackMargin(i,this.options),!this.options.rowfirst||!i.length)return this;var e={},n=!1;return i.removeClass(this.options.rowfirst).each(function(i,o){o=t.$(this),"none"!=this.style.display&&(i=o.offset().left,((e[i]=e[i]||[])&&e[i]).push(this),n=n===!1?i:Math.min(n,i))}),t.$(e[n]).addClass(this.options.rowfirst),this}}),function(){var i=[],e=function(t){if(t.is(":visible")){var i=t.parent().width(),e=t.data("width"),n=i/e,o=Math.floor(n*t.data("height"));t.css({height:e>i?o:t.data("height")})}};t.component("responsiveElement",{defaults:{},boot:function(){t.ready(function(i){t.$("iframe.uk-responsive-width, [data-uk-responsive]",i).each(function(){var i,e=t.$(this);e.data("responsiveElement")||(i=t.responsiveElement(e,{}))})})},init:function(){var t=this.element;t.attr("width")&&t.attr("height")&&(t.data({width:t.attr("width"),height:t.attr("height")}).on("display.uk.check",function(){e(t)}),e(t),i.push(t))}}),t.$win.on("resize load",t.Utils.debounce(function(){i.forEach(function(t){e(t)})},15))}(),t.Utils.stackMargin=function(i,e){e=t.$.extend({cls:"uk-margin-small-top"},e),i=t.$(i).removeClass(e.cls);var n=!1;i.each(function(i,e,o,s){s=t.$(this),"none"!=s.css("display")&&(i=s.offset(),e=s.outerHeight(),o=i.top+e,s.data({ukMarginPos:o,ukMarginTop:i.top}),(n===!1||i.topn.top&&i.data("ukMarginPos")>n.pos&&i.addClass(e.cls)})},t.Utils.matchHeights=function(i,e){i=t.$(i).css("min-height",""),e=t.$.extend({row:!0},e);var n=function(i){if(!(i.length<2)){var e=0;i.each(function(){e=Math.max(e,t.$(this).outerHeight())}).each(function(){var i=t.$(this),n=e-("border-box"==i.css("box-sizing")?0:i.outerHeight()-i.height());i.css("min-height",n+"px")})}};e.row?(i.first().width(),setTimeout(function(){var e=!1,o=[];i.each(function(){var i=t.$(this),s=i.offset().top;s!=e&&o.length&&(n(t.$(o)),o=[],s=i.offset().top),o.push(i),e=s}),o.length&&n(t.$(o))},0)):n(i)},function(i){t.Utils.inlineSvg=function(e,n){t.$(e||'img[src$=".svg"]',n||document).each(function(){var e=t.$(this),n=e.attr("src");if(!i[n]){var o=t.$.Deferred();t.$.get(n,{nc:Math.random()},function(i){o.resolve(t.$(i).find("svg"))}),i[n]=o.promise()}i[n].then(function(i){var n=t.$(i).clone();e.attr("id")&&n.attr("id",e.attr("id")),e.attr("class")&&n.attr("class",e.attr("class")),e.attr("style")&&n.attr("style",e.attr("style")),e.attr("width")&&(n.attr("width",e.attr("width")),e.attr("height")||n.removeAttr("height")),e.attr("height")&&(n.attr("height",e.attr("height")),e.attr("width")||n.removeAttr("width")),e.replaceWith(n)})})},t.ready(function(i){t.Utils.inlineSvg("[data-uk-svg]",i)})}({}),t.Utils.getCssVar=function(t){var i,e=document.documentElement,n=e.appendChild(document.createElement("div"));n.classList.add("var-"+t);try{i=JSON.parse(i=getComputedStyle(n,":before").content.replace(/^["'](.*)["']$/,"$1"))}catch(o){i=void 0}return e.removeChild(n),i}}(UIkit),function(t){"use strict";function i(i,e){e=t.$.extend({duration:1e3,transition:"easeOutExpo",offset:0,complete:function(){}},e);var n=i.offset().top-e.offset,o=t.$doc.height(),s=window.innerHeight;n+s>o&&(n=o-s),t.$("html,body").stop().animate({scrollTop:n},e.duration,e.transition).promise().done(e.complete)}t.component("smoothScroll",{boot:function(){t.$html.on("click.smooth-scroll.uikit","[data-uk-smooth-scroll]",function(){var i=t.$(this);if(!i.data("smoothScroll")){{t.smoothScroll(i,t.Utils.options(i.attr("data-uk-smooth-scroll")))}i.trigger("click")}return!1})},init:function(){var e=this;this.on("click",function(n){n.preventDefault(),i(t.$(this.hash).length?t.$(this.hash):t.$("body"),e.options)})}}),t.Utils.scrollToElement=i,t.$.easing.easeOutExpo||(t.$.easing.easeOutExpo=function(t,i,e,n,o){return i==o?e+n:n*(-Math.pow(2,-10*i/o)+1)+e})}(UIkit),function(t){"use strict";var i=t.$win,e=t.$doc,n=[],o=function(){for(var t=0;t=u)return e[t]}();if(!d)return;c.options.closest?(o.blur().closest(l).removeClass(r),s=o.filter("a[href='#"+d.attr("id")+"']").closest(l).addClass(r)):s=o.removeClass(r).filter("a[href='#"+d.attr("id")+"']").addClass(r),c.element.trigger("inview.uk.scrollspynav",[d,s])}};this.options.smoothscroll&&t.smoothScroll&&o.each(function(){t.smoothScroll(this,c.options.smoothscroll)}),u(),this.element.data("scrollspynav",this),this.check=u,s.push(this)}})}(UIkit),function(t){"use strict";var i=[];t.component("toggle",{defaults:{target:!1,cls:"uk-hidden",animation:!1,duration:200},boot:function(){t.ready(function(e){t.$("[data-uk-toggle]",e).each(function(){var i=t.$(this);if(!i.data("toggle")){t.toggle(i,t.Utils.options(i.attr("data-uk-toggle")))}}),setTimeout(function(){i.forEach(function(t){t.getToggles()})},0)})},init:function(){var t=this;this.aria=-1!==this.options.cls.indexOf("uk-hidden"),this.on("click",function(i){t.element.is('a[href="#"]')&&i.preventDefault(),t.toggle()}),i.push(this)},toggle:function(){if(this.getToggles(),this.totoggle.length){if(this.options.animation&&t.support.animation){var i=this,e=this.options.animation.split(",");1==e.length&&(e[1]=e[0]),e[0]=e[0].trim(),e[1]=e[1].trim(),this.totoggle.css("animation-duration",this.options.duration+"ms"),this.totoggle.each(function(){var n=t.$(this);n.hasClass(i.options.cls)?(n.toggleClass(i.options.cls),t.Utils.animate(n,e[0]).then(function(){n.css("animation-duration",""),t.Utils.checkDisplay(n)})):t.Utils.animate(this,e[1]+" uk-animation-reverse").then(function(){n.toggleClass(i.options.cls).css("animation-duration",""),t.Utils.checkDisplay(n)})})}else this.totoggle.toggleClass(this.options.cls),t.Utils.checkDisplay(this.totoggle);this.updateAria()}},getToggles:function(){this.totoggle=this.options.target?t.$(this.options.target):[],this.updateAria()},updateAria:function(){this.aria&&this.totoggle.length&&this.totoggle.not("[aria-hidden]").each(function(){t.$(this).attr("aria-hidden",t.$(this).hasClass("uk-hidden"))})}})}(UIkit),function(t){"use strict";t.component("alert",{defaults:{fade:!0,duration:200,trigger:".uk-alert-close"},boot:function(){t.$html.on("click.alert.uikit","[data-uk-alert]",function(i){var e=t.$(this);if(!e.data("alert")){var n=t.alert(e,t.Utils.options(e.attr("data-uk-alert")));t.$(i.target).is(n.options.trigger)&&(i.preventDefault(),n.close())}})},init:function(){var t=this;this.on("click",this.options.trigger,function(i){i.preventDefault(),t.close()})},close:function(){var t=this.trigger("close.uk.alert"),i=function(){this.trigger("closed.uk.alert").remove()}.bind(this);this.options.fade?t.css("overflow","hidden").css("max-height",t.height()).animate({height:0,opacity:0,paddingTop:0,paddingBottom:0,marginTop:0,marginBottom:0},this.options.duration,i):i()}})}(UIkit),function(t){"use strict";t.component("buttonRadio",{defaults:{activeClass:"uk-active",target:".uk-button"},boot:function(){t.$html.on("click.buttonradio.uikit","[data-uk-button-radio]",function(i){var e=t.$(this);if(!e.data("buttonRadio")){var n=t.buttonRadio(e,t.Utils.options(e.attr("data-uk-button-radio"))),o=t.$(i.target);o.is(n.options.target)&&o.trigger("click")}})},init:function(){var i=this;this.find(i.options.target).attr("aria-checked","false").filter("."+i.options.activeClass).attr("aria-checked","true"),this.on("click",this.options.target,function(e){var n=t.$(this);n.is('a[href="#"]')&&e.preventDefault(),i.find(i.options.target).not(n).removeClass(i.options.activeClass).blur(),n.addClass(i.options.activeClass),i.find(i.options.target).not(n).attr("aria-checked","false"),n.attr("aria-checked","true"),i.trigger("change.uk.button",[n])})},getSelected:function(){return this.find("."+this.options.activeClass)}}),t.component("buttonCheckbox",{defaults:{activeClass:"uk-active",target:".uk-button"},boot:function(){t.$html.on("click.buttoncheckbox.uikit","[data-uk-button-checkbox]",function(i){var e=t.$(this);if(!e.data("buttonCheckbox")){var n=t.buttonCheckbox(e,t.Utils.options(e.attr("data-uk-button-checkbox"))),o=t.$(i.target);o.is(n.options.target)&&o.trigger("click")}})},init:function(){var i=this;this.find(i.options.target).attr("aria-checked","false").filter("."+i.options.activeClass).attr("aria-checked","true"),this.on("click",this.options.target,function(e){var n=t.$(this);n.is('a[href="#"]')&&e.preventDefault(),n.toggleClass(i.options.activeClass).blur(),n.attr("aria-checked",n.hasClass(i.options.activeClass)),i.trigger("change.uk.button",[n])})},getSelected:function(){return this.find("."+this.options.activeClass)}}),t.component("button",{defaults:{},boot:function(){t.$html.on("click.button.uikit","[data-uk-button]",function(){var i=t.$(this);if(!i.data("button")){{t.button(i,t.Utils.options(i.attr("data-uk-button")))}i.trigger("click")}})},init:function(){var t=this;this.element.attr("aria-pressed",this.element.hasClass("uk-active")),this.on("click",function(i){t.element.is('a[href="#"]')&&i.preventDefault(),t.toggle(),t.trigger("change.uk.button",[t.element.blur().hasClass("uk-active")])})},toggle:function(){this.element.toggleClass("uk-active"),this.element.attr("aria-pressed",this.element.hasClass("uk-active"))}})}(UIkit),function(t){"use strict";function i(i,e,n,o){if(i=t.$(i),e=t.$(e),n=n||window.innerWidth,o=o||i.offset(),e.length){var s=e.outerWidth();if(i.css("min-width",s),"right"==t.langdirection){var a=n-(e.offset().left+s),r=n-(i.offset().left+i.outerWidth());i.css("margin-right",a-r)}else i.css("margin-left",e.offset().left-o.left)}}var e,n=!1,o={x:{"bottom-left":"bottom-right","bottom-right":"bottom-left","bottom-center":"bottom-center","top-left":"top-right","top-right":"top-left","top-center":"top-center","left-top":"right-top","left-bottom":"right-bottom","left-center":"right-center","right-top":"left-top","right-bottom":"left-bottom","right-center":"left-center"},y:{"bottom-left":"top-left","bottom-right":"top-right","bottom-center":"top-center","top-left":"bottom-left","top-right":"bottom-right","top-center":"bottom-center","left-top":"left-bottom","left-bottom":"left-top","left-center":"left-center","right-top":"right-bottom","right-bottom":"right-top","right-center":"right-center"},xy:{"bottom-left":"top-right","bottom-right":"top-left","bottom-center":"top-center","top-left":"bottom-right","top-right":"bottom-left","top-center":"bottom-center","left-top":"right-bottom","left-bottom":"right-top","left-center":"right-center","right-top":"left-bottom","right-bottom":"left-top","right-center":"left-center"}};t.component("dropdown",{defaults:{mode:"hover",pos:"bottom-left",offset:0,remaintime:800,justify:!1,boundary:t.$win,delay:0,dropdownSelector:".uk-dropdown,.uk-dropdown-blank",hoverDelayIdle:250,preventflip:!1},remainIdle:!1,boot:function(){var i=t.support.touch?"click":"mouseenter";t.$html.on(i+".dropdown.uikit focus pointerdown","[data-uk-dropdown]",function(e){var n=t.$(this);if(!n.data("dropdown")){var o=t.dropdown(n,t.Utils.options(n.attr("data-uk-dropdown")));("click"==e.type||"mouseenter"==e.type&&"hover"==o.options.mode)&&o.element.trigger(i),o.dropdown.length&&e.preventDefault()}})},init:function(){var i=this;this.dropdown=this.find(this.options.dropdownSelector),this.offsetParent=this.dropdown.parents().filter(function(){return-1!==t.$.inArray(t.$(this).css("position"),["relative","fixed","absolute"])}).slice(0,1),this.offsetParent.length||(this.offsetParent=this.element),this.centered=this.dropdown.hasClass("uk-dropdown-center"),this.justified=this.options.justify?t.$(this.options.justify):!1,this.boundary=t.$(this.options.boundary),this.boundary.length||(this.boundary=t.$win),this.dropdown.hasClass("uk-dropdown-up")&&(this.options.pos="top-left"),this.dropdown.hasClass("uk-dropdown-flip")&&(this.options.pos=this.options.pos.replace("left","right")),this.dropdown.hasClass("uk-dropdown-center")&&(this.options.pos=this.options.pos.replace(/(left|right)/,"center")),this.element.attr("aria-haspopup","true"),this.element.attr("aria-expanded",this.element.hasClass("uk-open")),this.dropdown.attr("aria-hidden","true"),"click"==this.options.mode||t.support.touch?this.on("click.uk.dropdown",function(e){var n=t.$(e.target);n.parents(i.options.dropdownSelector).length||((n.is("a[href='#']")||n.parent().is("a[href='#']")||i.dropdown.length&&!i.dropdown.is(":visible"))&&e.preventDefault(),n.blur()),i.element.hasClass("uk-open")?(!i.dropdown.find(e.target).length||n.is(".uk-dropdown-close")||n.parents(".uk-dropdown-close").length)&&i.hide():i.show()}):this.on("mouseenter",function(){i.trigger("pointerenter.uk.dropdown",[i]),i.remainIdle&&clearTimeout(i.remainIdle),e&&clearTimeout(e),n&&n==i||(e=n&&n!=i?setTimeout(function(){e=setTimeout(i.show.bind(i),i.options.delay)},i.options.hoverDelayIdle):setTimeout(i.show.bind(i),i.options.delay))}).on("mouseleave",function(){e&&clearTimeout(e),i.remainIdle=setTimeout(function(){n&&n==i&&i.hide()},i.options.remaintime),i.trigger("pointerleave.uk.dropdown",[i])}).on("click",function(e){var o=t.$(e.target);return i.remainIdle&&clearTimeout(i.remainIdle),n&&n==i?((!i.dropdown.find(e.target).length||o.is(".uk-dropdown-close")||o.parents(".uk-dropdown-close").length)&&i.hide(),void 0):((o.is("a[href='#']")||o.parent().is("a[href='#']"))&&e.preventDefault(),i.show(),void 0)})},show:function(){t.$html.off("click.outer.dropdown"),n&&n!=this&&n.hide(!0),e&&clearTimeout(e),this.trigger("beforeshow.uk.dropdown",[this]),this.checkDimensions(),this.element.addClass("uk-open"),this.element.attr("aria-expanded","true"),this.dropdown.attr("aria-hidden","false"),this.trigger("show.uk.dropdown",[this]),t.Utils.checkDisplay(this.dropdown,!0),t.Utils.focus(this.dropdown),n=this,this.registerOuterClick()},hide:function(t){this.trigger("beforehide.uk.dropdown",[this,t]),this.element.removeClass("uk-open"),this.remainIdle&&clearTimeout(this.remainIdle),this.remainIdle=!1,this.element.attr("aria-expanded","false"),this.dropdown.attr("aria-hidden","true"),this.trigger("hide.uk.dropdown",[this,t]),n==this&&(n=!1)},registerOuterClick:function(){var i=this;t.$html.off("click.outer.dropdown"),setTimeout(function(){t.$html.on("click.outer.dropdown",function(o){e&&clearTimeout(e);t.$(o.target);n!=i||i.element.find(o.target).length||(i.hide(!0),t.$html.off("click.outer.dropdown"))})},10)},checkDimensions:function(){if(this.dropdown.length){this.dropdown.removeClass("uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack uk-dropdown-autoflip").css({topLeft:"",left:"",marginLeft:"",marginRight:""}),this.justified&&this.justified.length&&this.dropdown.css("min-width","");var e,n=t.$.extend({},this.offsetParent.offset(),{width:this.offsetParent[0].offsetWidth,height:this.offsetParent[0].offsetHeight}),s=this.options.offset,a=this.dropdown,r=(a.show().offset()||{left:0,top:0},a.outerWidth()),l=a.outerHeight(),c=this.boundary.width(),u=(this.boundary[0]!==window&&this.boundary.offset()?this.boundary.offset():{top:0,left:0},this.options.pos),d={"bottom-left":{top:0+n.height+s,left:0},"bottom-right":{top:0+n.height+s,left:0+n.width-r},"bottom-center":{top:0+n.height+s,left:0+n.width/2-r/2},"top-left":{top:0-l-s,left:0},"top-right":{top:0-l-s,left:0+n.width-r},"top-center":{top:0-l-s,left:0+n.width/2-r/2},"left-top":{top:0,left:0-r-s},"left-bottom":{top:0+n.height-l,left:0-r-s},"left-center":{top:0+n.height/2-l/2,left:0-r-s},"right-top":{top:0,left:0+n.width+s},"right-bottom":{top:0+n.height-l,left:0+n.width+s},"right-center":{top:0+n.height/2-l/2,left:0+n.width+s}},h={}; +if(e=u.split("-"),h=d[u]?d[u]:d["bottom-left"],this.justified&&this.justified.length)i(a.css({left:0}),this.justified,c);else if(this.options.preventflip!==!0){var p;switch(this.checkBoundary(n.left+h.left,n.top+h.top,r,l,c)){case"x":"x"!==this.options.preventflip&&(p=o.x[u]||"right-top");break;case"y":"y"!==this.options.preventflip&&(p=o.y[u]||"top-left");break;case"xy":this.options.preventflip||(p=o.xy[u]||"right-bottom")}p&&(e=p.split("-"),h=d[p]?d[p]:d["bottom-left"],a.addClass("uk-dropdown-autoflip"),this.checkBoundary(n.left+h.left,n.top+h.top,r,l,c)&&(e=u.split("-"),h=d[u]?d[u]:d["bottom-left"]))}r>c&&(a.addClass("uk-dropdown-stack"),this.trigger("stack.uk.dropdown",[this])),a.css(h).css("display","").addClass("uk-dropdown-"+e[0])}},checkBoundary:function(i,e,n,o,s){var a="";return(0>i||i-t.$win.scrollLeft()+n>s)&&(a+="x"),(e-t.$win.scrollTop()<0||e-t.$win.scrollTop()+o>window.innerHeight)&&(a+="y"),a}}),t.component("dropdownOverlay",{defaults:{justify:!1,cls:"",duration:200},boot:function(){t.ready(function(i){t.$("[data-uk-dropdown-overlay]",i).each(function(){var i=t.$(this);i.data("dropdownOverlay")||t.dropdownOverlay(i,t.Utils.options(i.attr("data-uk-dropdown-overlay")))})})},init:function(){var e=this;this.justified=this.options.justify?t.$(this.options.justify):!1,this.overlay=this.element.find("uk-dropdown-overlay"),this.overlay.length||(this.overlay=t.$('
').appendTo(this.element)),this.overlay.addClass(this.options.cls),this.on({"beforeshow.uk.dropdown":function(t,n){e.dropdown=n,e.justified&&e.justified.length&&i(e.overlay.css({display:"block",marginLeft:"",marginRight:""}),e.justified,e.justified.outerWidth())},"show.uk.dropdown":function(){var i=e.dropdown.dropdown.outerHeight(!0);e.dropdown.element.removeClass("uk-open"),e.overlay.stop().css("display","block").animate({height:i},e.options.duration,function(){e.dropdown.dropdown.css("visibility",""),e.dropdown.element.addClass("uk-open"),t.Utils.checkDisplay(e.dropdown.dropdown,!0)}),e.pointerleave=!1},"hide.uk.dropdown":function(){e.overlay.stop().animate({height:0},e.options.duration)},"pointerenter.uk.dropdown":function(){clearTimeout(e.remainIdle)},"pointerleave.uk.dropdown":function(){e.pointerleave=!0}}),this.overlay.on({mouseenter:function(){e.remainIdle&&(clearTimeout(e.dropdown.remainIdle),clearTimeout(e.remainIdle))},mouseleave:function(){e.pointerleave&&n&&(e.remainIdle=setTimeout(function(){n&&n.hide()},n.options.remaintime))}})}})}(UIkit),function(t){"use strict";var i=[];t.component("gridMatchHeight",{defaults:{target:!1,row:!0,ignorestacked:!1,observe:!1},boot:function(){t.ready(function(i){t.$("[data-uk-grid-match]",i).each(function(){var i,e=t.$(this);e.data("gridMatchHeight")||(i=t.gridMatchHeight(e,t.Utils.options(e.attr("data-uk-grid-match"))))})})},init:function(){var e=this;this.columns=this.element.children(),this.elements=this.options.target?this.find(this.options.target):this.columns,this.columns.length&&(t.$win.on("load resize orientationchange",function(){var i=function(){e.element.is(":visible")&&e.match()};return t.$(function(){i()}),t.Utils.debounce(i,50)}()),this.options.observe&&t.domObserve(this.element,function(){e.element.is(":visible")&&e.match()}),this.on("display.uk.check",function(){this.element.is(":visible")&&this.match()}.bind(this)),i.push(this))},match:function(){var i=this.columns.filter(":visible:first");if(i.length){var e=Math.ceil(100*parseFloat(i.css("width"))/parseFloat(i.parent().css("width")))>=100;return e&&!this.options.ignorestacked?this.revert():t.Utils.matchHeights(this.elements,this.options),this}},revert:function(){return this.elements.css("min-height",""),this}}),t.component("gridMargin",{defaults:{cls:"uk-grid-margin",rowfirst:"uk-row-first"},boot:function(){t.ready(function(i){t.$("[data-uk-grid-margin]",i).each(function(){var i,e=t.$(this);e.data("gridMargin")||(i=t.gridMargin(e,t.Utils.options(e.attr("data-uk-grid-margin"))))})})},init:function(){t.stackMargin(this.element,this.options)}})}(UIkit),function(t){"use strict";function i(i,e){return e?("object"==typeof i?(i=i instanceof jQuery?i:t.$(i),i.parent().length&&(e.persist=i,e.persist.data("modalPersistParent",i.parent()))):i="string"==typeof i||"number"==typeof i?t.$("
").html(i):t.$("
").html("UIkit.modal Error: Unsupported data type: "+typeof i),i.appendTo(e.element.find(".uk-modal-dialog")),e):void 0}var e,n=!1,o=0,s=t.$html;t.$win.on("resize orientationchange",t.Utils.debounce(function(){t.$(".uk-modal.uk-open").each(function(){return t.$(this).data("modal")&&t.$(this).data("modal").resize()})},150)),t.component("modal",{defaults:{keyboard:!0,bgclose:!0,minScrollHeight:150,center:!1,modal:!0},scrollable:!1,transition:!1,hasTransitioned:!0,init:function(){if(e||(e=t.$("body")),this.element.length){var i=this;this.paddingdir="padding-"+("left"==t.langdirection?"right":"left"),this.dialog=this.find(".uk-modal-dialog"),this.active=!1,this.element.attr("aria-hidden",this.element.hasClass("uk-open")),this.on("click",".uk-modal-close",function(t){t.preventDefault(),i.hide()}).on("click",function(e){var n=t.$(e.target);n[0]==i.element[0]&&i.options.bgclose&&i.hide()}),t.domObserve(this.element,function(){i.resize()})}},toggle:function(){return this[this.isActive()?"hide":"show"]()},show:function(){if(this.element.length){var i=this;if(!this.isActive())return this.options.modal&&n&&n.hide(!0),this.element.removeClass("uk-open").show(),this.resize(!0),this.options.modal&&(n=this),this.active=!0,o++,t.support.transition?(this.hasTransitioned=!1,this.element.one(t.support.transition.end,function(){i.hasTransitioned=!0,t.Utils.focus(i.dialog,"a[href]")}).addClass("uk-open")):(this.element.addClass("uk-open"),t.Utils.focus(this.dialog,"a[href]")),s.addClass("uk-modal-page").height(),this.element.attr("aria-hidden","false"),this.element.trigger("show.uk.modal"),t.Utils.checkDisplay(this.dialog,!0),this}},hide:function(i){if(!i&&t.support.transition&&this.hasTransitioned){var e=this;this.one(t.support.transition.end,function(){e._hide()}).removeClass("uk-open")}else this._hide();return this},resize:function(t){if(this.isActive()||t){var i=e.width();if(this.scrollbarwidth=window.innerWidth-i,e.css(this.paddingdir,this.scrollbarwidth),this.element.css("overflow-y",this.scrollbarwidth?"scroll":"auto"),!this.updateScrollable()&&this.options.center){var n=this.dialog.outerHeight(),o=parseInt(this.dialog.css("margin-top"),10)+parseInt(this.dialog.css("margin-bottom"),10);n+oi?20:i)-e;return t.css({maxHeight:o0?o--:o=0,this.element.hide().removeClass("uk-open"),this.element.attr("aria-hidden","true"),o||(s.removeClass("uk-modal-page"),e.css(this.paddingdir,"")),n===this&&(n=!1),this.trigger("hide.uk.modal")},isActive:function(){return this.element.hasClass("uk-open")}}),t.component("modalTrigger",{boot:function(){t.$html.on("click.modal.uikit","[data-uk-modal]",function(i){var e=t.$(this);if(e.is("a")&&i.preventDefault(),!e.data("modalTrigger")){var n=t.modalTrigger(e,t.Utils.options(e.attr("data-uk-modal")));n.show()}}),t.$html.on("keydown.modal.uikit",function(t){n&&27===t.keyCode&&n.options.keyboard&&(t.preventDefault(),n.hide())})},init:function(){var i=this;this.options=t.$.extend({target:i.element.is("a")?i.element.attr("href"):!1},this.options),this.modal=t.modal(this.options.target,this.options),this.on("click",function(t){t.preventDefault(),i.show()}),this.proxy(this.modal,"show hide isActive")}}),t.modal.dialog=function(e,n){var o=t.modal(t.$(t.modal.dialog.template).appendTo("body"),n);return o.on("hide.uk.modal",function(){o.persist&&(o.persist.appendTo(o.persist.data("modalPersistParent")),o.persist=!1),o.element.remove()}),i(e,o),o},t.modal.dialog.template='
',t.modal.alert=function(i,e){e=t.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:t.modal.labels},e);var n=t.modal.dialog(['
'+String(i)+"
",'"].join(""),e);return n.on("show.uk.modal",function(){setTimeout(function(){n.element.find("button:first").focus()},50)}),n.show()},t.modal.confirm=function(i,e,n){var o=arguments.length>1&&arguments[arguments.length-1]?arguments[arguments.length-1]:{};e=t.$.isFunction(e)?e:function(){},n=t.$.isFunction(n)?n:function(){},o=t.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:t.modal.labels},t.$.isFunction(o)?{}:o);var s=t.modal.dialog(['
'+String(i)+"
",'"].join(""),o);return s.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click",function(){t.$(this).is(".js-modal-confirm")?e():n(),s.hide()}),s.on("show.uk.modal",function(){setTimeout(function(){s.element.find(".js-modal-confirm").focus()},50)}),s.show()},t.modal.prompt=function(i,e,n,o){n=t.$.isFunction(n)?n:function(){},o=t.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:t.modal.labels},o);var s=t.modal.dialog([i?'
'+String(i)+"
":"",'

','"].join(""),o),a=s.element.find("input[type='text']").val(e||"").on("keyup",function(t){13==t.keyCode&&s.element.find(".js-modal-ok").trigger("click")});return s.element.find(".js-modal-ok").on("click",function(){n(a.val())!==!1&&s.hide()}),s.show()},t.modal.blockUI=function(i,e){var n=t.modal.dialog(['
'+String(i||'
...
')+"
"].join(""),t.$.extend({bgclose:!1,keyboard:!1,modal:!1},e));return n.content=n.element.find(".uk-modal-content:first"),n.show()},t.modal.labels={Ok:"Ok",Cancel:"Cancel"}}(UIkit),function(t){"use strict";function i(i){var e=t.$(i),n="auto";if(e.is(":visible"))n=e.outerHeight();else{var o={position:e.css("position"),visibility:e.css("visibility"),display:e.css("display")};n=e.css({position:"absolute",visibility:"hidden",display:"block"}).outerHeight(),e.css(o)}return n}t.component("nav",{defaults:{toggle:'>li.uk-parent > a[href="#"]',lists:">li.uk-parent > ul",multiple:!1},boot:function(){t.ready(function(i){t.$("[data-uk-nav]",i).each(function(){var i=t.$(this);if(!i.data("nav")){t.nav(i,t.Utils.options(i.attr("data-uk-nav")))}})})},init:function(){var i=this;this.on("click.uk.nav",this.options.toggle,function(e){e.preventDefault();var n=t.$(this);i.open(n.parent()[0]==i.element[0]?n:n.parent("li"))}),this.update(),t.domObserve(this.element,function(){i.element.find(i.options.lists).not("[role]").length&&i.update()})},update:function(){var i=this;this.find(this.options.lists).each(function(){var e=t.$(this).attr("role","menu"),n=e.closest("li"),o=n.hasClass("uk-active");n.data("list-container")||(e.wrap('
'),n.data("list-container",e.parent()[o?"removeClass":"addClass"]("uk-hidden"))),n.attr("aria-expanded",n.hasClass("uk-open")),o&&i.open(n,!0)})},open:function(e,n){var o=this,s=this.element,a=t.$(e),r=a.data("list-container");this.options.multiple||s.children(".uk-open").not(e).each(function(){var i=t.$(this);i.data("list-container")&&i.data("list-container").stop().animate({height:0},function(){t.$(this).parent().removeClass("uk-open").end().addClass("uk-hidden")})}),a.toggleClass("uk-open"),a.attr("aria-expanded",a.hasClass("uk-open")),r&&(a.hasClass("uk-open")&&r.removeClass("uk-hidden"),n?(r.stop().height(a.hasClass("uk-open")?"auto":0),a.hasClass("uk-open")||r.addClass("uk-hidden"),this.trigger("display.uk.check")):r.stop().animate({height:a.hasClass("uk-open")?i(r.find("ul:first")):0},function(){a.hasClass("uk-open")?r.css("height",""):r.addClass("uk-hidden"),o.trigger("display.uk.check")}))}})}(UIkit),function(t){"use strict";var i={x:window.scrollX,y:window.scrollY},e=(t.$win,t.$doc,t.$html),n={show:function(n,o){if(n=t.$(n),n.length){o=t.$.extend({mode:"push"},o);var s=t.$("body"),a=n.find(".uk-offcanvas-bar:first"),r="right"==t.langdirection,l=a.hasClass("uk-offcanvas-bar-flip")?-1:1,c=l*(r?-1:1),u=window.innerWidth-s.width();i={x:window.pageXOffset,y:window.pageYOffset},a.attr("mode",o.mode),n.addClass("uk-active"),s.css({width:window.innerWidth-u,height:window.innerHeight}).addClass("uk-offcanvas-page"),("push"==o.mode||"reveal"==o.mode)&&s.css(r?"margin-right":"margin-left",(r?-1:1)*a.outerWidth()*c),"reveal"==o.mode&&a.css("clip","rect(0, "+a.outerWidth()+"px, 100vh, 0)"),e.css("margin-top",-1*i.y).width(),a.addClass("uk-offcanvas-bar-show"),this._initElement(n),a.trigger("show.uk.offcanvas",[n,a]),n.attr("aria-hidden","false")}},hide:function(n){var o=t.$("body"),s=t.$(".uk-offcanvas.uk-active"),a="right"==t.langdirection,r=s.find(".uk-offcanvas-bar:first"),l=function(){o.removeClass("uk-offcanvas-page").css({width:"",height:"",marginLeft:"",marginRight:""}),s.removeClass("uk-active"),r.removeClass("uk-offcanvas-bar-show"),e.css("margin-top",""),window.scrollTo(i.x,i.y),r.trigger("hide.uk.offcanvas",[s,r]),s.attr("aria-hidden","true")};s.length&&("none"==r.attr("mode")&&(n=!0),t.support.transition&&!n?(o.one(t.support.transition.end,function(){l()}).css(a?"margin-right":"margin-left",""),"reveal"==r.attr("mode")&&r.css("clip",""),setTimeout(function(){r.removeClass("uk-offcanvas-bar-show")},0)):l())},_initElement:function(i){i.data("OffcanvasInit")||(i.on("click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas",function(i){var e=t.$(i.target);if(!i.type.match(/swipe/)&&!e.hasClass("uk-offcanvas-close")){if(e.hasClass("uk-offcanvas-bar"))return;if(e.parents(".uk-offcanvas-bar:first").length)return}i.stopImmediatePropagation(),n.hide()}),i.on("click",'a[href*="#"]',function(){var i=t.$(this),e=i.attr("href");"#"!=e&&(t.$doc.one("hide.uk.offcanvas",function(){var n;try{n=t.$(i[0].hash)}catch(o){n=""}n.length||(n=t.$('[name="'+i[0].hash.replace("#","")+'"]')),n.length&&t.Utils.scrollToElement?t.Utils.scrollToElement(n,t.Utils.options(i.attr("data-uk-smooth-scroll")||"{}")):window.location.href=e}),n.hide())}),i.data("OffcanvasInit",!0))}};t.component("offcanvasTrigger",{boot:function(){e.on("click.offcanvas.uikit","[data-uk-offcanvas]",function(i){i.preventDefault();var e=t.$(this);if(!e.data("offcanvasTrigger")){{t.offcanvasTrigger(e,t.Utils.options(e.attr("data-uk-offcanvas")))}e.trigger("click")}}),e.on("keydown.uk.offcanvas",function(t){27===t.keyCode&&n.hide()})},init:function(){var i=this;this.options=t.$.extend({target:i.element.is("a")?i.element.attr("href"):!1,mode:"push"},this.options),this.on("click",function(t){t.preventDefault(),n.show(i.options.target,i.options)})}}),t.offcanvas=n}(UIkit),function(t){"use strict";function i(i,e,n){var o,s=t.$.Deferred(),a=i,r=i;return n[0]===e[0]?(s.resolve(),s.promise()):("object"==typeof i&&(a=i[0],r=i[1]||i[0]),t.$body.css("overflow-x","hidden"),o=function(){e&&e.hide().removeClass("uk-active "+r+" uk-animation-reverse"),n.addClass(a).one(t.support.animation.end,function(){setTimeout(function(){n.removeClass(""+a).css({opacity:"",display:""})},0),s.resolve(),t.$body.css("overflow-x",""),e&&e.css({opacity:"",display:""})}.bind(this)).show()},n.css("animation-duration",this.options.duration+"ms"),e&&e.length?(e.css("animation-duration",this.options.duration+"ms"),e.css("display","none").addClass(r+" uk-animation-reverse").one(t.support.animation.end,function(){o()}.bind(this)).css("display","")):(n.addClass("uk-active"),o()),s.promise())}var e;t.component("switcher",{defaults:{connect:!1,toggle:">*",active:0,animation:!1,duration:200,swiping:!0},animating:!1,boot:function(){t.ready(function(i){t.$("[data-uk-switcher]",i).each(function(){var i=t.$(this);if(!i.data("switcher")){t.switcher(i,t.Utils.options(i.attr("data-uk-switcher")))}})})},init:function(){var i=this;this.on("click.uk.switcher",this.options.toggle,function(t){t.preventDefault(),i.show(this)}),this.options.connect&&(this.connect=t.$(this.options.connect),this.connect.length&&(this.connect.on("click.uk.switcher","[data-uk-switcher-item]",function(e){e.preventDefault();var n=t.$(this).attr("data-uk-switcher-item");if(i.index!=n)switch(n){case"next":case"previous":i.show(i.index+("next"==n?1:-1));break;default:i.show(parseInt(n,10))}}),this.options.swiping&&this.connect.on("swipeRight swipeLeft",function(t){t.preventDefault(),window.getSelection().toString()||i.show(i.index+("swipeLeft"==t.type?1:-1))}),this.update()))},update:function(){this.connect.children().removeClass("uk-active").attr("aria-hidden","true");var t=this.find(this.options.toggle),i=t.filter(".uk-active");if(i.length)this.show(i,!1);else{if(this.options.active===!1)return;i=t.eq(this.options.active),this.show(i.length?i:t.eq(0),!1)}t.not(i).attr("aria-expanded","false"),i.attr("aria-expanded","true")},show:function(n,o){if(!this.animating){var s=this.find(this.options.toggle);isNaN(n)?n=t.$(n):(n=0>n?s.length-1:n,n=s.eq(s[n]?n:0));var a=this,r=t.$(n),l=e[this.options.animation]||function(t,n){if(!a.options.animation)return e.none.apply(a);var o=a.options.animation.split(",");return 1==o.length&&(o[1]=o[0]),o[0]=o[0].trim(),o[1]=o[1].trim(),i.apply(a,[o,t,n])};o!==!1&&t.support.animation||(l=e.none),r.hasClass("uk-disabled")||(s.attr("aria-expanded","false"),r.attr("aria-expanded","true"),s.filter(".uk-active").removeClass("uk-active"),r.addClass("uk-active"),this.options.connect&&this.connect.length&&(this.index=this.find(this.options.toggle).index(r),-1==this.index&&(this.index=0),this.connect.each(function(){var i=t.$(this),e=t.$(i.children()),n=t.$(e.filter(".uk-active")),o=t.$(e.eq(a.index));a.animating=!0,l.apply(a,[n,o]).then(function(){n.removeClass("uk-active"),o.addClass("uk-active"),n.attr("aria-hidden","true"),o.attr("aria-hidden","false"),t.Utils.checkDisplay(o,!0),a.animating=!1})})),this.trigger("show.uk.switcher",[r]))}}}),e={none:function(){var i=t.$.Deferred();return i.resolve(),i.promise()},fade:function(t,e){return i.apply(this,["uk-animation-fade",t,e])},"slide-bottom":function(t,e){return i.apply(this,["uk-animation-slide-bottom",t,e])},"slide-top":function(t,e){return i.apply(this,["uk-animation-slide-top",t,e])},"slide-vertical":function(t,e){var n=["uk-animation-slide-top","uk-animation-slide-bottom"];return t&&t.index()>e.index()&&n.reverse(),i.apply(this,[n,t,e])},"slide-left":function(t,e){return i.apply(this,["uk-animation-slide-left",t,e])},"slide-right":function(t,e){return i.apply(this,["uk-animation-slide-right",t,e])},"slide-horizontal":function(t,e){var n=["uk-animation-slide-right","uk-animation-slide-left"];return t&&t.index()>e.index()&&n.reverse(),i.apply(this,[n,t,e])},scale:function(t,e){return i.apply(this,["uk-animation-scale-up",t,e])}},t.switcher.animations=e}(UIkit),function(t){"use strict";t.component("tab",{defaults:{target:">li:not(.uk-tab-responsive, .uk-disabled)",connect:!1,active:0,animation:!1,duration:200,swiping:!0},boot:function(){t.ready(function(i){t.$("[data-uk-tab]",i).each(function(){var i=t.$(this);if(!i.data("tab")){t.tab(i,t.Utils.options(i.attr("data-uk-tab")))}})})},init:function(){var i=this;this.current=!1,this.on("click.uk.tab",this.options.target,function(e){if(e.preventDefault(),!i.switcher||!i.switcher.animating){var n=i.find(i.options.target).not(this);n.removeClass("uk-active").blur(),i.trigger("change.uk.tab",[t.$(this).addClass("uk-active"),i.current]),i.current=t.$(this),i.options.connect||(n.attr("aria-expanded","false"),t.$(this).attr("aria-expanded","true"))}}),this.options.connect&&(this.connect=t.$(this.options.connect)),this.responsivetab=t.$('
  • ').append('
      '),this.responsivetab.dropdown=this.responsivetab.find(".uk-dropdown"),this.responsivetab.lst=this.responsivetab.dropdown.find("ul"),this.responsivetab.caption=this.responsivetab.find("a:first"),this.element.hasClass("uk-tab-bottom")&&this.responsivetab.dropdown.addClass("uk-dropdown-up"),this.responsivetab.lst.on("click.uk.tab","a",function(e){e.preventDefault(),e.stopPropagation();var n=t.$(this);i.element.children("li:not(.uk-tab-responsive)").eq(n.data("index")).trigger("click")}),this.on("show.uk.switcher change.uk.tab",function(t,e){i.responsivetab.caption.html(e.text())}),this.element.append(this.responsivetab),this.options.connect&&(this.switcher=t.switcher(this.element,{toggle:">li:not(.uk-tab-responsive)",connect:this.options.connect,active:this.options.active,animation:this.options.animation,duration:this.options.duration,swiping:this.options.swiping})),t.dropdown(this.responsivetab,{mode:"click",preventflip:"y"}),i.trigger("change.uk.tab",[this.element.find(this.options.target).not(".uk-tab-responsive").filter(".uk-active")]),this.check(),t.$win.on("resize orientationchange",t.Utils.debounce(function(){i.element.is(":visible")&&i.check()},100)),this.on("display.uk.check",function(){i.element.is(":visible")&&i.check()})},check:function(){var i=this.element.children("li:not(.uk-tab-responsive)").removeClass("uk-hidden");if(!i.length)return this.responsivetab.addClass("uk-hidden"),void 0;var e,n,o,s=i.eq(0).offset().top+Math.ceil(i.eq(0).height()/2),a=!1;if(this.responsivetab.lst.empty(),i.each(function(){t.$(this).offset().top>s&&(a=!0)}),a)for(var r=0;r-1?"&":"?","enablejsapi=1&api=1"].join(""))}},check:function(){this.element.css({width:"",height:""}),this.dimension={w:this.element.width(),h:this.element.height()},this.element.attr("width")&&!isNaN(this.element.attr("width"))&&(this.dimension.w=this.element.attr("width")),this.element.attr("height")&&!isNaN(this.element.attr("height"))&&(this.dimension.h=this.element.attr("height")),this.ratio=this.dimension.w/this.dimension.h;var t,i,e=this.parent.width(),n=this.parent.height();e/this.ratio { + availableYears = d.sort(); +}) + + +function resultatsURL (year){ + var cacheBuster = window.Date.now(); + year = !!year ? year: util.getDefaultYear(); + return "api/resultats" + year + ".json?_=" + cacheBuster; +}; + +export function getAvailableYears(){ + if(window.availableYears){ + return _.clone(window.availableYears) + } + return availableYears.map(x => x) + +}; + +export function getDefaultYear(){ + return _.max(getAvailableYears()); +} + +export function formatDate(date){ + const monthNames = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', + 'juillet', 'août', 'septembre', 'octobre', 'novembre', + 'decembre']; + return [date.getDate(), + monthNames[date.getMonth()], + date.getFullYear()].join(' '); + +}; + + + +export function getResults(year){ + var url = resultatsURL(year); + return m.request({method: "GET", url: url}) +}; + +export function getDefaultResults() { + return getResults(getDefaultYear()); +}; + + +export function formatDateSmall(date){ + var smallMonthNames = ['janv', 'févr', 'mars', 'avr', 'mai', 'juin', + 'juill', 'août', 'sept', 'oct', 'nov', + 'dec']; + return [date.getDate(), + smallMonthNames[date.getMonth()], + date.getFullYear() % 1000].join(' '); + + +} diff --git a/templates/calendrier.vto b/templates/calendrier.vto new file mode 100644 index 0000000..fa38fa9 --- /dev/null +++ b/templates/calendrier.vto @@ -0,0 +1,8 @@ +{{ layout "templates/container.vto" }} + + +
      + + + +{{ /layout }} diff --git a/templates/contact.vto b/templates/contact.vto new file mode 100644 index 0000000..2e6133a --- /dev/null +++ b/templates/contact.vto @@ -0,0 +1,35 @@ +{{ layout "templates/container.vto" }} + +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + +
      sportsphenixmtl@gmail.com
      (514) 838-8950
      +

      10454 Sylvain-Garneau
      Montréal, Québec H1C 0A2

      +
      +

      Le site web est ouvert et accessible sur gitlab.

      +
      +
      +
      + +{{ /layout }} diff --git a/templates/container.vto b/templates/container.vto new file mode 100644 index 0000000..aad548c --- /dev/null +++ b/templates/container.vto @@ -0,0 +1,102 @@ + + + + + + + Balle Phenix + + + + + + + + + + + + + + + + {{ content }} + +
      +
      +
      Ligue de balle les Phénix... pour le plaisir de jouer! +

      Ligue de balle les Phénix

      +
      + +

      +
      +
      + + + diff --git a/templates/home.vto b/templates/home.vto new file mode 100644 index 0000000..b2f4ee2 --- /dev/null +++ b/templates/home.vto @@ -0,0 +1,107 @@ + +{{ layout "templates/container.vto" }} + + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      + {{ include "templates/includes/home-news.vto" }} +
      +
      +
      +
      +
      +
      +

      Calendrier

      +
      +
      +
      +
      +
      +
      +

      Parc Walter-Stewart

      + {{ include "templates/includes/walter-stewart-map.vto" }} +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + {{ include "templates/includes/home-news.vto" }} +
      +
      +
      +
      +
      +
      +

      Calendrier

      +
      +
      +
      +
      +
      +
      +
      +
      +

      Parc Walter-Stewart

      + {{ include "templates/includes/walter-stewart-map.vto" }} +
      +
      +
      +
      + + + + + +
      +
      +
      +
      +
      +
      + {{ include "templates/includes/home-news.vto" }} +
      +
      +
      +
      +
      +
      +
      +
      +

      Calendrier

      +
      +
      +
      +
      +
      +
      +
      +
      +

      Parc Walter-Stewart

      + {{ include "templates/includes/walter-stewart-map.vto" }} +
      +
      +
      +
      +
      +
      + +{{ /layout }} diff --git a/templates/includes/game-editor.vto b/templates/includes/game-editor.vto new file mode 100644 index 0000000..653c9c0 --- /dev/null +++ b/templates/includes/game-editor.vto @@ -0,0 +1,68 @@ +
      + + {{set prettyGameDate = new Date(game.date).toLocaleString("fr-CA", { month: 'long', year: 'numeric', day: 'numeric', timeZone: 'UTC'}) }} + + + +

      {{ game.away }} vs {{ game.home }} | {{ prettyGameDate }} | {{ game.time }}

      +
      + +
      + +
      + +
      + +
      + +
      + + + +
      + +
      +
      + +
      + +
      + +
      +
      diff --git a/templates/includes/home-news.vto b/templates/includes/home-news.vto new file mode 100644 index 0000000..09ad320 --- /dev/null +++ b/templates/includes/home-news.vto @@ -0,0 +1,11 @@ +

      + +

      Saison 2023

      +
      +

      + +

      +

      Bonne saison à tous et toutes!

      +

      N'oubliez pas de consulter la page facebook: https://www.facebook.com/SportsPhenixMtl/ pour toutes mises à jour, y compris les annulations due à la météo.

      +

      lire la suite ...

      +

      diff --git a/templates/includes/team-selector.vto b/templates/includes/team-selector.vto new file mode 100644 index 0000000..4c66228 --- /dev/null +++ b/templates/includes/team-selector.vto @@ -0,0 +1,10 @@ +{{ set selectedTeam = selectedTeam || "" }} +{{set isDisabled = isDisabled || false }} +{{set teams = ['jaune', 'rouge', 'bleu', 'gris', 'vert', 'noir', 'orange', 'mauve'] }} + + + diff --git a/templates/includes/walter-stewart-map.vto b/templates/includes/walter-stewart-map.vto new file mode 100644 index 0000000..bb0ddcf --- /dev/null +++ b/templates/includes/walter-stewart-map.vto @@ -0,0 +1,15 @@ +
      + + +
      + + Voir la carte + +
      diff --git a/templates/membre.vto b/templates/membre.vto new file mode 100644 index 0000000..d56030c --- /dev/null +++ b/templates/membre.vto @@ -0,0 +1,28 @@ +{{ layout "templates/container.vto" }} + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +{{ /layout }} diff --git a/templates/nouvelles.vto b/templates/nouvelles.vto new file mode 100644 index 0000000..a4f9725 --- /dev/null +++ b/templates/nouvelles.vto @@ -0,0 +1,20 @@ +{{ layout "templates/container.vto" }} + + +
      +
      +
      +

      +

      Saison 2023

      + +

      Dimanche 10 Juillet 2023

      +

      +

      Bonne saison à tous et toutes!

      +

      N'oubliez pas de consulter la page facebook: https://www.facebook.com/SportsPhenixMtl/ pour toutes mises à jour, y compris les annulations due à la météo.

      +

      Votre Comité 2023

      +
      +
      +
      + +{{ /layout }} diff --git a/templates/partials/games-editor.vto b/templates/partials/games-editor.vto new file mode 100644 index 0000000..a0b6ea4 --- /dev/null +++ b/templates/partials/games-editor.vto @@ -0,0 +1,37 @@ +{{set isToday = !!isToday }} + +
      + +
      + +
      + + + {{ for game of games }} +
      + {{ include "templates/includes/game-editor.vto" {game} }} +
      + {{ /for }} + +
      + +
      diff --git a/templates/partials/new-game-error.vto b/templates/partials/new-game-error.vto new file mode 100644 index 0000000..7db45f0 --- /dev/null +++ b/templates/partials/new-game-error.vto @@ -0,0 +1,7 @@ +
      + +
      +
      {{ error }}
      +
      + +
      diff --git a/templates/partials/new-games-editor.vto b/templates/partials/new-games-editor.vto new file mode 100644 index 0000000..f176dd3 --- /dev/null +++ b/templates/partials/new-games-editor.vto @@ -0,0 +1,45 @@ +
      + +
      + +
      +
      +
      + + {{ include "templates/includes/team-selector.vto" {name: "away-team"} }} + + {{ include "templates/includes/team-selector.vto" {name: "home-team"}}} + +
      + +
      + +
      + +
      + +
      + +
      + +
      + +
      + + + + +
      + + +
      + +
      diff --git a/templates/partials/single-game-editor.vto b/templates/partials/single-game-editor.vto new file mode 100644 index 0000000..907d6ae --- /dev/null +++ b/templates/partials/single-game-editor.vto @@ -0,0 +1,7 @@ +
      + +
      + {{ include "templates/includes/game-editor.vto" {game} }} +
      + +
      diff --git a/templates/reglement.vto b/templates/reglement.vto new file mode 100644 index 0000000..a81d3b3 --- /dev/null +++ b/templates/reglement.vto @@ -0,0 +1,42 @@ +{{ layout "templates/container.vto" }} + + +
      +
      + +
      +

      Mission

      +

      La ligue de balle Les Phénix a été fondée en 2004 afin d'offrir aux membres de la communauté gaie et lesbienne et à leurs amis hétéros l'opportunité de s'amuser et de pratiquer un sport dans une ambiance amicale et décontractée. L'ouverture d'esprit, la camaraderie et le plaisir de pratiquer un sport à l'extérieur caractérisent cette ligue.

      +
      +
      +
      +{{ /layout }}