.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 20px;\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n background-color: @list-group-disabled-bg;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n color: @list-group-link-hover-color;\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-max-combinators, no-duplicate-selectors\n\n//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0, 0, 0, .05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-right: @panel-body-padding;\n padding-left: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n border-bottom-left-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n margin-bottom: 0;\n border: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n text-align: center;\n list-style: none;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n cursor: @cursor-disabled;\n background-color: @pager-bg;\n }\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n margin-left: -1px;\n line-height: @line-height-base;\n color: @pagination-color;\n text-decoration: none;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n cursor: default;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n cursor: @cursor-disabled;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0, 0, 0, .05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","// stylelint-disable property-no-vendor-prefix\n\n//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n line-height: @badge-line-height;\n color: @badge-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0); }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n background-clip: padding-box;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0, 0, 0, .5));\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n margin-left: 5px;\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0, 0, 0, .5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n display: table; // 2\n content: \" \"; // 1\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n","// stylelint-disable font-family-name-quotes, font-family-no-missing-generic-family-keyword\n\n// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","// stylelint-disable declaration-no-important\n\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n","//\n// Misago Global Scaffolding\n// --------------------------------------------------\n\n\n// Disable horizontal scroll on mobile displays top-most containers\n@media screen and (max-width: @screen-sm-max) {\n html, body {\n overflow-x: hidden;\n }\n}\n\n\n// top margin utils\n@media screen and (min-width: @screen-md-min) {\n .md-margin-top-no {\n margin-top: 0px !important;\n }\n}\n\n@media screen and (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .sm-margin-top {\n margin-top: @line-height-computed !important;\n }\n \n .sm-margin-top-no {\n margin-top: 0px !important;\n }\n\n .sm-margin-top-half {\n margin-top: @line-height-computed * 0.33 !important;\n }\n\n .sm-align-row-buttons {\n margin-top: @line-height-computed * 0.25 !important;\n }\n}\n\n@media screen and (max-width: @screen-xs-max) {\n .xs-margin-top {\n margin-top: @line-height-computed !important;\n }\n\n .xs-margin-top-half {\n margin-top: @line-height-computed * 0.33 !important;\n }\n}\n","//\n// Auth changed message\n// --------------------------------------------------\n\n\n.auth-message {\n background-color: @auth-changed-bg;\n padding: @line-height-computed 0px;\n width: 100%;\n\n position: fixed;\n top: -100%;\n left: 0px;\n\n z-index: @zindex-auth-message;\n\n transition: top 300ms ease;\n\n &.show {\n top: 0px;\n bottom: auto;\n }\n\n p {\n padding: @line-height-computed / 4 0px;\n\n color: @auth-changed-color;\n }\n\n // Small displays\n @media screen and (max-width: @screen-sm-max) {\n text-align: center;\n\n .btn {\n padding: @padding-large-vertical @padding-large-horizontal;\n\n font-size: @font-size-large;\n }\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n.alerts-snackbar {\n position: fixed;\n top: -100%;\n width: 100%;\n z-index: @zindex-modal + 10;\n\n text-align: center;\n font-size: @font-size-large;\n\n transition: top 300ms ease;\n\n pointer-events: none;\n\n &.in {\n top: 0px;\n transition: top 200ms ease;\n }\n\n p {\n display: inline-block;\n border-radius: 0px 0px @border-radius-base @border-radius-base;\n margin: 0px;\n\n pointer-events: all;\n }\n}\n","//\n// Agreement overlay\n// --------------------------------------------------\n\n\n.agreement-overlay {\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0px;\n left: 0px;\n z-index: @zindex-modal + 10;\n\n background-color: fadeOut(@modal-backdrop-bg, @modal-backdrop-opacity * 100);\n overflow-x: scroll;\n \n .container {\n max-width: @modal-lg;\n padding: @line-height-computed @grid-gutter-width;\n }\n}\n\n.agreement-content {\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n outline: 0;\n\n padding: @padding-large-vertical @padding-large-horizontal;\n}\n\n.agreement-header {\n padding: @padding-large-vertical 0;\n\n border-bottom: 1px solid @gray-lighter;\n\n h2 {\n margin-top: 0;\n }\n\n p {\n margin: 0;\n padding: 0;\n }\n}\n\n.agreement-body {\n padding: @line-height-computed 0;\n\n p.lead {\n margin: 0;\n padding: 0;\n }\n}\n\n.agreement-footer {\n .modal-footer();\n\n padding: @padding-large-vertical 0;\n}\n\n// utility class disabling scroll on body\nbody.agreement-overlay-visible {\n overflow: hidden;\n}","//\n// Misago Loaders\n// --------------------------------------------------\n\n\n.loader {\n width: 100%;\n height: 49px;\n text-align: center;\n\n &.loader-spaced {\n margin: @line-height-computed * 2 0px;\n }\n}\n\n.loader-spinning-wheel {\n width: 49px;\n height: 49px;\n margin: 0 auto;\n border: 3px solid @loader-color;\n border-radius: 50%;\n border-left-color: transparent;\n border-right-color: transparent;\n animation: cssload-spin 575ms infinite linear;\n -o-animation: cssload-spin 575ms infinite linear;\n -ms-animation: cssload-spin 575ms infinite linear;\n -webkit-animation: cssload-spin 575ms infinite linear;\n -moz-animation: cssload-spin 575ms infinite linear;\n}\n\n@keyframes cssload-spin {\n 100%{ transform: rotate(360deg); transform: rotate(360deg); }\n}\n\n@-o-keyframes cssload-spin {\n 100%{ -o-transform: rotate(360deg); transform: rotate(360deg); }\n}\n\n@-ms-keyframes cssload-spin {\n 100%{ -ms-transform: rotate(360deg); transform: rotate(360deg); }\n}\n\n@-webkit-keyframes cssload-spin {\n 100%{ -webkit-transform: rotate(360deg); transform: rotate(360deg); }\n}\n\n@-moz-keyframes cssload-spin {\n 100%{ -moz-transform: rotate(360deg); transform: rotate(360deg); }\n}","//\n// Misago Navbar\n// --------------------------------------------------\n\n\n// Remove bottom margin from navbar\n.navbar {\n margin-bottom: 0px;\n}\n\n// Desktop navbar\n.navbar .navbar-full {\n // Brand\n .navbar-brand {\n padding-top: (@navbar-height - @navbar-icon-height) / 2;\n padding-bottom: (@navbar-height - @navbar-icon-height) / 2;\n\n font-size: @font-size-base * 1.5;\n\n &>* {\n display: inline-block;\n vertical-align: middle;\n }\n\n img {\n height: @navbar-icon-height;\n margin-right: @padding-base-horizontal / 2;\n }\n }\n\n .navbar-nav > li > a {\n font-size: @font-size-base * 1.2;\n }\n\n .navbar-icon {\n display: block;\n height: @navbar-height;\n padding: @nav-link-padding;\n padding-top: (@navbar-height - 28px) / 2;\n padding-bottom: (@navbar-height - 28px) / 2;\n position: relative;\n\n color: @navbar-default-link-color;\n\n &:hover, &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n\n .material-icon {\n width: 28px;\n height: 28px;\n\n font-size: 28px;\n line-height: 28px;\n }\n\n .badge {\n background-color: @brand-danger;\n position: absolute;\n\n top: 6px;\n right: 6px;\n\n font-size: 9px;\n }\n }\n\n .open .navbar-icon {\n &, &:hover, &:focus {\n background-color: @navbar-default-link-active-bg;\n \n color: @navbar-default-link-active-color;\n }\n }\n\n // Pull Guest and User menus to right\n .nav-guest, .nav-user {\n float: right;\n\n .navbar-btn {\n margin-left: @navbar-padding-horizontal;\n }\n }\n\n // User avatar size\n .nav-user .dropdown-toggle {\n padding: (@navbar-height - @navbar-avatar-size) / 2;\n\n img {\n width: @navbar-avatar-size;\n height: @navbar-avatar-size;\n }\n }\n}\n\n\n// Compact (mobile) navbar\n.navbar ul.navbar-compact-nav {\n border-collapse:collapse;\n display: table;\n margin: 0px;\n table-layout: fixed;\n width: 100%;\n\n &>li {\n display: table-cell;\n width: 100%;\n }\n\n &>li>a, &>li>button {\n background: none;\n border: none;\n display: block;\n padding-top: 13px;\n padding-bottom: 13px;\n\n width: 100%;\n\n color: @navbar-compact-link-color;\n text-align: center;\n\n &.active, &:hover, &:focus {\n color: @navbar-compact-link-hover-color;\n background-color: @navbar-compact-link-hover-bg;\n }\n\n &>img {\n width: @navbar-compact-item-size;\n height: @navbar-compact-item-size;\n }\n }\n\n &>li>button {\n display: inline-block;\n }\n\n &>li>a>.material-icon {\n font-size: @navbar-compact-item-size;\n line-height: @navbar-compact-item-size;\n }\n}\n\n// Make navbar's height match compact nav\n@media (max-width: @grid-float-breakpoint) {\n .navbar.navbar-misago {\n min-height: auto;\n }\n}\n\n\n// Hide compact navbar above breakpoint\n.navbar-misago .navbar-desktop-nav {\n display: none;\n}\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-misago ul.navbar-compact-nav {\n display: none;\n }\n\n .navbar-misago .navbar-desktop-nav {\n display: block;\n }\n}","//\n// Navs\n// --------------------------------------------------\n\n\n.nav-side>a {\n &>.material-icon {\n margin: -5px;\n margin-right: @line-height-computed / 2;\n\n position: relative;\n bottom: 1px;\n\n width: 24px;\n height: 24px;\n\n font-size: 24px;\n line-height: 24px;\n }\n\n .badge {\n position: relative;\n top: 1px;\n }\n}","//\n// Material Icons\n// --------------------------------------------------\n\n\n@font-face {\n font-family: 'Material Icons';\n font-style: normal;\n font-weight: 400;\n src: url(../fonts/MaterialIcons-Regular.eot); /* For IE6-8 */\n src: local('Material Icons'),\n local('MaterialIcons-Regular'),\n url(../fonts/MaterialIcons-Regular.woff2) format('woff2'),\n url(../fonts/MaterialIcons-Regular.woff) format('woff'),\n url(../fonts/MaterialIcons-Regular.ttf) format('truetype');\n}\n\n\n.material-icon {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n width: 1em;\n height: 1em;\n line-height: 1;\n text-align: center;\n text-transform: none;\n letter-spacing: normal;\n vertical-align: middle;\n word-wrap: normal;\n white-space: nowrap;\n direction: ltr;\n\n /* Support for all WebKit browsers. */\n -webkit-font-smoothing: antialiased;\n /* Support for Safari and Chrome. */\n text-rendering: optimizeLegibility;\n\n /* Support for Firefox. */\n -moz-osx-font-smoothing: grayscale;\n\n /* Support for IE. */\n font-feature-settings: 'liga';\n}\n","//\n// Misago Modals\n// --------------------------------------------------\n\n\n// Modal toolbar\n.modal-toolbar {\n background: @gray-lighter;\n border-bottom: 1px solid @modal-header-border-color;\n overflow: auto;\n padding: @padding-base-vertical @padding-base-horizontal;\n\n .pull-left {\n margin-right: 8px;\n }\n\n p {\n padding: @padding-small-vertical 0px;\n margin-bottom: 0px;\n }\n}\n\n\n// Modals displaying messages\n\n// Small displays\n@media screen and (max-width: @screen-sm-max) {\n .modal-message {\n text-align: center;\n\n .message-icon {\n margin: @line-height-computed * 1.5;\n\n .material-icon {\n font-size: @message-page-icon-size * 2;\n }\n }\n }\n}\n\n\n// Full displays\n@media screen and (min-width: @screen-md-min) {\n .modal-message {\n .modal-body {\n padding-top: @line-height-computed;\n padding-bottom: @line-height-computed * 1.5;\n }\n\n .message-icon {\n float: left;\n position: relative;\n left: 7px;\n\n .material-icon {\n font-size: @line-height-computed * 2.5;\n }\n }\n\n .message-body {\n margin-left: @line-height-computed * 3.75;\n margin-top: @line-height-computed * .6 - 2px;\n\n p {\n margin-top: @line-height-computed;\n }\n\n .lead {\n margin-top: 0px;\n margin-bottom: 0px;\n }\n }\n }\n}\n\n\n// Modal loader\n.modal-loader {\n padding: @line-height-computed * 2.5 0px;\n\n .loader {\n width: 100%;\n height: @loader-size;\n text-align: center;\n }\n\n .loader-spinning-wheel {\n width: @loader-size;\n height: @loader-size;\n }\n}\n\n\n// Modal form\n.modal-body .form-group {\n min-height: 34px;\n}\n\n\n// Errors modal\n.list-item-errors {\n margin-bottom: @line-height-computed;\n}\n\n.list-errored-items li:last-child .list-item-errors {\n margin-bottom: 0px;\n}\n\n\n// Post likes modal\n.modal-post-likers {\n .media-list {\n margin: 0px;\n }\n\n .item-title {\n display: block;\n }\n}","//\n// Forms\n// --------------------------------------------------\n\n// Material feedback icon\n.has-feedback .material-icon.form-control-feedback {\n top: @padding-base-vertical;\n right: @padding-base-horizontal * 2;\n\n font-size: @line-height-base;\n line-height: @line-height-base;\n}\n\n\n// Well done\n.well.well-form.well-done {\n font-size: @font-size-large;\n text-align: center;\n\n .message-icon {\n margin-bottom: @line-height-computed / 2;\n\n font-size: @font-size-large * 5;\n line-height: @font-size-large * 5;\n }\n\n .message-body {\n margin-bottom: @line-height-computed;\n }\n}\n\n\n// Noscript well\n.well.well-form.well-noscript {\n font-size: @font-size-large;\n text-align: center;\n\n .message-icon {\n margin-bottom: @line-height-computed / 2;\n\n font-size: @font-size-large * 5;\n line-height: @font-size-large * 5;\n }\n}\n","//\n// Inputs\n// --------------------------------------------------\n\n\n// Button-based inputs\n.btn.btn-yes-no, .btn.btn-select {\n background: transparent;\n border: 1px solid darken(@gray-lighter, 10%);\n\n .material-icon {\n margin: -4px 0px;\n margin-right: 8px;\n\n position: relative;\n bottom: 1px;\n\n width: 20px;\n height: 20px;\n\n font-size: 20px;\n line-height: 20px;\n }\n}\n\n@media screen and (max-width: @screen-xs-max) {\n .btn.btn-yes-no {\n width: 100%;\n overflow: auto;\n\n .material-icon {\n float: left;\n margin-top: 1px;\n }\n\n .btn-text {\n display: block;\n\n margin-left: 30px;\n\n text-align: left;\n white-space: normal;\n }\n }\n}\n\n\n// Hidden file input\ninput.hidden-file-upload {\n position: absolute;\n top: -9999px;\n left: -9999px;\n}\n\n\n// Search field\n.form-search {\n position: relative;\n\n .form-control {\n padding-right: 30px;\n }\n\n .material-icon {\n position: absolute;\n top: 5px;\n right: 5px;\n\n color: @gray-light;\n font-size: 24px;\n line-height: 24px;\n\n pointer-events: none;\n }\n}","//\n// Buttons\n// --------------------------------------------------\n\n\n// Button loading style\n.btn.btn-loading {\n &, &:link, &:active, &:visited, &:hover, &:focus {\n // make text transparent, but still take place in button\n color: transparent;\n\n // position loader over the text\n .loader {\n height: 20px;\n margin-top: -20px;\n\n & > div {\n width: 20px;\n height: 20px;\n }\n }\n }\n\n &.btn-default .loader > div {\n border-top-color: @btn-default-color;\n border-bottom-color: @btn-default-color;\n }\n\n &.btn-primary .loader > div {\n border-top-color: @btn-primary-color;\n border-bottom-color: @btn-primary-color;\n }\n\n &.btn-success .loader > div {\n border-top-color: @btn-success-color;\n border-bottom-color: @btn-success-color;\n }\n\n &.btn-info .loader > div {\n border-top-color: @btn-info-color;\n border-bottom-color: @btn-info-color;\n }\n\n &.btn-warning .loader > div {\n border-top-color: @btn-warning-color;\n border-bottom-color: @btn-warning-color;\n }\n\n &.btn-danger .loader > div {\n border-top-color: @btn-danger-color;\n border-bottom-color: @btn-danger-color;\n }\n}\n\n\n// Icons in buttons\n.btn .material-icon {\n margin-right: 3px;\n position: relative;\n bottom: 1px;\n}\n\n\n// Btn with larger icon\n.btn-icon .material-icon {\n margin: -1px -4px;\n\n width: 20px;\n height: 20px;\n\n font-size: 20px;\n line-height: 20px;\n}\n\n.btn-icon .btn-text {\n margin-left: @padding-small-horizontal;\n}\n\n.btn-icon .btn-text-left {\n margin-right: @padding-small-horizontal;\n}\n\n\n// Block btn icon\n.btn-block.btn-icon {\n padding-left: 0px;\n padding-right: 0px;\n}\n","//\n// Dropdowns\n// --------------------------------------------------\n\n\n// Unify .btn-link appearance with anchors\n.dropdown-menu>li>a,\n.dropdown-menu>li>.btn-link,\n.modal-menu>li>a,\n.modal-menu>li>.btn-link {\n display: block;\n border: none;\n clear: both;\n float: none;\n padding: 6px 20px;\n width: 100%;\n\n color: @dropdown-link-color;\n font-weight: normal;\n line-height: @line-height-base;\n text-align: left;\n white-space: nowrap;\n\n &:hover, &:focus {\n background-color: @dropdown-link-hover-bg;\n\n color: @dropdown-link-hover-color;\n text-decoration: none;\n }\n\n &:active {\n background-color: @dropdown-link-hover-bg;\n\n color: @dropdown-link-hover-color;\n text-decoration: none;\n }\n\n &:disabled {\n color: fadeOut(@dropdown-link-color, 50);\n }\n\n // Set material icons in dropdown menus\n .material-icon {\n margin: -2px 0px;\n margin-right: @line-height-computed * .35;\n\n position: relative;\n bottom: 1px;\n\n font-size: 18px;\n }\n\n .badge {\n float: right;\n\n position: relative;\n top: 1px;\n }\n}\n\n\n// Extra overrides for modal nav\n.modal-menu {\n margin: @line-height-computed 0px;\n padding: 0px;\n}\n\n.modal-menu>li {\n margin: @line-height-computed / 3 0px;\n padding: 0px;\n\n list-style: none;\n}\n\n\n// Bump min dropdown width to 210px\n.dropdown-menu {\n width: 210px;\n}\n\n\n// Dropdown footer\n.dropdown-menu .dropdown-footer {\n padding: 6px 20px;\n}\n\n\n// Dropdown buttons container\n.dropdown-menu .dropdown-buttons {\n padding: 2px 20px;\n padding-bottom: 7px;\n\n .btn {\n margin: 4px 0px;\n }\n}\n\n\n// Navbar's dropdown\n.mobile-dropdown {\n position: relative;\n}\n\n.mobile-dropdown.open>.dropdown-menu, .compact-nav.open>.dropdown-menu {\n border: none;\n border-radius: 0;\n\n display: block;\n margin: 0px;\n width: 100%;\n}\n\n\n// Guest menu\n.user-dropdown .guest-preview {\n text-align: center;\n\n .row {\n margin: 0px;\n }\n}\n\n\n// User menu\n.navbar .user-dropdown {\n width: 240px;\n}\n\n.user-dropdown .dropdown-header {\n padding: 6px 20px;\n\n font-size: @font-size-large;\n\n strong {\n font-weight: normal;\n }\n}\n\n\n// Category picker\n.category-picker .dropdown-menu {\n // Make category picker wider on desktops\n @media screen and (min-width: @screen-md-min) {\n width: 300px;\n }\n}\n\n.category-picker .dropdown-menu>li>.btn-link {\n white-space: normal;\n word-wrap: break-word;\n}\n\n\n// Stick to bottom on mobile\n@media screen and (max-width: @screen-xs-max) {\n .dropdown-menu.stick-to-bottom {\n border-radius: 0px;\n border: none;\n\n max-height: 300px;\n overflow-y: auto;\n\n .box-shadow(0px 0px @line-height-computed * 1.5 @gray-light);\n\n clear: both;\n top: auto;\n width: 100%;\n\n position: fixed;\n bottom: 0px;\n\n margin: 0px;\n padding: 0px;\n\n padding-bottom: @line-height-computed;\n\n li {\n float: none;\n\n margin: 0px;\n\n clear: both;\n\n &>a, &>.btn {\n padding-top: @line-height-computed * 0.75;\n padding-bottom: @line-height-computed * 0.75;\n\n border-bottom: 1px solid @dropdown-divider-bg;\n }\n }\n }\n}","// Category label is category on threads list\n.category-label {\n border-radius: .25em;\n padding: .2em .6em .3em;\n}\n\n.category-label-color,\n.category-label-color:link,\n.category-label-color:focus,\n.category-label-color:active,\n.category-label-color:visited,\n.category-label-color:hover {\n color: @category-label-color;\n}\n\n.category-label-no-color,\n.category-label-no-color:link,\n.category-label-no-color:focus,\n.category-label-no-color:active,\n.category-label-no-color:visited,\n.category-label-no-color:hover {\n background-color: @category-label-default-bg;\n color: @category-label-default-color;\n}","//\n// Search Dropdown\n// --------------------------------------------------\n\n\n// Default size and position for search dropdown\n.navbar-misago .dropdown-menu.dropdown-search-results {\n margin: 0px;\n padding-top: 0px;\n width: 400px;\n left: auto;\n right: 0px;\n}\n\n\n// Search input\n.dropdown-search-results .form-group {\n margin: 0px;\n padding: @padding-base-horizontal;\n}\n\n\n// Message\nli.dropdown-search-message {\n text-align: center;\n}\n\n\n// Thread result\n.dropdown-search-thread {\n width: 100%;\n\n h5 {\n margin: 0px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n small {\n display: block;\n margin: 0px;\n margin-top: 4px;\n }\n}","//\n// Page Header\n// --------------------------------------------------\n\n\n// Common styles\n.page-header-bg {\n margin-bottom: @line-height-computed;\n}\n\n.page-header {\n margin: 0px;\n padding: @line-height-computed * 2 0px;\n\n h1 {\n margin: 0px;\n\n word-wrap: break-word;\n }\n\n .btn-aligned {\n float: right;\n margin-left: 8px;\n\n &.pull-left {\n margin-left: 0px;\n margin-right: 8px;\n }\n }\n\n @media screen and (min-width: @screen-md-min) {\n .container>.row {\n h1 {\n margin-top: -3px;\n }\n\n .row {\n margin-top: @padding-small-vertical;\n }\n }\n }\n}\n\n\n// Small displays\n@media screen and (max-width: @screen-sm-max) {\n .container {\n h1 {\n font-size: @font-size-large * 1.25;\n }\n\n .btn-icon {\n .material-icon {\n width: 24px;\n height: 24px;\n\n margin: -3px 0px;\n\n font-size: 24px;\n line-height: 24px;\n }\n }\n }\n}\n\n\n// Breadcrumbs\n.page-breadcrumbs {\n margin-bottom: @line-height-computed;\n}\n\n.page-breadcrumbs .breadcrumb {\n background: none;\n margin: 0px;\n margin-top: @line-height-computed * -1;\n padding: 0px;\n overflow: auto;\n}\n\n.page-breadcrumbs .breadcrumb li {\n &, &:before {\n display: block;\n float: left;\n }\n\n &:before {\n margin-left: 4px;\n }\n}\n\n\n// Small go back button\n.go-back-sm {\n margin-top: @line-height-computed * -1;\n margin-bottom: @line-height-computed;\n\n .material-icon {\n height: @font-size-large;\n width: @font-size-large;\n\n font-size: @font-size-large;\n line-height: @font-size-large;\n\n position: relative;\n top: -1px;\n }\n}\n\n.page-breadcrumbs .go-back-sm {\n margin-bottom: 0px;\n}\n\n// Stats\n.header-stats {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed * -1;\n}\n\n.header-stats .list-inline {\n margin-bottom: 0px;\n}\n\n.header-stats .list-inline li {\n margin-bottom: 0px;\n margin-right: 8px;\n overflow: auto;\n vertical-align: top; // fix #834\n\n .status-icon {\n width: 18px;\n height: 18px;\n\n margin-right: 4px;\n\n position: relative;\n bottom: 1px;\n\n font-size: 18px;\n line-height: 18px;\n }\n\n &>.material-icon, &>.icon-legend {\n float: left;\n }\n\n &>.material-icon {\n margin-right: 4px;\n\n position: relative;\n top: 3px;\n }\n}\n\n@media screen and (max-width: @screen-sm-max) {\n .header-stats .list-inline {\n font-size: @font-size-small;\n\n li>.material-icon {\n top: 2px;\n }\n }\n}\n\n\n// Tabs\n.page-header .page-tabs {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed * -2;\n\n}\n \n.page-header .page-tabs .nav {\n &>li {\n margin: 0px;\n\n &>a {\n border-radius: 0px;\n }\n }\n}\n\n.page-tabs {\n ul {\n display: block;\n overflow-x: auto;\n\n white-space: nowrap;\n\n li, a {\n display: inline-block;\n float: none;\n \n white-space: nowrap;\n\n .material-icon {\n margin-right: @padding-base-horizontal / 2;\n }\n }\n }\n\n @media screen and (max-width: @screen-xs-max) {\n .container {\n padding-left: 0px;\n padding-right: 0px;\n }\n\n li a {\n padding-left: @line-height-computed * 1.33;\n padding-right: @line-height-computed * 1.33;\n }\n }\n}\n\n\n// Insert blank space between tabs and details on smallest displays\n@media screen and (max-width: @screen-xs-max) {\n .header-stats + .page-tabs {\n margin-top: @line-height-computed * 1.5;\n }\n}\n\n\n// Title edit form\n.title-edit-form {\n margin-bottom: @line-height-computed / 2 + 2px;\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Messages\n@media screen and (max-width: @screen-sm-max) {\n .panel-message-body {\n text-align: center;\n\n .message-icon {\n margin: @line-height-computed * 1.5;\n\n .material-icon {\n font-size: @message-page-icon-size * 2;\n }\n }\n }\n}\n\n\n// Full displays\n@media screen and (min-width: @screen-md-min) {\n .panel-message-body {\n padding: @line-height-computed;\n padding-bottom: @line-height-computed * 1.5;\n\n .message-icon {\n float: left;\n\n .material-icon {\n font-size: @line-height-computed * 2.5;\n }\n }\n\n .message-body {\n margin-left: @line-height-computed * 3.25;\n margin-top: @line-height-computed * .6 - 2px;\n\n .lead {\n margin-bottom: 0px;\n }\n\n .help-block {\n margin-top: @line-height-computed * .66;\n }\n }\n }\n}\n\n\n// Loading\n.panel-body-loading {\n padding: 0px;\n\n text-align: center;\n}","//\n// Forum Footer\n// --------------------------------------------------\n\n\n// Superbasic spacing and layout for easy overriding\n.misago-footer {\n margin-top: @line-height-computed * 1.5;\n margin-bottom: @line-height-computed * 2.5;\n\n .footer-content {\n border-top: 1px solid @page-header-border-color;\n padding-top: @line-height-computed * 1.5;\n }\n}\n\n\n// Position \"enable JS!\" message's icon\n.misago-footer .noscript-message .material-icon {\n position: relative;\n bottom: 1px;\n\n font-size: @font-size-large;\n}\n","//\n// UI Preview\n// --------------------------------------------------\n\n\n// Animation\n.ui-preview {\n color: @ui-preview;\n\n .animation(ui-preview-animation @ui-preview-frequency linear infinite);\n}\n\n@keyframes ui-preview-animation {\n 0% {\n .opacity(@ui-preview-in);\n }\n 50% {\n .opacity(@ui-preview-out);\n }\n 100% {\n .opacity(@ui-preview-in);\n }\n}\n\n\n// Text\n.ui-preview-text {\n background: @ui-preview;\n border-radius: 100px;\n display: inline-block;\n height: @font-size-base;\n\n position: relative;\n top: (@line-height-computed - @font-size-base) / 2;\n}\n\n\n.ui-preview-paragraph {\n .ui-preview-text {\n margin-right: 6px;\n\n &:last-child {\n margin-right: 0px;\n }\n }\n}\n\n\n// Image\n.ui-preview-img {\n background: @ui-preview;\n border-radius: @border-radius-base + 1px\n}","//\n// Misago pager\n// --------------------------------------------------\n\n\n.pager-undercontent {\n margin-top: @line-height-computed * -1;\n}\n\n\n// \"Load more\" button\n.pager-more {\n text-align: center;\n}\n\n// Large displays\n@media screen and (min-width: @screen-md-min) {\n .pager-more .btn {\n padding-left: @line-height-computed;\n padding-right: @line-height-computed;\n }\n}","//\n// Misago pagination\n// --------------------------------------------------\n\n\n.misago-pagination {\n overflow: auto;\n\n .pagination {\n float: left;\n margin: 0px;\n margin-right: @line-height-computed / 2;\n\n li>a, li>span {\n padding: 2px; // 28 px + Xpx = 30px\n }\n\n .material-icon {\n width: 28px;\n height: 28px;\n\n font-size: 28px;\n line-height: 28px;\n }\n }\n\n p {\n float: left;\n margin: 0px;\n padding: @padding-base-vertical + 1px;\n }\n}","//\n// Poll\n// --------------------------------------------------\n\n\n.panel-poll h2 {\n margin-top: 0px;\n}\n\n.poll-select-choice .btn {\n &, &:active, &:focus, &:hover {\n background: transparent;\n border: transparent;\n .box-shadow(none);\n\n margin: @padding-base-vertical 0px;\n padding: 0px;\n padding-left: @padding-base-vertical;\n\n outline: none;\n\n text-align: left;\n }\n\n .material-icon {\n margin-right: @padding-base-vertical;\n\n height: 28px;\n width: 28px;\n\n font-size: 28px;\n line-heigh: 28px;\n\n color: darken(@gray-lighter, 10%);\n }\n\n &.btn-selected .material-icon {\n color: @brand-primary;\n }\n}\n\n.poll-help {\n font-size: @font-size-small;\n}\n\n.poll-chart-selected .material-icon {\n margin-right: 4px;\n\n position: relative;\n bottom: 1px;\n\n height: 14px;\n width: 14px;\n\n color: @brand-success;\n font-size: 14px;\n line-heigh: 14px;\n}\n\n.poll-options {\n margin-bottom: 0px;\n \n @media screen and (max-width: @screen-xs-max) {\n margin-top: @padding-base-vertical * -1;\n\n .btn {\n margin: @padding-base-vertical 0px;\n }\n }\n}","//\n// Misago User Status\n// --------------------------------------------------\n\n\n// Colors\n.user-status {\n &.user-banned .status-icon {\n color: @user-status-banned;\n }\n\n &.user-online .status-icon {\n color: @user-status-online;\n }\n\n &.user-offline .status-icon {\n color: @user-status-offline;\n }\n}","//\n// User Card\n// --------------------------------------------------\n\n\n// Center card's content on larger displays\n.user-card {\n @media screen and (min-width: @screen-sm-min) {\n text-align: center;\n }\n}\n\n\n// Max out small avatar's width\n.user-card-small-avatar img {\n width: 100%;\n height: auto;\n}\n\n// Toggle avatar visibility\n@media screen and (min-width: @screen-sm-min) {\n .user-card-small-avatar {\n display: none;\n }\n}\n\n@media screen and (max-width: @screen-xs-max) {\n .user-card-avatar {\n display: none;\n }\n}","//\n// Misago Toolbar\n// --------------------------------------------------\n\n\n.toolbar {\n display: block;\n min-height: 34px;\n margin-bottom: @line-height-computed;\n\n &.toolbar-bottom {\n margin-top: @padding-large-vertical;\n margin-bottom: @line-height-computed;\n }\n\n &>h3 {\n font-size: @font-size-large;\n }\n\n &>p {\n padding: @padding-base-vertical 0px;\n\n text-align: center;\n }\n}\n\n\n// Full displays\n@media screen and (min-width: @screen-md-min) {\n .toolbar-left {\n float: left;\n margin-right: @padding-large-horizontal;\n }\n\n .toolbar-right {\n float: right;\n margin-left: @padding-large-horizontal;\n }\n\n .toolbar {\n .toolbar-control, .toolbar-bottom>.form-control {\n margin: 0px;\n width: auto;\n }\n\n &>p, &>h3 {\n min-height: @input-height-base;\n margin: 0px;\n padding-top: @padding-base-vertical;\n\n text-align: left;\n }\n\n &>p {\n padding-top: @padding-base-vertical + 1px;\n }\n }\n}\n\n\n// Toolbar spacing utils\n.row-toolbar .toolbar-vertical-spacer {\n margin-top: @line-height-computed / 2;\n}\n\n.row-toolbar-bottom-margin {\n margin-bottom: @line-height-computed;\n}\n\n\n// even some paddings in row with buttons\n@media screen and (min-width: @screen-sm-min) {\n .row-toolbar p {\n padding-top: @padding-base-vertical + 1px;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\nabbr {\n border: none !important;\n}\n\n\n.item-title {\n color: @text-color;\n font-weight: bold;\n text-decoration: none;\n}\n\na.item-title {\n &:link, &:active, &:visited, &:hover {\n color: @text-color;\n font-weight: bold;\n }\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n\n.message-line {\n text-align: center;\n\n .material-icon {\n margin-right: @line-height-computed / 3;\n\n font-size: 20px;\n line-height: 20px;\n\n height: 20px;\n width: 20px;\n }\n}","//\n// Markup styles\n// --------------------------------------------------\n\n\n// Force word wrap for user text\n.misago-markup {\n h1, h2, h3, h4, h5, h6, p {\n word-wrap: break-word;\n }\n}\n\n\n// Add upper margins for headers\n.misago-markup {\n h1, h2, h3, h4, h5, h6 {\n margin-top: @line-height-computed * 2;\n }\n}\n\n\n// Even out blocks\n.misago-markup>*, .misago-markup blockquote>* {\n margin: @line-height-computed 0px;\n\n &:first-child {\n margin-top: 0px;\n }\n\n &:last-child {\n margin-bottom: 0px;\n }\n}\n\n\n// Downscale images so they don't expand area\n.misago-markup img {\n max-width: 100%;\n max-height: 500px;\n}\n\n\n// Make quotes stand out a little\n.misago-markup .quote-block,\n.misago-markup blockquote {\n background: @gray-lighter;\n border: none;\n\n font-size: @font-size-base;\n\n .quote-heading {\n border-bottom: 1px solid darken(@gray-lighter, 8%);\n padding: (@line-height-computed / 2) @line-height-computed;\n\n font-size: @font-size-small;\n font-weight: bold;\n }\n}\n\n.misago-markup>.quote-block,\n.misago-markup>blockquote {\n border: 1px solid darken(@gray-lighter, 8%);\n}\n\n.misago-markup .quote-body {\n background: @body-bg;\n margin: 0px;\n padding: @line-height-computed;\n\n &>.quote-block, &>blockquote {\n border: 1px solid darken(@gray-lighter, 8%);\n }\n}\n\n\n// Style spoilers\n.misago-markup .spoiler-block {\n background: @gray-lighter;\n border: none;\n\n font-size: @font-size-base;\n}\n\n.misago-markup>.spoiler-block {\n border: 1px solid darken(@gray-lighter, 8%);\n position: relative;\n}\n\n.misago-markup .spoiler-body {\n background: @body-bg;\n margin: 0px;\n padding: @line-height-computed;\n}\n\n.misago-markup .spoiler-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: @body-bg;\n}\n\n .misago-markup .spoiler-block.revealed .spoiler-overlay {\n display: none;\n }\n\n// Add bullets to lists\n.misago-markup ul {\n list-style-type: square;\n\n li {\n list-style-type: square;\n }\n}\n\n.misago-markup ol {\n list-style-type: decimal;\n\n li {\n list-style-type: decimal;\n }\n}\n\n\n// Expand code blocks a little\n.misago-markup pre {\n background: #eee;\n border: none;\n padding: @padding-large-vertical;\n overflow: hidden;\n\n color: #000;\n\n code.hljs {\n margin: @padding-large-vertical * -1;\n padding: ((@line-height-computed - 1) / 2);\n }\n}\n","//\n// Change Avatar Modal\n// --------------------------------------------------\n\n\n// Index\n.modal-change-avatar .modal-avatar-index {\n .avatar-preview {\n border-radius: @border-radius-large;\n margin: 0px auto;\n overflow: hidden;\n position: relative;\n\n width: 200px;\n height: 200px;\n\n .loader {\n display: none;\n\n position: absolute;\n top: 50px;\n height: 100px;\n\n .loader-spinning-wheel {\n border-width: 10px;\n border-color: #fff;\n border-left-color: transparent;\n border-right-color: transparent;\n\n width: 100px;\n height: 100px;\n }\n }\n\n &.preview-loading {\n img {\n .opacity(0.33);\n }\n\n .loader {\n display: block;\n }\n }\n\n @media (max-width: (@grid-float-breakpoint - 1)) {\n margin-bottom: @line-height-computed;\n\n width: 150px;\n height: 150px;\n\n img {\n width: 150px;\n height: 150px;\n }\n\n .loader {\n top: 25px;\n height: 100px;\n\n .loader-spinning-wheel {\n width: 100px;\n height: 100px;\n }\n }\n }\n }\n\n .btn {\n text-align: left;\n }\n}\n\n\n// Upload\n.modal-change-avatar .modal-avatar-upload {\n text-align: center;\n\n .btn-pick-file {\n background: transparent;\n border: 2px solid @gray-lighter;\n border-radius: @border-radius-large;\n padding: @padding-large-vertical @padding-large-horizontal * 1.5;\n .box-shadow(none);\n\n color: @gray-light;\n font-size: @font-size-large;\n text-align: center;\n\n &>.material-icon {\n display: block;\n margin: 0px auto;\n margin-bottom: @line-height-computed * .66;\n\n font-size: @line-height-computed * 2.5;\n width: @line-height-computed * 2.5;\n height: @line-height-computed * 2.5;\n }\n\n &:hover, &:active {\n border-color: @brand-primary;\n color: @brand-primary;\n }\n }\n\n .text-muted {\n margin-top: @line-height-computed * 0.66;\n }\n\n .upload-progress {\n img {\n border-radius: @border-radius-base;\n margin-bottom: @line-height-computed;\n\n max-height: 80px;\n width: auto;\n }\n\n .progress {\n width: 70%;\n margin: 0px auto;\n }\n }\n}\n\n\n// Crop\n.modal-avatar-crop .crop-form {\n margin: 0px auto;\n\n .cropit-image-zoom-input {\n margin-top: @line-height-computed / 2;\n\n // removes default webkit styles\n -webkit-appearance: none;\n\n // fix for FF unable to apply focus style bug\n border: 1px solid white;\n\n // required for proper track sizing in FF\n width: 100%;\n\n &::-webkit-slider-runnable-track {\n width: 100%;\n height: 8px;\n background: @gray-lighter;\n border: none;\n border-radius: 3px;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n border: none;\n height: 20px;\n width: 20px;\n border-radius: 50%;\n background: @gray-light;\n margin-top: -6px;\n }\n\n &:focus {\n outline: none;\n }\n\n &:focus::-webkit-slider-runnable-track {\n background: @gray-lighter;\n }\n\n &::-moz-range-track {\n width: 100%;\n height: 8px;\n background: @gray-lighter;\n border: none;\n border-radius: 4px;\n }\n\n &::-moz-range-thumb {\n border: none;\n height: 20px;\n width: 20px;\n border-radius: 50%;\n background: @gray-light;\n }\n\n /*hide the outline behind the border*/\n &:-moz-focusring{\n outline: 1px solid white;\n outline-offset: -1px;\n }\n\n &::-ms-track {\n width: 100%;\n height: 8px;\n\n /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */\n background: transparent;\n\n /*leave room for the larger thumb to overflow with a transparent border */\n border-color: transparent;\n border-width: 8px 0;\n\n /*remove default tick marks*/\n color: transparent;\n }\n\n &::-ms-fill-lower {\n background: @gray-lighter;\n border-radius: 16px;\n }\n\n &::-ms-fill-upper {\n background: @gray-lighter;\n border-radius: 16px;\n }\n\n &::-ms-thumb {\n border: none;\n height: 20px;\n width: 20px;\n border-radius: 50%;\n background: @gray-light;\n }\n\n &:focus::-ms-fill-lower {\n background: @gray-lighter;\n }\n\n &:focus::-ms-fill-upper {\n background: @gray-lighter;\n }\n }\n}\n\n\n// Gallery\n.modal-change-avatar .modal-avatar-gallery {\n padding-bottom: 0px;\n\n .avatars-gallery {\n margin-bottom: @line-height-computed;\n\n h3 {\n margin-top: 0px;\n }\n }\n\n .avatars-gallery-images {\n .row {\n margin-bottom: @line-height-computed / 2;\n }\n\n .btn {\n border-radius: @border-radius-base + 2px;\n border: 2px solid @gray-lighter;\n background: none;\n padding: 2px;\n position: relative;\n\n &:hover, &:focus {\n border-color: @gray-light;\n }\n\n &.avatar-selected, &:active {\n border-color: @link-color;\n }\n\n img {\n border-radius: @border-radius-base;\n width: 100%;\n height: auto;\n }\n }\n }\n}","//\n// Categories Lists\n// --------------------------------------------------\n\n\n// Category Block\n// --------------------------------------------------\n\n// Thread unread state icon\n.category-main .read-status .material-icon {\n color: @category-read-color;\n}\n\n.category-main .read-status.item-new .material-icon {\n color: @category-new-color;\n}\n\n\n// Last thread\n.category-last-thread .media-heading {\n a {\n display: inline-block;\n overflow: hidden;\n\n white-space: nowrap;\n width: 290px; // md-3 - avatar column\n\n text-overflow: ellipsis;\n vertical-align: top;\n\n @media screen and (max-width: @screen-sm-max) {\n width: 275px; // md-3 - avatar column\n }\n\n @media screen and (max-width: @screen-xs-max) {\n width: 260px; // md-3 - avatar column\n }\n }\n}\n\n\n// Last thread message\n.category-thread-message {\n .material-icon {\n width: 28px;\n height: 28px;\n\n font-size: 28px;\n line-height: 28px;\n }\n\n p {\n margin: 0px;\n }\n}\n\n\n// Subcategories list\n// --------------------------------------------------\n.list-inline.subcategories-list {\n overflow: auto;\n margin-top: @line-height-computed / -2;\n\n li {\n display: block;\n float: left;\n\n a, a:link, a:visited, a:active, a:hover, a:focus {\n background-color: @gray-lighter;\n border: 1px solid darken(@gray-lighter, 5%);\n border-radius: @border-radius-base;\n display: inline-block;\n margin-top: @line-height-computed / 2;\n padding: @padding-base-vertical @padding-base-horizontal;\n\n color: @gray;\n }\n\n &:focus, a:hover, a:active {\n background-color: darken(@gray-lighter, 5%);\n\n color: @text-color;\n text-decoration: none;\n }\n }\n}\n\n.row.subcategories-list {\n .btn {\n margin-top: @line-height-computed;\n\n text-align: left;\n }\n}","//\n// Posting\n// --------------------------------------------------\n\n// Affix and style placeholder\n#posting-placeholder {\n background-color: @gray-lighter;\n display: none;\n margin-top: @line-height-computed * 1.5;\n margin-bottom: @line-height-computed * -1.5;\n padding: @line-height-computed 0px;\n\n transition: height 300ms;\n\n &.slide-in {\n display: block;\n }\n}\n\n\n// First row\n#posting-placeholder .first-row {\n margin-bottom: @line-height-computed;\n\n .form-control {\n border: 1px solid darken(@gray-lighter, 15%);\n }\n\n .posting-options {\n .btn {\n padding-top: 4px;\n padding-bottom: 4px;\n\n .btn-text {\n margin-left: @line-height-computed / 4;\n\n position: relative;\n top: 1px;\n }\n }\n\n .material-icon {\n width: 14px;\n height: 24px;\n\n margin-right: 0px;\n \n position: relative;\n top: 5px;\n\n font-size: 14px;\n line-height: 14px;\n text-align: center;\n }\n }\n}\n\n\n// Posting ui preview\n.posting-ui-preview {\n padding: @line-height-computed 0px;\n position: relative;\n\n .form-control {\n box-shadow: none;\n resize: none;\n }\n}\n\n\n// Posting Loader\n.posting-loader {\n text-align: center;\n}\n\n.posting-loader .loader {\n height: 100px;\n\n .loader-spinning-wheel {\n width: 100px;\n height: 100px;\n }\n}\n\n\n// Posting message\n@posting-icon-width: 28px;\n\n.posting-message {\n text-align: center;\n\n .material-icon {\n margin-right: @line-height-computed / 3;\n position: relative;\n top: -1px;\n\n width: @posting-icon-width;\n height: @posting-icon-width;\n\n font-size: @posting-icon-width;\n line-height: @posting-icon-width;\n }\n\n .message-body {\n p {\n font-size: @font-size-large;\n }\n }\n}\n","//\n// Editor\n// --------------------------------------------------\n\n@editor-border: darken(@gray-lighter, 15%);\n\n.editor-border {\n background-color: #fff;\n border: 1px solid @editor-border;\n border-radius: @border-radius-base;\n}\n\n.editor-border .form-control {\n // remove border and resizing\n border: none;\n resize: none;\n\n // remove shadow from control\n &, &:focus, &:active {\n .box-shadow(none);\n }\n}\n\n\n// Footer styles\n.editor-footer {\n border-top: 1px solid @editor-border;\n padding: @padding-base-vertical @padding-base-horizontal;\n overflow: auto;\n\n .pull-left {\n margin-right: @padding-base-horizontal;\n }\n\n .pull-right {\n margin-left: @padding-base-horizontal;\n }\n\n .btn-icon .material-icon {\n margin-bottom: -2px;\n }\n\n\n // center buttons on small devices\n @media screen and (max-width: @screen-sm-max) {\n .buttons-list {\n float: none !important;\n\n margin: 0px;\n margin-bottom: @line-height-computed / 2;\n\n .btn {\n display: inline-block;\n float: none !important;\n\n margin: @line-height-computed / 3;\n }\n }\n\n .btn-protect {\n .btn-text {\n margin-left: @padding-small-horizontal;\n }\n\n .material-icon {\n position: relative;\n bottom: 2px;\n\n width: 14px;\n height: 14px;\n\n font-size: 14px;\n line-height: 14px;\n }\n }\n }\n}\n\n@media screen and (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .buttons-list .btn {\n &:first-child {\n margin-left: 0px;\n }\n }\n}\n\n// make lock button full width\n@media screen and (max-width: @screen-xs-max) {\n .buttons-list {\n text-align: center;\n\n .btn-protect {\n display: block;\n float: none !important;\n\n width: 100%;\n\n margin: 0px;\n margin-top: @line-height-computed / 2;\n }\n }\n}\n\n\n// Attachments list\n.editor-attachments-list {\n margin: 0px;\n padding: 0px;\n\n li {\n margin: 0px;\n }\n}\n\n.editor-attachment-complete {\n border-top: 1px solid @editor-border;\n padding: @padding-base-vertical 0px;\n padding-right: @padding-base-horizontal;\n\n .editor-attachment-image {\n float: left;\n width: 50px;\n\n a {\n background-size: cover;\n background-position: center;\n border-radius: @border-radius-small;\n display: block;\n\n margin: 0px auto;\n width: 36px;\n height: 36px;\n }\n }\n\n .editor-attachment-icon {\n float: left;\n width: 50px;\n\n text-align: center;\n\n .material-icon {\n position: relative;\n top: 2px;\n\n height: 28px;\n width: 28px;\n\n font-size: 28px;\n line-height: 28px;\n }\n }\n\n .editor-attachment-details {\n margin-left: 50px;\n\n h4, p {\n margin: 0px;\n padding: 0px;\n\n font-size: @font-size-base;\n }\n\n p {\n margin-top: @padding-base-vertical / 2;\n\n color: @gray-light;\n font-size: @font-size-small;\n }\n\n abbr {\n white-space: nowrap;\n }\n }\n}\n\n\n.editor-attachment-actions {\n @media screen and (min-width: @screen-sm-min) {\n padding-top: 3px;\n }\n\n @media screen and (max-width: @screen-xs-max) {\n padding-left: @padding-base-horizontal;\n padding-right: @padding-base-horizontal;\n }\n}\n\n\n.editor-attachment-error {\n border-top: 1px solid @editor-border;\n padding: @padding-base-vertical 0px;\n padding-right: @padding-base-horizontal;\n}\n\n.editor-attachment-error-icon {\n float: left;\n width: 50px;\n\n text-align: center;\n\n .material-icon {\n position: relative;\n top: 2px;\n\n height: 28px;\n width: 28px;\n\n font-size: 28px;\n line-height: 28px;\n }\n}\n\n.editor-attachment-error-message {\n margin-left: 50px;\n padding: @padding-base-vertical 0px;\n position: relative;\n\n h4, p {\n margin: 0px;\n padding: 0px;\n\n font-size: @font-size-base;\n }\n\n p {\n margin-top: @padding-base-vertical / 2;\n font-size: @font-size-small;\n }\n\n .btn {\n position: absolute;\n top: @padding-base-vertical + 3px;\n right: @padding-base-horizontal;\n \n @media screen and (max-width: @screen-xs-max) {\n display: block;\n\n margin-top: @line-height-computed / 2;\n\n position: static;\n }\n }\n}\n\n.editor-attachment-progress-bar {\n background: @editor-border;\n overflow: auto;\n}\n\n.editor-attachment-progress {\n background: @brand-primary;\n float: left;\n height: 1px;\n}\n\n.editor-attachment-upload-message {\n margin: 0px;\n padding: @padding-base-vertical @padding-base-horizontal;\n}\n\n\n// Hide file input outside of viewport\n#editor-upload-field {\n position: absolute;\n left: -1000px;\n top: -1000px;\n}\n\n\n// Scale avatar in at.js suggestion\n.atwho-view ul li img {\n border-radius: @border-radius-small;\n margin-right: @font-size-base / 3;\n\n width: @line-height-computed;\n height: @line-height-computed;\n}","//\n// Thread Participants\n// --------------------------------------------------\n\n.participant-card .btn-user,\n.participant-card .dropdown.open .btn-user {\n margin-bottom: @line-height-computed;\n\n &, &:hover, &:focus, &:focus:active {\n padding: 0px;\n\n overflow: hidden;\n\n text-align: left;\n }\n\n img {\n background-color: #fff;\n width: 34px;\n height: 34px;\n\n margin-right: 8px;\n }\n}\n\n// Panel copy\n.panel-participants p {\n margin: 0px;\n margin-top: @padding-base-vertical + 1px;\n}","//\n// Poll Editor\n// --------------------------------------------------\n\n\n.poll-choices-control {\n .list-group-item {\n padding: 0px;\n }\n\n .list-group-item .btn {\n background: transparent;\n border: transparent;\n float: left;\n margin: 0px 2px;\n margin-bottom: -29px;\n padding: 0px;\n width: 28px;\n height: 28px;\n\n position: relative;\n top: 3px;\n\n .material-icon {\n width: 28px;\n height: 28px;\n\n font-size: 28px;\n line-height: 28px;\n }\n }\n\n input {\n &, &:focus, &:active {\n background: transparent;\n border: none;\n .box-shadow(none);\n outline: none;\n margin-left: 30px;\n padding: @padding-base-vertical @padding-base-horizontal;\n width: 100%;\n }\n }\n}","//\n// Posts List\n// --------------------------------------------------\n\n\n// Remove paddings and margins from items list\n.posts-list {\n margin: 0px;\n padding: 0px;\n clear: both;\n\n li {\n list-style: none;\n margin: 0px;\n padding: 0px;\n }\n}","//\n// Posts List Post\n// --------------------------------------------------\n\n\n// Post side\n.post-side {\n font-size: @font-size-small;\n\n .media {\n margin: 0px;\n }\n\n .poster-avatar {\n height: 36px;\n width: 36px;\n\n @media screen and (min-width: @screen-md-min) {\n margin-top: 4px;\n\n height: 82px;\n width: 82px;\n }\n }\n\n .user-status {\n margin-right: 4px;\n }\n\n .media-heading {\n display: block;\n }\n\n .media-heading {\n margin: 0px;\n margin-top: -1px;\n\n font-size: @font-size-base;\n\n .user-status {\n margin-right: 0;\n margin-left: 2px;\n }\n }\n\n .pull-right {\n margin-left: @padding-large-horizontal;\n }\n\n // Lay user details vertically\n @media screen and (min-width: @screen-md-min) {\n .media-heading {\n margin-top: 3px;\n\n font-size: @font-size-large;\n\n .user-status {\n display: none;\n }\n }\n\n .user-title {\n margin-top: 4px;\n margin-bottom: 5px;\n }\n\n .user-postcount {\n display: block;\n }\n\n .user-status {\n display: block;\n }\n }\n}\n\n\n// Heading\n.post-heading {\n height: 36px;\n\n @media screen and (max-width: @screen-sm-max) {\n margin-top: @line-height-computed / 2;\n }\n\n .pull-right {\n margin-left: @padding-large-horizontal;\n }\n\n &>.btn-link {\n padding-left: 0px;\n padding-right: 0px;\n }\n\n .label {\n margin-top: 6px;\n\n font-size: @font-size-base;\n font-weight: normal;\n }\n\n .label-unread {\n background-color: @brand-success;\n\n color: #fff;\n }\n}\n\n\n// Move controls up\n@media screen and (min-width: @screen-md-min) {\n .post-side .pull-right {\n display: none;\n }\n}\n\n@media screen and (max-width: @screen-sm-max) {\n .post-heading .pull-right {\n display: none;\n }\n}\n\n\n// Body\n.post-body {\n padding-top: @line-height-computed;\n padding-bottom: @line-height-computed * 1.5;\n}\n\n\n// Status\n.post-status-message {\n overflow: auto;\n\n .material-icon {\n float: left;\n\n font-size: 28px;\n line-height: 28px;\n }\n\n p {\n margin: 0px;\n margin-top: (28px - @line-height-computed) / 2;\n margin-left: 36px;\n }\n}\n\n\n.post-status-best-answer {\n background-color: @brand-success;\n\n color: #fff;\n}\n\n\n.post-status-hidden {\n background-color: @brand-danger;\n\n color: #fff;\n}\n\n\n.post-status-unapproved {\n background-color: @brand-primary;\n\n color: #fff;\n}\n\n\n.post-status-protected {\n background-color: @gray;\n\n color: #fff;\n}\n\n\n// Footer\n.post-footer {\n .pull-left {\n margin-right: @padding-large-horizontal;\n }\n\n .pull-right {\n margin-left: @padding-large-horizontal;\n }\n\n p {\n padding-top: 7px;\n padding-bottom: 6px;\n margin-bottom: 0px;\n }\n}\n\n\n// Attachments\n.post-attachments {\n @post-preview-width: 40px;\n\n border-top: 1px solid @gray-lighter;\n padding: @padding-base-vertical @padding-large-horizontal;\n\n abbr {\n white-space: nowrap;\n }\n\n .attachment-name {\n word-wrap: break-word;\n }\n\n .row>div {\n margin: @padding-large-vertical 0px;\n }\n\n .post-attachment-preview {\n float: left;\n height: @post-preview-width;\n width: @post-preview-width;\n\n text-align: center;\n }\n\n .post-attachment {\n margin-left: @post-preview-width + 12px;\n }\n\n .post-thumbnail {\n display: block;\n background-size: cover;\n background-position: center;\n border-radius: @border-radius-small;\n width: @post-preview-width;\n height: @post-preview-width;\n }\n\n .material-icon {\n width: 28px;\n height: 28px;\n\n position: relative;\n top: 5px;\n\n font-size: 28px;\n line-height: 28px;\n\n &:link, &:active, &:visited, &:hover, &:focus {\n color: @gray-darker;\n text-decoration: none;\n }\n }\n\n .post-attachment-description {\n margin: 0px;\n padding: 0px;\n\n color: @text-muted;\n font-size: @font-size-small;\n }\n}","//\n// Post Feed\n// --------------------------------------------------\n\n\n.post-feed .post-side {\n .media-heading {\n margin: 0px;\n\n font-size: @font-size-base;\n }\n\n .user-title {\n margin: 0px;\n\n font-size: @font-size-small;\n }\n}\n\n.post-feed .post-side .btn {\n display: inline-block;\n}\n\n\n.post-feed .post-side img {\n margin-top: 0px;\n\n width: 36px;\n height: 36px;\n}\n\n.post-feed .post-heading {\n height: auto;\n margin: @line-height-computed / 2 0px;\n}\n\n.post-feed .post-heading .btn {\n margin-right: @padding-large-horizontal;\n max-width: 100%;\n\n text-align: left;\n white-space: normal;\n word-wrap: break-word;\n}\n","//\n// Posts List Event\n// --------------------------------------------------\n\n\n// Event style\n.posts-list .event {\n margin-bottom: @line-height-computed;\n\n color: @text-muted;\n\n .media {\n margin-top: @line-height-computed / 4;\n }\n}\n\n\n// Event label\n.posts-list .event-label {\n .label-unread {\n background-color: @brand-success;\n\n color: #fff;\n }\n}\n\n// Event icon\n.posts-list .event .text-right {\n padding-right: 0px;\n\n text-align: right;\n\n .material-icon {\n margin-right: -12px;\n\n height: @event-icon-size;\n width: @event-icon-size;\n\n font-size: @event-icon-size;\n line-height: @event-icon-size;\n\n text-align: center;\n }\n}\n\n\n// Align event content with post's content\n.posts-list .event .text-left {\n padding-left: 24px;\n}\n\n\n// Event first and second rows\n.posts-list .event .event-message {\n margin-bottom: @line-height-computed / 4;\n\n font-size: @font-size-large;\n}\n\n.posts-list .event .event-info {\n margin: 0px;\n\n font-size: @font-size-small;\n\n li {\n margin-right: @padding-base-horizontal;\n\n &:last-child {\n margin-right: 0px;\n }\n }\n}\n\n\n// Event controls\n.posts-list .event .event-controls {\n .btn-link {\n border: 0px;\n margin: 0px;\n margin-right: @padding-base-horizontal;\n padding: 0px;\n\n font-size: @font-size-small;\n\n &:last-child {\n margin-right: 0px;\n }\n }\n}\n\n\n// Mobile tweaks\n@media screen and (max-width: @screen-xs-max) {\n .posts-list .event .text-right {\n width: @event-icon-size;\n\n text-align: right;\n }\n\n .posts-list .event .text-left:first-child {\n padding-left: 0px;\n }\n\n .posts-list .event .event-info {\n margin-top: @line-height-computed / 4;\n }\n\n .posts-list .event .event-controls {\n clear: both;\n margin-top: @line-height-computed / 4;\n\n .btn-link {\n margin-right: @line-height-computed;\n\n font-size: @font-size-base;\n\n &:last-child {\n margin-right: 0px;\n }\n }\n }\n}","//\n// Post Changelog Modal\n// --------------------------------------------------\n\n.post-changelog-diff {\n padding: 0px;\n margin: 0px;\n\n .list-unstyled {\n padding: 0px;\n margin: @padding-small-vertical 0px;\n }\n\n .diff-item {\n padding: @padding-small-vertical @padding-small-horizontal;\n }\n\n .diff-item-sub {\n color: @brand-danger;\n }\n\n .diff-item-add {\n color: @brand-success;\n }\n}\n\n\n.post-changelog-toolbar .row {\n margin-left: -12px;\n margin-right: -12px;\n}\n\n\n.post-changelog-toolbar .post-change-label {\n @media screen and (max-width: @screen-xs-max) {\n text-align: center;\n }\n}","//\n// Message Pages\n// --------------------------------------------------\n\n\n// Small displays\n@media screen and (max-width: @screen-xs-max) {\n .page-message, .page-error {\n .message-panel {\n text-align: center;\n }\n\n .message-icon {\n margin: @line-height-computed * 1.5;\n font-size: @message-page-icon-size;\n }\n }\n}\n\n\n// Full displays\n@media screen and (min-width: @screen-sm-min) {\n .page-message, .page-error {\n .message-panel {\n margin: @line-height-computed * 3 auto;\n max-width: @screen-md-max * .65;\n overflow: auto;\n }\n\n .message-icon {\n float: left;\n\n .material-icon {\n font-size: @message-page-icon-size;\n }\n }\n\n .message-body {\n margin-top: @message-page-icon-size / 5;\n margin-left: @message-page-icon-size + @line-height-computed;\n\n font-size: @font-size-large;\n\n p.lead {\n font-size: @font-size-large * 2;\n }\n }\n }\n}\n","//\n// Threads Lists\n// --------------------------------------------------\n\n\n.threads-list {\n margin-bottom: @line-height-computed;\n}\n\n\n// Make list row flexbox row\n.threads-list-item {\n display: flex;\n align-items: center;\n\n img {\n width: @thread-read-block-size;\n height: @thread-read-block-size;\n }\n}\n\n.threads-list-item-top-row {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n}\n\n.threads-list-item-bottom-row {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n// Thread icon\n.threads-list-item-col-icon {\n padding-right: @grid-gutter-width / 2;\n}\n\n.threads-list-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: @thread-read-block-size;\n height: @thread-read-block-size;\n\n border-radius: @border-radius-small;\n font-size: @thread-read-icon-size;\n line-height: @thread-read-icon-size;\n\n &:link, &:active, &:focus, &:hover, &:visited {\n background-color: @thread-read-icon-bg;\n color: @thread-read-icon-color;\n text-decoration: none;\n }\n}\n\n.threads-list-icon-new {\n &:link, &:active, &:focus, &:hover, &:visited {\n background-color: @thread-new-icon-bg;\n color: @thread-new-icon-color;\n }\n}\n\n// Thread title\n.threads-list-item-col-title {\n flex: 1;\n}\n\na.threads-list-item-title {\n &:link, &:active, &:focus, &:hover, &:visited {\n font-size: @threads-list-title-size;\n\n color: @thread-color;\n overflow-wrap: break-word;\n }\n}\n\na.threads-list-item-title-sm {\n font-size: @threads-list-title-size-sm;\n\n &:link, &:active, &:focus, &:hover, &:visited {\n color: @thread-read-color;\n overflow-wrap: break-word;\n }\n}\n\na.threads-list-item-title-new {\n &:link, &:active, &:focus, &:hover, &:visited {\n color: @thread-new-color;\n }\n}\n\n// Thread status flags\n.threads-list-item-col-flags {\n padding-left: @grid-gutter-width / 2;\n}\n\n.threads-list-item-flags {\n display: flex;\n align-items: center;\n\n opacity: @thread-flag-icon-opacity;\n\n margin: 0;\n padding: 0;\n\n li {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: @thread-flag-block-size;\n height: @thread-flag-block-size;\n\n border-radius: @border-radius-small;\n list-style-type: none;\n }\n\n li + li {\n margin-left: @grid-gutter-width / 4;\n }\n\n .material-icon {\n font-size: @thread-flag-icon-size;\n line-height: @thread-flag-icon-size;\n }\n}\n\n.threads-list-item:hover,\n.threads-list-item:focus {\n .threads-list-item-flags {\n opacity: @thread-flag-icon-opacity-hover;\n }\n}\n\n.threads-list-item-flag-pinned-globally {\n color: @thread-flag-pinned-globally-color;\n background: @thread-flag-pinned-globally-bg;\n}\n\n.threads-list-item-flag-pinned-locally {\n color: @thread-flag-pinned-locally-color;\n background: @thread-flag-pinned-locally-bg;\n}\n\n.threads-list-item-flag-answered {\n color: @thread-flag-answered-color;\n background: @thread-flag-answered-bg;\n}\n\n.threads-list-item-flag-poll {\n color: @thread-flag-poll-color;\n background: @thread-flag-poll-bg;\n}\n\n.threads-list-item-flag-unapproved {\n color: @thread-flag-unapproved-color;\n background: @thread-flag-unapproved-bg;\n}\n\n.threads-list-item-flag-closed {\n color: @thread-flag-closed-color;\n background: @thread-flag-closed-bg;\n}\n\n.threads-list-item-flag-hidden {\n color: @thread-flag-hidden-color;\n background: @thread-flag-hidden-bg;\n}\n\n// Thread category\n.threads-list-item-col-category {\n padding-left: @grid-gutter-width / 2;\n\n white-space: nowrap;\n}\n\n.threads-list-category-label {\n padding: 3px 6px;\n\n border-radius: @border-radius-small;\n\n font-size: @font-size-small;\n font-weight: bold;\n\n &, &:link, &:active, &:hover, &:focus, &:visited {\n color: @category-label-default-color;\n background: @category-label-default-bg;\n text-decoration: none;\n }\n\n &.threads-list-category-label-color {\n &, &:link, &:active, &:hover, &:focus, &:visited {\n color: #fff;\n background: var(--label-color);\n }\n }\n}\n\n.threads-list-item-parent-category {\n border-radius: @border-radius-small 0 0 @border-radius-small;\n margin-right: 2px;\n}\n\n.threads-list-item-parent-category + .threads-list-category-label {\n border-radius: 0 @border-radius-small @border-radius-small 0;\n}\n\n// Replies\n.threads-list-item-col-replies {\n width: 80px;\n padding-left: @grid-gutter-width / 2;\n}\n\n.threads-list-item-replies {\n display: flex;\n align-items: center;\n\n color: @thread-replies-color;\n font-size: @thread-replies-size;\n font-weight: bold;\n\n .material-icon {\n margin-right: @grid-gutter-width / 4;\n transform: matrix(-1, 0, 0, 1, 0, 0);\n }\n}\n\n// Last poster\n.threads-list-item-col-last-poster {\n padding-left: @grid-gutter-width / 2;\n\n img {\n border-radius: @border-radius-small;\n }\n}\n\n// Last activity\n.threads-list-item-col-last-activity {\n width: 120px;\n padding-left: @grid-gutter-width / 2;\n\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n a:link, a:hover, a:active, a:visited, a:focus {\n color: @thread-last-activity-color;\n font-size: @thread-last-activity-size;\n }\n}\n\n// Subscription and checkbox\n.threads-list-item-col-checkbox,\n.threads-list-item-col-subscription {\n padding-left: @grid-gutter-width / 2;\n}\n\n// Make list responsive\n.threads-list-item-title-sm,\n.threads-list-item-col-checkbox-sm {\n display: none;\n}\n\n@media (max-width: (@grid-float-breakpoint - 1)) {\n // Make card full-width\n .threads-list {\n margin-left: @grid-gutter-width * -.5;\n margin-right: @grid-gutter-width * -.5;\n\n .list-group, .list-group-item {\n border-radius: 0;\n border-left: 0;\n border-right: 0;\n }\n }\n\n // Use two rows per item\n .threads-list-item {\n display: block;\n\n // Make avatar same size as flag icons\n img {\n width: @thread-flag-block-size;\n height: @thread-flag-block-size;\n }\n }\n\n // Insert bottom marin to top row, align itss contents to top\n .threads-list-item-top-row {\n align-items: start;\n margin-bottom: @grid-gutter-width / 4;\n }\n\n // Make all cols in second row auto, align them to right\n .threads-list-item-bottom-row {\n justify-content: end;\n flex: 0;\n\n &>div {\n width: auto;\n padding: 0 0 0 @grid-gutter-width / 2;\n }\n }\n\n // Swap title with sm one\n .threads-list-item-title {\n display: none;\n }\n\n .threads-list-item-title-sm {\n display: inline-block;\n }\n\n // Make thread status and subscription icons disappear\n .threads-list-item-col-icon,\n .threads-list-item-col-subscription,\n .threads-list-item-col-checkbox {\n display: none;\n }\n\n // Reveal checkbox in top row, make it smol\n .threads-list-item-col-checkbox-sm {\n display: block;\n padding-left: @grid-gutter-width / 2;\n\n .btn-icon {\n padding: 4px;\n\n .material-icon {\n font-size: 16px;\n }\n }\n }\n}\n\n// Make thread buttons flash when thread is busy\n.threads-list-item-is-busy .btn-icon {\n opacity: .8;\n animation: busy .75s linear infinite;\n}\n\n@keyframes busy {\n 50% {\n opacity: .5;\n }\n}\n\n// Threads list update prompt\n.threads-list-update-prompt {\n padding: 0;\n}\n\n.threads-list-update-prompt-btn {\n padding: @padding-large-vertical @padding-large-horizontal;\n\n background: @update-threads-prompt-bg;\n color: @update-threads-prompt-color;\n border: none;\n border-radius: @list-group-border-radius @list-group-border-radius 0 0;\n}\n\n.threads-list-update-prompt-btn:hover,\n.threads-list-update-prompt-btn:focus {\n background: @update-threads-prompt-hover-bg;\n color: @update-threads-prompt-hover-color;\n}\n\n.threads-list-update-prompt-btn:active {\n background: @update-threads-prompt-active-bg;\n color: @update-threads-prompt-active-color;\n}\n","//\n// Active posters list\n// --------------------------------------------------\n\n\n\n// List layout\n.active-posters {\n li {\n display: block;\n overflow: auto;\n }\n}\n\n\n// User avatar\n.active-posters .rank-user-avatar {\n float: left;\n\n @media screen and (max-width: @screen-sm-max) {\n height: 42px; // even list item vertically\n\n img {\n width: 36px;\n height: 36px;\n\n position: relative;\n top: 3px;\n }\n }\n}\n\n\n// User\n.active-posters .rank-user {\n float: left;\n margin-top: 3px;\n\n @media screen and (max-width: @screen-sm-max) {\n margin-left: @line-height-computed * .66;\n width: 40%;\n }\n\n @media screen and (max-width: @screen-xs-max) {\n float: none;\n margin-left: 50px;\n width: auto;\n }\n\n @media screen and (min-width: @screen-md-min) {\n margin-left: @line-height-computed * .8;\n width: 25%;\n\n .user-name {\n font-size: @font-size-large;\n }\n }\n}\n\n\n// User details\n.active-posters .user-details {\n overflow: auto;\n\n font-family: Sans-Serif;\n\n .user-status, .rank-name, .user-title {\n display: block;\n float: left;\n margin-right: 3px;\n\n font-size: @font-size-small;\n\n @media screen and (min-width: @screen-md-min) {\n margin-right: 8px;\n }\n }\n\n .user-title {\n margin-right: 0px;\n }\n\n @media screen and (min-width: @screen-md-min) {\n overflow: visible;\n\n .rank-name, .user-title {\n height: 14px;\n overflow: hidden;\n\n position: relative;\n top: 1px;\n\n vertical-align: baseline;\n }\n }\n\n @media screen and (max-width: @screen-xs-max) {\n margin-top: @padding-base-vertical / 2;\n\n .rank-name, .user-title {\n font-weight: normal;\n }\n }\n}\n\n\n// User status\n.active-posters .user-status {\n overflow: auto;\n\n position: relative;\n top: 1px;\n\n span {\n display: block;\n float: left;\n }\n\n @media screen and (min-width: @screen-md-min) {\n height: 14px;\n overflow: hidden;\n }\n\n .status-icon {\n position: relative;\n\n @media screen and (max-width: @screen-sm-max) {\n top: 0px;\n\n width: 12px;\n height: 12px;\n\n font-size: 12px;\n line-height: 12px;\n }\n\n @media screen and (min-width: @screen-md-min) {\n top: 1px;\n\n margin-right: 3px;\n\n width: 13px;\n height: 13px;\n\n font-size: 13px;\n line-height: 13px;\n }\n }\n}\n\n\n// User status UI preview\n.active-posters {\n .status-label.ui-preview-text,\n .rank-name .ui-preview-text,\n .user-title .ui-preview-text {\n height: 11px;\n\n position: relative;\n top: 2px;\n\n font-size: 11px;\n line-height: 11px;\n }\n\n // even rank/title preview with status\n .rank-name, .user-title {\n .ui-preview-text {\n position: static;\n }\n }\n}\n\n\n// Rank stats\n.active-posters {\n .rank-position, .rank-posts-counted, .rank-posts-total {\n strong, small {\n display: block;\n }\n\n @media screen and (max-width: @screen-sm-max) {\n overflow: auto;\n\n strong, small {\n float: left;\n\n font-size: @font-size-base * .75;\n }\n\n strong {\n min-width: 30px;\n margin-right: 3px;\n\n text-align: right;\n }\n\n .ui-preview-text {\n height: 8px;\n\n position: relative;\n top: -1px;\n\n font-size: 8px;\n line-height: 8px;\n }\n }\n\n @media screen and (min-width: @screen-md-min) {\n float: left;\n margin-top: 3px;\n width: 23%;\n\n font-size: @font-size-large;\n text-align: center;\n\n small {\n font-size: @font-size-small;\n font-weight: normal;\n }\n }\n }\n}\n\n.user-compact-stats {\n .rank-position, .rank-posts-counted {\n strong, small {\n display: inline-block;\n float: none;\n }\n\n strong {\n min-width: auto;\n }\n\n small {\n margin-right: @line-height-computed;\n }\n }\n}\n\n\n// Tablet displays\n@media screen and (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n // Margin top first state so its even with username\n .active-posters .rank-position {\n margin-top: 6px;\n }\n\n\n // Hide rank-posts-total on small displays (cos it overflows for crazy posters)\n .active-posters .rank-posts-total {\n display: none;\n }\n}\n\n\n// Mobile displays\n@media screen and (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n // Margin top first state so its even with username\n .active-posters .rank-position {\n margin-top: 6px;\n }\n\n\n // Hide rank-posts-total on small displays (cos it overflows for crazy posters)\n .active-posters .rank-posts-total {\n display: none;\n }\n}","//\n// Forum Profile\n// --------------------------------------------------\n\n\n.page-user-profile .page-header {\n padding-top: @line-height-computed;\n\n .alert {\n margin-bottom: @line-height-computed;\n }\n\n h1 {\n margin-bottom: 0px;\n }\n \n .btn-aligned {\n margin-top: 0px;\n }\n}\n\n\n// Small displays header\n@media screen and (max-width: @screen-xs-max) {\n .page-user-profile .page-header {\n text-align: center;\n\n img {\n clear: both;\n margin-top: @line-height-computed;\n\n width: 100px;\n height: 100px;\n }\n\n h1 {\n margin-top: @line-height-computed;\n\n font-size: @font-size-base * 2;\n }\n\n .header-stats ul {\n text-align: center;\n\n li {\n display: inline-block;\n\n white-space: nowrap;\n }\n }\n }\n\n .page-user-profile .profile-side-avatar {\n display: none;\n }\n}\n\n\n// Tablet displays\n@media screen and (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .page-user-profile .page-header {\n img, h1 {\n float: left;\n }\n\n img {\n margin-top: @line-height-computed;\n margin-right: 24px;\n\n width: 80px;\n height: 80px;\n }\n\n h1 {\n position: relative;\n top: @line-height-computed * 1.25;\n }\n\n .header-stats {\n margin-left: 80px + 32px;\n margin-top: @line-height-computed * 1.25;\n margin-bottom: @line-height-computed * -2.25;\n\n position: relative;\n bottom: @line-height-computed * 2.5;\n }\n }\n}\n\n\n// Dekstops header\n@media screen and (min-width: @screen-md-min) {\n .page-user-profile .page-header {\n .user-avatar-sm {\n display: none;\n }\n\n h1 {\n position: relative;\n top: 5px;\n }\n\n .header-stats ul {\n li {\n display: block;\n float: left;\n }\n }\n }\n\n .page-user-profile .profile-side-avatar img {\n width: 100%;\n height: auto;\n margin-top: @line-height-computed * -7;\n margin-bottom: @line-height-computed;\n }\n}","//\n// Username History\n// --------------------------------------------------\n\n\n// Change tabular on larger displays\n.username-history li {\n @media screen and (min-width: @screen-md-min) {\n display: block;\n overflow: auto;\n }\n}\n\n\n// Change avatar\n.username-history .change-avatar {\n float: left;\n\n a, span {\n margin-right: @line-height-computed / 2;\n\n img {\n width: 42px;\n height: 42px;\n }\n }\n\n @media screen and (min-width: @screen-md-min) {\n a, span {\n img {\n width: 18px;\n height: 18px;\n\n position: relative;\n bottom: 1px;\n }\n }\n }\n}\n\n\n// Change author\n.username-history .change-author {\n @media screen and (min-width: @screen-md-min) {\n float: left;\n width: 30%;\n }\n}\n\n\n// Old to new name change\n.username-history .change {\n min-height: @line-height-computed; // we need that for ui-preview-text\n overflow: auto;\n\n span {\n display: block;\n float: left;\n }\n\n .material-icon {\n margin: 0px @font-size-base / 2;\n\n position: relative;\n top: 4px;\n }\n\n @media screen and (min-width: @screen-md-min) {\n float: left;\n width: 40%;\n }\n}\n\n\n// Date\n.username-history .change-date {\n @media screen and (min-width: @screen-md-min) {\n float: left;\n width: 20%;\n }\n}\n","//\n// Search Page\n// --------------------------------------------------\n\n\n.search-footer p {\n\tmargin-top: @line-height-computed;\n\n\tcolor: @gray;\n\tfont-size: @font-size-small;\n\ttext-align: center;\n}\n\n.page-search-form {\n @media screen and (min-width: @screen-sm-min) {\n padding-top: @line-height-computed * 2;\n }\n\n @media screen and (min-width: @screen-md-min) {\n padding-bottom: @line-height-computed * 2;\n \n h1 {\n position: relative;\n top: @padding-small-vertical;\n }\n\n .form-group {\n margin-bottom: 0px;\n }\n }\n}","/*\nDescription: Foundation 4 docs style for highlight.js\nAuthor: Dan Allen
\nWebsite: http://foundation.zurb.com/docs/\nVersion: 1.0\nDate: 2013-04-02\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: #eee; color: black;\n}\n\n.hljs-link,\n.hljs-emphasis,\n.hljs-attribute,\n.hljs-addition {\n color: #070;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong,\n.hljs-string,\n.hljs-deletion {\n color: #d14;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n\n.hljs-quote,\n.hljs-comment {\n color: #998;\n font-style: italic;\n}\n\n.hljs-section,\n.hljs-title {\n color: #900;\n}\n\n.hljs-class .hljs-title,\n.hljs-type {\n color: #458;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n color: #336699;\n}\n\n.hljs-bullet {\n color: #997700;\n}\n\n.hljs-meta {\n color: #3344bb;\n}\n\n.hljs-code,\n.hljs-number,\n.hljs-literal,\n.hljs-keyword,\n.hljs-selector-tag {\n color: #099;\n}\n\n.hljs-regexp {\n background-color: #fff0ff;\n color: #880088;\n}\n\n.hljs-symbol {\n color: #990073;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n color: #007700;\n}\n",".atwho-view {\n position:absolute;\n top: 0;\n left: 0;\n display: none;\n margin-top: 18px;\n background: white;\n color: black;\n border: 1px solid #DDD;\n border-radius: 3px;\n box-shadow: 0 0 5px rgba(0,0,0,0.1);\n min-width: 120px;\n z-index: 11110 !important;\n}\n\n.atwho-view .atwho-header {\n padding: 5px;\n margin: 5px;\n cursor: pointer;\n border-bottom: solid 1px #eaeff1;\n color: #6f8092;\n font-size: 11px;\n font-weight: bold;\n}\n\n.atwho-view .atwho-header .small {\n color: #6f8092;\n float: right;\n padding-top: 2px;\n margin-right: -5px;\n font-size: 12px;\n font-weight: normal;\n}\n\n.atwho-view .atwho-header:hover {\n cursor: default;\n}\n\n.atwho-view .cur {\n background: #3366FF;\n color: white;\n}\n.atwho-view .cur small {\n color: white;\n}\n.atwho-view strong {\n color: #3366FF;\n}\n.atwho-view .cur strong {\n color: white;\n font:bold;\n}\n.atwho-view ul {\n /* width: 100px; */\n list-style:none;\n padding:0;\n margin:auto;\n max-height: 200px;\n overflow-y: auto;\n}\n.atwho-view ul li {\n display: block;\n padding: 5px 10px;\n border-bottom: 1px solid #DDD;\n cursor: pointer;\n /* border-top: 1px solid #C8C8C8; */\n}\n.atwho-view small {\n font-size: smaller;\n color: #777;\n font-weight: normal;\n}\n","//\n// Typography Flavor\n// --------------------------------------------------\n\n\nabbr {\n outline: none;\n text-decoration: none;\n}","//\n// Flavor Shadows\n// --------------------------------------------------\n\n.shadow-2dp {\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, @shadow-key-penumbra-opacity),\n 0 3px 1px -2px rgba(0, 0, 0, @shadow-key-umbra-opacity),\n 0 1px 5px 0 rgba(0, 0, 0, @shadow-ambient-shadow-opacity);\n}\n\n.shadow-3dp {\n box-shadow: 0 3px 4px 0 rgba(0, 0, 0, @shadow-key-penumbra-opacity),\n 0 3px 3px -2px rgba(0, 0, 0, @shadow-key-umbra-opacity),\n 0 1px 8px 0 rgba(0, 0, 0, @shadow-ambient-shadow-opacity);\n}\n\n.shadow-4dp {\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, @shadow-key-penumbra-opacity),\n 0 1px 10px 0 rgba(0, 0, 0, @shadow-ambient-shadow-opacity),\n 0 2px 4px -1px rgba(0, 0, 0, @shadow-key-umbra-opacity);\n}\n\n.shadow-6dp {\n box-shadow: 0 6px 10px 0 rgba(0, 0, 0, @shadow-key-penumbra-opacity),\n 0 1px 18px 0 rgba(0, 0, 0, @shadow-ambient-shadow-opacity),\n 0 3px 5px -1px rgba(0, 0, 0, @shadow-key-umbra-opacity);\n}\n\n.shadow-8dp {\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, @shadow-key-penumbra-opacity),\n 0 3px 14px 2px rgba(0, 0, 0, @shadow-ambient-shadow-opacity),\n 0 5px 5px -3px rgba(0, 0, 0, @shadow-key-umbra-opacity);\n}\n\n.shadow-16dp {\n box-shadow: 0 16px 24px 2px rgba(0, 0, 0, @shadow-key-penumbra-opacity),\n 0 6px 30px 5px rgba(0, 0, 0, @shadow-ambient-shadow-opacity),\n 0 8px 10px -5px rgba(0, 0, 0, @shadow-key-umbra-opacity);\n}\n\n.shadow-24dp {\n box-shadow: 0 9px 46px 8px rgba(0, 0, 0, @shadow-key-penumbra-opacity),\n 0 11px 15px -7px rgba(0, 0, 0, @shadow-ambient-shadow-opacity),\n 0 24px 38px 3px rgba(0, 0, 0, @shadow-key-umbra-opacity);\n}","//\n// Buttons Flavor\n// --------------------------------------------------\n\n\n// mixins\n.misago-btn(@color, @bg, @color-hover, @bg-hover, @color-active, @bg-active) {\n &,\n &:disabled, &:disabled:hover,\n &.disabled, &.disabled:hover, &.disabled:active {\n background: @bg;\n border: 1px solid @bg;\n\n color: @color;\n\n .box-shadow(none);\n }\n\n &:disabled, &:disabled:hover,\n &.disabled, &.disabled:hover, &.disabled:active {\n .opacity(0.25);\n }\n\n &:hover, &:focus {\n background: @bg-hover;\n border: 1px solid @bg-hover;\n\n color: @color-hover;\n \n .box-shadow(none);\n }\n\n &:active:focus, &:active,\n .dropdown.open .dropdown-toggle &,\n .dropdown.open .dropdown-toggle &:focus,\n .dropdown.open .dropdown-toggle &:active:focus,\n .dropdown.open .dropdown-toggle &:hover {\n background: @bg-active;\n border: 1px solid @bg-active;\n\n color: @color-active;\n\n .box-shadow(none);\n }\n\n &.btn-loading {\n &, &:disabled, &:disabled:hover,\n &:hover, &:focus,\n &:active:focus, &:active {\n color: transparent;\n }\n }\n}\n\n.misago-btn-outline(@color, @bg, @border,\n @color-hover, @bg-hover, @border-hover,\n @color-active, @bg-active, @border-active) {\n &, &:disabled, &:disabled:hover,\n &.disabled, &.disabled:hover, &.disabled:active {\n background: @bg;\n border: 1px solid @border;\n\n color: @color;\n\n .box-shadow(none);\n }\n\n &:disabled, &:disabled:hover,\n &.disabled, &.disabled:hover, &.disabled:active {\n .opacity(0.25);\n }\n\n &:hover, &:focus {\n background: @bg-hover;\n border: 1px solid @border-hover;\n\n color: @color-hover;\n\n .box-shadow(none);\n }\n\n &:active:focus, &:active,\n .dropdown.open &,\n .dropdown.open &:focus,\n .dropdown.open &:active:focus,\n .dropdown.open &:hover {\n background: @bg-active;\n border: 1px solid @border-active;\n\n color: @color-active;\n\n .box-shadow(none);\n }\n\n &.btn-loading {\n &, &:disabled, &:disabled:hover,\n &:hover, &:focus,\n &:active:focus, &:active {\n background: @bg;\n border: 1px solid @border;\n\n color: transparent;\n\n .box-shadow(none);\n }\n }\n}\n\n\n// button styles\n.btn-default {\n .misago-btn(\n @btn-default-color,\n @btn-default-bg,\n\n @btn-default-hover-color,\n @btn-default-hover-bg,\n\n @btn-default-active-color,\n @btn-default-active-bg\n );\n}\n\n.btn-primary {\n .misago-btn(\n @btn-primary-color,\n @btn-primary-bg,\n\n @btn-primary-hover-color,\n @btn-primary-hover-bg,\n\n @btn-primary-active-color,\n @btn-primary-active-bg\n );\n}\n\n.btn-success {\n .misago-btn(\n @btn-success-color,\n @btn-success-bg,\n\n @btn-success-hover-color,\n @btn-success-hover-bg,\n\n @btn-success-active-color,\n @btn-success-active-bg\n );\n}\n\n.btn-danger {\n .misago-btn(\n @btn-danger-color,\n @btn-danger-bg,\n\n @btn-danger-hover-color,\n @btn-danger-hover-bg,\n\n @btn-danger-active-color,\n @btn-danger-active-bg\n );\n}\n\n\n// outlined button styles\n.btn-default.btn-outline {\n .misago-btn-outline(\n @btn-default-outline-color,\n @btn-default-outline-bg,\n @btn-default-outline-border,\n\n @btn-default-outline-hover-color,\n @btn-default-outline-hover-bg,\n @btn-default-outline-hover-border,\n\n @btn-default-outline-active-color,\n @btn-default-outline-active-bg,\n @btn-default-outline-active-border\n );\n}\n\n.btn-primary.btn-outline {\n .misago-btn-outline(\n @btn-primary-outline-color,\n @btn-primary-outline-bg,\n @btn-primary-outline-border,\n\n @btn-primary-outline-hover-color,\n @btn-primary-outline-hover-bg,\n @btn-primary-outline-hover-border,\n\n @btn-primary-outline-active-color,\n @btn-primary-outline-active-bg,\n @btn-primary-outline-active-border\n );\n}\n\n\n// sign in and register buttons in navbar\n.navbar-misago {\n .btn-sign-in {\n border-radius: @navbar-btn-sign-in-radius;\n\n .misago-btn-outline(\n @navbar-btn-sign-in-color,\n @navbar-btn-sign-in-bg,\n @navbar-btn-sign-in-border,\n\n @navbar-btn-sign-in-hover-color,\n @navbar-btn-sign-in-hover-bg,\n @navbar-btn-sign-in-hover-border,\n\n @navbar-btn-sign-in-active-color,\n @navbar-btn-sign-in-active-bg,\n @navbar-btn-sign-in-active-border\n );\n }\n\n .btn-register {\n border-radius: @navbar-btn-register-radius;\n\n .misago-btn-outline(\n @navbar-btn-register-color,\n @navbar-btn-register-bg,\n @navbar-btn-register-border,\n\n @navbar-btn-register-hover-color,\n @navbar-btn-register-hover-bg,\n @navbar-btn-register-hover-border,\n\n @navbar-btn-register-active-color,\n @navbar-btn-register-active-bg,\n @navbar-btn-register-active-border\n );\n }\n}","//\n// Social Buttons Flavor\n// --------------------------------------------------\n\n// Those buttons simply add brand color over the .btn-default\n.misago-social-btn(@color) {\n &, &:disabled, &:disabled:hover, {\n color: @color;\n font-weight: bold;\n }\n}\n\n.btn-social-battlenet,\n.btn-social-battlenet-oauth2 {\n .misago-social-btn(#0e86ca);\n}\n\n.btn-social-bungie {\n .misago-social-btn(#0096db);\n}\n\n.btn-social-facebook,\n.btn-social-facebook-app {\n .misago-social-btn(#3b5998);\n}\n\n.btn-social-github,\n.btn-social-github-team,\n.btn-social-github-enterprise,\n.btn-social-github-enterprise-org,\n.btn-social-github-enterprise-team {\n .misago-social-btn(#000000);\n}\n\n.btn-social-gitlab {\n .misago-social-btn(#fc6d26);\n}\n\n.btn-social-google,\n.btn-social-google-oauth,\n.btn-social-google-oauth2,\n.btn-social-google-plus,\n.btn-social-google-openidconnect {\n .misago-social-btn(#dd4b39);\n}\n\n.btn-social-linkedin {\n .misago-social-btn(#0077b5);\n}\n\n.btn-social-steam {\n .misago-social-btn(#5c7e10);\n}\n\n.btn-social-twitter {\n .misago-social-btn(#1da1f2);\n}\n\n.form-social-auth {\n .row {\n margin-top: @padding-base-vertical * -1;\n margin-bottom: @padding-base-vertical * -1;\n }\n\n .btn {\n margin: @padding-base-vertical 0px;\n }\n}","//\n// Inputs Flavor\n// --------------------------------------------------\n\n\n// default input\ninput.form-control, textarea.form-control {\n border-color: @input-border;\n box-shadow: inset 0px 0px 0px 1px @input-border;\n\n &:focus {\n border-color: @input-border-focus;\n box-shadow: inset 0px 0px 0px 1px @input-border-focus;\n }\n}\n\n.has-error input.form-control {\n border-color: @state-danger-border;\n box-shadow: inset 0px 0px 0px 1px @state-danger-border;\n\n &:focus {\n border-color: lighten(@state-danger-border, 20%);\n box-shadow: inset 0px 0px 0px 1px lighten(@state-danger-border, 20%);\n }\n}\n\n.has-success input.form-control {\n border-color: @state-success-border;\n box-shadow: inset 0px 0px 0px 1px @state-success-border;\n\n &:focus {\n border-color: lighten(@state-success-border, 20%);\n box-shadow: inset 0px 0px 0px 1px lighten(@state-success-border, 20%);\n }\n}\n\n\n// password strenght marker\n.password-strength {\n margin-top: @line-height-computed / 2;\n\n .text-small {\n margin-top: @line-height-computed / 5;\n \n color: lighten(@text-color, 25%);\n font-size: @font-size-small;\n }\n\n .progress {\n margin: 0px;\n }\n}","//\n// Flavor Auth Message\n// --------------------------------------------------\n\n.auth-message {\n background: @auth-message-bg;\n padding: @line-height-computed * 4 0px;\n\n .shadow-8dp();\n\n p {\n color: @auth-message-text-color;\n }\n\n .btn {\n & {\n background: @auth-message-btn-default-bg;\n border-color: @auth-message-btn-default-border;\n\n color: @auth-message-btn-default-color;\n }\n\n &:hover, &:focus {\n background: @auth-message-btn-default-hover-bg;\n border-color: @auth-message-btn-default-hover-border;\n\n color: @auth-message-btn-default-hover-color;\n }\n\n &:active {\n background: @auth-message-btn-default-active-bg;\n border-color: @auth-message-btn-default-active-border;\n\n color: @auth-message-btn-default-active-color;\n }\n }\n}","//\n// Dropdown Flavor\n// --------------------------------------------------\n\n\n.dropdown-menu {\n border: none;\n\n .shadow-4dp();\n}\n\n\n// Navbar dropdown\n.user-dropdown .dropdown-header {\n strong {\n display: block;\n\n color: @text-color;\n font-weight: bold;\n }\n\n .user-stats {\n margin-top: @line-height-computed / 2;\n\n font-size: @font-size-small;\n\n .material-icon {\n margin-right: 3px;\n\n position: relative;\n bottom: 1px;\n\n width: 14px;\n height: 14px;\n\n font-size: 14px;\n }\n }\n}\n\n.user-dropdown .guest-preview {\n padding-bottom: @padding-large-vertical;\n}\n\n.user-dropdown .badge {\n background-color: @brand-danger;\n}\n\n.user-dropdown {\n a:hover, a:focus, a:active,\n .btn-link:hover, .btn-link:focus, .btn-link:active {\n .badge {\n background-color: #fff;\n \n color: @brand-danger;\n }\n }\n}\n\n// Mobile dropdown\n.mobile-dropdown.open {\n margin: 0px;\n}","//\n// Flavor Navbar\n// --------------------------------------------------\n\n\n.navbar-misago {\n border-bottom: none;\n box-shadow: 0px 0px 3px @navbar-default-border;\n}\n\n\n// Round up user's avatar\n.navbar-misago .user-avatar {\n background: #fff;\n border-radius: @border-radius-small;\n}\n\n\n// Round up brand's icon\n.navbar-misago .brand-link img {\n border-radius: @border-radius-small;\n}","//\n// Search Dropdown\n// --------------------------------------------------\n\n\n.dropdown-search-results {\n border-radius: 0px 0px @border-radius-base @border-radius-base;\n}\n\n.dropdown-search-message {\n border-top: 1px solid @gray-lighter;\n padding: @padding-large-vertical @padding-large-horizontal;\n\n color: @text-muted;\n}\n\n.dropdown-search-loader {\n border-top: 1px solid @gray-lighter;\n padding: @padding-large-vertical @padding-large-horizontal;\n}\n\n.dropdown-search-header {\n border-top: 1px solid @gray-lighter;\n padding: 8px 20px;\n\n color: @text-muted;\n font-weight: bold;\n}\n\n\n// result\n.dropdown-search-thread, .dropdown-search-user {\n small {\n color: @text-muted;\n }\n}\n\n.dropdown-search-thread {\n .dropdown-search-post-content {\n overflow: hidden;\n white-space: normal;\n max-height: 47px;\n }\n\n .dropdown-search-post-footer {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n\n// footer\n.dropdown-search-footer {\n padding-bottom: @padding-small-vertical;\n\n &:last-child {\n padding-bottom: 0px;\n }\n}\n\n.dropdown-menu > li.dropdown-search-footer > a {\n font-size: small;\n}","//\n// Flavor Header\n// --------------------------------------------------\n\n\n// Graphic background\n.page-header {\n background: none; // we'll use header handler for that\n border-bottom: none;\n}\n\n.page-header-bg {\n background: @page-header-bg;\n background-size: cover;\n \n @media screen and (min-width: @screen-md-min) {\n margin-bottom: @line-height-computed * 2;\n }\n}\n\n\n// Min-height the line on headless pages\n.page-header-bg {\n min-height: @page-header-min-height;\n}\n\n\n// Item colors\n.page-header {\n h1 {\n color: @page-header-color;\n font-weight: 400;\n }\n}\n\n\n// Buttons\n.page-header .btn-outline {\n &.btn-default {\n .misago-btn(\n @page-header-btn-default-color,\n @page-header-btn-default-bg,\n\n @page-header-btn-default-hover-color,\n @page-header-btn-default-hover-bg,\n\n @page-header-btn-default-active-color,\n @page-header-btn-default-active-bg\n );\n }\n\n &.btn-primary {\n .misago-btn(\n @page-header-btn-primary-color,\n @page-header-btn-primary-bg,\n\n @page-header-btn-primary-hover-color,\n @page-header-btn-primary-hover-bg,\n\n @page-header-btn-primary-active-color,\n @page-header-btn-primary-active-bg\n );\n }\n}\n\n\n// Stats\n.header-stats {\n color: @page-header-text-color;\n\n li {\n a, a:link, a:visited {\n color: @page-header-link-color;\n }\n\n a:hover, a:focus, a:active {\n color: @page-header-link-hover-color;\n }\n\n .user-status.user-offline {\n .status-icon {\n color: @page-header-text-color;\n }\n }\n }\n}\n\n\n// Go back\n.page-header .go-back-sm {\n &, &:link, &:visited {\n color: @page-header-text-color;\n }\n\n &:hover, &:focus, &:active {\n color: @page-header-link-hover-color;\n }\n}\n\n\n// Breadcrumbs\n.page-header .breadcrumb {\n color: @page-header-text-color;\n \n a, a:link, a:visited {\n color: @page-header-text-color;\n }\n\n a:hover, a:focus, a:active {\n color: @page-header-link-color;\n }\n\n li:before {\n color: @page-header-text-color;\n }\n}\n\n\n// Header tabs\n.page-header .page-tabs {\n background-color: @page-tabs-bg;\n margin-top: @line-height-computed * 1.66;\n\n li a {\n font-weight: bold;\n\n &, &:link, &:visited {\n background-color: @page-tabs-link-bg;\n border-radius: @border-radius-small @border-radius-small 0 0;\n\n color: @page-tabs-link-color;\n }\n\n &:hover, &:focus {\n background-color: @page-tabs-link-hover-bg;\n\n color: @page-tabs-link-hover-color;\n \n @media screen and (max-width: @screen-sm-max) {\n // sticky hover on touch devices is confusing, so don.t add it\n background-color: @page-tabs-link-bg;\n\n color: @page-tabs-link-color;\n }\n }\n }\n\n li.active a {\n &, &:link, &:active, &:visited, &:hover, &:focus {\n background-color: @page-tabs-link-active-bg;\n\n color: @page-tabs-link-active-color;\n }\n }\n}","//\n// Flavor Footer\n// --------------------------------------------------\n\n\n// Make footer full width\n.misago-footer {\n margin-top: @line-height-computed * 2;\n\n .footer-content {\n border-top: 1px solid @gray-lighter;\n padding-top: @line-height-computed * 1;\n\n color: @page-footer-text-color;\n\n @media screen and (max-width: @screen-xs-max) {\n text-align: center;\n\n .site-footnote {\n clear: both;\n margin-bottom: @line-height-computed * .75;\n }\n }\n\n a, a:link, a:visited {\n color: @page-footer-link-color;\n }\n\n a:hover, a:focus {\n color: @page-footer-link-hover-color;\n }\n\n .misago-branding {\n &, &:link, &:visited {\n color: @page-footer-brand-color;\n }\n\n &:hover, &:focus {\n color: @page-footer-brand-hover-color;\n }\n }\n }\n}","//\n// List Groups Flavor\n// --------------------------------------------------\n\n\n.list-group {\n border-radius: @list-group-border-radius;\n\n .list-group-item {\n border-left-color: @list-group-outer-border;\n border-right-color: @list-group-outer-border;\n }\n\n .list-group-item:first-child {\n border-top-color: @list-group-outer-border;\n }\n\n .list-group-item:last-child {\n border-bottom-color: @list-group-outer-border;\n }\n}\n\n.list-group-item.empty-message {\n padding-top: @line-height-computed;\n padding-bottom: @line-height-computed;\n \n text-align: center;\n\n p {\n margin: @line-height-computed / 2 0px;\n }\n}","//\n// Navs Flavor\n// --------------------------------------------------\n\n.nav-side {\n .box-shadow(none);\n}\n\n\n.nav-side>.list-group-item {\n border-left: none;\n border-right: none;\n margin-bottom: 1px;\n\n &:first-child {\n border-top: none;\n }\n\n &:last-child {\n border-bottom: none;\n }\n\n &, &:link, &:visited {\n background: @side-nav-bg;\n border: none;\n \n color: @side-nav-color;\n }\n\n &:hover, &:focus, &:active {\n background: @side-nav-hover-bg;\n \n color: @side-nav-hover-color;\n }\n\n &.active {\n &, &:link, &:visited,\n &:hover, &:focus, &:active {\n background: @side-nav-active-bg;\n \n color: @side-nav-active-color;\n font-weight: bold;\n\n .badge {\n background: @side-nav-bg;\n\n color: @side-nav-color;\n }\n }\n }\n}","//\n// Username History Flavor\n// --------------------------------------------------\n\n\n.username-history .user-avatar {\n border-radius: @border-radius-base;\n}","//\n// Panels Flavor\n// --------------------------------------------------\n\n\n.panel {\n border: none;\n border-radius: @border-radius-base;\n\n .panel-heading, .panel-footer {\n background: @panel-bg;\n }\n\n .panel-title {\n color: @panel-title-color;\n }\n\n .form-group+.form-group {\n margin-top: @line-height-computed;\n }\n\n .panel-body>.form-group:first-child {\n margin-top: @line-height-computed / 2;\n }\n\n fieldset {\n margin-top: @line-height-computed;\n\n &:first-child {\n margin-top: 0px;\n }\n\n legend {\n border: none;\n\n color: @panel-fieldset-color;\n font-weight: 300;\n }\n }\n}\n\n\n// use default message icon color for panel messages\n.panel-message-body .message-icon {\n color: @message-icon-color;\n}","//\n// Forms Flavor\n// --------------------------------------------------\n\n.panel-form {\n border: 1px solid @panel-form-border;\n box-shadow: none;\n}\n\n.panel-form .panel-heading, .panel-form .panel-footer {\n border-color: @panel-form-border;\n}\n\n// remove bottom margin from poll panel\n.poll-form .panel {\n margin: 0px;\n}\n\n\n// Override help text color\n.help-block, .help-block .text-small {\n color: @gray-light;\n}","//\n// Categories Lists Flavor\n// --------------------------------------------------\n\n\n// Make category read status icon visually larger\n.category-main .media-left {\n .read-status {\n background: @category-read-color;\n border-radius: @border-radius-base;\n padding: @padding-small-vertical (@padding-large-vertical - 2px);\n }\n\n .material-icon {\n height: 14px;\n width: 14px;\n\n color: @gray;\n font-size: 14px;\n line-height: 14px;\n }\n\n .read-status.item-new {\n background-color: @category-new-color;\n\n .material-icon {\n color: #fff;\n }\n }\n \n @media screen and (min-width: @screen-sm-min) {\n padding: @padding-small-vertical 0px;\n }\n}\n\n\n// Fix category main alignment\n.category-main .media-body {\n padding-left: @padding-base-horizontal;\n \n @media screen and (max-width: @screen-xs-max) {\n padding-left: @padding-small-horizontal / 3;\n }\n}\n\n.list-group-category-no-description {\n .category-main .media-heading {\n margin-top: @padding-large-vertical;\n\n @media screen and (max-width: @screen-xs-max) {\n margin-top: @padding-large-vertical / 2;\n }\n }\n}\n\n\n// Make category name larger\n.category-main .media-heading {\n a, a:link, a:visited {\n color: @gray-dark;\n }\n\n a:focus, a:hover, a:active {\n color: @text-color;\n }\n}\n\n\n// Fade out stats\n.category-stats {\n color: @gray;\n}\n\n\n// Fade out category description\n.category-main .category-description p {\n font-size: @font-size-small;\n\n &:last-child {\n margin-bottom: 0px;\n }\n}\n\n// Round last poster's up avatar\n.category-last-thread img {\n background-color: #fff;\n border-radius: @border-radius-base;\n}\n\n// Last thread\n.category-last-thread .media-heading {\n margin-bottom: 2px;\n\n @media screen and (max-width: @screen-xs-max) {\n margin-top: @line-height-computed / 2;\n }\n}\n\n.category-last-thread .list-inline {\n color: @gray-light;\n font-size: @font-size-small;\n\n a, a:link, a:visited {\n color: @gray-light;\n }\n\n a:hover, a:active, a:focus {\n color: @gray-dark;\n }\n\n .item-title {\n &, &:link, &:visited {\n color: @gray-dark;\n }\n\n &:hover, &:active, &:focus {\n color: @text-color;\n }\n }\n}\n\n\n// Last thread message\n.category-thread-message {\n color: @gray-light;\n\n .material-icon {\n padding: @padding-base-vertical 0px;\n margin-right: @padding-base-vertical / 2;\n }\n\n @media screen and (max-width: @screen-xs-max) {\n padding-top: @line-height-computed * 0.75;\n\n font-size: @font-size-small;\n\n .material-icon {\n padding: 3px 0px;\n }\n }\n}","//\n// Thread Participants Flavor\n// --------------------------------------------------\n\n\n.panel-participants {\n border: 1px solid @panel-form-border;\n}\n\n\n.participant-card .btn-user {\n border: 0px !important;\n}\n\n.participant-card .dropdown-header-owner {\n color: @brand-primary;\n\n .material-icon {\n width: 14px;\n height: 14px;\n\n font-size: 14px;\n line-height: 14px;\n }\n\n .icon-text {\n margin-left: 4px;\n\n position: relative;\n top: 2px;\n }\n}\n\n.panel-participants p {\n color: @gray-light;\n\n @media screen and (max-width: @screen-xs-max) {\n margin-top: @line-height-computed / 2;\n \n text-align: center;\n }\n}","//\n// Polls Flavor\n// --------------------------------------------------\n\n.panel-poll {\n border: 1px solid @panel-form-border;\n}\n\n\n// Poll vote form\n.panel-poll .poll-select-choices {\n margin-top: @line-height-computed / -2;\n}\n\n\n// Poll results styles\n.panel-poll .poll-details {\n margin-bottom: @line-height-computed;\n\n color: @gray-light;\n font-size: @font-size-small;\n}\n\n.panel-poll .progress {\n margin-top: @line-height-computed / 3;\n margin-bottom: @line-height-computed / 4;\n}\n\n.panel-poll .poll-chart {\n color: @gray-light;\n font-size: @font-size-small;\n}\n\n.panel-poll .poll-options {\n margin-top: @line-height-computed;\n}","//\n// Posting Form Flavor\n// --------------------------------------------------\n\n#posting-placeholder {\n background-color: #fafbfc;\n}\n\n\n.posting-message {\n .material-icon {\n color: @message-info-icon-color;\n }\n \n .btn {\n margin-top: @line-height-computed;\n }\n}","//\n// Posts Flavor\n// --------------------------------------------------\n\n\n// Post body\n.panel-post {\n background: @post-bg;\n border: 1px solid @post-border;\n}\n\n\n// Post side\n.post-side {\n color: @gray-light;\n\n .poster-avatar {\n border-radius: @border-radius-base;\n }\n\n .user-title {\n color: @gray;\n\n a, a:link, a:visited,\n a:focus, a:hover, a:active {\n color: @gray;\n }\n }\n}\n\n\n// Header\n.post-heading {\n .label-unread {\n background-color: @post-unread-label;\n margin-right: @padding-large-horizontal;\n }\n\n .label-protected {\n background-color: transparent;\n margin-left: @padding-base-horizontal * 2;\n\n position: relative;\n top: 1px;\n\n color: @post-protected-icon;\n\n .material-icon {\n margin-right: 2px;\n\n position: relative;\n top: -1px;\n\n font-size: 16px;\n line-height: 16px;\n }\n }\n\n &>.btn-link {\n padding-left: 0px;\n padding-right: 0px;\n\n &, &:link, &:visited {\n color: @gray-light;\n }\n\n &:hover, &:focus, &:focus:active, &:active {\n color: @text-color;\n text-decoration: none;\n }\n }\n\n .btn-see-edits {\n margin-left: @padding-base-horizontal * 2;\n }\n}\n\n\n// Status\n.post-status-message {\n border-radius: @border-radius-base;\n margin-top: @line-height-computed / 2;\n padding: @padding-base-vertical @padding-base-horizontal;\n \n @media screen and (max-width: @screen-xs-max) {\n font-size: @font-size-small;\n\n .material-icon {\n margin-top: 3px;\n }\n\n p {\n margin-top: 0px;\n }\n }\n}\n\n\n// Post body\n.post-body:last-child {\n padding-bottom: @line-height-computed / 2;\n}\n\n\n// Attachments\n.post-attachments {\n background-color: @gray-lighter;\n border: none;\n border-radius: @border-radius-base;\n margin-bottom: @line-height-computed * 1.5;\n\n &:last-child {\n margin-bottom: @line-height-computed / 2;\n }\n\n @media screen and (max-width: @screen-xs-max) {\n border-radius: 0px;\n margin: 0px -15px;\n margin-bottom: @line-height-computed;\n }\n}\n\n\n// Footer\n.post-footer {\n &>.btn-link {\n padding-left: 0px;\n padding-right: 0px;\n\n &, &:link, &:visited {\n color: @gray-light;\n }\n\n &:hover, &:focus, &:focus:active, &:active {\n color: @text-color;\n text-decoration: none;\n }\n }\n\n p {\n color: @gray-light;\n font-size: @font-size-small;\n }\n}\n\n\n// Hidden and invalid messages\n.post-body-hidden, .post-body-invalid {\n padding-top: @line-height-computed / 2;\n padding-bottom: @line-height-computed / 2;\n \n .lead {\n margin-bottom: @line-height-computed / 2;\n }\n\n .text-muted {\n margin-bottom: 0px;\n\n font-size: @font-size-small;\n }\n}\n\n\n// Fade out hidden posts a little\n.post-hidden {\n .opacity(0.75);\n}","//\n// Post Feed Flavor\n// --------------------------------------------------\n\n.post-feed .panel-body {\n padding-bottom: 0px;\n}\n\n.post-feed .post-body {\n position: relative;\n padding-top: 0px;\n padding-bottom: @line-height-computed;\n max-height: 300px;\n overflow-y: hidden;\n\n &:after {\n box-shadow: 0px 0px 16px 16px #ffffff;\n display: block;\n\n position: absolute;\n bottom: 0px;\n\n height: 0px;\n width: 100%;\n\n content: '-';\n color: transparent;\n }\n}","//\n// Events Flavor\n// --------------------------------------------------\n\n\n// Style label\n.posts-list .event .event-label {\n margin-bottom: @line-height-computed / 4;\n}\n\n.posts-list .event .label-unread {\n background-color: @post-unread-label;\n\n color: #fff;\n}\n\n\n// Style info text\n.posts-list .event-info {\n a, a:link, a:visited, .btn-link {\n color: @gray;\n }\n\n a:focus, a:active, a:focus:active,\n .btn-link:focus, .btn-link:active, .btn-link:focus:active {\n color: @text-color;\n }\n}\n\n\n// Fade out hidden event\n.posts-list .event-hidden {\n .opacity(0.33);\n}","//\n// User Card Flavor\n// --------------------------------------------------\n\n\n// Background color\n.user-card {\n background: @user-card-bg;\n}\n\n\n// Round avatar corners\n.user-card-small-avatar, .user-card-avatar {\n img {\n border-radius: @border-radius-base;\n }\n}\n\n\n// Sizing and spacing on large avatar\n.user-card-avatar {\n margin: @line-height-computed 0px;\n\n img {\n width: 150px;\n height: 150px;\n }\n}\n\n\n// Upsize the user name\n.user-card-username {\n a, a:link, a:visited, a:hover, a:focus, a:active {\n color: @text-color;\n font-size: @font-size-large;\n font-weight: bold;\n }\n}\n\n\n// User title\n.user-card-title {\n span, a, a:link, a:visited {\n color: @gray;\n }\n\n a:focus, a:hover, a:active {\n color: @text-color;\n }\n}\n\n\n// User stats\n.user-card-stats {\n @media screen and (min-width: @screen-sm-min) {\n margin-top: @line-height-computed;\n }\n\n ul {\n margin: 0px;\n }\n\n li {\n display: inline-block;\n margin-right: @padding-base-horizontal;\n\n color: @gray-light;\n font-size: @font-size-small;\n\n @media screen and (min-width: @screen-sm-min) {\n margin: 0px @padding-base-horizontal / 2;\n }\n }\n\n li.user-stat-empty {\n display: none;\n }\n}\n\n// Divide stats in two on larger screen\n@media screen and (min-width: @screen-sm-min) {\n li.user-stat-divider {\n display: block;\n margin: 0px;\n }\n}\n\n@media screen and (max-width: @screen-xs-max) {\n li.user-stat-divider {\n display: none;\n }\n}\n\n// Make stats 60px min height on tablets and up\n@media screen and (min-width: @screen-sm-min) {\n .user-card-stats {\n min-height: 60px;\n }\n}\n\n\n// Reduce gutter on small grid\n@media screen and (max-width: @screen-xs-max) {\n .user-card-left {\n padding-right: 0px;\n }\n}","//\n// Progress Bars Flavor\n// --------------------------------------------------\n\n\n// Make progress bars flat\n.progress, .progress .progress-bar {\n .box-shadow(none);\n\n height: 8px;\n}","//\n// Markup Flavor\n// --------------------------------------------------\n\n\n// Round images\n.misago-markup img {\n border-radius: @border-radius-base;\n}\n\n\n// Quote block\n.misago-markup .quote-block,\n.misago-markup blockquote {\n background-color: #ffecb3;\n border-color: #b3e5fc;\n overflow: hidden;\n\n color: #3e2723;\n\n .quote-heading {\n background-color: #ffe082;\n border: none;\n\n color: #795548;\n\n a, a:link, a:visited {\n color: #5d4037;\n }\n\n a:hover, a:focus, a:active {\n color: #3e2723;\n }\n }\n\n hr {\n border-color: #ffca28;\n }\n}\n\n.misago-markup>.quote-block,\n.misago-markup>blockquote {\n background: #ffecb3;\n border: none;\n border-radius: @border-radius-base;\n\n .quote-block { \n background: #ffecb3;\n }\n}\n\n.misago-markup .quote-body {\n background: #ffecb3;\n\n &>.quote-block, &>blockquote {\n border-color: #ffe082;\n border-radius: @border-radius-base;\n }\n}\n\n\n// Spoiler block\n.misago-markup .spoiler-block {\n background: repeating-linear-gradient(\n 45deg,\n fadeout(@gray-lighter, 50%),\n fadeout(@gray-lighter, 50%) 10px,\n @post-bg 10px,\n @post-bg 20px\n );\n border: none;\n}\n\n.misago-markup .spoiler-body {\n background: transparent;\n -webkit-filter: blur(5px);\n -moz-filter: blur(5px);\n -o-filter: blur(5px);\n -ms-filter: blur(5px);\n filter: blur(5px);\n color: @text-color;\n}\n\n .misago-markup .spoiler-block.revealed .spoiler-body {\n -webkit-filter: none;\n -moz-filter: none;\n -o-filter: none;\n -ms-filter: none;\n filter: none;\n }\n\n.misago-markup .spoiler-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: fadeout(@post-bg, 90%);\n}\n\n.misago-markup .spoiler-reveal {\n .btn-default();\n}\n\n.misago-markup .spoiler-reveal,\n.misago-markup .spoiler-reveal:active,\n.misago-markup .spoiler-reveal:hover {\n border-radius: 4px;\n box-shadow: 0px 0px 0px 4px @post-bg;\n padding: @padding-base-vertical @padding-base-horizontal;\n}","//\n// Modal Flavor\n// --------------------------------------------------\n\n\n// Custom header styles\n.modal-header {\n background: @modal-header-bg;\n border-bottom-color: @modal-header-border-color;\n border-radius: @border-radius-large @border-radius-large 0px 0px;\n\n color: @modal-header-color;\n\n .close {\n padding: 0px 6px;\n\n color: @modal-header-color;\n font-size: 24px;\n line-height: 24px;\n text-shadow: none;\n }\n}\n\n\n// Color message icon\n.modal-message .message-icon {\n color: @message-icon-color;\n}\n\n\n// Even out space between form fields\n.modal-body>.form-group {\n margin: @line-height-computed 0px;\n\n &:first-child {\n margin-top: 0px;\n }\n\n &:last-child {\n margin-bottom: 0px;\n }\n}\n\n\n// Sign in modal\n.modal-sign-in {\n .modal-body {\n padding-top: 0px;\n padding-bottom: 0px;\n\n &>.form-group {\n margin: @line-height-computed 0px;\n }\n }\n}\n\n\n// Register modal\n.legal-footnote {\n label {\n font-weight: bold;\n }\n\n .help-block {\n margin-left: 20px;\n\n color: @brand-danger;\n }\n}\n\n\n// Avatar crop\n.modal-avatar-index {\n .avatar-preview {\n background: #fff;\n border-radius: @border-radius-large;\n }\n}\n\n.modal-avatar-crop {\n .cropit-preview {\n background: #fff;\n margin: @line-height-computed 0px;\n }\n\n .cropit-image-zoom-input {\n margin-top: @line-height-computed * 2;\n margin-bottom: @line-height-computed;\n }\n}\n\n// Post likes\n.modal-post-likers {\n .media {\n border-bottom: 1px solid @gray-lighter;\n padding-bottom: 15px; // hardcoded in BS less\n\n img {\n border-radius: @border-radius-base;\n\n width: 40px;\n height: 40px;\n }\n\n &:last-child {\n border: none;\n padding-bottom: 0px;\n }\n }\n}","//\n// Well Flavor\n// --------------------------------------------------\n\n.well {\n border: 1px solid @well-border;\n}","//\n// Active Posters Flavor\n// --------------------------------------------------\n\n\n.active-posters .rank-user-avatar img {\n border-radius: @border-radius-base;\n}\n\n\n.active-posters .user-details {\n color: @gray-light;\n\n a.rank-name {\n &, &:link, &:visited {\n color: @gray;\n font-weight: normal;\n }\n\n &:focus, &:hover, &:active {\n color: @text-color;\n }\n }\n\n span.rank-name {\n color: @gray;\n font-weight: normal;\n }\n}\n\n\n.active-posters small {\n color: @gray-light;\n}","//\n// Message Pages Flavor\n// --------------------------------------------------\n\n\n.page-error .message-icon {\n color: @error-icon-color;\n}\n\n.page-message .message-icon {\n color: @message-icon-color;\n}\n\n.page-message-info .message-icon {\n color: @message-info-icon-color;\n}\n\n.page-message-success .message-icon {\n color: @message-success-icon-color;\n}","//\n// User Options Flavor\n// --------------------------------------------------\n\n\n.page-options .message-line {\n color: @gray-light;\n\n a, a:link, a:visited {\n color: @gray-light;\n }\n\n a:hover, a:focus, a:focus:active, a:active {\n color: @text-color;\n }\n}","//\n// User Profile Flavor\n// --------------------------------------------------\n\n\n// Text align disabled account node\n.page-user-profile .page-header .alert {\n text-align: center;\n}\n\n// Style user's avatar\n.page-user-profile .page-header {\n img {\n background-color: #fff;\n border: 3px solid #fff;\n border-radius: @border-radius-large;\n .shadow-2dp();\n }\n\n .user-status .status-icon {\n width: 14px;\n height: 14px;\n\n font-size: 14px;\n line-height: 14px;\n }\n}\n\n.page-user-profile .profile-side-avatar {\n img {\n background-color: #fff;\n border: 3px solid #fff;\n border-radius: @border-radius-large;\n .shadow-4dp();\n }\n}","//\n// Profile Details\n// --------------------------------------------------\n\n\n.panel-profile-details-group.panel {\n border: 1px solid @panel-form-border;\n}\n\n\n.panel-profile-details-group.panel .form-group {\n margin: 0px;\n}\n\n\n.panel-profile-details-group .form-control-static {\n p:last-child {\n margin-bottom: 0px;\n }\n}","//\n// Default flavors for user ranks\n// --------------------------------------------------\n\n.post-rank-flavor(@border, @title) {\n .panel-post {\n border-color: @border;\n }\n\n .user-title {\n color: @title;\n\n a, a:link, a:visited,\n a:focus, a:hover, a:active {\n color: @title;\n }\n }\n}\n\n.card-rank-flavor(@border, @title, @color) {\n .panel-body {\n background: @body-bg;\n border: 2px solid @border;\n border-radius: @panel-border-radius;\n padding: @panel-body-padding - 2px;\n }\n\n .user-card-title {\n color: @title;\n\n a.user-title {\n &, &:link, &:visited,\n &:focus, &:hover, &:active {\n color: @title;\n }\n }\n }\n\n .user-card-stats li {\n color: @color;\n }\n}\n\n.list-group-rank-flavor(@border, @title) {\n border-left: 4px solid @border;\n padding-left: 11px;\n\n span.rank-name {\n color: @title;\n }\n\n a.rank-name {\n &, &:link, &:visited,\n &:focus, &:hover, &:active {\n color: @title;\n }\n }\n}\n\n.user-profile-rank-flavor(@color) {\n .user-rank {\n color: @color;\n\n a, a:link, a:visited,\n a:focus, a:hover, a:active {\n color: @color;\n }\n }\n}\n\n\n// Posts\n.post-primary {\n .post-rank-flavor(#b388ff, #6200ea);\n}\n\n.post-success {\n .post-rank-flavor(#00c853, #388e3c);\n}\n\n.post-warning {\n .post-rank-flavor(#ffab40, #ff6d00);\n}\n\n.post-danger {\n .post-rank-flavor(#ff8a80, #d50000);\n}\n\n\n// Cards\n.user-card-primary {\n .card-rank-flavor(#b388ff, #6200ea, #9575cd);\n}\n\n.user-card-success {\n .card-rank-flavor(#00c853, #388e3c, #66bb6a);\n}\n\n.user-card-warning {\n .card-rank-flavor(#ffab40, #ff6d00, #ff6e40);\n}\n\n.user-card-danger {\n .card-rank-flavor(#ff8a80, #d50000, #e57373);\n}\n\n\n// Posters ranking\n.list-group {\n .list-group-rank-primary {\n .list-group-rank-flavor(#7e57c2, #6200ea);\n }\n\n .list-group-rank-success {\n .list-group-rank-flavor(#9ccc65, #388e3c);\n }\n\n .list-group-rank-warning {\n .list-group-rank-flavor(#ff7043, #ff6d00);\n }\n\n .list-group-rank-danger {\n .list-group-rank-flavor(#f44336, #d50000);\n }\n}\n\n\n// User profiles\n.page-header-rank-primary {\n .user-profile-rank-flavor(#6200ea);\n}\n\n.page-header-rank-success {\n .user-profile-rank-flavor(#388e3c);\n}\n\n.page-header-rank-warning {\n .user-profile-rank-flavor(#ff6d00);\n}\n\n.page-header-rank-danger {\n .user-profile-rank-flavor(#d50000);\n}"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/misago/static/misago/js/misago.js b/misago/static/misago/js/misago.js
index 6ed9d6d1b5..ae9f5363e9 100644
--- a/misago/static/misago/js/misago.js
+++ b/misago/static/misago/js/misago.js
@@ -1,3 +1,3 @@
/*! For license information please see misago.js.LICENSE.txt */
-!function(){var e,t={54116:function(e,t){var n,a;(a="object"==typeof window&&window||"object"==typeof self&&self)&&(a.hljs=function(e){function t(e){return e.replace(/[&<>]/gm,(function(e){return k[e]}))}function n(e){return e.nodeName.toLowerCase()}function a(e,t){var n=e&&e.exec(t);return n&&0===n.index}function s(e){return y.test(e)}function i(e,t){var n,a={};for(n in e)a[n]=e[n];if(t)for(n in t)a[n]=t[n];return a}function o(e){var t=[];return function e(a,s){for(var i=a.firstChild;i;i=i.nextSibling)3===i.nodeType?s+=i.nodeValue.length:1===i.nodeType&&(t.push({event:"start",offset:s,node:i}),s=e(i,s),n(i).match(/br|hr|img|input/)||t.push({event:"stop",offset:s,node:i}));return s}(e,0),t}function r(e,a,s){function i(){return e.length&&a.length?e[0].offset!==a[0].offset?e[0].offset"}function r(e){u+=""+n(e)+">"}function l(e){("start"===e.event?o:r)(e.node)}for(var c=0,u="",d=[];e.length||a.length;){var p=i();if(u+=t(s.substring(c,p[0].offset)),c=p[0].offset,p===e){d.reverse().forEach(r);do{l(p.splice(0,1)[0]),p=i()}while(p===e&&p.length&&p[0].offset===c);d.reverse().forEach(o)}else"start"===p[0].event?d.push(p[0].node):d.pop(),l(p.splice(0,1)[0])}return u+t(s.substr(c))}function l(e){function t(e){return e&&e.source||e}function n(n,a){return new RegExp(t(n),"m"+(e.cI?"i":"")+(a?"g":""))}!function a(s,o){if(!s.compiled){if(s.compiled=!0,s.k=s.k||s.bK,s.k){var r={},l=function(t,n){e.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(e){var n=e.split("|");r[n[0]]=[t,n[1]?Number(n[1]):1]}))};"string"==typeof s.k?l("keyword",s.k):m(s.k).forEach((function(e){l(e,s.k[e])})),s.k=r}s.lR=n(s.l||/\w+/,!0),o&&(s.bK&&(s.b="\\b("+s.bK.split(" ").join("|")+")\\b"),s.b||(s.b=/\B|\b/),s.bR=n(s.b),s.e||s.eW||(s.e=/\B|\b/),s.e&&(s.eR=n(s.e)),s.tE=t(s.e)||"",s.eW&&o.tE&&(s.tE+=(s.e?"|":"")+o.tE)),s.i&&(s.iR=n(s.i)),null==s.r&&(s.r=1),s.c||(s.c=[]);var c=[];s.c.forEach((function(e){e.v?e.v.forEach((function(t){c.push(i(e,t))})):c.push("self"===e?s:e)})),s.c=c,s.c.forEach((function(e){a(e,s)})),s.starts&&a(s.starts,o);var u=s.c.map((function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b})).concat([s.tE,s.i]).map(t).filter(Boolean);s.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(e)}function c(e,n,s,i){function o(e,t){var n,s;for(n=0,s=t.c.length;s>n;n++)if(a(t.c[n].bR,e))return t.c[n]}function r(e,t){if(a(e.eR,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?r(e.parent,t):void 0}function d(e,t){return!s&&a(t.iR,e)}function p(e,t){var n=y.cI?t[0].toLowerCase():t[0];return e.k.hasOwnProperty(n)&&e.k[n]}function h(e,t,n,a){var s='')+t+(n?"":N)}function v(){w+=null!=_.sL?function(){var e="string"==typeof _.sL;if(e&&!Z[_.sL])return t(R);var n=e?c(_.sL,R,!0,k[_.sL]):u(R,_.sL.length?_.sL:void 0);return _.r>0&&(C+=n.r),e&&(k[_.sL]=n.top),h(n.language,n.value,!1,!0)}():function(){var e,n,a,s;if(!_.k)return t(R);for(s="",n=0,_.lR.lastIndex=0,a=_.lR.exec(R);a;)s+=t(R.substring(n,a.index)),(e=p(_,a))?(C+=e[1],s+=h(e[0],t(a[0]))):s+=t(a[0]),n=_.lR.lastIndex,a=_.lR.exec(R);return s+t(R.substr(n))}(),R=""}function m(e){w+=e.cN?h(e.cN,"",!0):"",_=Object.create(e,{parent:{value:_}})}function g(e,t){if(R+=e,null==t)return v(),0;var n=o(t,_);if(n)return n.skip?R+=t:(n.eB&&(R+=t),v(),n.rB||n.eB||(R=t)),m(n),n.rB?0:t.length;var a=r(_,t);if(a){var s=_;s.skip?R+=t:(s.rE||s.eE||(R+=t),v(),s.eE&&(R=t));do{_.cN&&(w+=N),_.skip||(C+=_.r),_=_.parent}while(_!==a.parent);return a.starts&&m(a.starts),s.rE?0:t.length}if(d(t,_))throw new Error('Illegal lexeme "'+t+'" for mode "'+(_.cN||"")+'"');return R+=t,t.length||1}var y=f(e);if(!y)throw new Error('Unknown language: "'+e+'"');l(y);var b,_=i||y,k={},w="";for(b=_;b!==y;b=b.parent)b.cN&&(w=h(b.cN,"",!0)+w);var R="",C=0;try{for(var E,S,L=0;_.t.lastIndex=L,E=_.t.exec(n);)S=g(n.substring(L,E.index),E[0]),L=E.index+S;for(g(n.substr(L)),b=_;b.parent;b=b.parent)b.cN&&(w+=N);return{r:C,value:w,language:e,top:_}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:t(n)};throw e}}function u(e,n){n=n||x.languages||m(Z);var a={r:0,value:t(e)},s=a;return n.filter(f).forEach((function(t){var n=c(t,e,!1);n.language=t,n.r>s.r&&(s=n),n.r>a.r&&(s=a,a=n)})),s.language&&(a.second_best=s),a}function d(e){return x.tabReplace||x.useBR?e.replace(_,(function(e,t){return x.useBR&&"\n"===e?" ":x.tabReplace?t.replace(/\t/g,x.tabReplace):void 0})):e}function p(e){var t,n,a,i,l,p=function(e){var t,n,a,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",n=b.exec(o))return f(n[1])?n[1]:"no-highlight";for(t=0,a=(o=o.split(/\s+/)).length;a>t;t++)if(s(i=o[t])||f(i))return i}(e);s(p)||(x.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/ /g,"\n"):t=e,l=t.textContent,a=p?c(p,l,!0):u(l),(n=o(t)).length&&((i=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=a.value,a.value=r(n,o(i),l)),a.value=d(a.value),e.innerHTML=a.value,e.className=function(e,t,n){var a=t?g[t]:n,s=[e.trim()];return e.match(/\bhljs\b/)||s.push("hljs"),-1===e.indexOf(a)&&s.push(a),s.join(" ").trim()}(e.className,p,a.language),e.result={language:a.language,re:a.r},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.r}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll("pre code");v.forEach.call(e,p)}}function f(e){return e=(e||"").toLowerCase(),Z[e]||Z[g[e]]}var v=[],m=Object.keys,Z={},g={},y=/^(no-?highlight|plain|text)$/i,b=/\blang(?:uage)?-([\w-]+)\b/i,_=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,N=" ",x={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},k={"&":"&","<":"<",">":">"};return e.highlight=c,e.highlightAuto=u,e.fixMarkup=d,e.highlightBlock=p,e.configure=function(e){x=i(x,e)},e.initHighlighting=h,e.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",h,!1),addEventListener("load",h,!1)},e.registerLanguage=function(t,n){var a=Z[t]=n(e);a.aliases&&a.aliases.forEach((function(e){g[e]=t}))},e.listLanguages=function(){return m(Z)},e.getLanguage=f,e.inherit=i,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(t,n,a){var s=e.inherit({cN:"comment",b:t,e:n,c:[]},a||{});return s.c.push(e.PWM),s.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),s},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e}({}),void 0===(n=function(){return a.hljs}.apply(t,[]))||(e.exports=n)),hljs.registerLanguage("xml",(function(e){var t={eW:!0,i:/,r:0,c:[{cN:"attr",b:"[A-Za-z0-9\\._:-]+",r:0},{b:/=\s*/,r:0,c:[{cN:"string",endsParent:!0,v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},e.C("\x3c!--","--\x3e",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"meta\",v:[{b:/<\\?xml/,e:/\\?>/,r:10},{b:/<\\?\\w+/,e:/\\?>/}]},{cN:\"tag\",b:\"?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,r:0},t]}]}});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```w*s*$\",e:\"^```s*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\t)\",e:\"$\",r:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,r:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],r:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage(\"ini\",function(e){var b={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",r:10},{b:'\"\"\"',e:'\"\"\"',r:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[e.C(\";\",\"$\"),e.HCM,{cN:\"section\",b:/^\\s*\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_-]+\\s*=\\s*/,e:\"$\",rB:!0,c:[{cN:\"attr\",b:/[a-z0-9\\[\\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},{cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},b,{cN:\"number\",b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},e.NM]}]}]}});hljs.registerLanguage(\"python\",function(e){var r={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},b={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[r],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},a={cN:\"number\",r:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},l={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",r,a,b]};return{aliases:[\"py\",\"gyp\"],k:{keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)|=>/,c:[r,a,b,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,l,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"css\",function(e){var c=\"[a-zA-Z-][a-zA-Z0-9_-]*\",t={b:/[A-Z\\_\\.\\-]+\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{b:\"@\",e:\"[{;]\",i:/:/,c:[{cN:\"keyword\",b:/\\w+/},{b:/\\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:c,r:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage(\"less\",function(e){var r=\"[\\\\w-]+\",t=\"(\"+r+\"|@{\"+r+\"})\",a=[],c=[],s=function(e){return{cN:\"string\",b:\"~?\"+e+\".*?\"+e}},b=function(e,r,t){return{cN:e,b:r,r:t}},n={b:\"\\\\(\",e:\"\\\\)\",c:c,r:0};c.push(e.CLCM,e.CBCM,s(\"'\"),s('\"'),e.CSSNM,{b:\"(url|data-uri)\\\\(\",starts:{cN:\"string\",e:\"[\\\\)\\\\n]\",eE:!0}},b(\"number\",\"#[0-9A-Fa-f]+\\\\b\"),n,b(\"variable\",\"@@?\"+r,10),b(\"variable\",\"@{\"+r+\"}\"),b(\"built_in\",\"~?`[^`]*?`\"),{cN:\"attribute\",b:r+\"\\\\s*:\",e:\":\",rB:!0,eE:!0},{cN:\"meta\",b:\"!important\"});var i=c.concat({b:\"{\",e:\"}\",c:a}),o={bK:\"when\",eW:!0,c:[{bK:\"and not\"}].concat(c)},u={b:t+\"\\\\s*:\",rB:!0,e:\"[;}]\",r:0,c:[{cN:\"attribute\",b:t,e:\":\",eE:!0,starts:{eW:!0,i:\"[<=$]\",r:0,c:c}}]},l={cN:\"keyword\",b:\"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b\",starts:{e:\"[;{}]\",rE:!0,c:c,r:0}},C={cN:\"variable\",v:[{b:\"@\"+r+\"\\\\s*:\",r:15},{b:\"@\"+r}],starts:{e:\"[;}]\",rE:!0,c:i}},p={v:[{b:\"[\\\\.#:&\\\\[>]\",e:\"[;{}]\"},{b:t,e:\"{\"}],rB:!0,rE:!0,i:\"[<='$\\\"]\",r:0,c:[e.CLCM,e.CBCM,o,b(\"keyword\",\"all\\\\b\"),b(\"variable\",\"@{\"+r+\"}\"),b(\"selector-tag\",t+\"%?\",0),b(\"selector-id\",\"#\"+t),b(\"selector-class\",\"\\\\.\"+t,0),b(\"selector-tag\",\"&\",0),{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"\\\\(\",e:\"\\\\)\",c:i},{b:\"!important\"}]};return a.push(e.CLCM,e.CBCM,l,C,u,p),{cI:!0,i:\"[=>'/<($\\\"]\",c:a}});hljs.registerLanguage(\"scss\",function(e){var t=\"[a-zA-Z-][a-zA-Z0-9_-]*\",i={cN:\"variable\",b:\"(\\\\$\"+t+\")\\\\b\"},r={cN:\"number\",b:\"#[0-9A-Fa-f]+\"};({cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:!0,i:\"[^\\\\s]\",starts:{eW:!0,eE:!0,c:[r,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"meta\",b:\"!important\"}]}});return{cI:!0,i:\"[=/|']\",c:[e.CLCM,e.CBCM,{cN:\"selector-id\",b:\"\\\\#[A-Za-z0-9_-]+\",r:0},{cN:\"selector-class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"selector-tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",r:0},{b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},i,{cN:\"attribute\",b:\"\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{b:\":\",e:\";\",c:[i,r,e.CSSNM,e.QSM,e.ASM,{cN:\"meta\",b:\"!important\"}]},{b:\"@\",e:\"[{;]\",k:\"mixin include extend for if else each while charset import debug media page content font-face namespace warn\",c:[i,e.QSM,e.ASM,r,e.CSSNM,{b:\"\\\\s[A-Za-z0-9_.-]+\",r:0}]}]}});hljs.registerLanguage(\"json\",function(e){var i={literal:\"true false null\"},n=[e.QSM,e.CNM],r={e:\",\",eW:!0,eE:!0,c:n,k:i},t={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(r,{b:/:/})],i:\"\\\\S\"},c={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(r)],i:\"\\\\S\"};return n.splice(n.length,0,t,c),{c:n,k:i,i:\"\\\\S\"}});hljs.registerLanguage(\"javascript\",function(e){var r=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},a={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)\"},{b:\"\\\\b(0[oO][0-7]+)\"},{b:e.CNR}],r:0},n={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:t,c:[]},c={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\"],k:t,c:[{cN:\"meta\",r:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\\s*/,r:0,c:[{b:r+\"\\\\s*:\",rB:!0,r:0,c:[{cN:\"attr\",b:r,r:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+r+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:r},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b:/,e:/(\\/\\w+|\\w+\\/)>/,sL:\"xml\",c:[{b:/<\\w+\\s*\\/>/,skip:!0},{b:/<\\w+/,e:/(\\/\\w+|\\w+\\/)>/,skip:!0,c:[{b:/<\\w+\\s*\\/>/,skip:!0},\"self\"]}]}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:s}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor\",e:/\\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},s={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]},a={cN:\"string\",b:/'/,e:/'/};return{aliases:[\"sh\",\"zsh\"],l:/-?[a-z\\._]+/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],r:0},e.HCM,s,a,t]}});","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst AGREEMENT_URL = ' %(agreement)s '\n\nconst RegisterLegalFootnote = props => {\n const {\n errors,\n privacyPolicy,\n termsOfService,\n onPrivacyPolicyChange,\n onTermsOfServiceChange\n } = props\n\n const termsOfServiceId = misago.get(\"TERMS_OF_SERVICE_ID\")\n const termsOfServiceUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n\n const privacyPolicyId = misago.get(\"PRIVACY_POLICY_ID\")\n const privacyPolicyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n\n if (!termsOfServiceId && !privacyPolicyId) return null\n\n return (\n \n \n \n
\n )\n}\n\nconst LegalAgreement = props => {\n const { agreement, checked, errors, url, value, onChange } = props\n\n if (!url) return null\n\n const agreementHtml = interpolate(\n AGREEMENT_URL,\n { agreement: escapeHtml(agreement), url: escapeHtml(url) },\n true\n )\n const label = interpolate(\n gettext(\"I have read and accept %(agreement)s.\"),\n { agreement: agreementHtml },\n true\n )\n\n return (\n \n
\n \n \n \n {errors &&\n errors.map((error, i) => (\n
\n {error}\n
\n ))}\n
\n )\n}\n\nexport default RegisterLegalFootnote\n","import React from \"react\"\nimport misago from \"misago\"\n\nconst StartSocialAuth = props => {\n const {\n buttonClassName,\n buttonLabel,\n formLabel,\n header,\n labelClassName\n } = props\n const socialAuth = misago.get(\"SOCIAL_AUTH\")\n\n if (socialAuth.length === 0) return null\n\n return (\n \n
\n
\n {socialAuth.map(({ id, name, button_text, button_color, url }) => {\n const className = \"btn btn-block btn-default btn-social-\" + id\n const style = button_color ? {color: button_color} : null\n const finalButtonLabel = button_text || interpolate(\n buttonLabel,\n { site: name },\n true\n )\n\n return (\n
\n )\n })}\n
\n
\n
\n
\n )\n}\n\nconst FormHeader = ({ className, text }) => {\n if (!text) return null\n return {text} \n}\n\nexport default StartSocialAuth\n","import React from \"react\"\nimport misago from \"misago\"\n\nexport default function(props) {\n const size = props.size || 100\n const size2x = props.size2x || size\n\n return (\n \n )\n}\n\nexport function getSrc(user, size) {\n if (user && user.id) {\n // just avatar hash, size and user id\n return resolveAvatarForSize(user.avatars, size).url\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n return misago.get(\"BLANK_AVATAR_URL\")\n }\n}\n\nexport function resolveAvatarForSize(avatars, size) {\n let avatar = avatars[0]\n avatars.forEach(av => {\n if (av.size >= size) {\n avatar = av\n }\n })\n return avatar\n}\n","import React from \"react\"\nimport Loader from \"./loader\"\n\nexport default class Button extends React.Component {\n render() {\n let className = \"btn \" + this.props.className\n let disabled = this.props.disabled\n\n if (this.props.loading) {\n className += \" btn-loading\"\n disabled = true\n }\n\n return (\n \n {this.props.children}\n {this.props.loading ? : null}\n \n )\n }\n}\n\nButton.defaultProps = {\n className: \"btn-default\",\n\n type: \"submit\",\n\n loading: false,\n disabled: false,\n\n onClick: null\n}\n","import React from \"react\"\n\nexport default function(props) {\n return (\n \n {props.choices.map(item => {\n return (\n \n {\"- - \".repeat(item.level) + item.label}\n \n )\n })}\n \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.dropdown) {\n return \"btn btn-default btn-aligned btn-icon btn-dropdown-toggle open hidden-md hidden-lg\"\n } else {\n return \"btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg\"\n }\n }\n\n render() {\n return (\n \n menu \n \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function({ display }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function({ display }) {\n if (!display) return null\n\n return (\n \n \n
\n )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n onChange = ev => {\n const { field, onChange } = this.props\n onChange(field.fieldname, ev.target.value)\n }\n\n render() {\n const { disabled, field, value } = this.props\n const { input } = field\n\n if (input.type === \"select\") {\n return (\n \n )\n }\n\n if (input.type === \"textarea\") {\n return (\n \n )\n }\n\n if (input.type === \"text\") {\n return (\n \n )\n }\n\n return null\n }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function({ disabled, errors, fields, name, onChange, value }) {\n return (\n \n {name} \n {fields.map(field => {\n return (\n \n \n \n )\n })}\n \n )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n errors: {}\n }\n\n const groups = props.groups.length\n for (let i = 0; i < groups; i++) {\n const group = props.groups[i]\n const fields = group.fields.length\n for (let f = 0; f < fields; f++) {\n const fieldname = group.fields[f].fieldname\n const initial = group.fields[f].initial\n this.state[fieldname] = initial\n }\n }\n }\n\n send() {\n const data = Object.assign({}, this.state, {\n errors: null,\n isLoading: null\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess(data) {\n this.props.onSuccess(data)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({ errors: rejection })\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onChange = (name, value) => {\n this.setState({\n [name]: value\n })\n }\n\n render() {\n return (\n \n )\n }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n if (!onCancel) return null\n\n return (\n \n {gettext(\"Cancel\")}\n \n )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n loading: true,\n groups: null\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.api).then(\n groups => {\n this.setState({\n loading: false,\n\n groups\n })\n },\n rejection => {\n snackbar.apiError(rejection)\n if (this.props.cancel) {\n this.props.cancel()\n }\n }\n )\n }\n\n render() {\n const { groups, loading } = this.state\n\n return (\n \n
\n
{gettext(\"Edit details\")} \n \n
\n
\n
\n
\n )\n }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isValidated() {\n return typeof this.props.validation !== \"undefined\"\n }\n\n getClassName() {\n let className = \"form-group\"\n if (this.isValidated()) {\n className += \" has-feedback\"\n if (this.props.validation === null) {\n className += \" has-success\"\n } else {\n className += \" has-error\"\n }\n }\n return className\n }\n\n getFeedback() {\n if (this.props.validation) {\n return (\n \n {this.props.validation.map((error, i) => {\n return
{error}
\n })}\n
\n )\n } else {\n return null\n }\n }\n\n getFeedbackDescription() {\n if (this.isValidated()) {\n return (\n \n {this.props.validation ? gettext(\"(error)\") : gettext(\"(success)\")}\n \n )\n } else {\n return null\n }\n }\n\n getHelpText() {\n if (this.props.helpText) {\n return {this.props.helpText}
\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
\n {this.props.label + \":\"}\n \n
\n {this.props.children}\n {this.getFeedbackDescription()}\n {this.getFeedback()}\n {this.getHelpText()}\n {this.props.extra || null}\n
\n
\n )\n }\n}\n","import React from \"react\"\nimport { required } from \"misago/utils/validators\"\nimport snackbar from \"misago/services/snackbar\"\n\nlet validateRequired = required()\n\nexport default class extends React.Component {\n validate() {\n let errors = {}\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: this.state.validators.required || this.state.validators,\n optional: this.state.validators.optional || {}\n }\n\n let validatedFields = []\n\n // add required fields to validation\n for (let name in validators.required) {\n if (\n validators.required.hasOwnProperty(name) &&\n validators.required[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // add optional fields to validation\n for (let name in validators.optional) {\n if (\n validators.optional.hasOwnProperty(name) &&\n validators.optional[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // validate fields values\n for (let i in validatedFields) {\n let name = validatedFields[i]\n let fieldErrors = this.validateField(name, this.state[name])\n\n if (fieldErrors === null) {\n errors[name] = null\n } else if (fieldErrors) {\n errors[name] = fieldErrors\n }\n }\n\n return errors\n }\n\n isValid() {\n let errors = this.validate()\n for (let field in errors) {\n if (errors.hasOwnProperty(field)) {\n if (errors[field] !== null) {\n return false\n }\n }\n }\n\n return true\n }\n\n validateField(name, value) {\n let errors = []\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: (this.state.validators.required || this.state.validators)[name],\n optional: (this.state.validators.optional || {})[name]\n }\n\n let requiredError = validateRequired(value) || false\n\n if (validators.required) {\n if (requiredError) {\n errors = [requiredError]\n } else {\n for (let i in validators.required) {\n let validationError = validators.required[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n }\n\n return errors.length ? errors : null\n } else if (requiredError === false && validators.optional) {\n for (let i in validators.optional) {\n let validationError = validators.optional[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n\n return errors.length ? errors : null\n }\n\n return false // false === field wasn't validated\n }\n\n bindInput = name => {\n return event => {\n this.changeValue(name, event.target.value)\n }\n }\n\n changeValue = (name, value) => {\n let newState = {\n [name]: value\n }\n\n const formErrors = this.state.errors || {}\n formErrors[name] = this.validateField(name, newState[name])\n newState.errors = formErrors\n\n this.setState(newState)\n }\n\n clean() {\n return true\n }\n\n send() {\n return null\n }\n\n handleSuccess(success) {\n return\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n handleSubmit = event => {\n // we don't reload page on submissions\n if (event) {\n event.preventDefault()\n }\n\n if (this.state.isLoading) {\n return\n }\n\n if (this.clean()) {\n this.setState({ isLoading: true })\n let promise = this.send()\n\n if (promise) {\n promise.then(\n success => {\n this.setState({ isLoading: false })\n this.handleSuccess(success)\n },\n rejection => {\n this.setState({ isLoading: false })\n this.handleError(rejection)\n }\n )\n } else {\n this.setState({ isLoading: false })\n }\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isActive() {\n if (this.props.isControlled) {\n return this.props.isActive\n } else {\n if (this.props.path) {\n return document.location.pathname.indexOf(this.props.path) === 0\n } else {\n return false\n }\n }\n }\n\n getClassName() {\n if (this.isActive()) {\n return (\n (this.props.className || \"\") +\n \" \" +\n (this.props.activeClassName || \"active\")\n )\n } else {\n return this.props.className || \"\"\n }\n }\n\n render() {\n return {this.props.children} \n }\n}\n","import React from \"react\"\n\nexport default function(props) {\n return (\n \n )\n}\n","import React from \"react\"\nimport Button from \"./button\"\nimport Form from \"./form\"\nimport FormGroup from \"./form-group\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n bestAnswer: \"0\",\n poll: \"0\"\n }\n }\n\n clean() {\n if (this.props.polls && this.state.poll === \"0\") {\n const confirmation = window.confirm(\n gettext(\"Are you sure you want to delete all polls?\")\n )\n return confirmation\n }\n\n return true\n }\n\n send() {\n const data = Object.assign({}, this.props.data, {\n best_answer: this.state.bestAnswer,\n poll: this.state.poll\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess = success => {\n this.props.onSuccess(success)\n modal.hide()\n }\n\n handleError = rejection => {\n this.props.onError(rejection)\n }\n\n onBestAnswerChange = event => {\n this.changeValue(\"bestAnswer\", event.target.value)\n }\n\n onPollChange = event => {\n this.changeValue(\"poll\", event.target.value)\n }\n\n render() {\n return (\n \n
\n
\n \n × \n \n
{gettext(\"Merge threads\")} \n \n
\n
\n
\n )\n }\n}\n\nexport function BestAnswerSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map(choice => {\n return (\n \n {choice[1]}\n \n )\n })}\n \n \n )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map(choice => {\n return (\n \n {choice[1]}\n \n )\n })}\n \n \n )\n}\n","const ytRegExp = new RegExp(\n \"^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*\"\n)\n\nexport class OneBox {\n constructor() {\n this._youtube = {}\n }\n\n render = domnode => {\n if (!domnode) return\n this.highlightCode(domnode)\n this.embedYoutubePlayers(domnode)\n }\n\n highlightCode(domnode) {\n const codeblocks = domnode.querySelectorAll(\"pre>code\")\n for (let i = 0; i < codeblocks.length; i++) {\n const code = codeblocks[i]\n hljs.highlightBlock(code)\n }\n }\n\n embedYoutubePlayers(domnode) {\n const anchors = domnode.querySelectorAll(\"p>a\")\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i]\n const p = a.parentNode\n const onlyChild = p.childNodes.length === 1\n\n if (!this._youtube[a.href]) {\n this._youtube[a.href] = parseYoutubeUrl(a.href)\n }\n\n const youtubeMovie = this._youtube[a.href]\n if (onlyChild && !!youtubeMovie && youtubeMovie.data !== false) {\n this.swapYoutubePlayer(a, youtubeMovie)\n }\n }\n }\n\n swapYoutubePlayer(element, youtube) {\n let url = \"https://www.youtube.com/embed/\"\n url += youtube.video\n url += \"?rel=0\"\n if (youtube.start) {\n url += \"&start=\" + youtube.start\n }\n\n const player = $(\n ''\n )\n $(element).replaceWith(player)\n player.wrap('
')\n }\n}\n\nexport default new OneBox()\n\nexport function parseYoutubeUrl(url) {\n const cleanedUrl = cleanUrl(url)\n const video = getVideoIdFromUrl(cleanedUrl)\n\n if (!video) return null\n\n let start = 0\n if (cleanedUrl.indexOf(\"?\") > 0) {\n const query = cleanedUrl.substr(cleanedUrl.indexOf(\"?\") + 1)\n const timebit = query.split(\"&\").filter(i => {\n return i.substr(0, 2) === \"t=\"\n })[0]\n\n if (timebit) {\n const bits = timebit.substr(2).split(\"m\")\n if (bits[0].substr(-1) === \"s\") {\n start += parseInt(bits[0].substr(0, bits[0].length - 1))\n } else {\n start += parseInt(bits[0]) * 60\n if (!!bits[1] && bits[1].substr(-1) === \"s\") {\n start += parseInt(bits[1].substr(0, bits[1].length - 1))\n }\n }\n }\n }\n\n return {\n start,\n video\n }\n}\n\nexport function cleanUrl(url) {\n let clean = url\n\n if (url.substr(0, 8) === \"https://\") {\n clean = clean.substr(8)\n } else if (url.substr(0, 7) === \"http://\") {\n clean = clean.substr(7)\n }\n\n if (clean.substr(0, 4) === \"www.\") {\n clean = clean.substr(4)\n }\n\n return clean\n}\n\nexport function getVideoIdFromUrl(url) {\n if (url.indexOf(\"youtu\") === -1) return null\n\n const video = url.match(ytRegExp)\n if (video) {\n return video[1]\n }\n return null\n}\n","import React from \"react\"\nimport onebox from \"misago/services/one-box\"\n\nexport default class extends React.Component {\n componentDidMount() {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n componentDidUpdate(prevProps, prevState) {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return nextProps.markup !== this.props.markup\n }\n\n render() {\n return (\n {\n this.documentNode = node\n }}\n />\n )\n }\n}\n\nfunction revealSpoiler(event) {\n var btn = event.target\n $(btn).parent().parent().addClass(\"revealed\")\n}","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n \n \n
\n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends PanelMessage {\n getHelpText() {\n if (this.props.helpText) {\n return {this.props.helpText}
\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
\n \n {this.props.icon || \"info_outline\"}\n \n
\n
\n
{this.props.message}
\n {this.getHelpText()}\n
\n {gettext(\"Ok\")}\n \n
\n
\n )\n }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.copy && this.props.copy.length) {\n if (\n stringCount(this.props.copy, \"
\n )\n } else {\n return null\n }\n }\n}\n","export default function(string, subString) {\n string = (string + \"\").toLowerCase()\n subString = (subString + \"\").toLowerCase()\n\n if (subString.length <= 0) return 0\n\n let n = 0\n let pos = 0\n let step = subString.length\n\n while (true) {\n pos = string.indexOf(subString, pos)\n if (pos >= 0) {\n n += 1\n pos += step\n } else {\n break\n }\n }\n\n return n\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n \n \n
\n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.helpText) {\n return {this.props.helpText}
\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
\n \n {this.props.icon || \"info_outline\"}\n \n
\n
\n
{this.props.message}
\n {this.getHelpText()}\n
\n
\n )\n }\n}\n","import React from \"react\"\n\nexport default function(props) {\n return (\n \n {props.poll.choices.map(choice => {\n return (\n
\n )\n })}\n
\n )\n}\n\nexport function PollChoice(props) {\n let proc = 0\n if (props.choice.votes && props.poll.votes) {\n proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n }\n\n return (\n \n {props.choice.label} \n \n \n
\n \n {getVotesLabel(props.votes, props.proc)}\n \n
\n
\n \n \n \n )\n}\n\nexport function ChoiceVotes(props) {\n return (\n \n {getVotesLabel(props.votes, props.proc)}\n \n )\n}\n\nexport function getVotesLabel(votes, proc) {\n const message = ngettext(\n \"%(votes)s vote, %(proc)s% of total.\",\n \"%(votes)s votes, %(proc)s% of total.\",\n votes\n )\n\n return interpolate(\n message,\n {\n votes: votes,\n proc: proc\n },\n true\n )\n}\n\nexport function UserChoice(props) {\n if (!props.selected) return null\n\n return (\n \n check_box \n {gettext(\"Your choice.\")}\n \n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: []\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.poll.api.votes).then(\n data => {\n const hydratedData = data.map(choice => {\n return Object.assign({}, choice, {\n voters: choice.voters.map(voter => {\n return Object.assign({}, voter, {\n voted_on: moment(voter.voted_on)\n })\n })\n })\n })\n\n this.setState({\n isLoading: false,\n data: hydratedData\n })\n },\n rejection => {\n this.setState({\n isLoading: false,\n error: rejection.detail\n })\n }\n )\n }\n\n render() {\n return (\n \n
\n
\n \n × \n \n
{gettext(\"Poll votes\")} \n \n\n
\n
\n
\n )\n }\n}\n\nexport function ModalBody(props) {\n if (props.isLoading) {\n return \n } else if (props.error) {\n return \n }\n\n return \n}\n\nexport function ChoicesList(props) {\n return (\n \n
\n {props.data.map(choice => {\n return \n })}\n \n
\n )\n}\n\nexport function ChoiceDetails(props) {\n return (\n \n {props.label} \n \n \n \n \n )\n}\n\nexport function VotesCount(props) {\n const message = ngettext(\n \"%(votes)s user has voted for this choice.\",\n \"%(votes)s users have voted for this choice.\",\n props.votes\n )\n\n const label = interpolate(\n message,\n {\n votes: props.votes\n },\n true\n )\n\n return {label}
\n}\n\nexport function VotesList(props) {\n if (!props.voters.length) return null\n\n return (\n \n {props.voters.map(user => {\n return \n })}\n \n )\n}\n\nexport function Voter(props) {\n if (props.url) {\n return (\n \n \n {props.username}\n {\" \"}\n \n \n )\n }\n\n return (\n \n {props.username} \n \n )\n}\n\nexport function VoteDate(props) {\n return (\n \n {props.voted_on.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function(props) {\n const { isPollOver, poll, showVoting, thread } = props\n\n if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n const controls = []\n\n const canVote = poll.acl.can_vote\n const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n if (canVote && canChangeVote) controls.push(0)\n if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n if (poll.acl.can_edit) controls.push(2)\n if (poll.acl.can_delete) controls.push(3)\n\n return (\n \n \n \n \n \n
\n )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n return (\n poll.is_public ||\n acl.can_delete ||\n acl.can_edit ||\n acl.can_see_votes ||\n (acl.can_vote &&\n !isPollOver &&\n (!poll.hasSelectedChoices || poll.allow_revotes))\n )\n}\n\nexport function getClassName(controls, control) {\n let className = \"col-xs-6\"\n\n if (controls.length === 1) {\n className = \"col-xs-12\"\n }\n\n if (controls.length === 3 && controls[0] === control) {\n className = \"col-xs-12\"\n }\n\n return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n const canVote = props.poll.acl.can_vote\n const canChangeVote =\n !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n if (!(canVote && canChangeVote)) return null\n\n return (\n \n \n {gettext(\"Vote\")}\n \n
\n )\n}\n\nexport class SeeVotes extends React.Component {\n onClick = () => {\n modal.show( )\n }\n\n render() {\n const seeVotes =\n this.props.poll.is_public || this.props.poll.acl.can_see_votes\n if (!seeVotes) return null\n\n return (\n \n \n {gettext(\"See votes\")}\n \n
\n )\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n submit: this.props.poll.api.index,\n\n thread: this.props.thread,\n poll: this.props.poll,\n\n mode: \"POLL\"\n })\n }\n\n render() {\n if (!this.props.poll.acl.can_edit) return null\n\n return (\n \n \n {gettext(\"Edit\")}\n \n
\n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const deletePoll = window.confirm(\n gettext(\n \"Are you sure you want to delete this poll? This action is not reversible.\"\n )\n )\n if (!deletePoll) return false\n\n store.dispatch(poll.busy())\n\n ajax\n .delete(this.props.poll.api.index)\n .then(this.handleSuccess, this.handleError)\n }\n\n handleSuccess = newThreadAcl => {\n snackbar.success(\"Poll has been deleted\")\n store.dispatch(poll.remove())\n store.dispatch(thread.updateAcl(newThreadAcl))\n }\n\n handleError = rejection => {\n snackbar.apiError(rejection)\n store.dispatch(poll.release())\n }\n\n render() {\n if (!this.props.poll.acl.can_delete) return null\n\n return (\n \n \n {gettext(\"Delete\")}\n \n
\n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s '\nconst USER_SPAN = '%(user)s '\nconst USER_URL = '%(user)s '\n\nexport default function(props) {\n return (\n \n )\n}\n\nexport function PollCreation(props) {\n const message = interpolate(\n escapeHtml(gettext(\"Posted by %(poster)s %(posted_on)s.\")),\n {\n poster: getPoster(props.poll),\n posted_on: getPostedOn(props.poll)\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getPoster(poll) {\n if (poll.url.poster) {\n return interpolate(\n USER_URL,\n {\n url: escapeHtml(poll.url.poster),\n user: escapeHtml(poll.poster_name)\n },\n true\n )\n }\n\n return interpolate(\n USER_SPAN,\n {\n user: escapeHtml(poll.poster_name)\n },\n true\n )\n}\n\nexport function getPostedOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n relative: escapeHtml(poll.posted_on.fromNow())\n },\n true\n )\n}\n\nexport function PollLength(props) {\n if (!props.poll.length) {\n return null\n }\n\n const message = interpolate(\n escapeHtml(gettext(\"Voting ends %(ends_on)s.\")),\n {\n ends_on: getEndsOn(props.poll)\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getEndsOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n relative: escapeHtml(poll.endsOn.fromNow())\n },\n true\n )\n}\n\nexport function PollVotes(props) {\n const message = ngettext(\"%(votes)s vote.\", \"%(votes)s votes.\", props.votes)\n const label = interpolate(\n message,\n {\n votes: props.votes\n },\n true\n )\n\n return {label} \n}\n\nexport function PollIsPublic(props) {\n if (!props.poll.is_public) {\n return null\n }\n\n return {gettext(\"Votes are public.\")} \n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function(props) {\n return (\n \n
\n
{props.poll.question} \n
\n
\n
\n
\n
\n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s '\nconst USER_SPAN = '%(user)s '\nconst USER_URL = '%(user)s '\n\nexport default function(props) {\n return (\n \n )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n if (choicesLeft === 0) {\n return (\n \n {gettext(\"You can't select any more choices.\")}\n \n )\n }\n\n const message = ngettext(\n \"You can select %(choices)s more choice.\",\n \"You can select %(choices)s more choices.\",\n choicesLeft\n )\n\n const label = interpolate(\n message,\n {\n choices: choicesLeft\n },\n true\n )\n\n return {label} \n}\n\nexport function PollAllowRevote(props) {\n if (props.poll.allow_revotes) {\n return (\n \n {gettext(\"You can change your vote later.\")}\n \n )\n }\n\n return {gettext(\"Votes are final.\")} \n}\n","import React from \"react\"\n\nexport default function(props) {\n return (\n \n {props.choices.map(choice => {\n return (\n \n )\n })}\n \n )\n}\n\nexport class ChoiceSelect extends React.Component {\n onClick = () => {\n this.props.toggleChoice(this.props.choice.hash)\n }\n\n render() {\n return (\n \n \n \n {this.props.choice.selected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n {this.props.choice.label} \n \n \n )\n }\n}\n","export function getChoiceFromHash(choices, hash) {\n for (const i in choices) {\n const choice = choices[i]\n if (choice.hash === hash) {\n return choice\n }\n }\n\n return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n let selection = []\n for (const i in choices) {\n const choice = choices[i]\n if (choice.selected) {\n selection.push(choice)\n }\n }\n\n return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n choices: props.poll.choices,\n choicesLeft: getChoicesLeft(props.poll, props.poll.choices)\n }\n }\n\n toggleChoice = hash => {\n const choice = getChoiceFromHash(this.state.choices, hash)\n\n let choices = null\n if (!choice.selected) {\n choices = this.selectChoice(choice, hash)\n } else {\n choices = this.deselectChoice(choice, hash)\n }\n\n this.setState({\n choices,\n choicesLeft: getChoicesLeft(this.props.poll, choices)\n })\n }\n\n selectChoice = (choice, hash) => {\n const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n if (!choicesLeft) {\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected && item.hash != hash) {\n item.selected = false\n break\n }\n }\n }\n\n return this.state.choices.map(choice => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? true : choice.selected\n })\n })\n }\n\n deselectChoice = (choice, hash) => {\n return this.state.choices.map(choice => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? false : choice.selected\n })\n })\n }\n\n clean() {\n if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n snackbar.error(gettext(\"You need to select at least one choice\"))\n return false\n }\n\n return true\n }\n\n send() {\n let data = []\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected) {\n data.push(item.hash)\n }\n }\n\n return ajax.post(this.props.poll.api.votes, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n snackbar.success(gettext(\"Your vote has been saved.\"))\n\n this.props.showResults()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const controls = []\n\n if (this.props.poll.acl.can_vote) controls.push(0)\n if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n controls.push(1)\n if (this.props.poll.acl.can_edit) controls.push(2)\n if (this.props.poll.acl.can_delete) controls.push(3)\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n let showResults = true\n if (props.user.id && !props.poll.hasSelectedChoices) {\n showResults = false\n }\n\n this.state = {\n showResults\n }\n }\n\n showResults = () => {\n this.setState({\n showResults: true\n })\n }\n\n showVoting = () => {\n this.setState({\n showResults: false\n })\n }\n\n render() {\n if (!this.props.thread.poll) return null\n\n const isPollOver = getIsPollOver(this.props.poll)\n\n if (\n !isPollOver &&\n this.props.poll.acl.can_vote &&\n !this.state.showResults\n ) {\n return \n } else {\n return (\n \n )\n }\n }\n}\n\nexport function getIsPollOver(poll) {\n if (poll.length) {\n return moment().isAfter(poll.endsOn)\n }\n return false\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n onAdd = () => {\n let choices = this.props.choices.slice()\n choices.push({\n hash: generateRandomHash(),\n label: \"\"\n })\n\n this.props.setChoices(choices)\n }\n\n onChange = (hash, label) => {\n const choices = this.props.choices.map(choice => {\n if (choice.hash === hash) {\n choice.label = label\n }\n\n return choice\n })\n this.props.setChoices(choices)\n }\n\n onDelete = hash => {\n const choices = this.props.choices.filter(choice => {\n return choice.hash !== hash\n })\n this.props.setChoices(choices)\n }\n\n render() {\n return (\n \n
\n {this.props.choices.map(choice => {\n return (\n 2}\n choice={choice}\n disabled={this.props.disabled}\n key={choice.hash}\n onChange={this.onChange}\n onDelete={this.onDelete}\n />\n )\n })}\n \n
\n {gettext(\"Add choice\")}\n \n
\n )\n }\n}\n\nexport class PollChoice extends React.Component {\n onChange = event => {\n this.props.onChange(this.props.choice.hash, event.target.value)\n }\n\n onDelete = () => {\n const deleteItem = window.confirm(\n gettext(\"Are you sure you want to delete this choice?\")\n )\n if (deleteItem) {\n this.props.onDelete(this.props.choice.hash)\n }\n }\n\n render() {\n return (\n \n \n close \n \n \n \n )\n }\n}\n\nexport function generateRandomHash() {\n let randomHash = \"\"\n while (randomHash.length != 12) {\n randomHash = Math.random()\n .toString(36)\n .replace(/[^a-zA-Z0-9]+/g, \"\")\n .substr(1, 12)\n }\n return randomHash\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const poll = props.poll || {\n question: \"\",\n choices: [\n {\n hash: \"choice-10000\",\n label: \"\"\n },\n {\n hash: \"choice-20000\",\n label: \"\"\n }\n ],\n length: 0,\n allowed_choices: 1,\n allow_revotes: 0,\n is_public: 0\n }\n\n this.state = {\n isLoading: false,\n isEdit: !!poll.question,\n\n question: poll.question,\n choices: poll.choices,\n length: poll.length,\n allowed_choices: poll.allowed_choices,\n allow_revotes: poll.allow_revotes,\n is_public: poll.is_public,\n\n validators: {\n question: [],\n choices: [],\n length: [],\n allowed_choices: []\n },\n\n errors: {}\n }\n }\n\n setChoices = choices => {\n const errors = Object.assign({}, errors, { choices: null })\n\n this.setState({\n choices,\n errors\n })\n }\n\n onCancel = () => {\n const cancel = window.confirm(gettext(\"Are you sure you want to discard poll?\"))\n if (cancel) {\n posting.close()\n }\n }\n\n send() {\n const data = {\n question: this.state.question,\n choices: this.state.choices,\n length: this.state.length,\n allowed_choices: this.state.allowed_choices,\n allow_revotes: this.state.allow_revotes,\n is_public: this.state.is_public\n }\n\n if (this.state.isEdit) {\n return ajax.put(this.props.poll.api.index, data)\n } else {\n return ajax.post(this.props.thread.api.poll, data)\n }\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n\n if (this.state.isEdit) {\n snackbar.success(gettext(\"Poll has been edited.\"))\n } else {\n snackbar.success(gettext(\"Poll has been posted.\"))\n }\n\n posting.close()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.non_field_errors) {\n rejection.allowed_choices = rejection.non_field_errors\n }\n\n this.setState({\n errors: Object.assign({}, rejection)\n })\n\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n \n )\n }\n}\n\nexport function PollPublicSwitch(props) {\n if (props.isEdit) return null\n\n return (\n \n \n \n \n
\n )\n}\n","import React from \"react\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nexport default function(props) {\n if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default(props) {\n return (\n \n \n
\n )\n}\n\nexport function Invalid(props) {\n return (\n \n
\n {gettext(\"This post's contents cannot be displayed.\")}\n
\n
\n {gettext(\"This error is caused by invalid post content manipulation.\")}\n
\n
\n )\n}\n","import React from \"react\"\n\nexport default function({ post }) {\n const { category, thread } = post\n\n const tooltip = interpolate(\n gettext(\"posted %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\")\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function({ post }) {\n return (\n \n {gettext(\"See post\")} \n chevron_right \n \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\n\nexport default function({ post }) {\n return (\n \n
\n
\n
\n
\n
\n {post.poster_name} \n
\n
\n {gettext(\"Removed user\")}\n \n
\n
\n
\n )\n}\n","import React from \"react\"\n\nexport default function({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle} \n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\nimport UserTitle from \"./user-title\"\n\nexport default function({ post, poster }) {\n return (\n \n )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function({ post, poster }) {\n if (poster.id) {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport Body from \"./body\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function({ post, poster }) {\n const user = poster || post.poster\n\n let className = \"post\"\n if (user && user.rank.css_class) {\n className += \" post-\" + user.rank.css_class\n }\n\n return (\n \n \n \n \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default function() {\n return (\n