diff --git a/build.gradle.kts b/build.gradle.kts index 246bab6..4df0e68 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -55,6 +55,7 @@ dependencies { implementation ("org.seleniumhq.selenium:selenium-java:4.10.0") + implementation ("org.commonmark:commonmark:0.18.0") implementation ("com.drewnoakes:metadata-extractor:2.19.0") implementation("org.springframework.boot:spring-boot-starter-security") diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/BumsInterceptor.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/BumsInterceptor.kt index c8415e0..0b9a8b2 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/configs/BumsInterceptor.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/BumsInterceptor.kt @@ -87,8 +87,8 @@ class BumsInterceptor : HandlerInterceptor { request.cookies?.forEach { if (it.name.equals("CLEAR", true)) { - request.getSession(true)?.let { session -> - session.invalidate() + request.getSession(false)?.let { session -> +// session.invalidate() session.setAttribute(WRITE_PERMISSION_KEY, false) } } diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/SecurityConfig.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/SecurityConfig.kt index 72b79e8..078cce0 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/configs/SecurityConfig.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/SecurityConfig.kt @@ -46,13 +46,16 @@ class SecurityConfig { logService.log(it.toString()) it.requestMatchers(HttpMethod.POST,"/user/**").permitAll() // it.requestMatchers(HttpMethod.POST,"/user/**").permitAll() +// it.requestMatchers(HttpMethod.POST,"/user/**").permitAll() // it.requestMatchers("/", "/user/**").permitAll() // .requestMatchers(".ajax").permitAll() // it.requestMatchers("/", "/user/joinUser.api").permitAll() // it.requestMatchers("user/joinUser.api").permitAll() + it.requestMatchers("/blog/viewer/**").permitAll() it.anyRequest().permitAll() + // .requestMatchers("/", "/login/**").permitAll() -// .requestMatchers("/posts/**", "/api/v1/posts/**").hasRole(Role.USER.name) + // .requestMatchers("/admins/**", "/api/v1/admins/**").hasRole(Role.ADMIN.name) // .anyRequest().authenticated() } diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Home.kt b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Home.kt index ea47702..3be9e4c 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Home.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Home.kt @@ -5,6 +5,11 @@ import jakarta.servlet.http.HttpServletResponse import kr.lunaticbum.back.lun.model.PostManageg import kr.lunaticbum.back.lun.model.ResultMV import kr.lunaticbum.back.lun.utils.LogService +import org.commonmark.node.Node +import org.commonmark.parser.Parser +import org.commonmark.renderer.html.HtmlRenderer +import org.jsoup.Jsoup +import org.jsoup.nodes.Element import org.springframework.beans.factory.annotation.Autowired import org.springframework.data.domain.Pageable import org.springframework.web.bind.annotation.GetMapping @@ -25,13 +30,24 @@ class Home { @GetMapping("/","/home") fun home() : ResultMV { val vm = ResultMV("content/home") - vm.modelMap.put("Posts", postManageg.find20(Pageable.ofSize(20)).apply { - this.forEach { - it.title = URLDecoder.decode(it.title) - it.content = URLDecoder.decode(it.content) - logService.log(Gson().toJson(it)) - } - }) + try { + vm.modelMap.put("Posts", postManageg.find4().apply { + this.forEach { + it.title = URLDecoder.decode(it.title) + it.content = URLDecoder.decode(it.content) + val parser: Parser = Parser.builder().build() + val document: Node = parser.parse(it.content) + val renderer = HtmlRenderer.builder().build() + Jsoup.parse(renderer.render(document))?.let { doc -> + val firstImg: Element? = doc.select("img")?.first() + val imgSrc: String = firstImg?.attr("src") ?: "" + it.image = imgSrc + it.html = doc.text() + } + it.title = if ((it.title?.length ?: 0) >= 1) it.title else "" + } + }.chunked(2)) + }catch (ex: Exception){ex.printStackTrace()} vm.modelMap.put("path","/blog/viewer/") return vm } diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt index 401859c..f862e00 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt @@ -312,8 +312,8 @@ class Telegram { .bodyToMono(String::class.java).block() } CoroutineScope(Dispatchers.IO).launch { - var originalQuery = msg.text - lama.generateResponse(originalQuery?.replace("오늘","오늘(${SimpleDateFormat("yyyy-MM-dd").format(Date())})"),msg.from?.id.toString()) + var originalQuery = msg.text ?: "" + lama.generateResponse(originalQuery.replace("오늘","오늘(${SimpleDateFormat("yyyy-MM-dd").format(Date())})"),msg.from?.id.toString()) } } @@ -371,7 +371,7 @@ class Telegram { // } // } CoroutineScope(Dispatchers.IO).async { - lama.generateResponse(originalQuery?.replace("오늘","오늘(${SimpleDateFormat("yyyy-MM-dd").format(Date())})")) + lama.generateResponse(originalQuery.replace("오늘","오늘(${SimpleDateFormat("yyyy-MM-dd").format(Date())})")) } return "TEST" } diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/model/Post.kt b/src/main/kotlin/kr/lunaticbum/back/lun/model/Post.kt index 9894e1d..aa0c10b 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/model/Post.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/model/Post.kt @@ -34,6 +34,9 @@ class Post { var category : String? = null var tags : String? = null + var html : String? = null + var image : String? = null + var writer : String? = null var writeTime : Long = 0 var posting : Boolean = false @@ -69,6 +72,19 @@ class PostManageg { return postRepository.findAllByPostingTrue(pageable).takeLast(20).buffer(20).blockLast(Duration.ofSeconds(30)) ?: listOf() } + + fun find4() : List { + val originalList = postRepository.findAllByModifyTime(0) + .takeLast(4) + .buffer(4) + .blockLast(Duration.ofSeconds(30)) ?: listOf() + + return originalList + List((4 - originalList.size).coerceAtLeast(0)) { + Post() // 기본값 생성 (필드 초기화 필요) + } +// return postRepository.findAllByModifyTime(0).takeLast(4).buffer(4).blockLast(Duration.ofSeconds(30)) ?: listOf() + } + fun find20() : List { return postRepository.findAllByModifyTime(0).takeLast(20).buffer(20).blockLast(Duration.ofSeconds(30)) ?: listOf() } diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/service/Lama.kt b/src/main/kotlin/kr/lunaticbum/back/lun/service/Lama.kt index c62d38b..456cc8c 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/service/Lama.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/service/Lama.kt @@ -2,22 +2,21 @@ package kr.lunaticbum.back.lun.service +import com.fasterxml.jackson.databind.ObjectMapper import com.google.gson.Gson -import com.google.gson.JsonElement import com.google.gson.JsonObject import com.google.gson.JsonParser import io.micrometer.observation.ObservationRegistry -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch +import kotlinx.coroutines.* +import kotlinx.coroutines.reactive.awaitSingle import kr.lunaticbum.back.lun.configs.GlobalEnvironment import kr.lunaticbum.back.lun.controllers.TelegramSendMsg import kr.lunaticbum.back.lun.model.* import kr.lunaticbum.back.lun.utils.RssFeedsParser import org.jsoup.Jsoup +import org.jsoup.nodes.Document import org.jsoup.select.Elements import org.openqa.selenium.By -import org.openqa.selenium.WebDriver import org.openqa.selenium.chrome.ChromeOptions import org.openqa.selenium.remote.RemoteWebDriver import org.springframework.ai.embedding.EmbeddingRequest @@ -37,6 +36,8 @@ import java.net.URLEncoder import java.text.SimpleDateFormat import java.time.Duration import java.util.* +import java.util.regex.Matcher +import java.util.regex.Pattern @Service @@ -84,54 +85,108 @@ class Lama { val joinString = "\n#" var lastElements : Elements = Elements() var body = Jsoup.connect(url).timeout(30000).get().body() -// var elements : Elements? = null -// if (url.contains("nate.com", true)) { -// if (url.contains("view", true)) { -// elements = body.select("[class*=articleView]") -// }else { -// elements = body.select("[class*=postRankSubjectList]") -// } -// } else if (url.contains("newsis.com/view", true)) { -// elements = body.select("[class*=articleView]") -// } else if (url.contains("blog.naver.com", true)) { -// elements = body.select("[class*=se-viewer]") -// } else if (url.contains("bbc.com/korean/articles", true)) { -// elements = body.select("main[role$=main]") -// } else if (url.contains("chosun.com/client", true)) { -// elements = body.select("[class*=articleBody]") -// } else if (url.contains("nocutnews.co.kr/news", true)) { -// elements = body.select("[class*=container]") -// } else if (url.contains("hani.co.kr/arti/", true)) { -// elements = body.select("[class*=ArticleDetail]") -// } else if (url.contains("yna.co.kr/view", true)) { -// elements = body.select("[class*=container]") -// } else if (url.contains("newspim.com/news", true)) { -// elements = body.select("[class*=container]") -// } else { -// -// } -// if (elements?.size ?: 0 > 0) { -// elements?.forEach { -// lastElements.add(it) -// } -// } -// -// if (lastElements.size < 1) { -// arrayOf("container","article","main","viewer","content").forEach { -// var result = Elements() -// result.addAll(body.select("[class*=$it]")) -// result.addAll(body.select("[id*=$it]")) -// result.addAll(body.select(it)) -// result.forEach { if (it.text().length > 100 && it.children().size < 5) { lastElements.add(it) } } -// } -// } - return if (lastElements.size > 0) { - lastElements.eachText().joinToString(joinString) + var elements : Elements? = null + if (url.contains("nate.com", true)) { + if (url.contains("view", true)) { + elements = body.select("[class*=articleView]") + }else { + elements = body.select("[class*=postRankSubjectList]") + } + } else if (url.contains("newsis.com/view", true)) { + elements = body.select("[class*=articleView]") + } else if (url.contains("blog.naver.com", true)) { + elements = body.select("[class*=se-viewer]") + } else if (url.contains("bbc.com/korean/articles", true)) { + elements = body.select("main[role$=main]") + } else if (url.contains("chosun.com/client", true)) { + elements = body.select("[class*=articleBody]") + } else if (url.contains("nocutnews.co.kr/news", true)) { + elements = body.select("[class*=container]") + } else if (url.contains("hani.co.kr/arti/", true)) { + elements = body.select("[class*=ArticleDetail]") + } else if (url.contains("yna.co.kr/view", true)) { + elements = body.select("[class*=container]") + } else if (url.contains("newspim.com/news", true)) { + elements = body.select("[class*=container]") } else { - body.children().eachText().joinToString(joinString) + + } + if (elements?.size ?: 0 > 0) { + elements?.forEach { + lastElements.add(it) + } + } + + if (lastElements.size < 1) { + arrayOf("container","article","main","viewer","content").forEach { + var result = Elements() + result.addAll(body.select("[class*=$it]")) + result.addAll(body.select("[id*=$it]")) + result.addAll(body.select(it)) + result.forEach { if (it.text().length > 100 && it.children().size < 5) { lastElements.add(it) } } + } + } + return if (lastElements.size > 0) { + lastElements.text() + } else { + body.text() } } + fun jsopFilter(doc : Document) : String { + var url = doc.baseUri() + val joinString = "\n#" + var lastElements : Elements = Elements() + var body = doc + var elements : Elements? = null + if (url.contains("nate.com", true)) { + if (url.contains("view", true)) { + elements = body.select("[class*=articleView]") + }else { + elements = body.select("[class*=postRankSubjectList]") + } + } else if (url.contains("newsis.com/view", true)) { + elements = body.select("[class*=articleView]") + } else if (url.contains("blog.naver.com", true)) { + elements = body.select("[class*=se-viewer]") + } else if (url.contains("bbc.com/korean/articles", true)) { + elements = body.select("main[role$=main]") + } else if (url.contains("chosun.com/client", true)) { + elements = body.select("[class*=articleBody]") + } else if (url.contains("nocutnews.co.kr/news", true)) { + elements = body.select("[class*=container]") + } else if (url.contains("hani.co.kr/arti/", true)) { + elements = body.select("[class*=ArticleDetail]") + } else if (url.contains("yna.co.kr/view", true)) { + elements = body.select("[class*=container]") + } else if (url.contains("newspim.com/news", true)) { + elements = body.select("[class*=container]") + } else { + + } + if (elements?.size ?: 0 > 0) { + elements?.forEach { + lastElements.add(it) + } + } + + if (lastElements.size < 1) { + arrayOf("container","article","main","viewer","content").forEach { + var result = Elements() + result.addAll(body.select("[class*=$it]")) + result.addAll(body.select("[id*=$it]")) + result.addAll(body.select(it)) + result.forEach { if (it.text().length > 100 && it.children().size < 5) { lastElements.add(it) } } + } + } + return if (lastElements.size > 0) { + lastElements.text() + } else { + body.text() + } + } + + // class WebScrap { // @SerializedName("query", alternate = ["question"]) // var query: String? = null @@ -153,17 +208,65 @@ class Lama { val llmPhi4Mini = "phi4-mini" val llmDolphin3 = "dolphin3" + var llm_gemma3_4b = "gemma3:4b" + var llm_phi4_mini = "phi4-mini:latest" + var llm_dolphin3 = "dolphin3:latest" + var llm_gemma3_12b = "gemma3:12b" + var llm_phi4_14b = "phi4:14b" + var llm_mistral_7b = "mistral:7b" - val currentLLM = llmDolphin3 + + val currentLLM = llm_dolphin3 fun getGoogleSearch(query:String){ Jsoup.connect("https://www.google.com/search?q=".plus(query)).timeout(30000).get().select("a[href]").forEach { } } - val waitTime = 1000L + val waitTime = 1500L val topCount = 2 + fun webDriver() : RemoteWebDriver { + val options : ChromeOptions = ChromeOptions(); + options.addArguments("--headless"); + options.addArguments("--disable-popup-blocking"); + options.addArguments("--disable-default-apps"); + options.addArguments("--disable-notifications"); + options.addArguments("--disable-blink-features=AutomationControlled") + return RemoteWebDriver(URL("https://video.lunaticbum.kr"), options) + } + + fun isValidUrl(url: String): Boolean { + val urlRegex = "^(https?|ftp)://[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)$".toRegex() + return url.matches(urlRegex) + } + + @Async + suspend fun getterUrl(urlString: String) { + try { + webDriver()?.let { driver -> + var findCount = 0 + try { + driver.get("urlString"); + Thread.sleep(waitTime) + println(driver.currentUrl) + driver.findElement(By.ByTagName("Body"))?.let { webElement -> + Jsoup.parse(driver.pageSource).select("[href*=https]").forEach { + var href = it.attr("href") + println(href) + } + } + + }catch (e:Exception){ + e.printStackTrace() + } + driver.close() + driver.quit() + } + }catch (e:Exception){} + } + + @Async suspend fun addDocuments(query : String , refinedQuery: RefinedQuery?) { var querys : ArrayList = ArrayList() @@ -171,48 +274,65 @@ class Lama { refinedQuery?.ko_query?.let { querys.add(it) } refinedQuery?.en_query?.let { querys.add(it) } - refinedQuery?.keywords?.let { querys.add(it.joinToString { " " })} + refinedQuery?.ko_keywords?.let { querys.add(it.joinToString( " "))} + refinedQuery?.en_keywords?.let { querys.add(it.joinToString( " "))} val readedUrls = ArrayList() try { - var options : ChromeOptions = ChromeOptions(); - options.addArguments("--disable-popup-blocking"); - options.addArguments("--disable-default-apps"); - options.addArguments("--disable-notifications"); - options.addArguments("--disable-blink-features=AutomationControlled"); + val targetUrls = hashSetOf() - RemoteWebDriver(URL("https://video.lunaticbum.kr"), options).let { driver -> - querys.forEach { refinedQuery-> - var findCount = 0 - try { - driver.get("https://www.google.com/search?q=$refinedQuery"); - Thread.sleep(waitTime) - println(driver.currentUrl) - driver.findElement(By.ByTagName("Body"))?.let { webElement -> - Jsoup.parse(driver.pageSource).select("[href*=https]").forEach { - var href = it.attr("href") - if (href?.length ?: 0 > 5 && href.startsWith("https://") && findCount < topCount && href.contains("google") == false && href.contains("youtube") == false) { - targetUrls.add(href) - println("add targetUrls $href") - findCount += 1 + + querys.forEach { refinedQuery-> + try { + webDriver()?.let { driver -> + var findCount = 0 + try { + driver.get("https://www.google.com/search?q=$refinedQuery"); + Thread.sleep(waitTime) + println(driver.currentUrl) + driver.findElement(By.ByTagName("Body"))?.let { webElement -> + Jsoup.parse(driver.pageSource).select("[href*=https]").forEach { + var href = it.attr("href") + if (href?.length ?: 0 > 5 && href.startsWith("https://") && findCount < topCount && href.contains("google") == false && href.contains("youtube") == false) { + targetUrls.add(href) + println("add targetUrls $href") + findCount += 1 + } } } - } - }catch (e:Exception){ - e.printStackTrace() + }catch (e:Exception){ + e.printStackTrace() + } + driver.close() + driver.quit() } - } - driver.close() - driver.quit() + }catch (e:Exception){} } - options = ChromeOptions(); - options.addArguments("--disable-popup-blocking"); - options.addArguments("--disable-default-apps"); - options.addArguments("--disable-notifications"); - options.addArguments("--disable-blink-features=AutomationControlled"); - RemoteWebDriver(URL("https://video.lunaticbum.kr"), options).let { driver -> - targetUrls.forEach { url -> + + querys.forEach { refinedQuery -> + try { + webDriver()?.let { driver -> + var findCount = 0 + RssFeedsParser().readFeed("https://news.google.com/rss/search?q=${URLEncoder.encode(refinedQuery)}=ko&gl=KR&ceid=KR%3Ako/")?.messages?.forEach { + var url: String? = it.link + if (url?.length ?: 0 > 5 && url?.startsWith("https://") == true && readedUrls.contains(url) == false && findCount < topCount) { + println("url >>>> $url") + targetUrls.add(url!!) + findCount += 1 + } + } + driver.close() + driver.quit() + } + }catch (e:Exception){ + } + + } + + + targetUrls.forEach { url -> + webDriver()?.let { driver -> var result = SearXngResult() if (url?.length ?: 0 > 5 && url?.startsWith("https://") == true && readedUrls.contains(url) == false) { readedUrls.add(url!!) @@ -222,85 +342,47 @@ class Lama { driver.get(url); Thread.sleep(waitTime) driver.findElement(By.ByTagName("Body"))?.let { webElement -> - if(webElement.text.length > 120) { - println(driver.currentUrl) - println(webElement.text) - result.title = driver.title - result.originHtml = webElement.text - webPageSummarize(result, webElement.text) + jsopFilter(Jsoup.parse(driver.pageSource)).let { text -> + result.originHtml = text + webPageSummarize(result) } } - } catch (e: Exception) { - e.printStackTrace() +// e.printStackTrace() } } + driver.close(); + driver.quit() } - driver.close(); - driver.quit() } - options = ChromeOptions(); - options.addArguments("--disable-popup-blocking"); - options.addArguments("--disable-default-apps"); - options.addArguments("--disable-notifications"); - options.addArguments("--disable-blink-features=AutomationControlled"); - RemoteWebDriver(URL("https://video.lunaticbum.kr"), options).let { driver -> - querys.forEach { refinedQuery -> - var googleSCount = 0 - RssFeedsParser().readFeed("https://news.google.com/rss/search?q=${URLEncoder.encode(query)}=ko&gl=KR&ceid=KR%3Ako/")?.messages?.forEach { - var url: String? = it.link - var result = SearXngResult() - println("url >>>> $url") - if (url?.length ?: 0 > 5 && url?.startsWith("https://") == true && readedUrls.contains(url) == false && googleSCount < topCount) { - readedUrls.add(url!!) - result.url = url!! - result.originQuery = query - result.refinedQuery = refinedQuery - result.title = it.title - println(result.title) - try { - driver.get(url); - Thread.sleep(waitTime) - println(driver.currentUrl) - driver.findElement(By.ByTagName("Body"))?.let { webElement -> - println(driver.currentUrl) - println(webElement.text) - result.title = driver.title - result.originHtml = webElement.text - webPageSummarize(result, webElement.text) - googleSCount += 1 - } - } catch (e: Exception) { - e.printStackTrace() - } - } - } - } - driver.close() - driver.quit() - } } catch (e:Exception){e.printStackTrace()} querys.forEach { refinedQuery -> val gSearch = "https://psn.lunaticbum.kr/search?q=${refinedQuery?.replace("오늘", SimpleDateFormat("yyyMMdd").format(Date()))}&language=ko&time_range=month&safesearch=0&categories=general&format=json" - println("gSearch >>> ${gSearch}") +// println("gSearch >>> ${gSearch}") WebClient.create().get() .uri(gSearch) .retrieve() .bodyToMono(SearXng::class.java).timeout(Duration.ofMinutes(20L)).block()?.let { gsResult -> - gsResult.results?.filter { it.url?.startsWith("https://") == true && it.score > 0.4 }?.forEach { - println("in filter ${it.url}") + gsResult.results?.filter { it.url?.startsWith("https://") == true && it.score > 5.0 }?.forEach { if (readedUrls.contains(it.url) == false) { readedUrls.add(it.url!!) it.originQuery = query it.refinedQuery = refinedQuery - println(it.title) try { - jsopFilter(it.url!!).let { text -> - it.originHtml = text - webPageSummarize(it, text) + webDriver()?.let { driver -> + driver.get(it.url!!) + Thread.sleep(waitTime) + driver.findElement(By.ByTagName("Body"))?.let { webElement -> + jsopFilter(it.url!!).let { text -> + it.originHtml = text + webPageSummarize(it) + } + } + driver.close() + driver.quit() } } catch (e: Exception) { e.printStackTrace() @@ -308,37 +390,107 @@ class Lama { } } } - println("end of search") +// println("end of search") } } - var format = "context:'%s'\ncontext는 웹 페이지 문자를 가져온 것 '%s'이 질문에 대해 연관 결과로 받은 내용임. 해당 context 정리 해서 본문 내용을 최대한 자세히 알려줘\n'{query:질문 내용, contents_ko:자세한 내용 한국어 , summary_ko:요약된 내용 한국어, keywords:[키워드], related_links:[{link,description}}], relatedness_score:0.0~10.0}'\n이 형식의 결과로 만들어 줘" + var format = "\"context:'%s'\n" + + "The context is extracted text from a web page. '%s' is the content received as a relevant result for this question. Please analyze and summarize the given context in detail, and provide the following information in JSON format.\n" + + "\n" + + "Please provide the result in this format, ensuring that all information is in Korean language." + + + var webSummaryResultFormat : String = """{ + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Original question" + }, + "contents_ko": { + "type": "string", + "description": "Detailed content in Korean" + }, + "summary_ko": { + "type": "string", + "description": "Concise summary in Korean" + }, + "keywords": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "related_links": { + "type": "array", + "items": { + "type": "object", + "properties": { + "link": { "type": "string" }, + "description": { "type": "string" } + }, + "required": ["link", "description"], + "additionalProperties": false + } + }, + "relatedness_score": { + "type": "number", + "minimum": 0.0, + "maximum": 10.0 + } + }, + "required": ["query", "contents_ko", "summary_ko", "keywords", "related_links", "relatedness_score"], + "additionalProperties": false +}"""; + + internal fun makeSummarizeRequestMsg(it : SearXngResult) : String= format.format(it.originHtml,it.originQuery) - internal fun makeCahtReq(reqMsg:String) = OllamaApi.ChatRequest.Builder(currentLLM).stream(false).format("json").messages(reqMsg.chunked(100).map { println(it); OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(it).build()}.toList()).build() + internal fun makeCahtReq(reqMsg:String, ollamaOptions: OllamaOptions?, format: Any) = OllamaApi.ChatRequest.Builder(currentLLM).options(ollamaOptions).stream(false).format(format).messages(reqMsg.chunked(100).map { OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(it).build()}.toList()).build() + var options = OllamaOptions.builder().build()//.temperature(0.8).topK(3).seed(30) @Async - fun webPageSummarize(it : SearXngResult , text : String) { + fun webPageSummarize(it : SearXngResult) { try { - infomationDic.get(it.originQuery)!!.put(it.url!!, text) - val chatClient = OllamaApi("https://lama.lunaticbum.kr") - val embeddingModel = OllamaEmbeddingModel(chatClient, OllamaOptions.builder().build(), ObservationRegistry.create(), ModelManagementOptions.defaults()) - val embeddingResponse = embeddingModel.call(EmbeddingRequest(text.chunked(400).toList(), OllamaOptions.builder().model(currentEmbedimg).truncate(false).build())) - it.originHtml = text - val sdss = QPut(arrayListOf()) - sdss.points.add(QData(id = System.currentTimeMillis(), embeddingResponse.result.output, it)) - if (sdss.points.size > 0) { - val qUrl = "https://ollama.lunaticbum.kr/collections/blama_vectors".plus("/points") - val client = WebClient.create() - client.put() - .uri(qUrl) - .header("api-key", "blama-admin-key-gb") - .body(BodyInserters.fromValue(Gson().toJson(sdss))) - .retrieve() - .bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)).subscribe( - { resultString -> }, { error -> error.printStackTrace() } - ) +// println("send to blama >> ${it.url}") + infomationDic.get(it.originQuery)?.put(it.url!!,Gson().toJson(it)) + try { + CoroutineScope(Dispatchers.IO).launch { + val chatClient = OllamaApi("https://lama.lunaticbum.kr") + chatClient.chat(makeCahtReq(makeSummarizeRequestMsg(it), options, ObjectMapper().readValue(webSummaryResultFormat,Map::class.java))).toMono().subscribe({aiResponce -> + it.pageData = aiResponce.message.content + var needSave = true + try { + var jsonObj = JsonParser.parseString(aiResponce.message.content) + needSave = jsonObj.isJsonObject && (jsonObj as JsonObject)?.get("relatedness_score")?.asDouble ?: 0.0 > 0.5 } catch (e: Exception) { + e.printStackTrace() + } + if (needSave) { + sendTlg("유효한 정보가 수집됨.".plus(aiResponce.message.content)) + val embeddingModel = OllamaEmbeddingModel(chatClient, OllamaOptions.builder().build(), ObservationRegistry.create(), ModelManagementOptions.defaults()) + val embeddingResponse = embeddingModel.call(EmbeddingRequest(Gson().toJson(it).chunked(400).toList(), OllamaOptions.builder().model(currentEmbedimg).truncate(false).build())) + + val sdss = QPut(arrayListOf()) + sdss.points.add(QData(id = System.currentTimeMillis(), embeddingResponse.result.output, it)) + if (sdss.points.size > 0) { + val qUrl = "https://ollama.lunaticbum.kr/collections/blama_vectors".plus("/points") + val client = WebClient.create() + client.put() + .uri(qUrl) + .header("api-key", "blama-admin-key-gb") + .body(BodyInserters.fromValue(Gson().toJson(sdss))) + .retrieve() + .bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)).subscribe( + { resultString -> }, { error -> error.printStackTrace() } + ) + }} + },{err-> + err.printStackTrace() + }) + } } + catch (e:Exception){e.printStackTrace()} }catch (e : Exception) { e.printStackTrace() } @@ -347,16 +499,46 @@ class Lama { class RefinedQuery { var ko_query : String? = null var en_query : String? = null - var keywords : Array? = null + var ko_keywords : Array? = null + var en_keywords : Array? = null } - var queryFormat = "질문:\n'%s'\n앞은 질문의 내용을 정리해서 '{ko_query:한국어 질문,en_query:영어 번역된 질문,ko_keywords:[한국어 키워드],en_keyword:[영문키워드]}'이 형식의 결과를 부탁할께" + + var jsonSchema: String = """{ + "type": "object", + "properties": { + "ko_query": { + "type": "string", + "description": "korean query" + }, + "en_query": { + "type": "string", + "description": "english query" + }, + "ko_keywords": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "description": "korean keywords" + }, + "en_keywords": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "description": "query keyword" + } + }, + "required": ["ko_query", "en_query", "ko_keywords", "en_keywords"], + "additionalProperties": false +}""".trimIndent() + var queryFormat = "Question:\n'%s'\nBased on the above question, please provide a JSON result formatted\nPlease ensure:\n1. Faithful translation maintaining original intent\n2. Keyword extraction focusing on core concepts\n3. Bilingual keyword matching\n4. Proper JSON formatting" + internal fun makeQuerySummarizeRequestMsg(query : String) : String= queryFormat.format(query) fun querySummarize(query: String) : RefinedQuery? { var refinedQuery : RefinedQuery? = null try { val chatClient = OllamaApi("https://lama.lunaticbum.kr") - var dispoable = chatClient.chat(makeCahtReq(makeQuerySummarizeRequestMsg(query))).toMono().subscribe({aiResponce -> + var dispoable = chatClient.chat(makeCahtReq(makeQuerySummarizeRequestMsg(query),options, ObjectMapper().readValue(jsonSchema,Map::class.java))).toMono().subscribe({aiResponce -> println("summary result >>>>> ${aiResponce.message.content}") refinedQuery = Gson().fromJson(aiResponce.message.content, RefinedQuery::class.java) },{err-> @@ -380,7 +562,7 @@ class Lama { .body(BodyInserters.fromValue(Gson().toJson(QSearchData(embedFlots,3)))) .retrieve() .bodyToMono(QSearch::class.java).timeout(Duration.ofMinutes(20L)).block() - println(Gson().toJson(lists)) + return if (lists?.result?.size ?: 0 > 0) { val qContents = QContentsList() lists?.result?.filter { it.score > 8.0 }?.forEach { qContents.ids.add(it.id) } @@ -400,64 +582,195 @@ class Lama { @Autowired lateinit var globalEvv : GlobalEnvironment + + val resultJsonScheme = """{ +"type": "object", +"properties": { +"querys": { +"type": "array", +"items": { +"type": "string" +}, +"description": "사용자의 질문 목록" +}, +"answers": { +"type": "array", +"items": { +"type": "string" +}, +"description": "질문에 대한 상세한 답변 목록" +}, +"keywords": { +"type": "array", +"items": { +"type": "string" +}, +"description": "답변과 관련된 주요 키워드 목록" +}, +"links": { +"type": "array", +"items": { +"type": "string" +}, +"description": "참고할 만한 관련 링크 목록" +} +}, +"required": ["querys", "answers", "keywords", "links"], +"additionalProperties": false +}""".trimIndent() + var infomationDic = hashMapOf>() - suspend fun generateResponse(query: String?, targetId: String? = globalEvv.telegramMyId) { + suspend fun generateResponse(query: String, targetId: String? = globalEvv.telegramMyId) { - val chatClient = OllamaApi("https://lama.lunaticbum.kr") - val embeddingModel = OllamaEmbeddingModel( - chatClient, OllamaOptions.builder().build(), ObservationRegistry.create(), ModelManagementOptions.defaults()) - println("On generateResponse :: find something ${query}") + if (isValidUrl(query)) { + getterUrl(query) + }else { - query?.let { originalQuery -> - infomationDic.put(query!!, hashMapOf()) - var embeddingResponse = embeddingModel.call(EmbeddingRequest(listOf(originalQuery), OllamaOptions.builder().model(currentEmbedimg).truncate(false).build())) - addDocuments(originalQuery, querySummarize(originalQuery)) - println("points size ${embeddingResponse.result.output.size}") - var context : StringBuffer = StringBuffer() - try { - embedQuery(embeddingResponse.result.output)?.result?.forEach { result -> - if (infomationDic.get(query!!)!!.contains(result.payload?.url ?: "NONE") == false) { - context.append("\n# :".plus(if (result.payload?.pageData?.length ?: 0 > 10) { - result.payload?.pageData - } else { - result.payload?.content - })) - } - } - }catch (e:Exception){ - e.printStackTrace() - } - - infomationDic.get(query!!)!!.iterator().forEach { context.append("\n#${it.key}:${it.value}") } - - val prompt : StringBuffer = StringBuffer().append("참조:\n").append(context).append("\n참조 내용을 고려 해서\n'$query'").append(query).append("\n에 {querys:[],answers:[],keywords:[],links:[]}형식으로 최대한 자세히 대답 해줘 모든 내용은 한국어로 해줘") val fullUrl = "https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage" + val chatClient = OllamaApi("https://lama.lunaticbum.kr") + val embeddingModel = OllamaEmbeddingModel( + chatClient, + OllamaOptions.builder().build(), + ObservationRegistry.create(), + ModelManagementOptions.defaults() + ) + println("On generateResponse :: find something ${query}") - val response: OllamaApi.ChatResponse = chatClient.chat(OllamaApi.ChatRequest.Builder(currentLLM).stream(false).format("json").messages( - prompt.chunked(300).map { println(it); OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(it).build()}.toList()).build()) -// println(response.message.content) - CoroutineScope(Dispatchers.IO).launch { - var toalmsg = "${query}의 대답이 도착했어요.\n${response.message.content}" - toalmsg.chunked(512).forEach { chunkedMsg -> - println("chunkedMsg >>> ${chunkedMsg}") - (targetId ?: globalEvv.telegramMyId)?.let { - var tlgSend = TelegramSendMsg(it, chunkedMsg) - WebClient - .create(fullUrl) - .post() - .contentType(MediaType.APPLICATION_JSON) - .body(BodyInserters.fromValue(Gson().toJson(tlgSend))) - .retrieve().bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)) - .block()?.let { result -> - println("result >>> ${result}") - } + query.let { originalQuery -> + infomationDic.put(query!!, hashMapOf()) + + try { + var embeddingResponse = embeddingModel.call( + EmbeddingRequest( + listOf(originalQuery), + OllamaOptions.builder().model(currentEmbedimg).truncate(false).build() + ) + ) + addDocuments(originalQuery, querySummarize(originalQuery)) + println("points size ${embeddingResponse.result.output.size}") + var context: StringBuffer = StringBuffer() + embedQuery(embeddingResponse.result.output)?.result?.forEach { result -> + if (infomationDic.get(query!!)!!.contains(result.payload?.url ?: "NONE") == false) { + context.append( + "\nReference:#".plus( + if (result.payload?.pageData?.length ?: 0 > 10) { + result.payload?.pageData + } else { + result.payload?.content + } + ) + ) + } } + + infomationDic.get(query!!)!!.iterator() + .forEach { context.append("\nReference:#${it.key}:${it.value}") } + + + val prompt: StringBuffer = StringBuffer() + prompt.append(context) + prompt.append("\nConsidering the above reference, please answer the following question:\n'$query'\n\nProvide a detailed response in the following JSON format\nPlease ensure all content is in Korean language and as detailed as possible.") + + + val answers = StringBuffer() + chatClient.streamingChat(OllamaApi.ChatRequest.Builder(currentLLM).stream(true) + .format(ObjectMapper().readValue(resultJsonScheme, Map::class.java)).messages( + prompt.chunked(1024) + .map { OllamaApi.Message.Builder(OllamaApi.Message.Role.USER).content(it).build() }.toList() + ).build() + ).timeout(Duration.ofMinutes(20)).subscribe({ responce -> + answers.append(responce.message.content) + println("responce.message.content >>> ${answers.length}") + try { + if (answers.length % 100 == 0) { + var tlgSend = TelegramSendMsg( + targetId ?: globalEvv.telegramMyId!!, + "결과를 수집 중 ${responce.message.content.length}의 문자열이 추가됨. 수집된 통 데이터는 ${answers.length}" + ) + WebClient + .create(fullUrl) + .post() + .contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(Gson().toJson(tlgSend))) + .retrieve().bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)) + .block()?.let { result -> + println("result >>> ${result}") + } + } + } catch (e: Exception) { + e.printStackTrace() + } + + }, { error -> + + }, { + var toalmsg: StringBuffer = StringBuffer("${query}의 대답이 도착했어요.\n").append(answers.toString()) + sendTlg(toalmsg.toString()) + infomationDic.remove(query) + println("On generateResponse :: END OF Answer") + }) + + } catch (e: Exception) { + e.printStackTrace() } - infomationDic.remove(query!!) + } - println("On generateResponse :: END OF Answer") } } + fun sendTlg(toalmsg : String) { + telegramScope.launch { + val fullUrl = "https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage" + toalmsg.chunked(512).forEach { chunkedMsg -> + launch { + println("chunkedMsg >>> ${chunkedMsg}") + globalEvv.telegramMyId?.let { + try { + var tlgSend = TelegramSendMsg(it, chunkedMsg) + WebClient + .create(fullUrl) + .post() + .contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(Gson().toJson(tlgSend))) + .retrieve().bodyToMono(String::class.java).timeout(Duration.ofMinutes(20L)) + .awaitSingle()?.let { result -> + println("result >>> ${result}") + } + }catch (e:Exception){ + e.printStackTrace() + } + } + } + } + } + } + private val telegramScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) + +// fun sendTlg2(toalmsg: String) { +// telegramScope.launch { +// val fullUrl = "https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage" +// val chunkedMessages = toalmsg.chunked(512) +// chunkedMessages.forEach { chunkedMsg -> +// launch { +// try { +// globalEvv.telegramMyId?.let { chatId -> +// val tlgSend = TelegramSendMsg(chatId, chunkedMsg) +// val result = WebClient.create(fullUrl) +// .post() +// .contentType(MediaType.APPLICATION_JSON) +// .bodyValue(Gson().toJson(tlgSend)) +// .retrieve() +// .awaitBody() +// +// println("Telegram send success: $result") +// } +// } catch (e: Exception) { +// println("Telegram send failed: ${e.localizedMessage}") +// // 추가 에러 처리 로직 +// } +// } +// } +// } +// } } \ No newline at end of file diff --git a/src/main/resources/static/assets/css/images/bg01.png b/src/main/resources/static/assets/css/images/bg01.png index 65bcb11..3ce3e33 100644 Binary files a/src/main/resources/static/assets/css/images/bg01.png and b/src/main/resources/static/assets/css/images/bg01.png differ diff --git a/src/main/resources/static/assets/css/main.css b/src/main/resources/static/assets/css/main.css index 458d87f..37ceb8c 100644 --- a/src/main/resources/static/assets/css/main.css +++ b/src/main/resources/static/assets/css/main.css @@ -52,10 +52,10 @@ blockquote, q { quotes: none; } - blockquote:before, blockquote:after, q:before, q:after { - content: ''; - content: none; - } +blockquote:before, blockquote:after, q:before, q:after { + content: ''; + content: none; +} table { border-collapse: collapse; @@ -85,173 +85,416 @@ input, select, textarea { /* Basic */ - html { - box-sizing: border-box; - } +html { + box-sizing: border-box; +} - *, *:before, *:after { - box-sizing: inherit; - } +*, *:before, *:after { + box-sizing: inherit; +} - body { - background: var(--almost-white) url("images/bg01.png"); - } +body { + background: var(--almost-white) url("images/bg01.png"); +} - body.is-preload *, body.is-preload *:before, body.is-preload *:after { - -moz-animation: none !important; - -webkit-animation: none !important; - -ms-animation: none !important; - animation: none !important; - -moz-transition: none !important; - -webkit-transition: none !important; - -ms-transition: none !important; - transition: none !important; - } +body.is-preload *, body.is-preload *:before, body.is-preload *:after { + -moz-animation: none !important; + -webkit-animation: none !important; + -ms-animation: none !important; + animation: none !important; + -moz-transition: none !important; + -webkit-transition: none !important; + -ms-transition: none !important; + transition: none !important; +} - body, input, select, textarea { - color: var(--font-color_default); - font-family: 'Source Sans Pro', sans-serif; - font-size: 16pt; - font-weight: 300; - line-height: 1.65em; - } +body, input, select, textarea { + color: var(--font-color_default); + font-family: 'Source Sans Pro', sans-serif; + font-size: 16pt; + font-weight: 300; + line-height: 1.65em; +} - a { - -moz-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; - -webkit-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; - -ms-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; - transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; - color: var(--point-color); - text-decoration: none; - border-bottom: dotted 1px; - } +a { + -moz-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; + -webkit-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; + -ms-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; + transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, opacity 0.2s ease-in-out; + color: var(--point-color); + text-decoration: none; + border-bottom: dotted 1px; +} - a:hover { - color: var(--point-color); - border-bottom-color: transparent; - } +a:hover { + color: var(--point-color); + border-bottom-color: transparent; +} - strong, b { - font-weight: 600; - } +strong, b { + font-weight: 600; +} - em, i { - font-style: italic; - } +em, i { + font-style: italic; +} - p, ul, ol, dl, table, blockquote { - margin: 0 0 2em 0; - } +p, ul, ol, dl, table, blockquote { + margin: 0 0 2em 0; +} - h1, h2, h3, h4, h5, h6 { - color: inherit; - font-weight: 600; - line-height: 1.75em; - margin-bottom: 1em; - } +h1, h2, h3, h4, h5, h6 { + color: inherit; + font-weight: 600; + line-height: 1.75em; + margin-bottom: 1em; +} - h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { - color: inherit; - text-decoration: none; - } +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; +} - h1 em, h2 em, h3 em, h4 em, h5 em, h6 em { - font-style: normal; - font-weight: 300; - } +h1 em, h2 em, h3 em, h4 em, h5 em, h6 em { + font-style: normal; + font-weight: 300; +} - h2 { - font-size: 1.75em; - letter-spacing: -0.025em; - } +h2 { + font-size: 1.75em; + letter-spacing: -0.025em; +} - h3 { - font-size: 1.2em; - letter-spacing: -0.025em; - } +h3 { + font-size: 1.2em; + letter-spacing: -0.025em; +} - sub { - font-size: 0.8em; - position: relative; - top: 0.5em; - } +sub { + font-size: 0.8em; + position: relative; + top: 0.5em; +} - sup { - font-size: 0.8em; - position: relative; - top: -0.5em; - } +sup { + font-size: 0.8em; + position: relative; + top: -0.5em; +} - hr { - border-top: solid 1px #e0e0e0; - border: 0; - margin-bottom: 1.5em; - } +hr { + border-top: solid 1px #e0e0e0; + border: 0; + margin-bottom: 1.5em; +} - blockquote { - border-left: solid 0.5em #e0e0e0; - font-style: italic; - padding: 1em 0 1em 2em; - } +blockquote { + border-left: solid 0.5em #e0e0e0; + font-style: italic; + padding: 1em 0 1em 2em; +} /* Container */ +.container { + margin: 0 auto; + max-width: 100%; + width: 1400px; +} + +@media screen and (max-width: 1680px) { + .container { - margin: 0 auto; - max-width: 100%; - width: 1400px; + width: 1200px; } - @media screen and (max-width: 1680px) { +} - .container { - width: 1200px; - } +@media screen and (max-width: 1280px) { - } + .container { + width: 960px; + } - @media screen and (max-width: 1280px) { +} - .container { - width: 960px; - } +@media screen and (max-width: 980px) { - } + .container { + width: 95%; + } - @media screen and (max-width: 980px) { +} - .container { - width: 95%; - } +@media screen and (max-width: 840px) { - } + .container { + width: 95%; + } - @media screen and (max-width: 840px) { +} - .container { - width: 95%; - } +@media screen and (max-width: 736px) { - } + .container { + width: 90%; + } - @media screen and (max-width: 736px) { +} - .container { - width: 90%; - } +@media screen and (max-width: 480px) { - } + .container { + width: 100%; + } - @media screen and (max-width: 480px) { - - .container { - width: 100%; - } - - } +} /* Row */ +.row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; +} + +.row > * { + box-sizing: border-box; +} + +.row.gtr-uniform > * > :last-child { + margin-bottom: 0; +} + +.row.aln-left { + justify-content: flex-start; +} + +.row.aln-center { + justify-content: center; +} + +.row.aln-right { + justify-content: flex-end; +} + +.row.aln-top { + align-items: flex-start; +} + +.row.aln-middle { + align-items: center; +} + +.row.aln-bottom { + align-items: flex-end; +} + +.row > .imp { + order: -1; +} + +.row > .col-1 { + width: 8.33333%; +} + +.row > .off-1 { + margin-left: 8.33333%; +} + +.row > .col-2 { + width: 16.66667%; +} + +.row > .off-2 { + margin-left: 16.66667%; +} + +.row > .col-3 { + width: 25%; +} + +.row > .off-3 { + margin-left: 25%; +} + +.row > .col-4 { + width: 33.33333%; +} + +.row > .off-4 { + margin-left: 33.33333%; +} + +.row > .col-5 { + width: 41.66667%; +} + +.row > .off-5 { + margin-left: 41.66667%; +} + +.row > .col-6 { + width: 50%; +} + +.row > .off-6 { + margin-left: 50%; +} + +.row > .col-7 { + width: 58.33333%; +} + +.row > .off-7 { + margin-left: 58.33333%; +} + +.row > .col-8 { + width: 66.66667%; +} + +.row > .off-8 { + margin-left: 66.66667%; +} + +.row > .col-9 { + width: 75%; +} + +.row > .off-9 { + margin-left: 75%; +} + +.row > .col-10 { + width: 83.33333%; +} + +.row > .off-10 { + margin-left: 83.33333%; +} + +.row > .col-11 { + width: 91.66667%; +} + +.row > .off-11 { + margin-left: 91.66667%; +} + +.row > .col-12 { + width: 100%; +} + +.row > .off-12 { + margin-left: 100%; +} + +.row.gtr-0 { + margin-top: 0px; + margin-left: 0px; +} + +.row.gtr-0 > * { + padding: 0px 0 0 0px; +} + +.row.gtr-0.gtr-uniform { + margin-top: 0px; +} + +.row.gtr-0.gtr-uniform > * { + padding-top: 0px; +} + +.row.gtr-25 { + margin-top: -12.5px; + margin-left: -12.5px; +} + +.row.gtr-25 > * { + padding: 12.5px 0 0 12.5px; +} + +.row.gtr-25.gtr-uniform { + margin-top: -12.5px; +} + +.row.gtr-25.gtr-uniform > * { + padding-top: 12.5px; +} + +.row.gtr-50 { + margin-top: -25px; + margin-left: -25px; +} + +.row.gtr-50 > * { + padding: 25px 0 0 25px; +} + +.row.gtr-50.gtr-uniform { + margin-top: -25px; +} + +.row.gtr-50.gtr-uniform > * { + padding-top: 25px; +} + +.row { + margin-top: -50px; + margin-left: -50px; +} + +.row > * { + padding: 50px 0 0 50px; +} + +.row.gtr-uniform { + margin-top: -50px; +} + +.row.gtr-uniform > * { + padding-top: 50px; +} + +.row.gtr-150 { + margin-top: -75px; + margin-left: -75px; +} + +.row.gtr-150 > * { + padding: 75px 0 0 75px; +} + +.row.gtr-150.gtr-uniform { + margin-top: -75px; +} + +.row.gtr-150.gtr-uniform > * { + padding-top: 75px; +} + +.row.gtr-200 { + margin-top: -100px; + margin-left: -100px; +} + +.row.gtr-200 > * { + padding: 100px 0 0 100px; +} + +.row.gtr-200.gtr-uniform { + margin-top: -100px; +} + +.row.gtr-200.gtr-uniform > * { + padding-top: 100px; +} + +@media screen and (max-width: 1680px) { + .row { display: flex; flex-wrap: wrap; @@ -259,1722 +502,2465 @@ input, select, textarea { align-items: stretch; } - .row > * { - box-sizing: border-box; - } + .row > * { + box-sizing: border-box; + } - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } - .row.aln-left { - justify-content: flex-start; - } + .row.aln-left { + justify-content: flex-start; + } - .row.aln-center { - justify-content: center; - } + .row.aln-center { + justify-content: center; + } - .row.aln-right { - justify-content: flex-end; - } + .row.aln-right { + justify-content: flex-end; + } - .row.aln-top { - align-items: flex-start; - } + .row.aln-top { + align-items: flex-start; + } - .row.aln-middle { - align-items: center; - } + .row.aln-middle { + align-items: center; + } - .row.aln-bottom { - align-items: flex-end; - } + .row.aln-bottom { + align-items: flex-end; + } - .row > .imp { - order: -1; - } - - .row > .col-1 { - width: 8.33333%; - } - - .row > .off-1 { - margin-left: 8.33333%; - } - - .row > .col-2 { - width: 16.66667%; - } - - .row > .off-2 { - margin-left: 16.66667%; - } - - .row > .col-3 { - width: 25%; - } - - .row > .off-3 { - margin-left: 25%; - } - - .row > .col-4 { - width: 33.33333%; - } - - .row > .off-4 { - margin-left: 33.33333%; - } - - .row > .col-5 { - width: 41.66667%; - } - - .row > .off-5 { - margin-left: 41.66667%; - } - - .row > .col-6 { - width: 50%; - } - - .row > .off-6 { - margin-left: 50%; - } - - .row > .col-7 { - width: 58.33333%; - } - - .row > .off-7 { - margin-left: 58.33333%; - } - - .row > .col-8 { - width: 66.66667%; - } - - .row > .off-8 { - margin-left: 66.66667%; - } - - .row > .col-9 { - width: 75%; - } - - .row > .off-9 { - margin-left: 75%; - } - - .row > .col-10 { - width: 83.33333%; - } - - .row > .off-10 { - margin-left: 83.33333%; - } - - .row > .col-11 { - width: 91.66667%; - } - - .row > .off-11 { - margin-left: 91.66667%; - } - - .row > .col-12 { - width: 100%; - } - - .row > .off-12 { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -12.5px; - margin-left: -12.5px; - } - - .row.gtr-25 > * { - padding: 12.5px 0 0 12.5px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -12.5px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 12.5px; - } - - .row.gtr-50 { - margin-top: -25px; - margin-left: -25px; - } - - .row.gtr-50 > * { - padding: 25px 0 0 25px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -25px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 25px; - } - - .row { - margin-top: -50px; - margin-left: -50px; - } - - .row > * { - padding: 50px 0 0 50px; - } - - .row.gtr-uniform { - margin-top: -50px; - } - - .row.gtr-uniform > * { - padding-top: 50px; - } - - .row.gtr-150 { - margin-top: -75px; - margin-left: -75px; - } - - .row.gtr-150 > * { - padding: 75px 0 0 75px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -75px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 75px; - } - - .row.gtr-200 { - margin-top: -100px; - margin-left: -100px; - } - - .row.gtr-200 > * { - padding: 100px 0 0 100px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -100px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 100px; - } - - @media screen and (max-width: 1680px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } - - .row > * { - box-sizing: border-box; - } - - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } - - .row.aln-left { - justify-content: flex-start; - } - - .row.aln-center { - justify-content: center; - } - - .row.aln-right { - justify-content: flex-end; - } - - .row.aln-top { - align-items: flex-start; - } - - .row.aln-middle { - align-items: center; - } + .row > .imp-wide { + order: -1; + } + + .row > .col-1-wide { + width: 8.33333%; + } + + .row > .off-1-wide { + margin-left: 8.33333%; + } + + .row > .col-2-wide { + width: 16.66667%; + } + + .row > .off-2-wide { + margin-left: 16.66667%; + } + + .row > .col-3-wide { + width: 25%; + } + + .row > .off-3-wide { + margin-left: 25%; + } + + .row > .col-4-wide { + width: 33.33333%; + } + + .row > .off-4-wide { + margin-left: 33.33333%; + } + + .row > .col-5-wide { + width: 41.66667%; + } + + .row > .off-5-wide { + margin-left: 41.66667%; + } + + .row > .col-6-wide { + width: 50%; + } + + .row > .off-6-wide { + margin-left: 50%; + } + + .row > .col-7-wide { + width: 58.33333%; + } + + .row > .off-7-wide { + margin-left: 58.33333%; + } + + .row > .col-8-wide { + width: 66.66667%; + } + + .row > .off-8-wide { + margin-left: 66.66667%; + } + + .row > .col-9-wide { + width: 75%; + } + + .row > .off-9-wide { + margin-left: 75%; + } + + .row > .col-10-wide { + width: 83.33333%; + } + + .row > .off-10-wide { + margin-left: 83.33333%; + } + + .row > .col-11-wide { + width: 91.66667%; + } + + .row > .off-11-wide { + margin-left: 91.66667%; + } + + .row > .col-12-wide { + width: 100%; + } + + .row > .off-12-wide { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-25 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 10px; + } + + .row.gtr-50 { + margin-top: -20px; + margin-left: -20px; + } + + .row.gtr-50 > * { + padding: 20px 0 0 20px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 20px; + } + + .row { + margin-top: -40px; + margin-left: -40px; + } + + .row > * { + padding: 40px 0 0 40px; + } + + .row.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-uniform > * { + padding-top: 40px; + } + + .row.gtr-150 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-150 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 60px; + } + + .row.gtr-200 { + margin-top: -80px; + margin-left: -80px; + } + + .row.gtr-200 > * { + padding: 80px 0 0 80px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -80px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 80px; + } + +} + +@media screen and (max-width: 1280px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } - .row.aln-bottom { - align-items: flex-end; - } + .row > * { + box-sizing: border-box; + } - .row > .imp-wide { - order: -1; - } - - .row > .col-1-wide { - width: 8.33333%; - } - - .row > .off-1-wide { - margin-left: 8.33333%; - } - - .row > .col-2-wide { - width: 16.66667%; - } - - .row > .off-2-wide { - margin-left: 16.66667%; - } - - .row > .col-3-wide { - width: 25%; - } - - .row > .off-3-wide { - margin-left: 25%; - } - - .row > .col-4-wide { - width: 33.33333%; - } - - .row > .off-4-wide { - margin-left: 33.33333%; - } - - .row > .col-5-wide { - width: 41.66667%; - } - - .row > .off-5-wide { - margin-left: 41.66667%; - } - - .row > .col-6-wide { - width: 50%; - } - - .row > .off-6-wide { - margin-left: 50%; - } - - .row > .col-7-wide { - width: 58.33333%; - } - - .row > .off-7-wide { - margin-left: 58.33333%; - } - - .row > .col-8-wide { - width: 66.66667%; - } - - .row > .off-8-wide { - margin-left: 66.66667%; - } + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } - .row > .col-9-wide { - width: 75%; - } - - .row > .off-9-wide { - margin-left: 75%; - } - - .row > .col-10-wide { - width: 83.33333%; - } - - .row > .off-10-wide { - margin-left: 83.33333%; - } - - .row > .col-11-wide { - width: 91.66667%; - } - - .row > .off-11-wide { - margin-left: 91.66667%; - } - - .row > .col-12-wide { - width: 100%; - } - - .row > .off-12-wide { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -10px; - margin-left: -10px; - } - - .row.gtr-25 > * { - padding: 10px 0 0 10px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -10px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 10px; - } - - .row.gtr-50 { - margin-top: -20px; - margin-left: -20px; - } - - .row.gtr-50 > * { - padding: 20px 0 0 20px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -20px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 20px; - } - - .row { - margin-top: -40px; - margin-left: -40px; - } - - .row > * { - padding: 40px 0 0 40px; - } - - .row.gtr-uniform { - margin-top: -40px; - } - - .row.gtr-uniform > * { - padding-top: 40px; - } - - .row.gtr-150 { - margin-top: -60px; - margin-left: -60px; - } - - .row.gtr-150 > * { - padding: 60px 0 0 60px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -60px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 60px; - } - - .row.gtr-200 { - margin-top: -80px; - margin-left: -80px; - } - - .row.gtr-200 > * { - padding: 80px 0 0 80px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -80px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 80px; - } - - } - - @media screen and (max-width: 1280px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } + .row.aln-left { + justify-content: flex-start; + } - .row > * { - box-sizing: border-box; - } + .row.aln-center { + justify-content: center; + } - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } + .row.aln-right { + justify-content: flex-end; + } - .row.aln-left { - justify-content: flex-start; - } + .row.aln-top { + align-items: flex-start; + } - .row.aln-center { - justify-content: center; - } + .row.aln-middle { + align-items: center; + } - .row.aln-right { - justify-content: flex-end; - } + .row.aln-bottom { + align-items: flex-end; + } - .row.aln-top { - align-items: flex-start; - } + .row > .imp-normal { + order: -1; + } + + .row > .col-1-normal { + width: 8.33333%; + } + + .row > .off-1-normal { + margin-left: 8.33333%; + } + + .row > .col-2-normal { + width: 16.66667%; + } + + .row > .off-2-normal { + margin-left: 16.66667%; + } + + .row > .col-3-normal { + width: 25%; + } + + .row > .off-3-normal { + margin-left: 25%; + } - .row.aln-middle { - align-items: center; - } + .row > .col-4-normal { + width: 33.33333%; + } - .row.aln-bottom { - align-items: flex-end; - } + .row > .off-4-normal { + margin-left: 33.33333%; + } - .row > .imp-normal { - order: -1; - } - - .row > .col-1-normal { - width: 8.33333%; - } - - .row > .off-1-normal { - margin-left: 8.33333%; - } - - .row > .col-2-normal { - width: 16.66667%; - } - - .row > .off-2-normal { - margin-left: 16.66667%; - } - - .row > .col-3-normal { - width: 25%; - } - - .row > .off-3-normal { - margin-left: 25%; - } + .row > .col-5-normal { + width: 41.66667%; + } - .row > .col-4-normal { - width: 33.33333%; - } + .row > .off-5-normal { + margin-left: 41.66667%; + } - .row > .off-4-normal { - margin-left: 33.33333%; - } + .row > .col-6-normal { + width: 50%; + } - .row > .col-5-normal { - width: 41.66667%; - } + .row > .off-6-normal { + margin-left: 50%; + } - .row > .off-5-normal { - margin-left: 41.66667%; - } + .row > .col-7-normal { + width: 58.33333%; + } - .row > .col-6-normal { - width: 50%; - } + .row > .off-7-normal { + margin-left: 58.33333%; + } + + .row > .col-8-normal { + width: 66.66667%; + } + + .row > .off-8-normal { + margin-left: 66.66667%; + } - .row > .off-6-normal { - margin-left: 50%; - } + .row > .col-9-normal { + width: 75%; + } + + .row > .off-9-normal { + margin-left: 75%; + } + + .row > .col-10-normal { + width: 83.33333%; + } + + .row > .off-10-normal { + margin-left: 83.33333%; + } + + .row > .col-11-normal { + width: 91.66667%; + } + + .row > .off-11-normal { + margin-left: 91.66667%; + } + + .row > .col-12-normal { + width: 100%; + } + + .row > .off-12-normal { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -7.5px; + margin-left: -7.5px; + } + + .row.gtr-25 > * { + padding: 7.5px 0 0 7.5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -7.5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 7.5px; + } + + .row.gtr-50 { + margin-top: -15px; + margin-left: -15px; + } + + .row.gtr-50 > * { + padding: 15px 0 0 15px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -15px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 15px; + } + + .row { + margin-top: -30px; + margin-left: -30px; + } + + .row > * { + padding: 30px 0 0 30px; + } + + .row.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-150 { + margin-top: -45px; + margin-left: -45px; + } + + .row.gtr-150 > * { + padding: 45px 0 0 45px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -45px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 45px; + } + + .row.gtr-200 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-200 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 60px; + } + +} + +@media screen and (max-width: 980px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } - .row > .col-7-normal { - width: 58.33333%; - } + .row > * { + box-sizing: border-box; + } - .row > .off-7-normal { - margin-left: 58.33333%; - } - - .row > .col-8-normal { - width: 66.66667%; - } - - .row > .off-8-normal { - margin-left: 66.66667%; - } + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } - .row > .col-9-normal { - width: 75%; - } - - .row > .off-9-normal { - margin-left: 75%; - } - - .row > .col-10-normal { - width: 83.33333%; - } - - .row > .off-10-normal { - margin-left: 83.33333%; - } - - .row > .col-11-normal { - width: 91.66667%; - } - - .row > .off-11-normal { - margin-left: 91.66667%; - } - - .row > .col-12-normal { - width: 100%; - } - - .row > .off-12-normal { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -7.5px; - margin-left: -7.5px; - } - - .row.gtr-25 > * { - padding: 7.5px 0 0 7.5px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -7.5px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 7.5px; - } - - .row.gtr-50 { - margin-top: -15px; - margin-left: -15px; - } - - .row.gtr-50 > * { - padding: 15px 0 0 15px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -15px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 15px; - } - - .row { - margin-top: -30px; - margin-left: -30px; - } - - .row > * { - padding: 30px 0 0 30px; - } - - .row.gtr-uniform { - margin-top: -30px; - } - - .row.gtr-uniform > * { - padding-top: 30px; - } - - .row.gtr-150 { - margin-top: -45px; - margin-left: -45px; - } - - .row.gtr-150 > * { - padding: 45px 0 0 45px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -45px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 45px; - } - - .row.gtr-200 { - margin-top: -60px; - margin-left: -60px; - } - - .row.gtr-200 > * { - padding: 60px 0 0 60px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -60px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 60px; - } - - } - - @media screen and (max-width: 980px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } + .row.aln-left { + justify-content: flex-start; + } - .row > * { - box-sizing: border-box; - } + .row.aln-center { + justify-content: center; + } - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } + .row.aln-right { + justify-content: flex-end; + } - .row.aln-left { - justify-content: flex-start; - } + .row.aln-top { + align-items: flex-start; + } - .row.aln-center { - justify-content: center; - } + .row.aln-middle { + align-items: center; + } - .row.aln-right { - justify-content: flex-end; - } + .row.aln-bottom { + align-items: flex-end; + } - .row.aln-top { - align-items: flex-start; - } + .row > .imp-narrow { + order: -1; + } + + .row > .col-1-narrow { + width: 8.33333%; + } + + .row > .off-1-narrow { + margin-left: 8.33333%; + } + + .row > .col-2-narrow { + width: 16.66667%; + } + + .row > .off-2-narrow { + margin-left: 16.66667%; + } + + .row > .col-3-narrow { + width: 25%; + } + + .row > .off-3-narrow { + margin-left: 25%; + } - .row.aln-middle { - align-items: center; - } + .row > .col-4-narrow { + width: 33.33333%; + } - .row.aln-bottom { - align-items: flex-end; - } + .row > .off-4-narrow { + margin-left: 33.33333%; + } - .row > .imp-narrow { - order: -1; - } - - .row > .col-1-narrow { - width: 8.33333%; - } - - .row > .off-1-narrow { - margin-left: 8.33333%; - } - - .row > .col-2-narrow { - width: 16.66667%; - } - - .row > .off-2-narrow { - margin-left: 16.66667%; - } - - .row > .col-3-narrow { - width: 25%; - } - - .row > .off-3-narrow { - margin-left: 25%; - } + .row > .col-5-narrow { + width: 41.66667%; + } - .row > .col-4-narrow { - width: 33.33333%; - } + .row > .off-5-narrow { + margin-left: 41.66667%; + } - .row > .off-4-narrow { - margin-left: 33.33333%; - } + .row > .col-6-narrow { + width: 50%; + } - .row > .col-5-narrow { - width: 41.66667%; - } + .row > .off-6-narrow { + margin-left: 50%; + } - .row > .off-5-narrow { - margin-left: 41.66667%; - } + .row > .col-7-narrow { + width: 58.33333%; + } - .row > .col-6-narrow { - width: 50%; - } + .row > .off-7-narrow { + margin-left: 58.33333%; + } + + .row > .col-8-narrow { + width: 66.66667%; + } + + .row > .off-8-narrow { + margin-left: 66.66667%; + } - .row > .off-6-narrow { - margin-left: 50%; - } + .row > .col-9-narrow { + width: 75%; + } + + .row > .off-9-narrow { + margin-left: 75%; + } + + .row > .col-10-narrow { + width: 83.33333%; + } + + .row > .off-10-narrow { + margin-left: 83.33333%; + } + + .row > .col-11-narrow { + width: 91.66667%; + } + + .row > .off-11-narrow { + margin-left: 91.66667%; + } + + .row > .col-12-narrow { + width: 100%; + } + + .row > .off-12-narrow { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -7.5px; + margin-left: -7.5px; + } + + .row.gtr-25 > * { + padding: 7.5px 0 0 7.5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -7.5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 7.5px; + } + + .row.gtr-50 { + margin-top: -15px; + margin-left: -15px; + } + + .row.gtr-50 > * { + padding: 15px 0 0 15px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -15px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 15px; + } + + .row { + margin-top: -30px; + margin-left: -30px; + } + + .row > * { + padding: 30px 0 0 30px; + } + + .row.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-150 { + margin-top: -45px; + margin-left: -45px; + } + + .row.gtr-150 > * { + padding: 45px 0 0 45px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -45px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 45px; + } + + .row.gtr-200 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-200 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 60px; + } + +} + +@media screen and (max-width: 840px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } - .row > .col-7-narrow { - width: 58.33333%; - } + .row > * { + box-sizing: border-box; + } - .row > .off-7-narrow { - margin-left: 58.33333%; - } - - .row > .col-8-narrow { - width: 66.66667%; - } - - .row > .off-8-narrow { - margin-left: 66.66667%; - } + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } - .row > .col-9-narrow { - width: 75%; - } - - .row > .off-9-narrow { - margin-left: 75%; - } - - .row > .col-10-narrow { - width: 83.33333%; - } - - .row > .off-10-narrow { - margin-left: 83.33333%; - } - - .row > .col-11-narrow { - width: 91.66667%; - } - - .row > .off-11-narrow { - margin-left: 91.66667%; - } - - .row > .col-12-narrow { - width: 100%; - } - - .row > .off-12-narrow { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -7.5px; - margin-left: -7.5px; - } - - .row.gtr-25 > * { - padding: 7.5px 0 0 7.5px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -7.5px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 7.5px; - } - - .row.gtr-50 { - margin-top: -15px; - margin-left: -15px; - } - - .row.gtr-50 > * { - padding: 15px 0 0 15px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -15px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 15px; - } - - .row { - margin-top: -30px; - margin-left: -30px; - } - - .row > * { - padding: 30px 0 0 30px; - } - - .row.gtr-uniform { - margin-top: -30px; - } - - .row.gtr-uniform > * { - padding-top: 30px; - } - - .row.gtr-150 { - margin-top: -45px; - margin-left: -45px; - } - - .row.gtr-150 > * { - padding: 45px 0 0 45px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -45px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 45px; - } - - .row.gtr-200 { - margin-top: -60px; - margin-left: -60px; - } - - .row.gtr-200 > * { - padding: 60px 0 0 60px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -60px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 60px; - } - - } - - @media screen and (max-width: 840px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } + .row.aln-left { + justify-content: flex-start; + } - .row > * { - box-sizing: border-box; - } + .row.aln-center { + justify-content: center; + } - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } + .row.aln-right { + justify-content: flex-end; + } - .row.aln-left { - justify-content: flex-start; - } + .row.aln-top { + align-items: flex-start; + } - .row.aln-center { - justify-content: center; - } + .row.aln-middle { + align-items: center; + } - .row.aln-right { - justify-content: flex-end; - } + .row.aln-bottom { + align-items: flex-end; + } - .row.aln-top { - align-items: flex-start; - } + .row > .imp-narrower { + order: -1; + } + + .row > .col-1-narrower { + width: 8.33333%; + } + + .row > .off-1-narrower { + margin-left: 8.33333%; + } + + .row > .col-2-narrower { + width: 16.66667%; + } + + .row > .off-2-narrower { + margin-left: 16.66667%; + } + + .row > .col-3-narrower { + width: 25%; + } + + .row > .off-3-narrower { + margin-left: 25%; + } - .row.aln-middle { - align-items: center; - } + .row > .col-4-narrower { + width: 33.33333%; + } - .row.aln-bottom { - align-items: flex-end; - } + .row > .off-4-narrower { + margin-left: 33.33333%; + } - .row > .imp-narrower { - order: -1; - } - - .row > .col-1-narrower { - width: 8.33333%; - } - - .row > .off-1-narrower { - margin-left: 8.33333%; - } - - .row > .col-2-narrower { - width: 16.66667%; - } - - .row > .off-2-narrower { - margin-left: 16.66667%; - } - - .row > .col-3-narrower { - width: 25%; - } - - .row > .off-3-narrower { - margin-left: 25%; - } + .row > .col-5-narrower { + width: 41.66667%; + } - .row > .col-4-narrower { - width: 33.33333%; - } + .row > .off-5-narrower { + margin-left: 41.66667%; + } - .row > .off-4-narrower { - margin-left: 33.33333%; - } + .row > .col-6-narrower { + width: 50%; + } - .row > .col-5-narrower { - width: 41.66667%; - } + .row > .off-6-narrower { + margin-left: 50%; + } - .row > .off-5-narrower { - margin-left: 41.66667%; - } + .row > .col-7-narrower { + width: 58.33333%; + } - .row > .col-6-narrower { - width: 50%; - } + .row > .off-7-narrower { + margin-left: 58.33333%; + } + + .row > .col-8-narrower { + width: 66.66667%; + } + + .row > .off-8-narrower { + margin-left: 66.66667%; + } - .row > .off-6-narrower { - margin-left: 50%; - } + .row > .col-9-narrower { + width: 75%; + } + + .row > .off-9-narrower { + margin-left: 75%; + } + + .row > .col-10-narrower { + width: 83.33333%; + } + + .row > .off-10-narrower { + margin-left: 83.33333%; + } + + .row > .col-11-narrower { + width: 91.66667%; + } + + .row > .off-11-narrower { + margin-left: 91.66667%; + } + + .row > .col-12-narrower { + width: 100%; + } + + .row > .off-12-narrower { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -7.5px; + margin-left: -7.5px; + } + + .row.gtr-25 > * { + padding: 7.5px 0 0 7.5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -7.5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 7.5px; + } + + .row.gtr-50 { + margin-top: -15px; + margin-left: -15px; + } + + .row.gtr-50 > * { + padding: 15px 0 0 15px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -15px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 15px; + } + + .row { + margin-top: -30px; + margin-left: -30px; + } + + .row > * { + padding: 30px 0 0 30px; + } + + .row.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-150 { + margin-top: -45px; + margin-left: -45px; + } + + .row.gtr-150 > * { + padding: 45px 0 0 45px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -45px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 45px; + } + + .row.gtr-200 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-200 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 60px; + } + +} + +@media screen and (max-width: 736px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } - .row > .col-7-narrower { - width: 58.33333%; - } + .row > * { + box-sizing: border-box; + } - .row > .off-7-narrower { - margin-left: 58.33333%; - } - - .row > .col-8-narrower { - width: 66.66667%; - } - - .row > .off-8-narrower { - margin-left: 66.66667%; - } + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } - .row > .col-9-narrower { - width: 75%; - } - - .row > .off-9-narrower { - margin-left: 75%; - } - - .row > .col-10-narrower { - width: 83.33333%; - } - - .row > .off-10-narrower { - margin-left: 83.33333%; - } - - .row > .col-11-narrower { - width: 91.66667%; - } - - .row > .off-11-narrower { - margin-left: 91.66667%; - } - - .row > .col-12-narrower { - width: 100%; - } - - .row > .off-12-narrower { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -7.5px; - margin-left: -7.5px; - } - - .row.gtr-25 > * { - padding: 7.5px 0 0 7.5px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -7.5px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 7.5px; - } - - .row.gtr-50 { - margin-top: -15px; - margin-left: -15px; - } - - .row.gtr-50 > * { - padding: 15px 0 0 15px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -15px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 15px; - } - - .row { - margin-top: -30px; - margin-left: -30px; - } - - .row > * { - padding: 30px 0 0 30px; - } - - .row.gtr-uniform { - margin-top: -30px; - } - - .row.gtr-uniform > * { - padding-top: 30px; - } - - .row.gtr-150 { - margin-top: -45px; - margin-left: -45px; - } - - .row.gtr-150 > * { - padding: 45px 0 0 45px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -45px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 45px; - } - - .row.gtr-200 { - margin-top: -60px; - margin-left: -60px; - } - - .row.gtr-200 > * { - padding: 60px 0 0 60px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -60px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 60px; - } - - } - - @media screen and (max-width: 736px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } + .row.aln-left { + justify-content: flex-start; + } - .row > * { - box-sizing: border-box; - } + .row.aln-center { + justify-content: center; + } - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } + .row.aln-right { + justify-content: flex-end; + } - .row.aln-left { - justify-content: flex-start; - } + .row.aln-top { + align-items: flex-start; + } - .row.aln-center { - justify-content: center; - } + .row.aln-middle { + align-items: center; + } - .row.aln-right { - justify-content: flex-end; - } + .row.aln-bottom { + align-items: flex-end; + } - .row.aln-top { - align-items: flex-start; - } + .row > .imp-mobile { + order: -1; + } + + .row > .col-1-mobile { + width: 8.33333%; + } + + .row > .off-1-mobile { + margin-left: 8.33333%; + } + + .row > .col-2-mobile { + width: 16.66667%; + } + + .row > .off-2-mobile { + margin-left: 16.66667%; + } + + .row > .col-3-mobile { + width: 25%; + } + + .row > .off-3-mobile { + margin-left: 25%; + } - .row.aln-middle { - align-items: center; - } + .row > .col-4-mobile { + width: 33.33333%; + } - .row.aln-bottom { - align-items: flex-end; - } + .row > .off-4-mobile { + margin-left: 33.33333%; + } - .row > .imp-mobile { - order: -1; - } - - .row > .col-1-mobile { - width: 8.33333%; - } - - .row > .off-1-mobile { - margin-left: 8.33333%; - } - - .row > .col-2-mobile { - width: 16.66667%; - } - - .row > .off-2-mobile { - margin-left: 16.66667%; - } - - .row > .col-3-mobile { - width: 25%; - } - - .row > .off-3-mobile { - margin-left: 25%; - } + .row > .col-5-mobile { + width: 41.66667%; + } - .row > .col-4-mobile { - width: 33.33333%; - } + .row > .off-5-mobile { + margin-left: 41.66667%; + } - .row > .off-4-mobile { - margin-left: 33.33333%; - } + .row > .col-6-mobile { + width: 50%; + } - .row > .col-5-mobile { - width: 41.66667%; - } + .row > .off-6-mobile { + margin-left: 50%; + } - .row > .off-5-mobile { - margin-left: 41.66667%; - } + .row > .col-7-mobile { + width: 58.33333%; + } - .row > .col-6-mobile { - width: 50%; - } + .row > .off-7-mobile { + margin-left: 58.33333%; + } + + .row > .col-8-mobile { + width: 66.66667%; + } + + .row > .off-8-mobile { + margin-left: 66.66667%; + } - .row > .off-6-mobile { - margin-left: 50%; - } + .row > .col-9-mobile { + width: 75%; + } + + .row > .off-9-mobile { + margin-left: 75%; + } + + .row > .col-10-mobile { + width: 83.33333%; + } + + .row > .off-10-mobile { + margin-left: 83.33333%; + } + + .row > .col-11-mobile { + width: 91.66667%; + } + + .row > .off-11-mobile { + margin-left: 91.66667%; + } + + .row > .col-12-mobile { + width: 100%; + } + + .row > .off-12-mobile { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -5px; + margin-left: -5px; + } + + .row.gtr-25 > * { + padding: 5px 0 0 5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 5px; + } + + .row.gtr-50 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-50 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 10px; + } + + .row { + margin-top: -20px; + margin-left: -20px; + } + + .row > * { + padding: 20px 0 0 20px; + } + + .row.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-uniform > * { + padding-top: 20px; + } + + .row.gtr-150 { + margin-top: -30px; + margin-left: -30px; + } + + .row.gtr-150 > * { + padding: 30px 0 0 30px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-200 { + margin-top: -40px; + margin-left: -40px; + } + + .row.gtr-200 > * { + padding: 40px 0 0 40px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 40px; + } + +} + +@media screen and (max-width: 480px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } - .row > .col-7-mobile { - width: 58.33333%; - } + .row > * { + box-sizing: border-box; + } - .row > .off-7-mobile { - margin-left: 58.33333%; - } - - .row > .col-8-mobile { - width: 66.66667%; - } - - .row > .off-8-mobile { - margin-left: 66.66667%; - } + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } - .row > .col-9-mobile { - width: 75%; - } - - .row > .off-9-mobile { - margin-left: 75%; - } - - .row > .col-10-mobile { - width: 83.33333%; - } - - .row > .off-10-mobile { - margin-left: 83.33333%; - } - - .row > .col-11-mobile { - width: 91.66667%; - } - - .row > .off-11-mobile { - margin-left: 91.66667%; - } - - .row > .col-12-mobile { - width: 100%; - } - - .row > .off-12-mobile { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -5px; - margin-left: -5px; - } - - .row.gtr-25 > * { - padding: 5px 0 0 5px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -5px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 5px; - } - - .row.gtr-50 { - margin-top: -10px; - margin-left: -10px; - } - - .row.gtr-50 > * { - padding: 10px 0 0 10px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -10px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 10px; - } - - .row { - margin-top: -20px; - margin-left: -20px; - } - - .row > * { - padding: 20px 0 0 20px; - } - - .row.gtr-uniform { - margin-top: -20px; - } - - .row.gtr-uniform > * { - padding-top: 20px; - } - - .row.gtr-150 { - margin-top: -30px; - margin-left: -30px; - } - - .row.gtr-150 > * { - padding: 30px 0 0 30px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -30px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 30px; - } - - .row.gtr-200 { - margin-top: -40px; - margin-left: -40px; - } - - .row.gtr-200 > * { - padding: 40px 0 0 40px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -40px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 40px; - } - - } - - @media screen and (max-width: 480px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } + .row.aln-left { + justify-content: flex-start; + } - .row > * { - box-sizing: border-box; - } + .row.aln-center { + justify-content: center; + } - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } + .row.aln-right { + justify-content: flex-end; + } - .row.aln-left { - justify-content: flex-start; - } + .row.aln-top { + align-items: flex-start; + } - .row.aln-center { - justify-content: center; - } + .row.aln-middle { + align-items: center; + } - .row.aln-right { - justify-content: flex-end; - } + .row.aln-bottom { + align-items: flex-end; + } - .row.aln-top { - align-items: flex-start; - } + .row > .imp-mobilep { + order: -1; + } + + .row > .col-1-mobilep { + width: 8.33333%; + } + + .row > .off-1-mobilep { + margin-left: 8.33333%; + } + + .row > .col-2-mobilep { + width: 16.66667%; + } + + .row > .off-2-mobilep { + margin-left: 16.66667%; + } + + .row > .col-3-mobilep { + width: 25%; + } + + .row > .off-3-mobilep { + margin-left: 25%; + } - .row.aln-middle { - align-items: center; - } + .row > .col-4-mobilep { + width: 33.33333%; + } - .row.aln-bottom { - align-items: flex-end; - } + .row > .off-4-mobilep { + margin-left: 33.33333%; + } - .row > .imp-mobilep { - order: -1; - } - - .row > .col-1-mobilep { - width: 8.33333%; - } - - .row > .off-1-mobilep { - margin-left: 8.33333%; - } - - .row > .col-2-mobilep { - width: 16.66667%; - } - - .row > .off-2-mobilep { - margin-left: 16.66667%; - } - - .row > .col-3-mobilep { - width: 25%; - } - - .row > .off-3-mobilep { - margin-left: 25%; - } + .row > .col-5-mobilep { + width: 41.66667%; + } - .row > .col-4-mobilep { - width: 33.33333%; - } + .row > .off-5-mobilep { + margin-left: 41.66667%; + } - .row > .off-4-mobilep { - margin-left: 33.33333%; - } + .row > .col-6-mobilep { + width: 50%; + } - .row > .col-5-mobilep { - width: 41.66667%; - } + .row > .off-6-mobilep { + margin-left: 50%; + } - .row > .off-5-mobilep { - margin-left: 41.66667%; - } + .row > .col-7-mobilep { + width: 58.33333%; + } - .row > .col-6-mobilep { - width: 50%; - } + .row > .off-7-mobilep { + margin-left: 58.33333%; + } + + .row > .col-8-mobilep { + width: 66.66667%; + } + + .row > .off-8-mobilep { + margin-left: 66.66667%; + } - .row > .off-6-mobilep { - margin-left: 50%; - } - - .row > .col-7-mobilep { - width: 58.33333%; - } - - .row > .off-7-mobilep { - margin-left: 58.33333%; - } - - .row > .col-8-mobilep { - width: 66.66667%; - } - - .row > .off-8-mobilep { - margin-left: 66.66667%; - } - - .row > .col-9-mobilep { - width: 75%; - } - - .row > .off-9-mobilep { - margin-left: 75%; - } - - .row > .col-10-mobilep { - width: 83.33333%; - } - - .row > .off-10-mobilep { - margin-left: 83.33333%; - } - - .row > .col-11-mobilep { - width: 91.66667%; - } - - .row > .off-11-mobilep { - margin-left: 91.66667%; - } - - .row > .col-12-mobilep { - width: 100%; - } - - .row > .off-12-mobilep { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -5px; - margin-left: -5px; - } - - .row.gtr-25 > * { - padding: 5px 0 0 5px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -5px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 5px; - } - - .row.gtr-50 { - margin-top: -10px; - margin-left: -10px; - } - - .row.gtr-50 > * { - padding: 10px 0 0 10px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -10px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 10px; - } - - .row { - margin-top: -20px; - margin-left: -20px; - } - - .row > * { - padding: 20px 0 0 20px; - } - - .row.gtr-uniform { - margin-top: -20px; - } - - .row.gtr-uniform > * { - padding-top: 20px; - } - - .row.gtr-150 { - margin-top: -30px; - margin-left: -30px; - } - - .row.gtr-150 > * { - padding: 30px 0 0 30px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -30px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 30px; - } - - .row.gtr-200 { - margin-top: -40px; - margin-left: -40px; - } - - .row.gtr-200 > * { - padding: 40px 0 0 40px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -40px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 40px; - } - - } + .row > .col-9-mobilep { + width: 75%; + } + + .row > .off-9-mobilep { + margin-left: 75%; + } + + .row > .col-10-mobilep { + width: 83.33333%; + } + + .row > .off-10-mobilep { + margin-left: 83.33333%; + } + + .row > .col-11-mobilep { + width: 91.66667%; + } + + .row > .off-11-mobilep { + margin-left: 91.66667%; + } + + .row > .col-12-mobilep { + width: 100%; + } + + .row > .off-12-mobilep { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -5px; + margin-left: -5px; + } + + .row.gtr-25 > * { + padding: 5px 0 0 5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 5px; + } + + .row.gtr-50 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-50 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 10px; + } + + .row { + margin-top: -20px; + margin-left: -20px; + } + + .row > * { + padding: 20px 0 0 20px; + } + + .row.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-uniform > * { + padding-top: 20px; + } + + .row.gtr-150 { + margin-top: -30px; + margin-left: -30px; + } + + .row.gtr-150 > * { + padding: 30px 0 0 30px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-200 { + margin-top: -40px; + margin-left: -40px; + } + + .row.gtr-200 > * { + padding: 40px 0 0 40px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 40px; + } + +} /* Section/Article */ - section.special, article.special { +section.special, article.special { + text-align: center; +} + +header p { + color: #999; + font-size: 1.25em; + position: relative; + margin-top: -1.25em; + margin-bottom: 2.25em; +} + +header.major { + text-align: center; + margin: 0 0 2em 0; +} + +header.major h2 { + font-size: 2.25em; +} + +header.major p { + position: relative; + border-top: solid 1px #e0e0e0; + padding: 1em 0 0 0; + margin: 0; + top: -1em; + font-size: 1.5em; + letter-spacing: -0.025em; +} + +footer { + margin: 0 0 3em 0; +} + +footer > :last-child { + margin-bottom: 0; +} + +footer.major { + padding-top: 3em; +} + +/* Form */ + +input[type="text"], +input[type="password"], +input[type="email"], +textarea { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + -moz-transition: border-color 0.2s ease-in-out; + -webkit-transition: border-color 0.2s ease-in-out; + -ms-transition: border-color 0.2s ease-in-out; + transition: border-color 0.2s ease-in-out; + background: var(--pure-white); + border: solid 1px #e0e0e0; + border-radius: 5px; + color: inherit; + display: block; + outline: 0; + padding: 0.75em; + text-decoration: none; + width: 100%; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="email"]:focus, +textarea:focus { + border-color: var(--point-color); +} + +input[type="text"], +input[type="password"], +input[type="email"] { + line-height: 1em; +} + +label { + display: block; + color: inherit; + font-weight: 600; + line-height: 1.75em; + margin-bottom: 0.5em; +} + +::-webkit-input-placeholder { + color: #999; + position: relative; + top: 3px; +} + +:-moz-placeholder { + color: #999; +} + +::-moz-placeholder { + color: #999; +} + +:-ms-input-placeholder { + color: #999; +} + +/* Image */ + +.image { + border: 0; + display: inline-block; + position: relative; + border-radius: 5px; +} + +.image img { + display: block; + border-radius: 5px; +} + +.image.left { + display: block; + float: left; + margin: 0 2em 2em 0; + position: relative; + top: 0.25em; +} + +.image.left img { + display: block; + width: 100%; +} + +.image.fit { + display: block; +} + +.image.fit img { + display: block; + width: 100%; +} + +.image.featured { + display: block; + margin: 0 0 2em 0; +} + +.image.featured img { + display: block; + width: 100%; +} + +/* Icon */ + +.icon { + text-decoration: none; + position: relative; + text-decoration: none; +} + +.icon:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + text-transform: none !important; + font-family: 'Font Awesome 5 Free'; + font-weight: 400; +} + +.icon > .label { + display: none; +} + +.icon:before { + line-height: inherit; +} + +.icon.solid:before { + font-weight: 900; +} + +.icon.brands:before { + font-family: 'Font Awesome 5 Brands'; +} + +.icon.major { + text-align: center; + cursor: default; + background-color: var(--point-color); + background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + color: var(--pure-white); + border-radius: 100%; + display: inline-block; + width: 5em; + height: 5em; + line-height: 5em; + box-shadow: 0 0 0 7px white, 0 0 0 8px #e0e0e0; + margin: 0 0 2em 0; +} + +.icon.major:before { + font-size: 36px; +} + +/* Lists */ + +ol { + list-style: decimal; + padding-left: 1.25em; +} + +ol li { + padding-left: 0.25em; +} + +ul { + list-style: disc; + padding-left: 1em; +} + +ul li { + padding-left: 0.5em; +} + +/* Links */ + +ul.links { + list-style: none; + padding-left: 0; +} + +ul.links li { + line-height: 2.5em; + padding-left: 0; +} + +/* Icons */ + +ul.icons { + cursor: default; + list-style: none; + padding-left: 0; +} + +ul.icons li { + display: inline-block; + line-height: 1em; + padding-left: 1.5em; +} + +ul.icons li:first-child { + padding-left: 0; +} + +ul.icons li a, ul.icons li span { + font-size: 2em; + border: 0; +} + +/* Menu */ + +ul.menu { + list-style: none; + padding-left: 0; +} + +ul.menu li { + border-left: solid 1px #e0e0e0; + display: inline-block; + padding: 0 0 0 1em; + margin: 0 0 0 1em; +} + +ul.menu li:first-child { + border-left: 0; + margin-left: 0; + padding-left: 0; +} + +/* Actions */ + +ul.actions { + display: -moz-flex; + display: -webkit-flex; + display: -ms-flex; + display: flex; + cursor: default; + list-style: none; + margin-left: -1em; + padding-left: 0; +} + +ul.actions li { + padding: 0 0 0 1em; + vertical-align: middle; +} + +ul.actions.special { + -moz-justify-content: center; + -webkit-justify-content: center; + -ms-justify-content: center; + justify-content: center; + width: 100%; + margin-left: 0; +} + +ul.actions.special li:first-child { + padding-left: 0; +} + +ul.actions.stacked { + -moz-flex-direction: column; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + margin-left: 0; +} + +ul.actions.stacked li { + padding: 1.25em 0 0 0; +} + +ul.actions.stacked li:first-child { + padding-top: 0; +} + +ul.actions.fit { + width: calc(100% + 1em); +} + +ul.actions.fit li { + -moz-flex-grow: 1; + -webkit-flex-grow: 1; + -ms-flex-grow: 1; + flex-grow: 1; + -moz-flex-shrink: 1; + -webkit-flex-shrink: 1; + -ms-flex-shrink: 1; + flex-shrink: 1; + width: 100%; +} + +ul.actions.fit li > * { + width: 100%; +} + +ul.actions.fit.stacked { + width: 100%; +} + +@media screen and (max-width: 736px) { + + ul.actions:not(.fixed) { + -moz-flex-direction: column; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + margin-left: 0; + width: 100% !important; + } + + ul.actions:not(.fixed) li { + -moz-flex-grow: 1; + -webkit-flex-grow: 1; + -ms-flex-grow: 1; + flex-grow: 1; + -moz-flex-shrink: 1; + -webkit-flex-shrink: 1; + -ms-flex-shrink: 1; + flex-shrink: 1; + padding: 1em 0 0 0; text-align: center; + width: 100%; + } + + ul.actions:not(.fixed) li > * { + width: 100%; + } + + ul.actions:not(.fixed) li:first-child { + padding-top: 0; + } + + ul.actions:not(.fixed) li input[type="submit"], + ul.actions:not(.fixed) li input[type="reset"], + ul.actions:not(.fixed) li input[type="button"], + ul.actions:not(.fixed) li button, + ul.actions:not(.fixed) li .button { + width: 100%; + } + + ul.actions:not(.fixed) li input[type="submit"].icon:before, + ul.actions:not(.fixed) li input[type="reset"].icon:before, + ul.actions:not(.fixed) li input[type="button"].icon:before, + ul.actions:not(.fixed) li button.icon:before, + ul.actions:not(.fixed) li .button.icon:before { + margin-left: -0.5em; + } + +} + +/* Tables */ + +table { + width: 100%; +} + +table.default { + width: 100%; +} + +table.default tbody tr { + border-bottom: solid 1px #e0e0e0; +} + +table.default td { + padding: 0.5em 1em 0.5em 1em; +} + +table.default th { + font-weight: 600; + padding: 0.5em 1em 0.5em 1em; + text-align: left; +} + +table.default thead { + background-color: var(--button-alt-default); + background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + color: var(--pure-white); +} + +/* Button */ + +input[type="submit"], +input[type="reset"], +input[type="button"], +button, +.button { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + -moz-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + -webkit-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + -ms-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-color: var(--point-color); + border-radius: 5px; + border: 0; + color: var(--pure-white); + cursor: pointer; + display: inline-block; + padding: 0 1.5em; + line-height: 2.75em; + min-width: 9em; + text-align: center; + text-decoration: none; + font-weight: 600; + letter-spacing: -0.025em; +} + +input[type="submit"]:hover, +input[type="reset"]:hover, +input[type="button"]:hover, +button:hover, +.button:hover { + background-color: var(--point-hover-color); + color: var(--pure-white) !important; +} + +input[type="submit"]:active, +input[type="reset"]:active, +input[type="button"]:active, +button:active, +.button:active { + background-color: var(--point-hover-color2); + color: var(--pure-white); +} + +input[type="submit"].alt, +input[type="reset"].alt, +input[type="button"].alt, +button.alt, +.button.alt { + background-color: var(--button-alt-default); + color: var(--pure-white); +} + +input[type="submit"].alt:hover, +input[type="reset"].alt:hover, +input[type="button"].alt:hover, +button.alt:hover, +.button.alt:hover { + background-color: #626262; +} + +input[type="submit"].alt:active, +input[type="reset"].alt:active, +input[type="button"].alt:active, +button.alt:active, +.button.alt:active { + background-color: #484848; +} + +input[type="submit"].icon:before, +input[type="reset"].icon:before, +input[type="button"].icon:before, +button.icon:before, +.button.icon:before { + margin-right: 0.5em; +} + +input[type="submit"].fit, +input[type="reset"].fit, +input[type="button"].fit, +button.fit, +.button.fit { + width: 100%; +} + +input[type="submit"].small, +input[type="reset"].small, +input[type="button"].small, +button.small, +.button.small { + font-size: 0.8em; +} + +/* Box */ + +.box.highlight { + text-align: center; +} + +.box.post { + position: relative; + margin: 0 0 2em 0; +} + +.box.post:after { + content: ''; + display: block; + clear: both; +} + +.box.post .inner { + margin-left: calc(30% + 2em); +} + +.box.post .inner > :last-child { + margin-bottom: 0; +} + +.box.post .image { + width: 30%; + margin: 0; +} + +.ellipsis { + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 0.2em 0.2em; +} + +/* Header */ + +#header { + text-align: center; + padding: 3em 0 0 0; + background-color: var(--pure-white); + background-image: url("images/bg02.png"), url("images/bg02.png"), url("images/bg01.png"); + background-position: top left, top left, top left; + background-size: 100% 6em, 100% 6em, auto; + background-repeat: no-repeat, no-repeat, repeat; +} + +#header h1 { + padding: 0 0 2.75em 0; + margin: 0; +} + +#header h1 a { + font-size: 1.5em; + letter-spacing: -0.025em; + border: 0; +} + +#nav { + cursor: default; + background-color: #333; + background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + padding: 0; +} + +#nav:after { + content: ''; + display: block; + width: 100%; + height: 0.75em; + background-color: var(--point-color); + background-image: url("images/bg01.png"); +} + +#nav > ul { + margin: 0; +} + +#nav > ul > li { + position: relative; + display: inline-block; + margin-left: 1em; +} + +#nav > ul > li a { + color: #c0c0c0; + text-decoration: none; + border: 0; + display: block; + padding: 1.5em 0.5em 1.35em 0.5em; +} + +#nav > ul > li:first-child { + margin-left: 0; +} + +#nav > ul > li:hover a { + color: var(--pure-white); +} + +#nav > ul > li.current { + font-weight: 600; +} + +#nav > ul > li.current:before { + -moz-transform: rotateZ(45deg); + -webkit-transform: rotateZ(45deg); + -ms-transform: rotateZ(45deg); + transform: rotateZ(45deg); + width: 0.75em; + height: 0.75em; + content: ''; + display: block; + position: absolute; + bottom: -0.5em; + left: 50%; + margin-left: -0.375em; + background-color: var(--point-color); + background-image: url("images/bg01.png"); +} + +#nav > ul > li.current a { + color: var(--pure-white); +} + +#nav > ul > li.active a { + color: var(--pure-white); +} + +#nav > ul > li.active.current:before { + opacity: 0; +} + +#nav > ul > li > ul { + display: none; +} + +/* Dropotron */ + +.dropotron { + background-image: -moz-linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); + background-image: -ms-linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); + background-image: linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); + background-color: #333; + border-radius: 5px; + color: var(--pure-white); + min-width: 10em; + padding: 1em 0; + text-align: center; + box-shadow: 0 1em 1em 0 rgba(0, 0, 0, 0.5); + list-style: none; +} + +.dropotron > li { + line-height: 2em; + padding: 0 1.1em 0 1em; +} + +.dropotron > li > a { + color: #c0c0c0; + text-decoration: none; + border: 0; +} + +.dropotron > li.active > a, .dropotron > li:hover > a { + color: var(--pure-white); +} + +.dropotron.level-0 { + border-radius: 0 0 5px 5px; + font-size: 0.9em; + padding-top: 0; + margin-top: -1px; +} + +/* Banner */ + +#banner { + background-image: url("../../images/banner.jpg"); + background-position: center center; + background-size: cover; + height: 28em; + text-align: center; + position: relative; +} + +#banner header { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background: #212121; + background: rgba(27, 27, 27, 0.75); + color: var(--pure-white); + padding: 1.5em 0; +} + +#banner header h2 { + display: inline-block; + margin: 0; + font-size: 1.25em; + vertical-align: middle; +} + +#banner header h2 em { + opacity: 0.75; +} + +#banner header h2 a { + border-bottom-color: rgba(255, 255, 255, 0.5); +} + +#banner header h2 a:hover { + border-bottom-color: transparent; +} + +#banner header .button { + vertical-align: middle; + margin-left: 1em; + line-height: 1.2em; +} + +/* Wrapper */ + +.wrapper { + padding: 5em 0 3em 0; +} + +.wrapper.style1 { + background: var(--pure-white); +} + +.wrapper.style2 { + background-color: var(--pure-white); + background-image: url("images/bg02.png"), url("images/bg03.png"), url("images/bg01.png"); + background-position: top left, bottom left, top left; + background-size: 100% 6em, 100% 6em, auto; + background-repeat: no-repeat, no-repeat, repeat; +} + +.wrapper.style3 { + background-color: var(--point-color); + background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); + color: var(--pure-white); +} + +.wrapper.style3 .button { + background: var(--pure-white); + color: #474747; +} + +.wrapper.style3 .button:hover { + color: var(--point-color) !important; +} + +/* CTA */ + +#cta { + text-align: center; + padding: 3.5em 0; +} +#cta2 { + text-align: center; + padding: 0.5em 3.5em; + +} +#cta2 header h2 { + margin-bottom: 0em; +} +#cta header h2 { + display: inline-block; + vertical-align: middle; + margin: 0; +} + +#cta header .button { + vertical-align: middle; + margin-left: 1em; +} + +/* Footer */ + +#footer { + padding: 4em 0 8em 0; +} + +#footer a { + color: inherit; + border-bottom-color: rgba(71, 71, 71, 0.25); +} + +#footer a:hover { + color: var(--point-color); + border-bottom-color: transparent; +} + +#footer .container { + margin-bottom: 4em; +} + +#footer .icons { + text-align: center; + margin: 0; +} + +#footer .icons a { + color: #999; +} + +#footer .icons a:hover { + color: #474747; +} + +#footer .copyright { + color: #999; + margin-top: 1.5em; + text-align: center; + font-size: 0.9em; +} + +/* Wide */ + +@media screen and (max-width: 1680px) { + + /* Basic */ + + body, input, select, textarea { + font-size: 14pt; + line-height: 1.5em; + } + + /* Banner */ + + #banner { + height: 24em; + } + +} + +/* Normal */ + +@media screen and (max-width: 1280px) { + + /* Basic */ + + body, input, select, textarea { + font-size: 13pt; + line-height: 1.5em; + } + + /* Lists */ + + ol { + padding-left: 1.25em; + } + + ol li { + padding-left: 0.25em; + } + + /* Icons */ + + ul.icons li a, ul.icons li span { + font-size: 1.5em; + } + + /* Header */ + + #header { + padding: 2em 0 0 0; + } + + #header h1 { + padding: 0 0 1.75em 0; + } + + /* Banner */ + + #banner { + height: 20em; + } + + /* Wrapper */ + + .wrapper { + padding: 3em 0 1em 0; + } + + /* CTA */ + + #cta { + padding: 2em 0; + } + + /* Footer */ + + #footer { + padding: 3em 0 3em 0; + } + + #footer .container { + margin-bottom: 1em; + } + +} + +/* Narrow */ + +@media screen and (max-width: 980px) { + + /* Basic */ + + body, input, select, textarea { + font-size: 12pt; + line-height: 1.5em; + } + +} + +/* Narrower */ + +#navPanel, #titleBar { + display: none; +} + +@media screen and (max-width: 840px) { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + body, input, select, textarea { + font-size: 13pt; + } + + h1, h2, h3, h4, h5, h6 { + margin-bottom: 0.5em; } header p { - color: #999; - font-size: 1.25em; - position: relative; - margin-top: -1.25em; - margin-bottom: 2.25em; + margin-top: -0.75em; } header.major { @@ -1982,1391 +2968,420 @@ input, select, textarea { margin: 0 0 2em 0; } - header.major h2 { - font-size: 2.25em; - } - - header.major p { - position: relative; - border-top: solid 1px #e0e0e0; - padding: 1em 0 0 0; - margin: 0; - top: -1em; - font-size: 1.5em; - letter-spacing: -0.025em; - } - - footer { - margin: 0 0 3em 0; + header.major h2 { + font-size: 1.75em; } - footer > :last-child { - margin-bottom: 0; - } + header.major p { + top: -0.25em; + font-size: 1.25em; + } - footer.major { - padding-top: 3em; - } + /* Box */ -/* Form */ + .box.highlight { + text-align: left; + position: relative; + padding-left: 7em; + } - input[type="text"], - input[type="password"], - input[type="email"], - textarea { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - -moz-transition: border-color 0.2s ease-in-out; - -webkit-transition: border-color 0.2s ease-in-out; - -ms-transition: border-color 0.2s ease-in-out; - transition: border-color 0.2s ease-in-out; - background: var(--pure-white); - border: solid 1px #e0e0e0; - border-radius: 5px; - color: inherit; + .box.highlight i { + position: absolute; + margin: 0; + left: 0; + top: 0.25em; + } + + .box.post .inner { + margin-left: calc(20% + 2em); + } + + .box.post .image { + width: 20%; + } + + /* Header */ + + #header { + display: none; + } + + /* Banner */ + + #banner { + height: 20em; + } + + #banner header h2 { display: block; - outline: 0; - padding: 0.75em; - text-decoration: none; + } + + #banner header .button { + margin: 1em 0 0 0; + } + + /* CTA */ + + #cta { + padding: 1.5em 0; + } + + #cta header h2 { + display: block; + } + + #cta header .button { + margin: 1em 0 0 0; + } + + /* Footer */ + + #footer { + text-align: center; + } + + #footer .container { + margin-bottom: 4em; + } + + #footer form .actions { + -moz-justify-content: center; + -webkit-justify-content: center; + -ms-justify-content: center; + justify-content: center; width: 100%; + margin-left: 0; } - input[type="text"]:focus, - input[type="password"]:focus, - input[type="email"]:focus, - textarea:focus { - border-color: var(--point-color); - } - - input[type="text"], - input[type="password"], - input[type="email"] { - line-height: 1em; + #footer form .actions li:first-child { + padding-left: 0; } - label { + /* Nav */ + + #page-wrapper { + -moz-backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -moz-transition: -moz-transform 0.5s ease; + -webkit-transition: -webkit-transform 0.5s ease; + -ms-transition: -ms-transform 0.5s ease; + transition: transform 0.5s ease; + padding-bottom: 1px; + padding-top: 44px; + } + + #titleBar { + -moz-backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -moz-transition: -moz-transform 0.5s ease; + -webkit-transition: -webkit-transform 0.5s ease; + -ms-transition: -ms-transform 0.5s ease; + transition: transform 0.5s ease; display: block; - color: inherit; + height: 44px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 10001; + background-color: #333; + background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); + height: 44px; + line-height: 44px; + box-shadow: 0 4px 0 0 var(--point-color); + } + + #titleBar .title { + display: block; + position: relative; font-weight: 600; - line-height: 1.75em; - margin-bottom: 0.5em; + text-align: center; + color: var(--pure-white); + z-index: 1; } - ::-webkit-input-placeholder { - color: #999; - position: relative; - top: 3px; + #titleBar .title em { + font-style: normal; + font-weight: 300; } - :-moz-placeholder { - color: #999; - } - - ::-moz-placeholder { - color: #999; - } - - :-ms-input-placeholder { - color: #999; - } - -/* Image */ - - .image { + #titleBar .toggle { + text-decoration: none; border: 0; + height: 60px; + left: 0; + position: absolute; + top: 0; + width: 80px; + z-index: 2; + } + + #titleBar .toggle:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; display: inline-block; - position: relative; - border-radius: 5px; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + text-transform: none !important; + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } - .image img { - display: block; - border-radius: 5px; - } + #titleBar .toggle:before { + content: '\f0c9'; + display: block; + height: 44px; + line-height: inherit; + text-align: center; + width: 44px; + color: var(--pure-white); + opacity: 0.5; + } - .image.left { - display: block; - float: left; - margin: 0 2em 2em 0; - position: relative; - top: 0.25em; - } + #titleBar .toggle:active:before { + opacity: 0.75; + } - .image.left img { - display: block; - width: 100%; - } + #navPanel { + background-color: #1f1f1f; + box-shadow: inset -1px 0 3px 0 rgba(0, 0, 0, 0.5); + background-image: -moz-linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: -ms-linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); + background-image: linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); + -moz-backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -moz-transform: translateX(-275px); + -webkit-transform: translateX(-275px); + -ms-transform: translateX(-275px); + transform: translateX(-275px); + -moz-transition: -moz-transform 0.5s ease; + -webkit-transition: -webkit-transform 0.5s ease; + -ms-transition: -ms-transform 0.5s ease; + transition: transform 0.5s ease; + display: block; + height: 100%; + left: 0; + overflow-y: auto; + position: fixed; + top: 0; + width: 275px; + z-index: 10002; + } - .image.fit { - display: block; - } - - .image.fit img { - display: block; - width: 100%; - } - - .image.featured { - display: block; - margin: 0 0 2em 0; - } - - .image.featured img { - display: block; - width: 100%; - } - -/* Icon */ - - .icon { - text-decoration: none; - position: relative; + #navPanel .link { + border-bottom: 0; + border-top: solid 1px rgba(255, 255, 255, 0.05); + color: #888; + display: block; + height: 48px; + line-height: 48px; + padding: 0 1em 0 1em; text-decoration: none; } - .icon:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - text-transform: none !important; - font-family: 'Font Awesome 5 Free'; - font-weight: 400; - } - - .icon > .label { - display: none; - } - - .icon:before { - line-height: inherit; - } - - .icon.solid:before { - font-weight: 900; - } - - .icon.brands:before { - font-family: 'Font Awesome 5 Brands'; - } - - .icon.major { - text-align: center; - cursor: default; - background-color: var(--point-color); - background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - color: var(--pure-white); - border-radius: 100%; - display: inline-block; - width: 5em; - height: 5em; - line-height: 5em; - box-shadow: 0 0 0 7px white, 0 0 0 8px #e0e0e0; - margin: 0 0 2em 0; - } - - .icon.major:before { - font-size: 36px; - } - -/* Lists */ - - ol { - list-style: decimal; - padding-left: 1.25em; + #navPanel .link:first-child { + border-top: 0; } - ol li { - padding-left: 0.25em; - } - - ul { - list-style: disc; - padding-left: 1em; + #navPanel .link.depth-0 { + color: var(--pure-white); } - ul li { - padding-left: 0.5em; - } - -/* Links */ - - ul.links { - list-style: none; - padding-left: 0; + #navPanel .link .indent-1 { + display: inline-block; + width: 1em; } - ul.links li { - line-height: 2.5em; - padding-left: 0; - } - -/* Icons */ - - ul.icons { - cursor: default; - list-style: none; - padding-left: 0; + #navPanel .link .indent-2 { + display: inline-block; + width: 2em; } - ul.icons li { - display: inline-block; - line-height: 1em; - padding-left: 1.5em; - } - - ul.icons li:first-child { - padding-left: 0; - } - - ul.icons li a, ul.icons li span { - font-size: 2em; - border: 0; - } - -/* Menu */ - - ul.menu { - list-style: none; - padding-left: 0; + #navPanel .link .indent-3 { + display: inline-block; + width: 3em; } - ul.menu li { - border-left: solid 1px #e0e0e0; - display: inline-block; - padding: 0 0 0 1em; - margin: 0 0 0 1em; - } - - ul.menu li:first-child { - border-left: 0; - margin-left: 0; - padding-left: 0; - } - -/* Actions */ - - ul.actions { - display: -moz-flex; - display: -webkit-flex; - display: -ms-flex; - display: flex; - cursor: default; - list-style: none; - margin-left: -1em; - padding-left: 0; + #navPanel .link .indent-4 { + display: inline-block; + width: 4em; } - ul.actions li { - padding: 0 0 0 1em; - vertical-align: middle; - } - - ul.actions.special { - -moz-justify-content: center; - -webkit-justify-content: center; - -ms-justify-content: center; - justify-content: center; - width: 100%; - margin-left: 0; - } - - ul.actions.special li:first-child { - padding-left: 0; - } - - ul.actions.stacked { - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - margin-left: 0; - } - - ul.actions.stacked li { - padding: 1.25em 0 0 0; - } - - ul.actions.stacked li:first-child { - padding-top: 0; - } - - ul.actions.fit { - width: calc(100% + 1em); - } - - ul.actions.fit li { - -moz-flex-grow: 1; - -webkit-flex-grow: 1; - -ms-flex-grow: 1; - flex-grow: 1; - -moz-flex-shrink: 1; - -webkit-flex-shrink: 1; - -ms-flex-shrink: 1; - flex-shrink: 1; - width: 100%; - } - - ul.actions.fit li > * { - width: 100%; - } - - ul.actions.fit.stacked { - width: 100%; - } - - @media screen and (max-width: 736px) { - - ul.actions:not(.fixed) { - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - margin-left: 0; - width: 100% !important; - } - - ul.actions:not(.fixed) li { - -moz-flex-grow: 1; - -webkit-flex-grow: 1; - -ms-flex-grow: 1; - flex-grow: 1; - -moz-flex-shrink: 1; - -webkit-flex-shrink: 1; - -ms-flex-shrink: 1; - flex-shrink: 1; - padding: 1em 0 0 0; - text-align: center; - width: 100%; - } - - ul.actions:not(.fixed) li > * { - width: 100%; - } - - ul.actions:not(.fixed) li:first-child { - padding-top: 0; - } - - ul.actions:not(.fixed) li input[type="submit"], - ul.actions:not(.fixed) li input[type="reset"], - ul.actions:not(.fixed) li input[type="button"], - ul.actions:not(.fixed) li button, - ul.actions:not(.fixed) li .button { - width: 100%; - } - - ul.actions:not(.fixed) li input[type="submit"].icon:before, - ul.actions:not(.fixed) li input[type="reset"].icon:before, - ul.actions:not(.fixed) li input[type="button"].icon:before, - ul.actions:not(.fixed) li button.icon:before, - ul.actions:not(.fixed) li .button.icon:before { - margin-left: -0.5em; - } - - } - -/* Tables */ - - table { - width: 100%; + #navPanel .link .indent-5 { + display: inline-block; + width: 5em; } - table.default { - width: 100%; - } + body.navPanel-visible #page-wrapper { + -moz-transform: translateX(275px); + -webkit-transform: translateX(275px); + -ms-transform: translateX(275px); + transform: translateX(275px); + } - table.default tbody tr { - border-bottom: solid 1px #e0e0e0; - } + body.navPanel-visible #titleBar { + -moz-transform: translateX(275px); + -webkit-transform: translateX(275px); + -ms-transform: translateX(275px); + transform: translateX(275px); + } - table.default td { - padding: 0.5em 1em 0.5em 1em; - } + body.navPanel-visible #navPanel { + -moz-transform: translateX(0); + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } - table.default th { - font-weight: 600; - padding: 0.5em 1em 0.5em 1em; - text-align: left; - } +} - table.default thead { - background-color: var(--button-alt-default); - background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - color: var(--pure-white); - } +/* Mobile */ -/* Button */ +@media screen and (max-width: 736px) { + + /* Basic */ + + body, input, select, textarea { + font-size: 11pt; + line-height: 1.35em; + } + + h2 { + font-size: 1.25em; + letter-spacing: 0; + line-height: 1.35em; + } + + h3 { + font-size: 1em; + letter-spacing: 0; + line-height: 1.35em; + } + + header p { + margin-top: -0.5em; + font-size: 1em; + } + + header.major { + padding: 0 20px; + } + + header.major h2 { + font-size: 1.25em; + } + + header.major p { + top: 0; + margin-top: 1.25em; + font-size: 1em; + } + + /* Menu */ + + ul.menu li { + border: 0; + padding: 0; + margin: 0; + display: block; + line-height: 2em; + } + + /* Banner */ + + #banner { + height: 18em; + } + + /* Wrapper */ + + .wrapper { + padding: 2em 0 1px 0; + } + +} + +/* Mobile (Portrait) */ + +@media screen and (max-width: 480px) { + + /* Icon */ + + .icon.major { + width: 4em; + height: 4em; + line-height: 4em; + box-shadow: 0 0 0 7px white, 0 0 0 8px #e0e0e0; + } + + .icon.major:before { + font-size: 24px; + } + + /* Button */ input[type="submit"], input[type="reset"], input[type="button"], button, .button { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - -moz-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; - -webkit-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; - -ms-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; - transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; - background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-color: var(--point-color); - border-radius: 5px; - border: 0; - color: var(--pure-white); - cursor: pointer; - display: inline-block; - padding: 0 1.5em; - line-height: 2.75em; - min-width: 9em; - text-align: center; - text-decoration: none; - font-weight: 600; - letter-spacing: -0.025em; + width: 100%; + display: block; } - input[type="submit"]:hover, - input[type="reset"]:hover, - input[type="button"]:hover, - button:hover, - .button:hover { - background-color: var(--point-hover-color); - color: var(--pure-white) !important; - } - - input[type="submit"]:active, - input[type="reset"]:active, - input[type="button"]:active, - button:active, - .button:active { - background-color: var(--point-hover-color2); - color: var(--pure-white); - } - - input[type="submit"].alt, - input[type="reset"].alt, - input[type="button"].alt, - button.alt, - .button.alt { - background-color: var(--button-alt-default); - color: var(--pure-white); - } - - input[type="submit"].alt:hover, - input[type="reset"].alt:hover, - input[type="button"].alt:hover, - button.alt:hover, - .button.alt:hover { - background-color: #626262; - } - - input[type="submit"].alt:active, - input[type="reset"].alt:active, - input[type="button"].alt:active, - button.alt:active, - .button.alt:active { - background-color: #484848; - } - - input[type="submit"].icon:before, - input[type="reset"].icon:before, - input[type="button"].icon:before, - button.icon:before, - .button.icon:before { - margin-right: 0.5em; - } - - input[type="submit"].fit, - input[type="reset"].fit, - input[type="button"].fit, - button.fit, - .button.fit { - width: 100%; - } - - input[type="submit"].small, - input[type="reset"].small, - input[type="button"].small, - button.small, - .button.small { - font-size: 0.8em; - } - -/* Box */ + /* Box */ .box.highlight { - text-align: center; + padding-left: calc(4em + 30px); } - .box.post { - position: relative; - margin: 0 0 2em 0; + .box.post .inner { + margin-left: calc(30% + 20px); } - .box.post:after { - content: ''; - display: block; - clear: both; - } - - .box.post .inner { - margin-left: calc(30% + 2em); - } - - .box.post .inner > :last-child { - margin-bottom: 0; - } - - .box.post .image { - width: 30%; - margin: 0; - } - -/* Header */ - - #header { - text-align: center; - padding: 3em 0 0 0; - background-color: var(--pure-white); - background-image: url("images/bg02.png"), url("images/bg02.png"), url("images/bg01.png"); - background-position: top left, top left, top left; - background-size: 100% 6em, 100% 6em, auto; - background-repeat: no-repeat, no-repeat, repeat; + .box.post .image { + width: 30%; } - #header h1 { - padding: 0 0 2.75em 0; - margin: 0; - } - - #header h1 a { - font-size: 1.5em; - letter-spacing: -0.025em; - border: 0; - } - - #nav { - cursor: default; - background-color: #333; - background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - padding: 0; - } - - #nav:after { - content: ''; - display: block; - width: 100%; - height: 0.75em; - background-color: var(--point-color); - background-image: url("images/bg01.png"); - } - - #nav > ul { - margin: 0; - } - - #nav > ul > li { - position: relative; - display: inline-block; - margin-left: 1em; - } - - #nav > ul > li a { - color: #c0c0c0; - text-decoration: none; - border: 0; - display: block; - padding: 1.5em 0.5em 1.35em 0.5em; - } - - #nav > ul > li:first-child { - margin-left: 0; - } - - #nav > ul > li:hover a { - color: var(--pure-white); - } - - #nav > ul > li.current { - font-weight: 600; - } - - #nav > ul > li.current:before { - -moz-transform: rotateZ(45deg); - -webkit-transform: rotateZ(45deg); - -ms-transform: rotateZ(45deg); - transform: rotateZ(45deg); - width: 0.75em; - height: 0.75em; - content: ''; - display: block; - position: absolute; - bottom: -0.5em; - left: 50%; - margin-left: -0.375em; - background-color: var(--point-color); - background-image: url("images/bg01.png"); - } - - #nav > ul > li.current a { - color: var(--pure-white); - } - - #nav > ul > li.active a { - color: var(--pure-white); - } - - #nav > ul > li.active.current:before { - opacity: 0; - } - - #nav > ul > li > ul { - display: none; - } - -/* Dropotron */ - - .dropotron { - background-image: -moz-linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); - background-image: -ms-linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); - background-image: linear-gradient(top, rgba(0,0,0,0.3), rgba(0,0,0,0)), url("images/bg01.png"); - background-color: #333; - border-radius: 5px; - color: var(--pure-white); - min-width: 10em; - padding: 1em 0; - text-align: center; - box-shadow: 0 1em 1em 0 rgba(0, 0, 0, 0.5); - list-style: none; - } - - .dropotron > li { - line-height: 2em; - padding: 0 1.1em 0 1em; - } - - .dropotron > li > a { - color: #c0c0c0; - text-decoration: none; - border: 0; - } - - .dropotron > li.active > a, .dropotron > li:hover > a { - color: var(--pure-white); - } - - .dropotron.level-0 { - border-radius: 0 0 5px 5px; - font-size: 0.9em; - padding-top: 0; - margin-top: -1px; - } - -/* Banner */ + /* Banner */ #banner { - background-image: url("../../images/banner.jpg"); - background-position: center center; - background-size: cover; - height: 28em; - text-align: center; - position: relative; + height: 20em; } - #banner header { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - background: #212121; - background: rgba(27, 27, 27, 0.75); - color: var(--pure-white); - padding: 1.5em 0; - } + #banner header { + padding: 20px; + } - #banner header h2 { - display: inline-block; - margin: 0; - font-size: 1.25em; - vertical-align: middle; - } - - #banner header h2 em { - opacity: 0.75; - } - - #banner header h2 a { - border-bottom-color: rgba(255, 255, 255, 0.5); - } - - #banner header h2 a:hover { - border-bottom-color: transparent; - } - - #banner header .button { - vertical-align: middle; - margin-left: 1em; - line-height: 1.2em; - } - -/* Wrapper */ + /* Wrapper */ .wrapper { - padding: 5em 0 3em 0; + padding: 2em 20px 1px 20px; } - .wrapper.style1 { - background: var(--pure-white); - } - - .wrapper.style2 { - background-color: var(--pure-white); - background-image: url("images/bg02.png"), url("images/bg03.png"), url("images/bg01.png"); - background-position: top left, bottom left, top left; - background-size: 100% 6em, 100% 6em, auto; - background-repeat: no-repeat, no-repeat, repeat; - } - - .wrapper.style3 { - background-color: var(--point-color); - background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.15)), url("images/bg01.png"); - color: var(--pure-white); - } - - .wrapper.style3 .button { - background: var(--pure-white); - color: #474747; - } - - .wrapper.style3 .button:hover { - color: var(--point-color) !important; - } - -/* CTA */ + /* CTA */ #cta { - text-align: center; - padding: 3.5em 0; + padding: 20px; } - #cta header h2 { - display: inline-block; - vertical-align: middle; - margin: 0; - } - - #cta header .button { - vertical-align: middle; - margin-left: 1em; - } - -/* Footer */ + /* Footer */ #footer { - padding: 4em 0 8em 0; + padding: 2em 20px; + text-align: left; } - #footer a { - color: inherit; - border-bottom-color: rgba(71, 71, 71, 0.25); - } - - #footer a:hover { - color: var(--point-color); - border-bottom-color: transparent; - } - - #footer .container { - margin-bottom: 4em; - } - - #footer .icons { - text-align: center; - margin: 0; - } - - #footer .icons a { - color: #999; - } - - #footer .icons a:hover { - color: #474747; - } - - #footer .copyright { - color: #999; - margin-top: 1.5em; - text-align: center; - font-size: 0.9em; - } - -/* Wide */ - - @media screen and (max-width: 1680px) { - - /* Basic */ - - body, input, select, textarea { - font-size: 14pt; - line-height: 1.5em; - } - - /* Banner */ - - #banner { - height: 24em; - } - - } - -/* Normal */ - - @media screen and (max-width: 1280px) { - - /* Basic */ - - body, input, select, textarea { - font-size: 13pt; - line-height: 1.5em; - } - - /* Lists */ - - ol { - padding-left: 1.25em; - } - - ol li { - padding-left: 0.25em; - } - - /* Icons */ - - ul.icons li a, ul.icons li span { - font-size: 1.5em; - } - - /* Header */ - - #header { - padding: 2em 0 0 0; - } - - #header h1 { - padding: 0 0 1.75em 0; - } - - /* Banner */ - - #banner { - height: 20em; - } - - /* Wrapper */ - - .wrapper { - padding: 3em 0 1em 0; - } - - /* CTA */ - - #cta { - padding: 2em 0; - } - - /* Footer */ - - #footer { - padding: 3em 0 3em 0; - } - - #footer .container { - margin-bottom: 1em; - } - - } - -/* Narrow */ - - @media screen and (max-width: 980px) { - - /* Basic */ - - body, input, select, textarea { - font-size: 12pt; - line-height: 1.5em; - } - - } - -/* Narrower */ - - #navPanel, #titleBar { - display: none; - } - - @media screen and (max-width: 840px) { - - /* Basic */ - - html, body { - overflow-x: hidden; - } - - body, input, select, textarea { - font-size: 13pt; - } - - h1, h2, h3, h4, h5, h6 { - margin-bottom: 0.5em; - } - - header p { - margin-top: -0.75em; - } - - header.major { - text-align: center; - margin: 0 0 2em 0; - } - - header.major h2 { - font-size: 1.75em; - } - - header.major p { - top: -0.25em; - font-size: 1.25em; - } - - /* Box */ - - .box.highlight { - text-align: left; - position: relative; - padding-left: 7em; - } - - .box.highlight i { - position: absolute; - margin: 0; - left: 0; - top: 0.25em; - } - - .box.post .inner { - margin-left: calc(20% + 2em); - } - - .box.post .image { - width: 20%; - } - - /* Header */ - - #header { - display: none; - } - - /* Banner */ - - #banner { - height: 20em; - } - - #banner header h2 { - display: block; - } - - #banner header .button { - margin: 1em 0 0 0; - } - - /* CTA */ - - #cta { - padding: 1.5em 0; - } - - #cta header h2 { - display: block; - } - - #cta header .button { - margin: 1em 0 0 0; - } - - /* Footer */ - - #footer { - text-align: center; - } - - #footer .container { - margin-bottom: 4em; - } - - #footer form .actions { - -moz-justify-content: center; - -webkit-justify-content: center; - -ms-justify-content: center; - justify-content: center; - width: 100%; - margin-left: 0; - } - - #footer form .actions li:first-child { - padding-left: 0; - } - - /* Nav */ - - #page-wrapper { - -moz-backface-visibility: hidden; - -webkit-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - -moz-transition: -moz-transform 0.5s ease; - -webkit-transition: -webkit-transform 0.5s ease; - -ms-transition: -ms-transform 0.5s ease; - transition: transform 0.5s ease; - padding-bottom: 1px; - padding-top: 44px; - } - - #titleBar { - -moz-backface-visibility: hidden; - -webkit-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - -moz-transition: -moz-transform 0.5s ease; - -webkit-transition: -webkit-transform 0.5s ease; - -ms-transition: -ms-transform 0.5s ease; - transition: transform 0.5s ease; - display: block; - height: 44px; - left: 0; - position: fixed; - top: 0; - width: 100%; - z-index: 10001; - background-color: #333; - background-image: -moz-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - background-image: -ms-linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - background-image: linear-gradient(top, rgba(0,0,0,0), rgba(0,0,0,0.3)), url("images/bg01.png"); - height: 44px; - line-height: 44px; - box-shadow: 0 4px 0 0 var(--point-color); - } - - #titleBar .title { - display: block; - position: relative; - font-weight: 600; - text-align: center; - color: var(--pure-white); - z-index: 1; - } - - #titleBar .title em { - font-style: normal; - font-weight: 300; - } - - #titleBar .toggle { - text-decoration: none; - border: 0; - height: 60px; - left: 0; - position: absolute; - top: 0; - width: 80px; - z-index: 2; - } - - #titleBar .toggle:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - text-transform: none !important; - font-family: 'Font Awesome 5 Free'; - font-weight: 900; - } - - #titleBar .toggle:before { - content: '\f0c9'; - display: block; - height: 44px; - line-height: inherit; - text-align: center; - width: 44px; - color: var(--pure-white); - opacity: 0.5; - } - - #titleBar .toggle:active:before { - opacity: 0.75; - } - - #navPanel { - background-color: #1f1f1f; - box-shadow: inset -1px 0 3px 0 rgba(0, 0, 0, 0.5); - background-image: -moz-linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -webkit-linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: -ms-linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); - background-image: linear-gradient(left, rgba(0,0,0,0) 75%, rgba(0,0,0,0.15)), url("images/bg01.png"); - -moz-backface-visibility: hidden; - -webkit-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - -moz-transform: translateX(-275px); - -webkit-transform: translateX(-275px); - -ms-transform: translateX(-275px); - transform: translateX(-275px); - -moz-transition: -moz-transform 0.5s ease; - -webkit-transition: -webkit-transform 0.5s ease; - -ms-transition: -ms-transform 0.5s ease; - transition: transform 0.5s ease; - display: block; - height: 100%; - left: 0; - overflow-y: auto; - position: fixed; - top: 0; - width: 275px; - z-index: 10002; - } - - #navPanel .link { - border-bottom: 0; - border-top: solid 1px rgba(255, 255, 255, 0.05); - color: #888; - display: block; - height: 48px; - line-height: 48px; - padding: 0 1em 0 1em; - text-decoration: none; - } - - #navPanel .link:first-child { - border-top: 0; - } - - #navPanel .link.depth-0 { - color: var(--pure-white); - } - - #navPanel .link .indent-1 { - display: inline-block; - width: 1em; - } - - #navPanel .link .indent-2 { - display: inline-block; - width: 2em; - } - - #navPanel .link .indent-3 { - display: inline-block; - width: 3em; - } - - #navPanel .link .indent-4 { - display: inline-block; - width: 4em; - } - - #navPanel .link .indent-5 { - display: inline-block; - width: 5em; - } - - body.navPanel-visible #page-wrapper { - -moz-transform: translateX(275px); - -webkit-transform: translateX(275px); - -ms-transform: translateX(275px); - transform: translateX(275px); - } - - body.navPanel-visible #titleBar { - -moz-transform: translateX(275px); - -webkit-transform: translateX(275px); - -ms-transform: translateX(275px); - transform: translateX(275px); - } - - body.navPanel-visible #navPanel { - -moz-transform: translateX(0); - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - } - -/* Mobile */ - - @media screen and (max-width: 736px) { - - /* Basic */ - - body, input, select, textarea { - font-size: 11pt; - line-height: 1.35em; - } - - h2 { - font-size: 1.25em; - letter-spacing: 0; - line-height: 1.35em; - } - - h3 { - font-size: 1em; - letter-spacing: 0; - line-height: 1.35em; - } - - header p { - margin-top: -0.5em; - font-size: 1em; - } - - header.major { - padding: 0 20px; - } - - header.major h2 { - font-size: 1.25em; - } - - header.major p { - top: 0; - margin-top: 1.25em; - font-size: 1em; - } - - /* Menu */ - - ul.menu li { - border: 0; - padding: 0; - margin: 0; - display: block; - line-height: 2em; - } - - /* Banner */ - - #banner { - height: 18em; - } - - /* Wrapper */ - - .wrapper { - padding: 2em 0 1px 0; - } - - } - -/* Mobile (Portrait) */ - - @media screen and (max-width: 480px) { - - /* Icon */ - - .icon.major { - width: 4em; - height: 4em; - line-height: 4em; - box-shadow: 0 0 0 7px white, 0 0 0 8px #e0e0e0; - } - - .icon.major:before { - font-size: 24px; - } - - /* Button */ - - input[type="submit"], - input[type="reset"], - input[type="button"], - button, - .button { - width: 100%; - display: block; - } - - /* Box */ - - .box.highlight { - padding-left: calc(4em + 30px); - } - - .box.post .inner { - margin-left: calc(30% + 20px); - } - - .box.post .image { - width: 30%; - } - - /* Banner */ - - #banner { - height: 20em; - } - - #banner header { - padding: 20px; - } - - /* Wrapper */ - - .wrapper { - padding: 2em 20px 1px 20px; - } - - /* CTA */ - - #cta { - padding: 20px; - } - - /* Footer */ - - #footer { - padding: 2em 20px; - text-align: left; - } - - } \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/resources/static/js/blog.js b/src/main/resources/static/js/blog.js index d6e95f1..f1e74cb 100644 --- a/src/main/resources/static/js/blog.js +++ b/src/main/resources/static/js/blog.js @@ -20,6 +20,8 @@ function goToEditor(path,id,sk) { location.href = path + id+"?token="+sk; } + + function onclickWrite(type, keyword, html) { let title_field = document.getElementById('title_field') var hasValues = true diff --git a/src/main/resources/templates/content/blog/viewer.html b/src/main/resources/templates/content/blog/viewer.html index ca896f4..e1a58e5 100644 --- a/src/main/resources/templates/content/blog/viewer.html +++ b/src/main/resources/templates/content/blog/viewer.html @@ -34,16 +34,25 @@ -
- -
-
-
-
-
-
- +
+
+
+ + + +
+ +
+
+
+
+
+
+ +
+
+
-
+ diff --git a/src/main/resources/templates/content/home.html b/src/main/resources/templates/content/home.html index aefe735..6f9a4e3 100644 --- a/src/main/resources/templates/content/home.html +++ b/src/main/resources/templates/content/home.html @@ -10,25 +10,10 @@ @@ -36,7 +21,7 @@ @@ -52,7 +37,7 @@
-
+

Are you ready to continue your quest?

@@ -62,42 +47,14 @@
-
-
-
- +
+
+ +
+
-

The First Thing

-

Duis neque nisi, dapibus sed mattis et quis, nibh. Sed et dapibus nisl amet mattis, sed a rutrum accumsan sed. Suspendisse eu.

-
-
-
-
-
- -
-

The Second Thing

-

Duis neque nisi, dapibus sed mattis et quis, nibh. Sed et dapibus nisl amet mattis, sed a rutrum accumsan sed. Suspendisse eu.

-
-
-
-
-
-
-
- -
-

The Third Thing

-

Duis neque nisi, dapibus sed mattis et quis, nibh. Sed et dapibus nisl amet mattis, sed a rutrum accumsan sed. Suspendisse eu.

-
-
-
-
-
- -
-

The Fourth Thing

-

Duis neque nisi, dapibus sed mattis et quis, nibh. Sed et dapibus nisl amet mattis, sed a rutrum accumsan sed. Suspendisse eu.

+

+

@@ -133,11 +90,10 @@
-
+

Are you ready to continue your quest?

- Insert Coin
diff --git a/src/main/resources/templates/fragments/footer.html b/src/main/resources/templates/fragments/footer.html index 010a179..32a73b3 100644 --- a/src/main/resources/templates/fragments/footer.html +++ b/src/main/resources/templates/fragments/footer.html @@ -64,7 +64,7 @@