Made a huge amount of progress on the Cosora Theme in the Control Panel, it's almost ready for deployment.

Added the view counter, it currently collects data without exposing it to the admin.

Added an API for scheduling tasks which run once every second and once every fifteen minutes.
Added a generated map containing all the routes with the function names as keys.
Added the request counter to the generated router.
Added more ARIA Labels and moved various bits and pieces into the CSS files for flexibility.
Removed a bunch of redundant avatar checks in the templates.
Improved the mobile friendliness of Cosora.
Fixed various issues in the other themes.
Refactored the file listener.
Gosora now resyncs newly created theme files not just modified ones.
Gosora now resyncs renamed theme files not just modified ones.
This commit is contained in:
Azareal 2017-12-10 03:43:30 +00:00
parent 9eae8da180
commit abfe0a472a
48 changed files with 1242 additions and 713 deletions

63
common/counters.go Normal file
View File

@ -0,0 +1,63 @@
package common
import (
"database/sql"
"sync/atomic"
"../query_gen/lib"
)
var GlobalViewCounter *BufferedViewCounter
type BufferedViewCounter struct {
buckets [2]int64
currentBucket int64
insert *sql.Stmt
}
func NewGlobalViewCounter() (*BufferedViewCounter, error) {
acc := qgen.Builder.Accumulator()
counter := &BufferedViewCounter{
currentBucket: 0,
insert: acc.SimpleInsert("viewchunks", "count, createdAt", "?,UTC_TIMESTAMP()"),
}
//AddScheduledFifteenMinuteTask(counter.Tick)
AddScheduledSecondTask(counter.Tick)
return counter, acc.FirstError()
}
func (counter *BufferedViewCounter) Tick() (err error) {
var oldBucket = counter.currentBucket
var nextBucket int64
if counter.currentBucket == 1 {
nextBucket = 0
} else {
nextBucket = 1
}
atomic.AddInt64(&counter.buckets[oldBucket], counter.buckets[nextBucket])
atomic.StoreInt64(&counter.buckets[nextBucket], 0)
atomic.StoreInt64(&counter.currentBucket, nextBucket)
/*debugLog("counter.buckets[nextBucket]: ", counter.buckets[nextBucket])
debugLog("counter.buckets[oldBucket]: ", counter.buckets[oldBucket])
debugLog("counter.currentBucket:", counter.currentBucket)
debugLog("oldBucket:", oldBucket)
debugLog("nextBucket:", nextBucket)*/
var previousViewChunk = counter.buckets[oldBucket]
atomic.AddInt64(&counter.buckets[oldBucket], -previousViewChunk)
return counter.insertChunk(previousViewChunk)
}
func (counter *BufferedViewCounter) Bump() {
atomic.AddInt64(&counter.buckets[counter.currentBucket], 1)
}
func (counter *BufferedViewCounter) insertChunk(count int64) error {
if count == 0 {
return nil
}
debugLogf("Inserting a viewchunk with a count of %d", count)
_, err := counter.insert.Exec(count)
return err
}

View File

@ -19,6 +19,8 @@ type TaskStmts struct {
getSync *sql.Stmt
}
var ScheduledSecondTasks []func() error
var ScheduledFifteenMinuteTasks []func() error
var taskStmts TaskStmts
var lastSync time.Time
@ -33,6 +35,17 @@ func init() {
})
}
// AddScheduledSecondTask is not concurrency safe
func AddScheduledSecondTask(task func() error) {
ScheduledSecondTasks = append(ScheduledSecondTasks, task)
}
// AddScheduledFifteenMinuteTask is not concurrency safe
func AddScheduledFifteenMinuteTask(task func() error) {
ScheduledFifteenMinuteTasks = append(ScheduledFifteenMinuteTasks, task)
}
// TODO: Use AddScheduledSecondTask
func HandleExpiredScheduledGroups() error {
rows, err := taskStmts.getExpiredScheduledGroups.Query()
if err != nil {
@ -58,6 +71,7 @@ func HandleExpiredScheduledGroups() error {
return rows.Err()
}
// TODO: Use AddScheduledSecondTask
func HandleServerSync() error {
var lastUpdate time.Time
err := taskStmts.getSync.QueryRow().Scan(&lastUpdate)

View File

@ -165,10 +165,9 @@ func (widget *Widget) Build(hvars interface{}) (string, error) {
return widget.Body, nil
}
var b bytes.Buffer
var headerVars = hvars.(*HeaderVars)
err := RunThemeTemplate(headerVars.Theme.Name, widget.Body, hvars, headerVars.Writer)
return string(b.Bytes()), err
return "", err
}
// TODO: Make a store for this?

View File

@ -13,6 +13,64 @@ import (
)
var ErrNoRoute = errors.New("That route doesn't exist.")
var RouteMap = map[string]interface{}{
"routeAPI": routeAPI,
"routeOverview": routeOverview,
"routeForums": routeForums,
"routeForum": routeForum,
"routeChangeTheme": routeChangeTheme,
"routeShowAttachment": routeShowAttachment,
"routeReportSubmit": routeReportSubmit,
"routeTopicCreate": routeTopicCreate,
"routeTopics": routeTopics,
"routePanelForums": routePanelForums,
"routePanelForumsCreateSubmit": routePanelForumsCreateSubmit,
"routePanelForumsDelete": routePanelForumsDelete,
"routePanelForumsDeleteSubmit": routePanelForumsDeleteSubmit,
"routePanelForumsEdit": routePanelForumsEdit,
"routePanelForumsEditSubmit": routePanelForumsEditSubmit,
"routePanelForumsEditPermsSubmit": routePanelForumsEditPermsSubmit,
"routePanelSettings": routePanelSettings,
"routePanelSettingEdit": routePanelSettingEdit,
"routePanelSettingEditSubmit": routePanelSettingEditSubmit,
"routePanelWordFilters": routePanelWordFilters,
"routePanelWordFiltersCreate": routePanelWordFiltersCreate,
"routePanelWordFiltersEdit": routePanelWordFiltersEdit,
"routePanelWordFiltersEditSubmit": routePanelWordFiltersEditSubmit,
"routePanelWordFiltersDeleteSubmit": routePanelWordFiltersDeleteSubmit,
"routePanelThemes": routePanelThemes,
"routePanelThemesSetDefault": routePanelThemesSetDefault,
"routePanelPlugins": routePanelPlugins,
"routePanelPluginsActivate": routePanelPluginsActivate,
"routePanelPluginsDeactivate": routePanelPluginsDeactivate,
"routePanelPluginsInstall": routePanelPluginsInstall,
"routePanelUsers": routePanelUsers,
"routePanelUsersEdit": routePanelUsersEdit,
"routePanelUsersEditSubmit": routePanelUsersEditSubmit,
"routePanelGroups": routePanelGroups,
"routePanelGroupsEdit": routePanelGroupsEdit,
"routePanelGroupsEditPerms": routePanelGroupsEditPerms,
"routePanelGroupsEditSubmit": routePanelGroupsEditSubmit,
"routePanelGroupsEditPermsSubmit": routePanelGroupsEditPermsSubmit,
"routePanelGroupsCreateSubmit": routePanelGroupsCreateSubmit,
"routePanelBackups": routePanelBackups,
"routePanelLogsMod": routePanelLogsMod,
"routePanelDebug": routePanelDebug,
"routePanel": routePanel,
"routeAccountEditCritical": routeAccountEditCritical,
"routeAccountEditCriticalSubmit": routeAccountEditCriticalSubmit,
"routeAccountEditAvatar": routeAccountEditAvatar,
"routeAccountEditAvatarSubmit": routeAccountEditAvatarSubmit,
"routeAccountEditUsername": routeAccountEditUsername,
"routeAccountEditUsernameSubmit": routeAccountEditUsernameSubmit,
"routeAccountEditEmail": routeAccountEditEmail,
"routeAccountEditEmailTokenSubmit": routeAccountEditEmailTokenSubmit,
"routeProfile": routeProfile,
"routeBanSubmit": routeBanSubmit,
"routeUnban": routeUnban,
"routeActivate": routeActivate,
"routeIps": routeIps,
}
type GenRouter struct {
UploadHandler func(http.ResponseWriter, *http.Request)
@ -45,27 +103,22 @@ func (router *GenRouter) Handle(_ string, _ http.Handler) {
func (router *GenRouter) HandleFunc(pattern string, handle func(http.ResponseWriter, *http.Request, common.User) common.RouteError) {
router.Lock()
defer router.Unlock()
router.extra_routes[pattern] = handle
router.Unlock()
}
func (router *GenRouter) RemoveFunc(pattern string) error {
router.Lock()
defer router.Unlock()
_, ok := router.extra_routes[pattern]
if !ok {
router.Unlock()
return ErrNoRoute
}
delete(router.extra_routes, pattern)
router.Unlock()
return nil
}
func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
//if req.URL.Path == "/" {
// default_route(w,req)
// return
//}
if len(req.URL.Path) == 0 || req.URL.Path[0] != '/' {
w.WriteHeader(405)
w.Write([]byte(""))
@ -95,6 +148,9 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
if common.Dev.SuperDebug {
log.Print("before PreRoute")
}
// Increment the global view counter
common.GlobalViewCounter.Bump()
// Deal with the session stuff, etc.
user, ok := common.PreRoute(w, req)

71
main.go
View File

@ -80,6 +80,10 @@ func afterDBInit() (err error) {
if err != nil {
return err
}
common.GlobalViewCounter, err = common.NewGlobalViewCounter()
if err != nil {
return err
}
return nil
}
@ -163,43 +167,50 @@ func main() {
defer watcher.Close()
go func() {
var modifiedFileEvent = func(path string) error {
var pathBits = strings.Split(path, "\\")
if len(pathBits) == 0 {
return nil
}
if pathBits[0] == "themes" {
var themeName string
if len(pathBits) >= 2 {
themeName = pathBits[1]
}
if len(pathBits) >= 3 && pathBits[2] == "public" {
// TODO: Handle new themes freshly plopped into the folder?
theme, ok := common.Themes[themeName]
if ok {
return theme.LoadStaticFiles()
}
}
}
return nil
}
var err error
for {
select {
case event := <-watcher.Events:
log.Println("event:", event)
// TODO: Handle file deletes (and renames more graciously by removing the old version of it)
if event.Op&fsnotify.Write == fsnotify.Write {
log.Println("modified file:", event.Name)
var pathBits = strings.Split(event.Name, "\\")
if len(pathBits) > 0 {
if pathBits[0] == "themes" {
var themeName string
if len(pathBits) >= 1 {
themeName = pathBits[1]
}
if len(pathBits) >= 2 && pathBits[2] == "public" {
// TODO: Handle new themes freshly plopped into the folder?
theme, ok := common.Themes[themeName]
if ok {
err = theme.LoadStaticFiles()
if err != nil {
common.LogError(err)
}
}
}
}
}
err = modifiedFileEvent(event.Name)
} else if event.Op&fsnotify.Create == fsnotify.Create {
log.Println("new file:", event.Name)
err = modifiedFileEvent(event.Name)
}
case err := <-watcher.Errors:
log.Println("error:", err)
if err != nil {
common.LogError(err)
}
case err = <-watcher.Errors:
common.LogError(err)
}
}
}()
// TODO: Keep tabs on the theme stuff, and the langpacks
// TODO: Keep tabs on the (non-resource) theme stuff, and the langpacks
err = watcher.Add("./public")
if err != nil {
log.Fatal(err)
@ -226,6 +237,12 @@ func main() {
//log.Print("Running the second ticker")
// TODO: Add a plugin hook here
for _, task := range common.ScheduledSecondTasks {
if task() != nil {
common.LogError(err)
}
}
err := common.HandleExpiredScheduledGroups()
if err != nil {
common.LogError(err)
@ -249,6 +266,12 @@ func main() {
case <-fifteenMinuteTicker.C:
// TODO: Add a plugin hook here
for _, task := range common.ScheduledFifteenMinuteTasks {
if task() != nil {
common.LogError(err)
}
}
// TODO: Automatically lock topics, if they're really old, and the associated setting is enabled.
// TODO: Publish scheduled posts.

View File

@ -354,6 +354,14 @@ func createTables(adapter qgen.Adapter) error {
[]qgen.DBTableKey{},
)
qgen.Install.CreateTable("viewchunks", "", "",
[]qgen.DBTableColumn{
qgen.DBTableColumn{"count", "int", 0, false, false, "0"},
qgen.DBTableColumn{"createdAt", "datetime", 0, false, false, ""},
},
[]qgen.DBTableKey{},
)
qgen.Install.CreateTable("sync", "", "",
[]qgen.DBTableColumn{
qgen.DBTableColumn{"last_update", "datetime", 0, false, false, ""},

View File

@ -1,10 +1,12 @@
/* WIP Under Construction */
package main
import "log"
import (
"log"
"os"
)
//import "strings"
import "os"
var routeList []*RouteImpl
var routeGroups []*RouteGroup
@ -15,32 +17,39 @@ func main() {
// Load all the routes...
routes()
var out string
var fileData = "// Code generated by. DO NOT EDIT.\n/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */\n"
for _, route := range routeList {
var end int
if route.Path[len(route.Path)-1] == '/' {
end = len(route.Path) - 1
} else {
end = len(route.Path) - 1
var out, routeMap string
var mapIt = func(name string) {
routeMap += "\t\"" + name + "\": " + name + ",\n"
//reverseRouteMap += "\t" + name + ": \"" + name + "\",\n"
}
var countToIndents = func(indent int) (indentor string) {
for i := 0; i < indent; i++ {
indentor += "\t"
}
out += "\n\t\tcase \"" + route.Path[0:end] + "\":"
if len(route.RunBefore) > 0 {
for _, runnable := range route.RunBefore {
return indentor
}
var runBefore = func(runnables []Runnable, indent int) (out string) {
var indentor = countToIndents(indent)
if len(runnables) > 0 {
for _, runnable := range runnables {
if runnable.Literal {
out += "\n\t\t\t\t\t" + runnable.Contents
out += "\n\t" + indentor + runnable.Contents
} else {
out += `
err = common.` + runnable.Contents + `(w,req,user)
if err != nil {
router.handleError(err,w,req,user)
return
}
`
out += "\n" + indentor + "err = common." + runnable.Contents + "(w,req,user)\n" +
indentor + "if err != nil {\n" +
indentor + "\trouter.handleError(err,w,req,user)\n" +
indentor + "\treturn\n" +
indentor + "}\n" + indentor
}
}
}
return out
}
for _, route := range routeList {
var end = len(route.Path) - 1
out += "\n\t\tcase \"" + route.Path[0:end] + "\":"
out += runBefore(route.RunBefore, 4)
out += "\n\t\t\terr = " + route.Name + "(w,req,user"
for _, item := range route.Vars {
out += "," + item
@ -49,25 +58,13 @@ func main() {
if err != nil {
router.handleError(err,w,req,user)
}`
mapIt(route.Name)
}
for _, group := range routeGroups {
var end = len(group.Path) - 1
out += `
case "` + group.Path[0:end] + `":`
for _, runnable := range group.RunBefore {
if runnable.Literal {
out += "\t\t\t" + runnable.Contents
} else {
out += `
err = common.` + runnable.Contents + `(w,req,user)
if err != nil {
router.handleError(err,w,req,user)
return
}
`
}
}
out += "\n\t\tcase \"" + group.Path[0:end] + "\":"
out += runBefore(group.RunBefore, 3)
out += "\n\t\t\tswitch(req.URL.Path) {"
var defaultRoute = blankRoute()
@ -115,30 +112,18 @@ func main() {
out += "," + item
}
out += ")"
mapIt(route.Name)
}
if defaultRoute.Name != "" {
out += "\n\t\t\t\tdefault:"
if len(defaultRoute.RunBefore) > 0 {
for _, runnable := range defaultRoute.RunBefore {
if runnable.Literal {
out += "\n\t\t\t\t\t" + runnable.Contents
} else {
out += `
err = common.` + runnable.Contents + `(w,req,user)
if err != nil {
router.handleError(err,w,req,user)
return
}
`
}
}
}
out += runBefore(defaultRoute.RunBefore, 4)
out += "\n\t\t\t\t\terr = " + defaultRoute.Name + "(w,req,user"
for _, item := range defaultRoute.Vars {
out += ", " + item
}
out += ")"
mapIt(defaultRoute.Name)
}
out += `
}
@ -147,7 +132,9 @@ func main() {
}`
}
fileData += `package main
var fileData = `// Code generated by. DO NOT EDIT.
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import (
"log"
@ -160,6 +147,8 @@ import (
)
var ErrNoRoute = errors.New("That route doesn't exist.")
var RouteMap = map[string]interface{}{
` + routeMap + `}
type GenRouter struct {
UploadHandler func(http.ResponseWriter, *http.Request)
@ -192,27 +181,22 @@ func (router *GenRouter) Handle(_ string, _ http.Handler) {
func (router *GenRouter) HandleFunc(pattern string, handle func(http.ResponseWriter, *http.Request, common.User) common.RouteError) {
router.Lock()
defer router.Unlock()
router.extra_routes[pattern] = handle
router.Unlock()
}
func (router *GenRouter) RemoveFunc(pattern string) error {
router.Lock()
defer router.Unlock()
_, ok := router.extra_routes[pattern]
if !ok {
router.Unlock()
return ErrNoRoute
}
delete(router.extra_routes, pattern)
router.Unlock()
return nil
}
func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
//if req.URL.Path == "/" {
// default_route(w,req)
// return
//}
if len(req.URL.Path) == 0 || req.URL.Path[0] != '/' {
w.WriteHeader(405)
w.Write([]byte(""))
@ -242,6 +226,9 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
if common.Dev.SuperDebug {
log.Print("before PreRoute")
}
// Increment the global view counter
common.GlobalViewCounter.Bump()
// Deal with the session stuff, etc.
user, ok := common.PreRoute(w, req)

View File

@ -0,0 +1,4 @@
CREATE TABLE [viewchunks] (
[count] int DEFAULT 0 not null,
[createdAt] datetime not null
);

View File

@ -0,0 +1,4 @@
CREATE TABLE `viewchunks` (
`count` int DEFAULT 0 not null,
`createdAt` datetime not null
);

View File

@ -0,0 +1,4 @@
CREATE TABLE `viewchunks` (
`count` int DEFAULT 0 not null,
`createdAt` timestamp not null
);

View File

@ -3,9 +3,9 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "strconv"
import "net/http"
import "./common"
import "strconv"
// nolint
func init() {
@ -115,94 +115,82 @@ if tmpl_forum_vars.CurrentUser.ID != 0 {
w.Write(forum_18)
if tmpl_forum_vars.CurrentUser.Perms.CreateTopic {
w.Write(forum_19)
if tmpl_forum_vars.CurrentUser.Avatar != "" {
w.Write(forum_20)
w.Write([]byte(tmpl_forum_vars.CurrentUser.Avatar))
w.Write(forum_21)
}
w.Write(forum_22)
w.Write(forum_20)
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Forum.ID)))
w.Write(forum_23)
w.Write(forum_21)
if tmpl_forum_vars.CurrentUser.Perms.UploadFiles {
w.Write(forum_22)
}
w.Write(forum_23)
}
}
w.Write(forum_24)
}
w.Write(forum_25)
}
}
w.Write(forum_26)
if len(tmpl_forum_vars.ItemList) != 0 {
for _, item := range tmpl_forum_vars.ItemList {
w.Write(forum_27)
w.Write(forum_25)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(forum_28)
w.Write(forum_26)
if item.Sticky {
w.Write(forum_29)
w.Write(forum_27)
} else {
if item.IsClosed {
w.Write(forum_28)
}
}
w.Write(forum_29)
w.Write([]byte(item.Creator.Link))
w.Write(forum_30)
}
}
w.Write(forum_31)
if item.Creator.Avatar != "" {
w.Write(forum_32)
w.Write([]byte(item.Creator.Link))
w.Write(forum_33)
w.Write([]byte(item.Creator.Avatar))
w.Write(forum_34)
}
w.Write(forum_35)
w.Write(forum_31)
w.Write([]byte(item.Link))
w.Write(forum_36)
w.Write(forum_32)
w.Write([]byte(item.Title))
w.Write(forum_37)
w.Write(forum_33)
w.Write([]byte(item.Creator.Link))
w.Write(forum_38)
w.Write(forum_34)
w.Write([]byte(item.Creator.Name))
w.Write(forum_39)
w.Write(forum_35)
if item.IsClosed {
w.Write(forum_40)
w.Write(forum_36)
}
if item.Sticky {
w.Write(forum_37)
}
w.Write(forum_38)
w.Write([]byte(strconv.Itoa(item.PostCount)))
w.Write(forum_39)
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(forum_40)
if item.Sticky {
w.Write(forum_41)
}
w.Write(forum_42)
w.Write([]byte(strconv.Itoa(item.PostCount)))
w.Write(forum_43)
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(forum_44)
if item.Sticky {
w.Write(forum_45)
} else {
if item.IsClosed {
w.Write(forum_46)
w.Write(forum_42)
}
}
w.Write(forum_47)
if item.LastUser.Avatar != "" {
w.Write(forum_48)
w.Write(forum_43)
w.Write([]byte(item.LastUser.Link))
w.Write(forum_49)
w.Write(forum_44)
w.Write([]byte(item.LastUser.Avatar))
w.Write(forum_50)
}
w.Write(forum_51)
w.Write(forum_45)
w.Write([]byte(item.LastUser.Link))
w.Write(forum_52)
w.Write(forum_46)
w.Write([]byte(item.LastUser.Name))
w.Write(forum_53)
w.Write(forum_47)
w.Write([]byte(item.RelativeLastReplyAt))
w.Write(forum_54)
w.Write(forum_48)
}
} else {
w.Write(forum_55)
w.Write(forum_49)
if tmpl_forum_vars.CurrentUser.Perms.CreateTopic {
w.Write(forum_56)
w.Write(forum_50)
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Forum.ID)))
w.Write(forum_57)
w.Write(forum_51)
}
w.Write(forum_58)
w.Write(forum_52)
}
w.Write(forum_59)
w.Write(forum_53)
w.Write(footer_0)
w.Write([]byte(common.BuildWidget("footer",tmpl_forum_vars.Header)))
w.Write(footer_1)

View File

@ -42,30 +42,31 @@ var menu_0 = []byte(`<nav class="nav">
<div class="move_right">
<ul>`)
var menu_1 = []byte(`
<li class="menu_left menu_overview"><a href="/" rel="home">`)
<li id="menu_overview" class="menu_left"><a href="/" rel="home">`)
var menu_2 = []byte(`</a></li>
<li class="menu_left menu_forums"><a href="/forums/">Forums</a></li>
<li class="menu_left menu_topics"><a href="/">Topics</a></li>
<li id="menu_forums" class="menu_left"><a href="/forums/" aria-label="The Forum list" title="Forum List"></a></li>
<li class="menu_left menu_topics"><a href="/" aria-label="The topic list" title="Topic List"></a></li>
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter"></div>
<div class="alert_counter" aria-label="The number of alerts"></div>
<div class="alert_aftercounter"></div>
<div class="alertList"></div>
<div class="alertList" aria-label="The alert list"></div>
</li>
`)
var menu_3 = []byte(`
<li class="menu_left menu_account"><a href="/user/edit/critical/">Account</a></li>
<li class="menu_left menu_account"><a href="/user/edit/critical/" aria-label="The account manager" title="Account Manager"></a></li>
<li class="menu_left menu_profile"><a href="`)
var menu_4 = []byte(`">Profile</a></li>
<li class="menu_left menu_panel menu_account supermod_only"><a href="/panel/">Panel</a></li>
var menu_4 = []byte(`" aria-label="Your profile" title="Your profile"></a></li>
<li class="menu_left menu_panel menu_account supermod_only"><a href="/panel/" aria-label="The Control Panel" title="Control Panel"></a></li>
<li class="menu_left menu_logout"><a href="/accounts/logout/?session=`)
var menu_5 = []byte(`">Logout</a></li>
var menu_5 = []byte(`" aria-label="Log out of your account" title="Logout"></a></li>
`)
var menu_6 = []byte(`
<li class="menu_left menu_register"><a href="/accounts/create/">Register</a></li>
<li class="menu_left menu_login"><a href="/accounts/login/">Login</a></li>
<li class="menu_left menu_register"><a href="/accounts/create/" aria-label="Create a new account" title="Register"></a></li>
<li class="menu_left menu_login"><a href="/accounts/login/" aria-label="Login to your account" title="Login"></a></li>
`)
var menu_7 = []byte(`
<li class="menu_left menu_hamburger" title="Menu"><a></a></li>
</ul>
</div>
</div>
@ -122,125 +123,121 @@ var topic_20 = []byte(`
<article itemscope itemtype="http://schema.org/CreativeWork" class="rowblock post_container top_post" aria-label="The opening post for this topic">
<div class="rowitem passive editable_parent post_item `)
var topic_21 = []byte(`" style="`)
var topic_22 = []byte(`background-image: url(`)
var topic_23 = []byte(`), url(/static/`)
var topic_24 = []byte(`/post-avatar-bg.jpg);background-position: 0px `)
var topic_25 = []byte(`-1`)
var topic_26 = []byte(`0px;background-repeat:no-repeat, repeat-y;`)
var topic_27 = []byte(`">
var topic_21 = []byte(`" style="background-image: url(`)
var topic_22 = []byte(`), url(/static/`)
var topic_23 = []byte(`/post-avatar-bg.jpg);background-position: 0px `)
var topic_24 = []byte(`-1`)
var topic_25 = []byte(`0px;background-repeat:no-repeat, repeat-y;">
<p class="hide_on_edit topic_content user_content" itemprop="text" style="margin:0;padding:0;">`)
var topic_28 = []byte(`</p>
var topic_26 = []byte(`</p>
<textarea name="topic_content" class="show_on_edit topic_content_input">`)
var topic_29 = []byte(`</textarea>
var topic_27 = []byte(`</textarea>
<span class="controls">
<a href="`)
var topic_30 = []byte(`" class="username real_username" rel="author">`)
var topic_31 = []byte(`</a>&nbsp;&nbsp;
var topic_28 = []byte(`" class="username real_username" rel="author">`)
var topic_29 = []byte(`</a>&nbsp;&nbsp;
`)
var topic_32 = []byte(`<a href="/topic/like/submit/`)
var topic_33 = []byte(`" class="mod_button" title="Love it" style="color:#202020;">
var topic_30 = []byte(`<a href="/topic/like/submit/`)
var topic_31 = []byte(`" class="mod_button" title="Love it" style="color:#202020;">
<button class="username like_label"`)
var topic_34 = []byte(` style="background-color:#D6FFD6;"`)
var topic_35 = []byte(`></button></a>`)
var topic_36 = []byte(`<a href='/topic/edit/`)
var topic_37 = []byte(`' class="mod_button open_edit" style="font-weight:normal;" title="Edit Topic"><button class="username edit_label"></button></a>`)
var topic_38 = []byte(`<a href='/topic/delete/submit/`)
var topic_39 = []byte(`' class="mod_button" style="font-weight:normal;" title="Delete Topic"><button class="username trash_label"></button></a>`)
var topic_40 = []byte(`<a class="mod_button" href='/topic/unlock/submit/`)
var topic_41 = []byte(`' style="font-weight:normal;" title="Unlock Topic"><button class="username unlock_label"></button></a>`)
var topic_42 = []byte(`<a href='/topic/lock/submit/`)
var topic_43 = []byte(`' class="mod_button" style="font-weight:normal;" title="Lock Topic"><button class="username lock_label"></button></a>`)
var topic_44 = []byte(`<a class="mod_button" href='/topic/unstick/submit/`)
var topic_45 = []byte(`' style="font-weight:normal;" title="Unpin Topic"><button class="username unpin_label"></button></a>`)
var topic_46 = []byte(`<a href='/topic/stick/submit/`)
var topic_47 = []byte(`' class="mod_button" style="font-weight:normal;" title="Pin Topic"><button class="username pin_label"></button></a>`)
var topic_48 = []byte(`<a class="mod_button" href='/users/ips/?ip=`)
var topic_49 = []byte(`' style="font-weight:normal;" title="View IP"><button class="username ip_label"></button></a>`)
var topic_50 = []byte(`
var topic_32 = []byte(` style="background-color:#D6FFD6;"`)
var topic_33 = []byte(`></button></a>`)
var topic_34 = []byte(`<a href='/topic/edit/`)
var topic_35 = []byte(`' class="mod_button open_edit" style="font-weight:normal;" title="Edit Topic"><button class="username edit_label"></button></a>`)
var topic_36 = []byte(`<a href='/topic/delete/submit/`)
var topic_37 = []byte(`' class="mod_button" style="font-weight:normal;" title="Delete Topic"><button class="username trash_label"></button></a>`)
var topic_38 = []byte(`<a class="mod_button" href='/topic/unlock/submit/`)
var topic_39 = []byte(`' style="font-weight:normal;" title="Unlock Topic"><button class="username unlock_label"></button></a>`)
var topic_40 = []byte(`<a href='/topic/lock/submit/`)
var topic_41 = []byte(`' class="mod_button" style="font-weight:normal;" title="Lock Topic"><button class="username lock_label"></button></a>`)
var topic_42 = []byte(`<a class="mod_button" href='/topic/unstick/submit/`)
var topic_43 = []byte(`' style="font-weight:normal;" title="Unpin Topic"><button class="username unpin_label"></button></a>`)
var topic_44 = []byte(`<a href='/topic/stick/submit/`)
var topic_45 = []byte(`' class="mod_button" style="font-weight:normal;" title="Pin Topic"><button class="username pin_label"></button></a>`)
var topic_46 = []byte(`<a class="mod_button" href='/users/ips/?ip=`)
var topic_47 = []byte(`' style="font-weight:normal;" title="View IP"><button class="username ip_label"></button></a>`)
var topic_48 = []byte(`
<a href="/report/submit/`)
var topic_51 = []byte(`?session=`)
var topic_52 = []byte(`&type=topic" class="mod_button report_item" style="font-weight:normal;" title="Flag Topic"><button class="username flag_label"></button></a>
var topic_49 = []byte(`?session=`)
var topic_50 = []byte(`&type=topic" class="mod_button report_item" style="font-weight:normal;" title="Flag Topic"><button class="username flag_label"></button></a>
`)
var topic_53 = []byte(`<a class="username hide_on_micro like_count">`)
var topic_54 = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_55 = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_56 = []byte(`</a>`)
var topic_57 = []byte(`<a class="username hide_on_micro level">`)
var topic_58 = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level"></a>`)
var topic_59 = []byte(`
var topic_51 = []byte(`<a class="username hide_on_micro like_count">`)
var topic_52 = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_53 = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_54 = []byte(`</a>`)
var topic_55 = []byte(`<a class="username hide_on_micro level">`)
var topic_56 = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level"></a>`)
var topic_57 = []byte(`
</span>
</div>
</article>
<div class="rowblock post_container" aria-label="The current page for this topic" style="overflow: hidden;">`)
var topic_60 = []byte(`
var topic_58 = []byte(`
<article itemscope itemtype="http://schema.org/CreativeWork" class="rowitem passive deletable_block editable_parent post_item action_item">
<span class="action_icon" style="font-size: 18px;padding-right: 5px;">`)
var topic_61 = []byte(`</span>
var topic_59 = []byte(`</span>
<span itemprop="text">`)
var topic_62 = []byte(`</span>
var topic_60 = []byte(`</span>
</article>
`)
var topic_63 = []byte(`
var topic_61 = []byte(`
<article itemscope itemtype="http://schema.org/CreativeWork" class="rowitem passive deletable_block editable_parent post_item `)
var topic_64 = []byte(`" style="`)
var topic_65 = []byte(`background-image: url(`)
var topic_66 = []byte(`), url(/static/`)
var topic_67 = []byte(`/post-avatar-bg.jpg);background-position: 0px `)
var topic_68 = []byte(`-1`)
var topic_69 = []byte(`0px;background-repeat:no-repeat, repeat-y;`)
var topic_70 = []byte(`">
var topic_62 = []byte(`" style="background-image: url(`)
var topic_63 = []byte(`), url(/static/`)
var topic_64 = []byte(`/post-avatar-bg.jpg);background-position: 0px `)
var topic_65 = []byte(`-1`)
var topic_66 = []byte(`0px;background-repeat:no-repeat, repeat-y;">
`)
var topic_71 = []byte(`
var topic_67 = []byte(`
<p class="editable_block user_content" itemprop="text" style="margin:0;padding:0;">`)
var topic_72 = []byte(`</p>
var topic_68 = []byte(`</p>
<span class="controls">
<a href="`)
var topic_73 = []byte(`" class="username real_username" rel="author">`)
var topic_74 = []byte(`</a>&nbsp;&nbsp;
var topic_69 = []byte(`" class="username real_username" rel="author">`)
var topic_70 = []byte(`</a>&nbsp;&nbsp;
`)
var topic_75 = []byte(`<a href="/reply/like/submit/`)
var topic_76 = []byte(`" class="mod_button" title="Love it" style="color:#202020;"><button class="username like_label"`)
var topic_77 = []byte(` style="background-color:#D6FFD6;"`)
var topic_78 = []byte(`></button></a>`)
var topic_79 = []byte(`<a href="/reply/edit/submit/`)
var topic_80 = []byte(`" class="mod_button" title="Edit Reply"><button class="username edit_item edit_label"></button></a>`)
var topic_81 = []byte(`<a href="/reply/delete/submit/`)
var topic_82 = []byte(`" class="mod_button" title="Delete Reply"><button class="username delete_item trash_label"></button></a>`)
var topic_83 = []byte(`<a class="mod_button" href='/users/ips/?ip=`)
var topic_84 = []byte(`' style="font-weight:normal;" title="View IP"><button class="username ip_label"></button></a>`)
var topic_85 = []byte(`
var topic_71 = []byte(`<a href="/reply/like/submit/`)
var topic_72 = []byte(`" class="mod_button" title="Love it" style="color:#202020;"><button class="username like_label"`)
var topic_73 = []byte(` style="background-color:#D6FFD6;"`)
var topic_74 = []byte(`></button></a>`)
var topic_75 = []byte(`<a href="/reply/edit/submit/`)
var topic_76 = []byte(`" class="mod_button" title="Edit Reply"><button class="username edit_item edit_label"></button></a>`)
var topic_77 = []byte(`<a href="/reply/delete/submit/`)
var topic_78 = []byte(`" class="mod_button" title="Delete Reply"><button class="username delete_item trash_label"></button></a>`)
var topic_79 = []byte(`<a class="mod_button" href='/users/ips/?ip=`)
var topic_80 = []byte(`' style="font-weight:normal;" title="View IP"><button class="username ip_label"></button></a>`)
var topic_81 = []byte(`
<a href="/report/submit/`)
var topic_86 = []byte(`?session=`)
var topic_87 = []byte(`&type=reply" class="mod_button report_item" title="Flag Reply"><button class="username report_item flag_label"></button></a>
var topic_82 = []byte(`?session=`)
var topic_83 = []byte(`&type=reply" class="mod_button report_item" title="Flag Reply"><button class="username report_item flag_label"></button></a>
`)
var topic_88 = []byte(`<a class="username hide_on_micro like_count">`)
var topic_89 = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_90 = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_91 = []byte(`</a>`)
var topic_92 = []byte(`<a class="username hide_on_micro level">`)
var topic_93 = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level"></a>`)
var topic_94 = []byte(`
var topic_84 = []byte(`<a class="username hide_on_micro like_count">`)
var topic_85 = []byte(`</a><a class="username hide_on_micro like_count_label" title="Like Count"></a>`)
var topic_86 = []byte(`<a class="username hide_on_micro user_tag">`)
var topic_87 = []byte(`</a>`)
var topic_88 = []byte(`<a class="username hide_on_micro level">`)
var topic_89 = []byte(`</a><a class="username hide_on_micro level_label" style="float:right;" title="Level"></a>`)
var topic_90 = []byte(`
</span>
</article>
`)
var topic_95 = []byte(`</div>
var topic_91 = []byte(`</div>
`)
var topic_96 = []byte(`
var topic_92 = []byte(`
<div class="rowblock topic_reply_form quick_create_form">
<form id="reply_form" enctype="multipart/form-data" action="/reply/create/" method="post"></form>
<input form="reply_form" name="tid" value='`)
var topic_97 = []byte(`' type="hidden" />
var topic_93 = []byte(`' type="hidden" />
<div class="formrow real_first_child">
<div class="formitem">
<textarea id="input_content" form="reply_form" name="reply-content" placeholder="Insert reply here" required></textarea>
@ -250,16 +247,16 @@ var topic_97 = []byte(`' type="hidden" />
<div class="formitem">
<button form="reply_form" name="reply-button" class="formbutton">Create Reply</button>
`)
var topic_98 = []byte(`
var topic_94 = []byte(`
<input name="upload_files" form="reply_form" id="upload_files" multiple type="file" style="display: none;" />
<label for="upload_files" class="formbutton add_file_button">Add File</label>
<div id="upload_file_dock"></div>`)
var topic_99 = []byte(`
var topic_95 = []byte(`
</div>
</div>
</div>
`)
var topic_100 = []byte(`
var topic_96 = []byte(`
</main>
@ -505,9 +502,6 @@ var profile_0 = []byte(`
<div id="profile_container" class="colstack">
<div id="profile_left_lane" class="colstack_left">
<!--<header class="colstack_item colstack_head rowhead">
<div class="rowitem"><h1>Profile</h1></div>
</header>-->
<div id="profile_left_pane" class="rowmenu">
<div class="topBlock">
<div class="rowitem avatarRow">
@ -596,45 +590,45 @@ var profile_19 = []byte(`
<div id="profile_comments" class="colstack_item hash_hide">`)
var profile_20 = []byte(`
<div class="rowitem passive deletable_block editable_parent simple `)
var profile_21 = []byte(`" style="`)
var profile_22 = []byte(`background-image: url(`)
var profile_23 = []byte(`), url(/static/post-avatar-bg.jpg);background-position: 0px `)
var profile_24 = []byte(`-1`)
var profile_25 = []byte(`0px;`)
var profile_26 = []byte(`">
var profile_21 = []byte(`" style="background-image: url(`)
var profile_22 = []byte(`), url(/static/post-avatar-bg.jpg);background-position: 0px `)
var profile_23 = []byte(`-1`)
var profile_24 = []byte(`0px;">
<img class="bgsub" src="`)
var profile_25 = []byte(`" />
<span class="editable_block user_content simple">`)
var profile_27 = []byte(`</span>
var profile_26 = []byte(`</span>
<span class="controls">
<a href="`)
var profile_28 = []byte(`" class="real_username username">`)
var profile_29 = []byte(`</a>&nbsp;&nbsp;
var profile_27 = []byte(`" class="real_username username">`)
var profile_28 = []byte(`</a>&nbsp;&nbsp;
`)
var profile_30 = []byte(`<a href="/profile/reply/edit/submit/`)
var profile_31 = []byte(`" class="mod_button" title="Edit Item"><button class="username edit_item edit_label"></button></a>
var profile_29 = []byte(`<a href="/profile/reply/edit/submit/`)
var profile_30 = []byte(`" class="mod_button" title="Edit Item"><button class="username edit_item edit_label"></button></a>
<a href="/profile/reply/delete/submit/`)
var profile_32 = []byte(`" class="mod_button" title="Delete Item"><button class="username delete_item trash_label"></button></a>`)
var profile_33 = []byte(`
var profile_31 = []byte(`" class="mod_button" title="Delete Item"><button class="username delete_item trash_label"></button></a>`)
var profile_32 = []byte(`
<a class="mod_button" href="/report/submit/`)
var profile_34 = []byte(`?session=`)
var profile_35 = []byte(`&type=user-reply"><button class="username report_item flag_label"></button></a>
var profile_33 = []byte(`?session=`)
var profile_34 = []byte(`&type=user-reply"><button class="username report_item flag_label"></button></a>
`)
var profile_36 = []byte(`<a class="username hide_on_mobile user_tag" style="float: right;">`)
var profile_37 = []byte(`</a>`)
var profile_38 = []byte(`
var profile_35 = []byte(`<a class="username hide_on_mobile user_tag" style="float: right;">`)
var profile_36 = []byte(`</a>`)
var profile_37 = []byte(`
</span>
</div>
`)
var profile_39 = []byte(`</div>
var profile_38 = []byte(`</div>
`)
var profile_40 = []byte(`
var profile_39 = []byte(`
<form id="profile_comments_form" class="hash_hide" action="/profile/reply/create/" method="post">
<input name="uid" value='`)
var profile_41 = []byte(`' type="hidden" />
var profile_40 = []byte(`' type="hidden" />
<div class="colstack_item topic_reply_form" style="border-top: none;">
<div class="formrow">
<div class="formitem"><textarea name="reply-content" placeholder="Insert reply here"></textarea></div>
@ -645,13 +639,13 @@ var profile_41 = []byte(`' type="hidden" />
</div>
</form>
`)
var profile_42 = []byte(`
var profile_41 = []byte(`
</div>
</div>
`)
var profile_43 = []byte(`
var profile_42 = []byte(`
<script type="text/javascript">
function handle_profile_hashbit() {
var hash_class = ""
@ -736,7 +730,7 @@ var topics_3 = []byte(`
`)
var topics_4 = []byte(`
<div class="opt mod_opt" title="Moderate">
<a class="moderate_link" href="#"></a>
<a class="moderate_link" href="#" aria-label="Moderate Posts"></a>
</div>
`)
var topics_5 = []byte(`<div class="opt locked_opt" title="You don't have the permissions needed to create a topic" aria-label="You don't have the permissions needed to make a topic anywhere"><a></a></div>`)
@ -767,21 +761,19 @@ var topics_8 = []byte(`
var topics_9 = []byte(`
<div class="rowblock topic_create_form quick_create_form" style="display: none;" aria-label="Quick Topic Form">
<form name="topic_create_form_form" id="topic_create_form_form" enctype="multipart/form-data" action="/topic/create/submit/" method="post"></form>
`)
var topics_10 = []byte(`<img class="little_row_avatar" src="`)
var topics_11 = []byte(`" height="64" />`)
var topics_12 = []byte(`
<img class="little_row_avatar" src="`)
var topics_10 = []byte(`" height="64" />
<div class="main_form">
<div class="topic_meta">
<div class="formrow topic_board_row real_first_child">
<div class="formitem"><select form="topic_create_form_form" id="topic_board_input" name="topic-board">
`)
var topics_13 = []byte(`<option `)
var topics_14 = []byte(`selected`)
var topics_15 = []byte(` value="`)
var topics_16 = []byte(`">`)
var topics_17 = []byte(`</option>`)
var topics_18 = []byte(`
var topics_11 = []byte(`<option `)
var topics_12 = []byte(`selected`)
var topics_13 = []byte(` value="`)
var topics_14 = []byte(`">`)
var topics_15 = []byte(`</option>`)
var topics_16 = []byte(`
</select></div>
</div>
<div class="formrow topic_name_row">
@ -799,77 +791,73 @@ var topics_18 = []byte(`
<div class="formitem">
<button form="topic_create_form_form" class="formbutton">Create Topic</button>
`)
var topics_19 = []byte(`
var topics_17 = []byte(`
<input name="upload_files" form="topic_create_form_form" id="upload_files" multiple type="file" style="display: none;" />
<label for="upload_files" class="formbutton add_file_button">Add File</label>
<div id="upload_file_dock"></div>`)
var topics_20 = []byte(`
var topics_18 = []byte(`
<button class="formbutton close_form">Cancel</button>
</div>
</div>
</div>
</div>
`)
var topics_21 = []byte(`
var topics_19 = []byte(`
<div id="topic_list" class="rowblock topic_list" aria-label="A list containing topics from every forum">
`)
var topics_22 = []byte(`<div class="topic_row" data-tid="`)
var topics_23 = []byte(`">
var topics_20 = []byte(`<div class="topic_row" data-tid="`)
var topics_21 = []byte(`">
<div class="rowitem topic_left passive datarow `)
var topics_24 = []byte(`topic_sticky`)
var topics_25 = []byte(`topic_closed`)
var topics_26 = []byte(`">
var topics_22 = []byte(`topic_sticky`)
var topics_23 = []byte(`topic_closed`)
var topics_24 = []byte(`">
<span class="selector"></span>
`)
var topics_27 = []byte(`<a href="`)
var topics_28 = []byte(`"><img src="`)
var topics_29 = []byte(`" height="64" /></a>`)
var topics_30 = []byte(`
<a href="`)
var topics_25 = []byte(`"><img src="`)
var topics_26 = []byte(`" height="64" /></a>
<span class="topic_inner_left">
<a class="rowtopic" href="`)
var topics_31 = []byte(`"><span>`)
var topics_32 = []byte(`</span></a> `)
var topics_33 = []byte(`<a class="rowsmall parent_forum" href="`)
var topics_34 = []byte(`">`)
var topics_35 = []byte(`</a>`)
var topics_36 = []byte(`
var topics_27 = []byte(`"><span>`)
var topics_28 = []byte(`</span></a> `)
var topics_29 = []byte(`<a class="rowsmall parent_forum" href="`)
var topics_30 = []byte(`">`)
var topics_31 = []byte(`</a>`)
var topics_32 = []byte(`
<br /><a class="rowsmall starter" href="`)
var topics_37 = []byte(`">`)
var topics_38 = []byte(`</a>
var topics_33 = []byte(`">`)
var topics_34 = []byte(`</a>
`)
var topics_39 = []byte(`<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>`)
var topics_40 = []byte(`<span class="rowsmall topic_status_e topic_status_sticky" title="Status: Pinned"> | &#x1F4CD;&#xFE0E</span>`)
var topics_41 = []byte(`
var topics_35 = []byte(`<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>`)
var topics_36 = []byte(`<span class="rowsmall topic_status_e topic_status_sticky" title="Status: Pinned"> | &#x1F4CD;&#xFE0E</span>`)
var topics_37 = []byte(`
</span>
<span class="topic_inner_right rowsmall" style="float: right;">
<span class="replyCount">`)
var topics_42 = []byte(`</span><br />
var topics_38 = []byte(`</span><br />
<span class="likeCount">`)
var topics_43 = []byte(`</span>
var topics_39 = []byte(`</span>
</span>
</div>
<div class="rowitem topic_right passive datarow `)
var topics_44 = []byte(`topic_sticky`)
var topics_45 = []byte(`topic_closed`)
var topics_46 = []byte(`">
`)
var topics_47 = []byte(`<a href="`)
var topics_48 = []byte(`"><img src="`)
var topics_49 = []byte(`" height="64" /></a>`)
var topics_50 = []byte(`
var topics_40 = []byte(`topic_sticky`)
var topics_41 = []byte(`topic_closed`)
var topics_42 = []byte(`">
<a href="`)
var topics_43 = []byte(`"><img src="`)
var topics_44 = []byte(`" height="64" /></a>
<span>
<a href="`)
var topics_51 = []byte(`" class="lastName" style="font-size: 14px;">`)
var topics_52 = []byte(`</a><br>
var topics_45 = []byte(`" class="lastName" style="font-size: 14px;">`)
var topics_46 = []byte(`</a><br>
<span class="rowsmall lastReplyAt">`)
var topics_53 = []byte(`</span>
var topics_47 = []byte(`</span>
</span>
</div>
</div>`)
var topics_54 = []byte(`<div class="rowitem passive">There aren't any topics yet.`)
var topics_55 = []byte(` <a href="/topics/create/">Start one?</a>`)
var topics_56 = []byte(`</div>`)
var topics_57 = []byte(`
var topics_48 = []byte(`<div class="rowitem passive">There aren't any topics yet.`)
var topics_49 = []byte(` <a href="/topics/create/">Start one?</a>`)
var topics_50 = []byte(`</div>`)
var topics_51 = []byte(`
</div>
</main>
@ -901,7 +889,7 @@ var forum_13 = []byte(`"></a></div>
`)
var forum_14 = []byte(`
<div class="opt mod_opt" title="Moderate">
<a class="moderate_link" href="#"></a>
<a class="moderate_link" href="#" aria-label="Moderate Posts"></a>
</div>
`)
var forum_15 = []byte(`<div class="opt locked_opt" title="You don't have the permissions needed to create a topic" aria-label="You don't have the permissions needed to make a topic in this forum"><a></a></div>`)
@ -930,12 +918,10 @@ var forum_18 = []byte(`
var forum_19 = []byte(`
<div id="forum_topic_create_form" class="rowblock topic_create_form quick_create_form" style="display: none;" aria-label="Quick Topic Form">
<form id="topic_create_form_form" enctype="multipart/form-data" action="/topic/create/submit/" method="post"></form>
`)
var forum_20 = []byte(`<img class="little_row_avatar" src="`)
var forum_21 = []byte(`" height="64" />`)
var forum_22 = []byte(`
<img class="little_row_avatar" src="`)
var forum_20 = []byte(`" height="64" />
<input form="topic_create_form_form" id="topic_board_input" name="topic-board" value="`)
var forum_23 = []byte(`" type="hidden">
var forum_21 = []byte(`" type="hidden">
<div class="main_form">
<div class="topic_meta">
<div class="formrow topic_name_row real_first_child">
@ -953,74 +939,70 @@ var forum_23 = []byte(`" type="hidden">
<div class="formitem">
<button form="topic_create_form_form" name="topic-button" class="formbutton">Create Topic</button>
`)
var forum_24 = []byte(`
var forum_22 = []byte(`
<input name="upload_files" form="topic_create_form_form" id="upload_files" multiple type="file" style="display: none;" />
<label for="upload_files" class="formbutton add_file_button">Add File</label>
<div id="upload_file_dock"></div>`)
var forum_25 = []byte(`
var forum_23 = []byte(`
<button class="formbutton close_form">Cancel</button>
</div>
</div>
</div>
</div>
`)
var forum_26 = []byte(`
var forum_24 = []byte(`
<div id="forum_topic_list" class="rowblock topic_list">
`)
var forum_27 = []byte(`<div class="topic_row" data-tid="`)
var forum_28 = []byte(`">
var forum_25 = []byte(`<div class="topic_row" data-tid="`)
var forum_26 = []byte(`">
<div class="rowitem topic_left passive datarow `)
var forum_29 = []byte(`topic_sticky`)
var forum_30 = []byte(`topic_closed`)
var forum_31 = []byte(`">
var forum_27 = []byte(`topic_sticky`)
var forum_28 = []byte(`topic_closed`)
var forum_29 = []byte(`">
<span class="selector"></span>
`)
var forum_32 = []byte(`<a href="`)
var forum_33 = []byte(`"><img src="`)
var forum_34 = []byte(`" height="64" /></a>`)
var forum_35 = []byte(`
<a href="`)
var forum_30 = []byte(`"><img src="`)
var forum_31 = []byte(`" height="64" /></a>
<span class="topic_inner_left">
<a class="rowtopic" href="`)
var forum_36 = []byte(`"><span>`)
var forum_37 = []byte(`</span></a>
var forum_32 = []byte(`"><span>`)
var forum_33 = []byte(`</span></a>
<br /><a class="rowsmall starter" href="`)
var forum_38 = []byte(`">`)
var forum_39 = []byte(`</a>
var forum_34 = []byte(`">`)
var forum_35 = []byte(`</a>
`)
var forum_40 = []byte(`<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>`)
var forum_41 = []byte(`<span class="rowsmall topic_status_e topic_status_sticky" title="Status: Pinned"> | &#x1F4CD;&#xFE0E</span>`)
var forum_42 = []byte(`
var forum_36 = []byte(`<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E</span>`)
var forum_37 = []byte(`<span class="rowsmall topic_status_e topic_status_sticky" title="Status: Pinned"> | &#x1F4CD;&#xFE0E</span>`)
var forum_38 = []byte(`
</span>
<span class="topic_inner_right rowsmall" style="float: right;">
<span class="replyCount">`)
var forum_43 = []byte(`</span><br />
var forum_39 = []byte(`</span><br />
<span class="likeCount">`)
var forum_44 = []byte(`</span>
var forum_40 = []byte(`</span>
</span>
</div>
<div class="rowitem topic_right passive datarow `)
var forum_45 = []byte(`topic_sticky`)
var forum_46 = []byte(`topic_closed`)
var forum_47 = []byte(`">
`)
var forum_48 = []byte(`<a href="`)
var forum_49 = []byte(`"><img src="`)
var forum_50 = []byte(`" height="64" /></a>`)
var forum_51 = []byte(`
var forum_41 = []byte(`topic_sticky`)
var forum_42 = []byte(`topic_closed`)
var forum_43 = []byte(`">
<a href="`)
var forum_44 = []byte(`"><img src="`)
var forum_45 = []byte(`" height="64" /></a>
<span>
<a href="`)
var forum_52 = []byte(`" class="lastName" style="font-size: 14px;">`)
var forum_53 = []byte(`</a><br>
var forum_46 = []byte(`" class="lastName" style="font-size: 14px;">`)
var forum_47 = []byte(`</a><br>
<span class="rowsmall lastReplyAt">`)
var forum_54 = []byte(`</span>
var forum_48 = []byte(`</span>
</span>
</div>
</div>`)
var forum_55 = []byte(`<div class="rowitem passive">There aren't any topics in this forum yet.`)
var forum_56 = []byte(` <a href="/topics/create/`)
var forum_57 = []byte(`">Start one?</a>`)
var forum_58 = []byte(`</div>`)
var forum_59 = []byte(`
var forum_49 = []byte(`<div class="rowitem passive">There aren't any topics in this forum yet.`)
var forum_50 = []byte(` <a href="/topics/create/`)
var forum_51 = []byte(`">Start one?</a>`)
var forum_52 = []byte(`</div>`)
var forum_53 = []byte(`
</div>
</main>
`)

View File

@ -117,50 +117,48 @@ for _, item := range tmpl_profile_vars.ItemList {
w.Write(profile_20)
w.Write([]byte(item.ClassName))
w.Write(profile_21)
if item.Avatar != "" {
w.Write(profile_22)
w.Write([]byte(item.Avatar))
w.Write(profile_23)
w.Write(profile_22)
if item.ContentLines <= 5 {
w.Write(profile_23)
}
w.Write(profile_24)
}
w.Write([]byte(item.Avatar))
w.Write(profile_25)
}
w.Write(profile_26)
w.Write([]byte(item.ContentHtml))
w.Write(profile_27)
w.Write(profile_26)
w.Write([]byte(item.UserLink))
w.Write(profile_28)
w.Write(profile_27)
w.Write([]byte(item.CreatedByName))
w.Write(profile_29)
w.Write(profile_28)
if tmpl_profile_vars.CurrentUser.IsMod {
w.Write(profile_29)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_30)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_31)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_32)
}
w.Write(profile_33)
w.Write(profile_32)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_34)
w.Write(profile_33)
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_35)
w.Write(profile_34)
if item.Tag != "" {
w.Write(profile_36)
w.Write(profile_35)
w.Write([]byte(item.Tag))
w.Write(profile_36)
}
w.Write(profile_37)
}
}
w.Write(profile_38)
}
}
w.Write(profile_39)
if !tmpl_profile_vars.CurrentUser.IsBanned {
w.Write(profile_40)
w.Write(profile_39)
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
w.Write(profile_41)
w.Write(profile_40)
}
w.Write(profile_41)
w.Write(profile_42)
w.Write(profile_43)
w.Write(footer_0)
w.Write([]byte(common.BuildWidget("footer",tmpl_profile_vars.Header)))
w.Write(footer_1)

View File

@ -121,181 +121,173 @@ w.Write(topic_19)
w.Write(topic_20)
w.Write([]byte(tmpl_topic_vars.Topic.ClassName))
w.Write(topic_21)
if tmpl_topic_vars.Topic.Avatar != "" {
w.Write(topic_22)
w.Write([]byte(tmpl_topic_vars.Topic.Avatar))
w.Write(topic_23)
w.Write(topic_22)
w.Write([]byte(tmpl_topic_vars.Header.Theme.Name))
w.Write(topic_24)
w.Write(topic_23)
if tmpl_topic_vars.Topic.ContentLines <= 5 {
w.Write(topic_24)
}
w.Write(topic_25)
}
w.Write(topic_26)
}
w.Write(topic_27)
w.Write([]byte(tmpl_topic_vars.Topic.ContentHTML))
w.Write(topic_28)
w.Write(topic_26)
w.Write([]byte(tmpl_topic_vars.Topic.Content))
w.Write(topic_29)
w.Write(topic_27)
w.Write([]byte(tmpl_topic_vars.Topic.UserLink))
w.Write(topic_30)
w.Write(topic_28)
w.Write([]byte(tmpl_topic_vars.Topic.CreatedByName))
w.Write(topic_31)
w.Write(topic_29)
if tmpl_topic_vars.CurrentUser.Perms.LikeItem {
w.Write(topic_32)
w.Write(topic_30)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_33)
w.Write(topic_31)
if tmpl_topic_vars.Topic.Liked {
w.Write(topic_34)
w.Write(topic_32)
}
w.Write(topic_35)
w.Write(topic_33)
}
if tmpl_topic_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_34)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_35)
}
if tmpl_topic_vars.CurrentUser.Perms.DeleteTopic {
w.Write(topic_36)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_37)
}
if tmpl_topic_vars.CurrentUser.Perms.DeleteTopic {
if tmpl_topic_vars.CurrentUser.Perms.CloseTopic {
if tmpl_topic_vars.Topic.IsClosed {
w.Write(topic_38)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_39)
}
if tmpl_topic_vars.CurrentUser.Perms.CloseTopic {
if tmpl_topic_vars.Topic.IsClosed {
} else {
w.Write(topic_40)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_41)
} else {
w.Write(topic_42)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_43)
}
}
if tmpl_topic_vars.CurrentUser.Perms.PinTopic {
if tmpl_topic_vars.Topic.Sticky {
w.Write(topic_42)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_43)
} else {
w.Write(topic_44)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_45)
} else {
w.Write(topic_46)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_47)
}
}
if tmpl_topic_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_48)
w.Write(topic_46)
w.Write([]byte(tmpl_topic_vars.Topic.IPAddress))
w.Write(topic_49)
w.Write(topic_47)
}
w.Write(topic_50)
w.Write(topic_48)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_51)
w.Write(topic_49)
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_52)
w.Write(topic_50)
if tmpl_topic_vars.Topic.LikeCount > 0 {
w.Write(topic_53)
w.Write(topic_51)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.LikeCount)))
w.Write(topic_54)
w.Write(topic_52)
}
if tmpl_topic_vars.Topic.Tag != "" {
w.Write(topic_55)
w.Write(topic_53)
w.Write([]byte(tmpl_topic_vars.Topic.Tag))
w.Write(topic_56)
w.Write(topic_54)
} else {
w.Write(topic_57)
w.Write(topic_55)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.Level)))
w.Write(topic_58)
w.Write(topic_56)
}
w.Write(topic_59)
w.Write(topic_57)
if len(tmpl_topic_vars.ItemList) != 0 {
for _, item := range tmpl_topic_vars.ItemList {
if item.ActionType != "" {
w.Write(topic_60)
w.Write(topic_58)
w.Write([]byte(item.ActionIcon))
w.Write(topic_61)
w.Write(topic_59)
w.Write([]byte(item.ActionType))
w.Write(topic_62)
w.Write(topic_60)
} else {
w.Write(topic_63)
w.Write(topic_61)
w.Write([]byte(item.ClassName))
w.Write(topic_64)
if item.Avatar != "" {
w.Write(topic_65)
w.Write(topic_62)
w.Write([]byte(item.Avatar))
w.Write(topic_66)
w.Write(topic_63)
w.Write([]byte(tmpl_topic_vars.Header.Theme.Name))
w.Write(topic_67)
w.Write(topic_64)
if item.ContentLines <= 5 {
w.Write(topic_68)
w.Write(topic_65)
}
w.Write(topic_69)
}
w.Write(topic_70)
w.Write(topic_71)
w.Write(topic_66)
w.Write(topic_67)
w.Write([]byte(item.ContentHtml))
w.Write(topic_72)
w.Write(topic_68)
w.Write([]byte(item.UserLink))
w.Write(topic_73)
w.Write(topic_69)
w.Write([]byte(item.CreatedByName))
w.Write(topic_74)
w.Write(topic_70)
if tmpl_topic_vars.CurrentUser.Perms.LikeItem {
w.Write(topic_71)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_72)
if item.Liked {
w.Write(topic_73)
}
w.Write(topic_74)
}
if tmpl_topic_vars.CurrentUser.Perms.EditReply {
w.Write(topic_75)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_76)
if item.Liked {
w.Write(topic_77)
}
w.Write(topic_78)
}
if tmpl_topic_vars.CurrentUser.Perms.EditReply {
w.Write(topic_79)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_80)
}
if tmpl_topic_vars.CurrentUser.Perms.DeleteReply {
w.Write(topic_77)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_78)
}
if tmpl_topic_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_79)
w.Write([]byte(item.IPAddress))
w.Write(topic_80)
}
w.Write(topic_81)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_82)
}
if tmpl_topic_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_83)
w.Write([]byte(item.IPAddress))
w.Write(topic_84)
}
w.Write(topic_85)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_86)
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_87)
w.Write(topic_83)
if item.LikeCount > 0 {
w.Write(topic_88)
w.Write(topic_84)
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(topic_89)
w.Write(topic_85)
}
if item.Tag != "" {
w.Write(topic_90)
w.Write(topic_86)
w.Write([]byte(item.Tag))
w.Write(topic_91)
w.Write(topic_87)
} else {
w.Write(topic_92)
w.Write(topic_88)
w.Write([]byte(strconv.Itoa(item.Level)))
w.Write(topic_93)
w.Write(topic_89)
}
w.Write(topic_90)
}
}
}
w.Write(topic_91)
if tmpl_topic_vars.CurrentUser.Perms.CreateReply {
w.Write(topic_92)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_93)
if tmpl_topic_vars.CurrentUser.Perms.UploadFiles {
w.Write(topic_94)
}
}
}
w.Write(topic_95)
if tmpl_topic_vars.CurrentUser.Perms.CreateReply {
}
w.Write(topic_96)
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_97)
if tmpl_topic_vars.CurrentUser.Perms.UploadFiles {
w.Write(topic_98)
}
w.Write(topic_99)
}
w.Write(topic_100)
w.Write(footer_0)
w.Write([]byte(common.BuildWidget("footer",tmpl_topic_vars.Header)))
w.Write(footer_1)

View File

@ -3,9 +3,9 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "strconv"
import "net/http"
import "./common"
import "strconv"
// nolint
func init() {
@ -93,112 +93,100 @@ if tmpl_topics_vars.CurrentUser.ID != 0 {
w.Write(topics_8)
if len(tmpl_topics_vars.ForumList) != 0 {
w.Write(topics_9)
if tmpl_topics_vars.CurrentUser.Avatar != "" {
w.Write(topics_10)
w.Write([]byte(tmpl_topics_vars.CurrentUser.Avatar))
w.Write(topics_11)
}
w.Write(topics_12)
w.Write(topics_10)
if len(tmpl_topics_vars.ForumList) != 0 {
for _, item := range tmpl_topics_vars.ForumList {
w.Write(topics_13)
w.Write(topics_11)
if item.ID == tmpl_topics_vars.DefaultForum {
w.Write(topics_14)
w.Write(topics_12)
}
w.Write(topics_15)
w.Write(topics_13)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topics_16)
w.Write(topics_14)
w.Write([]byte(item.Name))
w.Write(topics_15)
}
}
w.Write(topics_16)
if tmpl_topics_vars.CurrentUser.Perms.UploadFiles {
w.Write(topics_17)
}
}
w.Write(topics_18)
if tmpl_topics_vars.CurrentUser.Perms.UploadFiles {
}
}
w.Write(topics_19)
}
w.Write(topics_20)
}
}
w.Write(topics_21)
if len(tmpl_topics_vars.TopicList) != 0 {
for _, item := range tmpl_topics_vars.TopicList {
w.Write(topics_22)
w.Write(topics_20)
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topics_23)
w.Write(topics_21)
if item.Sticky {
w.Write(topics_24)
w.Write(topics_22)
} else {
if item.IsClosed {
w.Write(topics_25)
w.Write(topics_23)
}
}
w.Write(topics_26)
if item.Creator.Avatar != "" {
w.Write(topics_27)
w.Write(topics_24)
w.Write([]byte(item.Creator.Link))
w.Write(topics_28)
w.Write(topics_25)
w.Write([]byte(item.Creator.Avatar))
w.Write(topics_29)
}
w.Write(topics_30)
w.Write(topics_26)
w.Write([]byte(item.Link))
w.Write(topics_31)
w.Write(topics_27)
w.Write([]byte(item.Title))
w.Write(topics_32)
w.Write(topics_28)
if item.ForumName != "" {
w.Write(topics_33)
w.Write(topics_29)
w.Write([]byte(item.ForumLink))
w.Write(topics_34)
w.Write(topics_30)
w.Write([]byte(item.ForumName))
w.Write(topics_31)
}
w.Write(topics_32)
w.Write([]byte(item.Creator.Link))
w.Write(topics_33)
w.Write([]byte(item.Creator.Name))
w.Write(topics_34)
if item.IsClosed {
w.Write(topics_35)
}
if item.Sticky {
w.Write(topics_36)
w.Write([]byte(item.Creator.Link))
w.Write(topics_37)
w.Write([]byte(item.Creator.Name))
w.Write(topics_38)
if item.IsClosed {
w.Write(topics_39)
}
w.Write(topics_37)
w.Write([]byte(strconv.Itoa(item.PostCount)))
w.Write(topics_38)
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(topics_39)
if item.Sticky {
w.Write(topics_40)
}
w.Write(topics_41)
w.Write([]byte(strconv.Itoa(item.PostCount)))
w.Write(topics_42)
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(topics_43)
if item.Sticky {
w.Write(topics_44)
} else {
if item.IsClosed {
w.Write(topics_45)
w.Write(topics_41)
}
}
w.Write(topics_46)
if item.LastUser.Avatar != "" {
w.Write(topics_47)
w.Write(topics_42)
w.Write([]byte(item.LastUser.Link))
w.Write(topics_48)
w.Write(topics_43)
w.Write([]byte(item.LastUser.Avatar))
w.Write(topics_44)
w.Write([]byte(item.LastUser.Link))
w.Write(topics_45)
w.Write([]byte(item.LastUser.Name))
w.Write(topics_46)
w.Write([]byte(item.RelativeLastReplyAt))
w.Write(topics_47)
}
} else {
w.Write(topics_48)
if tmpl_topics_vars.CurrentUser.Perms.CreateTopic {
w.Write(topics_49)
}
w.Write(topics_50)
w.Write([]byte(item.LastUser.Link))
}
w.Write(topics_51)
w.Write([]byte(item.LastUser.Name))
w.Write(topics_52)
w.Write([]byte(item.RelativeLastReplyAt))
w.Write(topics_53)
}
} else {
w.Write(topics_54)
if tmpl_topics_vars.CurrentUser.Perms.CreateTopic {
w.Write(topics_55)
}
w.Write(topics_56)
}
w.Write(topics_57)
w.Write(footer_0)
w.Write([]byte(common.BuildWidget("footer",tmpl_topics_vars.Header)))
w.Write(footer_1)

View File

@ -5,11 +5,9 @@
<div class="colstack_item colstack_head rowhead">
<div class="rowitem"><h1>Edit Avatar</h1></div>
</div>
{{if .CurrentUser.Avatar}}
<div class="colstack_item">
<div class="rowitem"><img src="{{.CurrentUser.Avatar}}" height="128px" max-width="128px" /></div>
</div>
{{end}}
<div class="colstack_item the_form">
<form action="/user/edit/avatar/submit/" method="post" enctype="multipart/form-data">
<div class="formrow real_first_child">

View File

@ -15,7 +15,7 @@
<div class="opt create_topic_opt" title="Create Topic" aria-label="Create a topic"><a class="create_topic_link" href="/topics/create/{{.Forum.ID}}"></a></div>
{{/** TODO: Add a permissions check for this **/}}
<div class="opt mod_opt" title="Moderate">
<a class="moderate_link" href="#"></a>
<a class="moderate_link" href="#" aria-label="Moderate Posts"></a>
</div>
{{else}}<div class="opt locked_opt" title="You don't have the permissions needed to create a topic" aria-label="You don't have the permissions needed to make a topic in this forum"><a></a></div>{{end}}
<div style="clear: both;"></div>
@ -39,7 +39,7 @@
{{if .CurrentUser.Perms.CreateTopic}}
<div id="forum_topic_create_form" class="rowblock topic_create_form quick_create_form" style="display: none;" aria-label="Quick Topic Form">
<form id="topic_create_form_form" enctype="multipart/form-data" action="/topic/create/submit/" method="post"></form>
{{if .CurrentUser.Avatar}}<img class="little_row_avatar" src="{{.CurrentUser.Avatar}}" height="64" />{{end}}
<img class="little_row_avatar" src="{{.CurrentUser.Avatar}}" height="64" />
<input form="topic_create_form_form" id="topic_board_input" name="topic-board" value="{{.Forum.ID}}" type="hidden">
<div class="main_form">
<div class="topic_meta">
@ -72,7 +72,7 @@
{{range .ItemList}}<div class="topic_row" data-tid="{{.ID}}">
<div class="rowitem topic_left passive datarow {{if .Sticky}}topic_sticky{{else if .IsClosed}}topic_closed{{end}}">
<span class="selector"></span>
{{if .Creator.Avatar}}<a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" /></a>{{end}}
<a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" /></a>
<span class="topic_inner_left">
<a class="rowtopic" href="{{.Link}}"><span>{{.Title}}</span></a>
<br /><a class="rowsmall starter" href="{{.Creator.Link}}">{{.Creator.Name}}</a>
@ -86,7 +86,7 @@
</span>
</div>
<div class="rowitem topic_right passive datarow {{if .Sticky}}topic_sticky{{else if .IsClosed}}topic_closed{{end}}">
{{if .LastUser.Avatar}}<a href="{{.LastUser.Link}}"><img src="{{.LastUser.Avatar}}" height="64" /></a>{{end}}
<a href="{{.LastUser.Link}}"><img src="{{.LastUser.Avatar}}" height="64" /></a>
<span>
<a href="{{.LastUser.Link}}" class="lastName" style="font-size: 14px;">{{.LastUser.Name}}</a><br>
<span class="rowsmall lastReplyAt">{{.RelativeLastReplyAt}}</span>

View File

@ -19,7 +19,7 @@
<div style="clear: both;"></div>
</div>
<main id="socialgroups_member_list" class="rowblock member_list" style="position: relative;z-index: 50;">
{{range .ItemList}}<div class="rowitem passive datarow" style="{{if .User.Avatar}}background-image: url({{.User.Avatar}});background-position: left;background-repeat: no-repeat;background-size: 64px;padding-left: 78px;{{end}}{{if .Offline}}background-color: #eaeaea;{{else if gt .Rank 0}}background-color: #e6f3ff;{{end}}">
{{range .ItemList}}<div class="rowitem passive datarow" style="background-image: url({{.User.Avatar}});background-position: left;background-repeat: no-repeat;background-size: 64px;padding-left: 78px;{{if .Offline}}background-color: #eaeaea;{{else if gt .Rank 0}}background-color: #e6f3ff;{{end}}">
<span style="float: right;">
<span class="rank" style="font-size: 15px;">{{.RankString}}</span><br />
<span class="joinedAt rowsmall">{{.JoinedAt}}</span>

View File

@ -19,7 +19,7 @@
<div style="clear: both;"></div>
</div>
<main id="forum_topic_list" class="rowblock topic_list" style="position: relative;z-index: 50;">
{{range .ItemList}}<div class="rowitem topic_left passive datarow" style="{{if .Creator.Avatar}}background-image: url({{.Creator.Avatar}});background-position: left;background-repeat: no-repeat;background-size: 64px;padding-left: 72px;{{end}}{{if .Sticky}}background-color: #FFFFCC;{{else if .IsClosed}}background-color: #eaeaea;{{end}}">
{{range .ItemList}}<div class="rowitem topic_left passive datarow" style="background-image: url({{.Creator.Avatar}});background-position: left;background-repeat: no-repeat;background-size: 64px;padding-left: 72px;{{if .Sticky}}background-color: #FFFFCC;{{else if .IsClosed}}background-color: #eaeaea;{{end}}">
<span class="topic_inner_right rowsmall" style="float: right;">
<span class="replyCount">{{.PostCount}} replies</span><br />
<span class="lastReplyAt">{{.LastReplyAt}}</span>
@ -30,7 +30,7 @@
{{if .IsClosed}}<span class="rowsmall topic_status_e topic_status_closed" title="Status: Closed"> | &#x1F512;&#xFE0E{{end}}</span>
</span>
</div>
<div class="rowitem topic_right passive datarow" style="{{if .LastUser.Avatar}}background-image: url({{.LastUser.Avatar}});background-position: left;background-repeat: no-repeat;background-size: 64px;padding-left: 72px;{{end}}">
<div class="rowitem topic_right passive datarow" style="background-image: url({{.LastUser.Avatar}});background-position: left;background-repeat: no-repeat;background-size: 64px;padding-left: 72px;">
<span>
<a href="{{.LastUser.Link}}" class="lastName" style="font-size: 14px;">{{.LastUser.Name}}</a><br>
<span class="rowsmall lastReplyAt">Last: {{.LastReplyAt}}</span>

View File

@ -14,7 +14,7 @@
</div>
{{if .IP}}
<div class="rowblock bgavatars">
{{range .ItemList}}<div class="rowitem"{{if .Avatar}} style="background-image: url('{{.Avatar}}');"{{end}}>
{{range .ItemList}}<div class="rowitem" style="background-image: url('{{.Avatar}}');">
<a href="{{.Link}}">{{.Name}}</a>
</div>
{{else}}<div class="rowitem">No users found.</div>{{end}}

View File

@ -2,24 +2,25 @@
<div class="move_left">
<div class="move_right">
<ul>{{/** Add a menu manager **/}}
<li class="menu_left menu_overview"><a href="/" rel="home">{{.Header.Site.ShortName}}</a></li>
<li class="menu_left menu_forums"><a href="/forums/">Forums</a></li>
<li class="menu_left menu_topics"><a href="/">Topics</a></li>
<li id="menu_overview" class="menu_left"><a href="/" rel="home">{{.Header.Site.ShortName}}</a></li>
<li id="menu_forums" class="menu_left"><a href="/forums/" aria-label="The Forum list" title="Forum List"></a></li>
<li class="menu_left menu_topics"><a href="/" aria-label="The topic list" title="Topic List"></a></li>
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter"></div>
<div class="alert_counter" aria-label="The number of alerts"></div>
<div class="alert_aftercounter"></div>
<div class="alertList"></div>
<div class="alertList" aria-label="The alert list"></div>
</li>
{{if .CurrentUser.Loggedin}}
<li class="menu_left menu_account"><a href="/user/edit/critical/">Account</a></li>
<li class="menu_left menu_profile"><a href="{{.CurrentUser.Link}}">Profile</a></li>
<li class="menu_left menu_panel menu_account supermod_only"><a href="/panel/">Panel</a></li>
<li class="menu_left menu_logout"><a href="/accounts/logout/?session={{.CurrentUser.Session}}">Logout</a></li>
<li class="menu_left menu_account"><a href="/user/edit/critical/" aria-label="The account manager" title="Account Manager"></a></li>
<li class="menu_left menu_profile"><a href="{{.CurrentUser.Link}}" aria-label="Your profile" title="Your profile"></a></li>
<li class="menu_left menu_panel menu_account supermod_only"><a href="/panel/" aria-label="The Control Panel" title="Control Panel"></a></li>
<li class="menu_left menu_logout"><a href="/accounts/logout/?session={{.CurrentUser.Session}}" aria-label="Log out of your account" title="Logout"></a></li>
{{else}}
<li class="menu_left menu_register"><a href="/accounts/create/">Register</a></li>
<li class="menu_left menu_login"><a href="/accounts/login/">Login</a></li>
<li class="menu_left menu_register"><a href="/accounts/create/" aria-label="Create a new account" title="Register"></a></li>
<li class="menu_left menu_login"><a href="/accounts/login/" aria-label="Login to your account" title="Login"></a></li>
{{end}}
<li class="menu_left menu_hamburger" title="Menu"><a></a></li>
</ul>
</div>
</div>

View File

@ -16,15 +16,28 @@
</div>
<div id="panel_adminlogs" class="colstack_item rowlist">
{{range .Logs}}
<div class="rowitem" style="font-weight: normal;text-transform: none;">
<a style="font-size: 17px;">{{.Action}}</a><br />
<small style="margin-left: 2px;">IP: {{.IPAddress}}</small>
<span style="float: right;">
<span style="font-size: 16px;position:relative;top: -2px;">{{.DoneAt}}</span>
<div class="rowitem panel_compactrow" style="font-weight: normal;text-transform: none;">
<span style="float: left;">
<span>{{.Action}}</span><br />
<small style="margin-left: 2px;font-size: 12px;">{{.IPAddress}}</small>
</span>
<span class="to_right">
<span style="font-size: 14px;">{{.DoneAt}}</span>
</span>
<div style="clear: both;"></div>
</div>
{{end}}
</div>
{{if gt .LastPage 1}}
<div class="pageset">
{{if gt .Page 1}}<div class="pageitem"><a href="?page={{subtract .Page 1}}">Prev</a></div>{{end}}
{{range .PageList}}
<div class="pageitem"><a href="?page={{.}}">{{.}}</a></div>
{{end}}
{{if ne .LastPage .Page}}<div class="pageitem"><a href="?page={{add .Page 1}}">Next</a></div>{{end}}
</div>
{{end}}
</main>
</div>
{{template "footer.html" . }}

View File

@ -6,13 +6,13 @@
<div class="rowitem"><a>Debug</a></div>
</div>
<div id="panel_debug" class="colstack_grid">
<div class="grid_item grid_stat">Uptime</div>
<div class="grid_item grid_stat">Open DB Conns</div>
<div class="grid_item grid_stat">Adapter</div>
<div class="grid_item grid_stat"><span>Uptime</span></div>
<div class="grid_item grid_stat"><span>Open DB Conns</span></div>
<div class="grid_item grid_stat"><span>Adapter</span></div>
<div class="grid_item grid_stat">{{.Uptime}}</div>
<div class="grid_item grid_stat">{{.OpenConns}}</div>
<div class="grid_item grid_stat">{{.DBAdapter}}</div>
<div class="grid_item grid_stat"><span>{{.Uptime}}</span></div>
<div class="grid_item grid_stat"><span>{{.OpenConns}}</span></div>
<div class="grid_item grid_stat"><span>{{.DBAdapter}}</span></div>
</div>
</main>
</div>

View File

@ -49,7 +49,7 @@ var form_vars = {'perm_preset': ['can_moderate','can_post','read_only','no_acces
<div class="colstack_item colstack_head">
<div class="rowitem"><a>Forum Permissions</a></div>
</div>
<div id="forum_quick_perms" class="colstack_item rowlist">
<div id="forum_quick_perms" class="colstack_item rowlist formlist">
{{range .Groups}}
<div class="formrow">
<div class="formitem editable_parent">

View File

@ -14,23 +14,21 @@
<div id="panel_forums" class="colstack_item rowlist">
{{range .ItemList}}
<div class="rowitem editable_parent">
<span class="panel_floater">
<span data-field="forum_active" data-type="list" class="panel_tag editable_block forum_active {{if .Active}}forum_active_Show" data-value="1{{else}}forum_active_Hide" data-value="0{{end}}" title="Hidden"></span>
<span data-field="forum_preset" data-type="list" data-value="{{.Preset}}" class="panel_tag editable_block forum_preset forum_preset_{{.Preset}}" title="{{.PresetLang}}"></span>
<span class="panel_buttons">
<a class="panel_tag edit_fields hide_on_edit panel_right_button">Edit</a>
<a class="panel_right_button" href="/panel/forums/edit/submit/{{.ID}}"><button class='panel_tag submit_edit show_on_edit' type='submit'>Update</button></a>
{{if gt .ID 1}}<a href="/panel/forums/delete/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button hide_on_edit">Delete</a>{{end}}
<a href="/panel/forums/edit/{{.ID}}" class="panel_tag panel_right_button show_on_edit">Full Edit</a>
</span>
</span>
<span style="float: left;">
<span id="panel_forums_left_box">
{{/** TODO: Make sure the forum_active_name class is set and unset when the activity status of this forum is changed **/}}
<a data-field="forum_name" data-type="text" class="editable_block forum_name{{if not .Active}} forum_active_name{{end}}">{{.Name}}</a>
<br /><span data-field="forum_desc" data-type="text" class="editable_block forum_desc rowsmall">{{.Desc}}</span>
</span>
<span class="panel_floater">
<span data-field="forum_active" data-type="list" class="panel_tag editable_block forum_active {{if .Active}}forum_active_Show" data-value="1{{else}}forum_active_Hide" data-value="0{{end}}" title="Hidden"></span>
<span data-field="forum_preset" data-type="list" data-value="{{.Preset}}" class="panel_tag editable_block forum_preset forum_preset_{{.Preset}}" title="{{.PresetLang}}"></span>
</span>
<span class="panel_buttons">
<a class="panel_tag edit_fields hide_on_edit panel_right_button edit_button" aria-label="Edit Forum"></a>
<a class="panel_right_button" href="/panel/forums/edit/submit/{{.ID}}"><button class='panel_tag submit_edit show_on_edit' type='submit'>Update</button></a>
{{if gt .ID 1}}<a href="/panel/forums/delete/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button hide_on_edit delete_button" aria-label="Delete Forum"></a>{{end}}
<a href="/panel/forums/edit/{{.ID}}" class="panel_tag panel_right_button show_on_edit">Full Edit</a>
</span>
<br /><span data-field="forum_desc" data-type="text" class="editable_block forum_desc rowsmall">{{.Desc}}</span>
<div style="clear: both;"></div>
</div>
{{end}}
</div>

View File

@ -16,7 +16,7 @@
<div class="rowitem"><h1>{{.Name}} Group</h1></div>
</div>
<form action="/panel/groups/edit/perms/submit/{{.ID}}?session={{.CurrentUser.Session}}" method="post">
<div id="panel_group" class="colstack_item rowlist">
<div id="panel_group" class="colstack_item rowlist formlist">
{{if .CurrentUser.Perms.EditGroupLocalPerms}}
{{range .LocalPerms}}
<div class="formrow">
@ -39,7 +39,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><h1>Extended Permissions</h1></div>
</div>
<div class="colstack_item rowlist">
<div class="colstack_item rowlist formlist">
{{if .CurrentUser.Perms.EditGroupGlobalPerms}}
{{range .GlobalPerms}}
<div class="formrow">

View File

@ -14,7 +14,7 @@
{{if .RankClass}}<a class="panel_tag panel_rank_tag panel_rank_tag_{{.RankClass}}" title="{{.Rank}}"></a>
{{else}}<span class="panel_tag">{{.Rank}}</span>{{end}}
{{if .CanEdit}}<a href="/panel/groups/edit/{{.ID}}" class="panel_tag panel_right_button">Edit</a>{{end}}
{{if .CanEdit}}<a href="/panel/groups/edit/{{.ID}}" class="panel_tag panel_right_button edit_button" aria-label="Edit Group"></a>{{end}}
</span>
</div>
{{end}}

View File

@ -22,7 +22,7 @@
<span>{{.Action}}</span><br />
<small style="margin-left: 2px;font-size: 12px;">{{.IPAddress}}</small>
</span>
<span style="float: right;">
<span class="to_right">
<span style="font-size: 14px;">{{.DoneAt}}</span>
</span>
<div style="clear: both;"></div>

View File

@ -6,7 +6,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><h1>Plugins</h1></div>
</div>
<div id="panel_plugins" class="colstack_item">
<div id="panel_plugins" class="colstack_item complex_rowlist">
{{range .ItemList}}
<div class="rowitem editable_parent">
<a {{if .URL}}href="{{.URL}}" {{end}}class="editable_block" class="panel_upshift">{{.Name}}</a><br />

View File

@ -10,7 +10,7 @@
{{range $key, $value := .Something}}
<div class="rowitem panel_compactrow editable_parent">
<a href="/panel/settings/edit/{{$key}}" class="editable_block panel_upshift">{{$key}}</a>
<a class="panel_compacttext" style="float: right;">{{$value}}</a>
<a class="panel_compacttext to_right">{{$value}}</a>
</div>
{{end}}
</div>

View File

@ -11,7 +11,7 @@
{{template "panel-inner-menu.html" . }}
</nav>
<!-- Stop inlining this x.x -->
{{/** Stop inlining this x.x **/}}
<style type="text/css">
.rowitem::after {
content: "";
@ -24,7 +24,7 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><h1>Primary Themes</h1></div>
</div>
<div id="panel_primary_themes" class="colstack_item panel_themes">
<div id="panel_primary_themes" class="colstack_item panel_themes complex_rowlist">
{{range .PrimaryThemes}}
<div class="theme_row rowitem editable_parent" style="{{if .FullImage}}background-image: url('/static/{{.FullImage}}');background-position: center;background-size: 50%;background-repeat: no-repeat;{{end}}">
<span style="float: left;">
@ -39,6 +39,7 @@
</div>
{{end}}
</div>
{{if .VariantThemes}}
<div class="colstack_item colstack_head">
<div class="rowitem"><h1>Variant Themes</h1></div>
</div>
@ -57,6 +58,7 @@
</div>
{{end}}
</div>
{{end}}
</main>
</div>

View File

@ -8,8 +8,9 @@
</div>
<div id="panel_users" class="colstack_item rowlist bgavatars">
{{range .ItemList}}
<div class="rowitem editable_parent" style="{{if .Avatar}}background-image: url('{{.Avatar}}');{{end}}">
<a {{if $.CurrentUser.Perms.EditUser}}href="/panel/users/edit/{{.ID}}?session={{$.CurrentUser.Session}} "{{end}}class="editable_block">{{.Name}}</a>
<div class="rowitem editable_parent" style="background-image: url('{{.Avatar}}');">
<img class="bgsub" src="{{.Avatar}}" />
<a class="rowTitle" {{if $.CurrentUser.Perms.EditUser}}href="/panel/users/edit/{{.ID}}?session={{$.CurrentUser.Session}}" {{end}}class="editable_block">{{.Name}}</a>
<a href="/user/{{.ID}}" class="tag-mini">Profile</a>
{{if (.Tag) and (.IsSuperMod)}}<span style="float: right;"><span class="panel_tag" style="margin-left 4px;">{{.Tag}}</span></span>{{end}}

View File

@ -10,12 +10,12 @@
{{range .Something}}
<div class="rowitem panel_compactrow editable_parent">
<a data-field="find" data-type="text" href="/panel/settings/word-filters/edit/{{.ID}}" class="editable_block panel_upshift edit_fields">{{.Find}}</a>
<span style="padding-left: 2px;padding-right: 2px;"> || </span>
<span class="itemSeparator"></span>
<a data-field="replacement" data-type="text" class="editable_block panel_compacttext">{{.Replacement}}</a>
<span class="panel_buttons">
<a class="panel_tag edit_fields hide_on_edit panel_right_button">Edit</a>
<a class="panel_tag edit_fields hide_on_edit panel_right_button edit_button" aria-label="Edit Word Filter"></a>
<a class="panel_right_button" href="/panel/settings/word-filters/edit/submit/{{.ID}}"><button class='panel_tag submit_edit show_on_edit' type='submit'>Update</button></a>
<a href="/panel/settings/word-filters/delete/submit/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button hide_on_edit">Delete</a>
<a href="/panel/settings/word-filters/delete/submit/{{.ID}}?session={{$.CurrentUser.Session}}" class="panel_tag panel_right_button hide_on_edit delete_button" aria-label="Delete Word Filter"></a>
</span>
</div>
{{else}}

View File

@ -3,9 +3,6 @@
<div id="profile_container" class="colstack">
<div id="profile_left_lane" class="colstack_left">
<!--<header class="colstack_item colstack_head rowhead">
<div class="rowitem"><h1>Profile</h1></div>
</header>-->
<div id="profile_left_pane" class="rowmenu">
<div class="topBlock">
<div class="rowitem avatarRow">
@ -73,7 +70,8 @@
<div class="rowitem"><h1>Comments</h1></div>
</div>
<div id="profile_comments" class="colstack_item hash_hide">{{range .ItemList}}
<div class="rowitem passive deletable_block editable_parent simple {{.ClassName}}" style="{{if .Avatar}}background-image: url({{.Avatar}}), url(/static/post-avatar-bg.jpg);background-position: 0px {{if le .ContentLines 5}}-1{{end}}0px;{{end}}">
<div class="rowitem passive deletable_block editable_parent simple {{.ClassName}}" style="background-image: url({{.Avatar}}), url(/static/post-avatar-bg.jpg);background-position: 0px {{if le .ContentLines 5}}-1{{end}}0px;">
<img class="bgsub" src="{{.Avatar}}" />
<span class="editable_block user_content simple">{{.ContentHtml}}</span>
<span class="controls">
<a href="{{.UserLink}}" class="real_username username">{{.CreatedByName}}</a>&nbsp;&nbsp;

View File

@ -23,7 +23,7 @@
</div>
<article itemscope itemtype="http://schema.org/CreativeWork" class="rowblock post_container top_post" aria-label="The opening post for this topic">
<div class="rowitem passive editable_parent post_item {{.Topic.ClassName}}" style="{{if .Topic.Avatar}}background-image: url({{.Topic.Avatar}}), url(/static/{{.Header.Theme.Name}}/post-avatar-bg.jpg);background-position: 0px {{if le .Topic.ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;{{end}}">
<div class="rowitem passive editable_parent post_item {{.Topic.ClassName}}" style="background-image: url({{.Topic.Avatar}}), url(/static/{{.Header.Theme.Name}}/post-avatar-bg.jpg);background-position: 0px {{if le .Topic.ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;">
<p class="hide_on_edit topic_content user_content" itemprop="text" style="margin:0;padding:0;">{{.Topic.ContentHTML}}</p>
<textarea name="topic_content" class="show_on_edit topic_content_input">{{.Topic.Content}}</textarea>
@ -57,7 +57,7 @@
<span itemprop="text">{{.ActionType}}</span>
</article>
{{else}}
<article itemscope itemtype="http://schema.org/CreativeWork" class="rowitem passive deletable_block editable_parent post_item {{.ClassName}}" style="{{if .Avatar}}background-image: url({{.Avatar}}), url(/static/{{$.Header.Theme.Name}}/post-avatar-bg.jpg);background-position: 0px {{if le .ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;{{end}}">
<article itemscope itemtype="http://schema.org/CreativeWork" class="rowitem passive deletable_block editable_parent post_item {{.ClassName}}" style="background-image: url({{.Avatar}}), url(/static/{{$.Header.Theme.Name}}/post-avatar-bg.jpg);background-position: 0px {{if le .ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;">
{{/** TODO: We might end up with <br>s in the inline editor, fix this **/}}
<p class="editable_block user_content" itemprop="text" style="margin:0;padding:0;">{{.ContentHtml}}</p>

View File

@ -9,7 +9,7 @@
<div class="opt create_topic_opt" title="Create Topic" aria-label="Create a topic"><a class="create_topic_link" href="/topics/create/"></a></div>
{{/** TODO: Add a permissions check for this **/}}
<div class="opt mod_opt" title="Moderate">
<a class="moderate_link" href="#"></a>
<a class="moderate_link" href="#" aria-label="Moderate Posts"></a>
</div>
{{else}}<div class="opt locked_opt" title="You don't have the permissions needed to create a topic" aria-label="You don't have the permissions needed to make a topic anywhere"><a></a></div>{{end}}
<div style="clear: both;"></div>
@ -35,7 +35,7 @@
{{if .ForumList}}
<div class="rowblock topic_create_form quick_create_form" style="display: none;" aria-label="Quick Topic Form">
<form name="topic_create_form_form" id="topic_create_form_form" enctype="multipart/form-data" action="/topic/create/submit/" method="post"></form>
{{if .CurrentUser.Avatar}}<img class="little_row_avatar" src="{{.CurrentUser.Avatar}}" height="64" />{{end}}
<img class="little_row_avatar" src="{{.CurrentUser.Avatar}}" height="64" />
<div class="main_form">
<div class="topic_meta">
<div class="formrow topic_board_row real_first_child">
@ -72,7 +72,7 @@
{{range .TopicList}}<div class="topic_row" data-tid="{{.ID}}">
<div class="rowitem topic_left passive datarow {{if .Sticky}}topic_sticky{{else if .IsClosed}}topic_closed{{end}}">
<span class="selector"></span>
{{if .Creator.Avatar}}<a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" /></a>{{end}}
<a href="{{.Creator.Link}}"><img src="{{.Creator.Avatar}}" height="64" /></a>
<span class="topic_inner_left">
<a class="rowtopic" href="{{.Link}}"><span>{{.Title}}</span></a> {{if .ForumName}}<a class="rowsmall parent_forum" href="{{.ForumLink}}">{{.ForumName}}</a>{{end}}
<br /><a class="rowsmall starter" href="{{.Creator.Link}}">{{.Creator.Name}}</a>
@ -86,7 +86,7 @@
</span>
</div>
<div class="rowitem topic_right passive datarow {{if .Sticky}}topic_sticky{{else if .IsClosed}}topic_closed{{end}}">
{{if .LastUser.Avatar}}<a href="{{.LastUser.Link}}"><img src="{{.LastUser.Avatar}}" height="64" /></a>{{end}}
<a href="{{.LastUser.Link}}"><img src="{{.LastUser.Avatar}}" height="64" /></a>
<span>
<a href="{{.LastUser.Link}}" class="lastName" style="font-size: 14px;">{{.LastUser.Name}}</a><br>
<span class="rowsmall lastReplyAt">{{.RelativeLastReplyAt}}</span>

View File

@ -65,6 +65,7 @@ body, #back {
display: none;
}
.nav {
padding-top: 16px;
border-bottom: 2px solid var(--header-border-color);
}
@ -82,30 +83,36 @@ li {
border-right: 1px solid var(--header-border-color);
}
.menu_overview {
#menu_overview {
font-size: 22px;
margin-right: 12px;
letter-spacing: 1px;
}
.menu_left.menu_overview:after {
#menu_overview:after {
margin-right: 5px !important;
height: 20px !important;
}
.menu_forums a:before, .menu_topics a:before, .alert_bell:before, .menu_account a:before, .menu_profile a:before, .menu_panel a:before, .menu_logout a:before {
#menu_forums a:before, .menu_topics a:before, .alert_bell:before, .menu_account a:before, .menu_profile a:before, .menu_panel a:before, .menu_logout a:before {
font: normal normal normal 14px/1 FontAwesome;
}
.menu_forums a:before {
#menu_forums a:before {
content: "\f03a";
margin-right: 6px;
}
#menu_forums a:after {
content: "Forums";
}
.menu_topics a:before {
margin-right: 4px;
content: "\f27b";
position: relative;
top: -2px;
}
.menu_topics a:after {
content: "Topics";
}
.menu_alerts {
color: var(--primary-link-color);
display: flex;
@ -136,6 +143,9 @@ li {
content: "\f2c3";
margin-right: 6px;
}
.menu_account a:after {
content: "Account";
}
.menu_profile a:before {
content: "\f2c0";
margin-right: 5px;
@ -143,14 +153,29 @@ li {
top: -1px;
font-size: 14px;
}
.menu_profile a:after {
content: "Profile";
}
.menu_panel a:before {
margin-right: 6px;
content: "\f108";
}
.menu_panel a:after {
content: "Panel";
}
.menu_logout a:before {
content: "\f08b";
margin-right: 3px;
}
.menu_logout a:after {
content: "Logout";
}
.menu_login a:after {
content: "Login";
}
.menu_register a:after {
content: "Register";
}
ul {
display: flex;
@ -158,6 +183,7 @@ ul {
padding: 0px;
margin-left: 14px;
margin-bottom: 12px;
margin-top: 0px;
}
.alertList {
display: none;
@ -169,7 +195,7 @@ ul {
border-bottom: 2px solid var(--header-border-color);
margin-left: 12px;
}
.rowblock:not(.topic_list), .colstack_head, .topic_row .rowitem {
.rowblock:not(.topic_list):not(.forum_list), .colstack_head, .topic_row .rowitem, .forum_list .rowitem {
background-color: var(--element-background-color);
}
.rowblock {
@ -495,15 +521,41 @@ select, input, textarea, button {
background-color: var(--element-background-color);
padding: 12px;
}
/* TODO: Refactor bgavatars to make the avatars rounded */
.rowlist.bgavatars {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fill, 150px);
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
grid-gap: 6px 12px;
}
.rowlist .rowitem {
display: flex;
}
.rowlist.bgavatars .rowitem {
background-repeat: no-repeat;
background-size: 40px;
padding-left: 46px;
background-image: none !important;
flex-direction: column;
}
.rowlist.bgavatars .bgsub {
height: 80px;
width: 80px;
border-radius: 48px;
margin-top: 4px;
margin-bottom: 8px;
}
.rowlist.bgavatars .bgsub, .rowlist.bgavatars .rowitem > a, .rowlist.bgavatars .rowitem > span {
margin-left: auto;
margin-right: auto;
}
.rowlist .rowTitle {
font-size: 20px;
margin-bottom: 3px;
}
.rowlist .panel_compactrow {
padding: 16px;
}
.topic_list .rowtopic {
font-size: 17px;
font-size: 16px;
margin-right: 1px;
white-space: nowrap;
display: inline-block;
@ -856,6 +908,33 @@ select, input, textarea, button {
border-right: none !important;
}
.to_right {
float: right;
margin-left: auto;
}
/* TODO: Highlight the one we're currently on? */
.pageset {
display: flex;
margin-left: 16px;
}
.pageitem {
padding: 8px;
padding-left: 10px;
padding-right: 10px;
background: var(--element-background-color);
border: 1px solid var(--element-border-color);
border-bottom: 2px solid var(--element-border-color);
border-left: none;
border-right: none;
}
.pageitem:first-child {
border-left: 1px solid var(--element-border-color);
}
.pageitem:last-child {
border-right: 1px solid var(--element-border-color);
}
/* TODO: Make widget_about's CSS less footer centric */
.footer {
margin-top: 14px;
@ -941,6 +1020,7 @@ select, input, textarea, button {
margin-right: auto;
text-align: center;
}
/* TODO: Move these to panel.css */
#dash-version:before, #dash-cpu:before, #dash-ram:before {
display: inline-block;
background: hsl(0,0%,98%);
@ -967,6 +1047,44 @@ select, input, textarea, button {
}
}
@media(max-width: 520px) {
#menu_overview {
font-size: 18px;
background-color: hsl(0,0%,97%);
margin-top: -16px;
margin-bottom: -11px;
margin-left: -14px;
margin-right: 16px;
padding-top: 16px;
padding-left: 14px;
padding-right: 4px;
}
#menu_overview::after {
height: 16px !important;
}
.menu_left a:after {
content: "" !important;
}
.menu_left:not(:last-child):after, .menu_alerts:after {
margin-left: 4px;
border-right: none;
}
.menu_alerts {
margin-right: 16px;
}
.alert_bell {
position: relative;
bottom: -1px;
}
.alert_bell:before {
font-size: 17px;
}
.alert_aftercounter {
display: none;
}
.rowhead h1, .opthead h1, .colstack_head h1 {
font-size: 18px;
}
.topic_list {
display: flex;
flex-wrap: wrap;
@ -990,7 +1108,7 @@ select, input, textarea, button {
.topic_right.rowitem {
border-top: none;
border-left: 1px solid var(--element-border-color);
background-color: hsl(0,0%,90%);
background-color: hsl(0,0%,95%);
}
.topic_right br, .topic_right img {
display: none;
@ -1002,4 +1120,14 @@ select, input, textarea, button {
margin-top: 6px;
margin-bottom: 6px;
}
}
@media(max-width: 450px) {
.topic_list .topic_row {
display: block;
width: 100%;
float: none;
}
.topic_list .topic_row:nth-child(odd) {
margin-right: 0px;
}
}

View File

@ -1,3 +1,86 @@
.about {
.complex_rowlist {
background-color: inherit !important;
border: none !important;
}
.complex_rowlist .rowitem {
display: flex;
}
.panel_buttons, .panel_floater {
margin-left: auto;
display: flex;
}
.panel_buttons:before,
.panel_floater:before,
.edit_button:after,
.delete_button:after {
color: hsl(0,0%,65%);
}
.panel_buttons:before,
.panel_floater:before {
content: "";
border-left: 1px solid var(--element-border-color);
height: 15px;
margin-top: 2px;
margin-bottom: 0px;
margin-right: 0px;
}
.edit_button:after, .delete_button:after {
font: normal normal normal 14px/1 FontAwesome;
padding-left: 12px;
height: 20px;
}
.edit_button:after {
content: "\f040";
}
.delete_button:after {
content: "\f014";
}
#panel_users .panel_floater:before,
#panel_forums .panel_floater:before,
#forum_quick_perms .panel_floater:before,
.panel_themes .panel_floater:before,
#panel_backups .panel_floater:before {
border-left: none;
}
#panel_forums_name_box {
order: 0;
}
#panel_users .panel_tag:not(.panel_right_button) {
display: none;
}
#panel_word_filters .itemSeparator:before {
content: "|";
padding-left: 5px;
padding-right: 5px;
color: var(--primary-link-color);
}
/* TODO: Should we be using .formrows in #forum_quick_perms? Can we normalize it? Would this break the other themes? */
.formlist:not(#forum_quick_perms),
.panel_themes .rowitem,
#panel_plugins .rowitem,
#forum_quick_perms .formitem {
padding: 12px;
margin-bottom: 8px;
background-color: var(--element-background-color);
border: 1px solid var(--element-border-color);
border-bottom: 2px solid var(--element-border-color);
}
.formlist .formrow {
padding: 0px !important;
margin: 0px;
}
.formlist .formitem {
padding: 8px;
}
#forum_quick_perms .panel_floater,
.panel_theme_mobile, .panel_theme_tag {
display: none;
}
#panel_plugins .rowitem {
display: block;
}

View File

@ -58,17 +58,42 @@ li {
float: right;
}
.menu_overview {
#menu_overview {
margin-right: 13px;
margin-left: 10px;
font-size: 16px;
}
.menu_left:not(.menu_overview) {
.menu_left:not(#menu_overview) {
font-size: 15px;
padding-top: 13px;
}
#menu_forums a:after {
content: "Forums";
}
.menu_topics a:after {
content: "Topics";
}
.menu_account a:after {
content: "Account";
}
.menu_profile a:after {
content: "Profile";
}
.menu_panel a:after {
content: "Panel";
}
.menu_logout a:after {
content: "Logout";
}
.menu_login a:after {
content: "Login";
}
.menu_register a:after {
content: "Register";
}
.alert_bell {
float: right;
}
@ -194,8 +219,9 @@ a {
padding: 10px;
}
/* Algin to right in a flex head */
/* Align to right in a flex head */
.to_right {
float: right;
margin-left: auto;
}
@ -472,6 +498,9 @@ input, select, textarea {
margin-top: 5px;
}
.little_row_avatar {
display: none;
}
.topic_create_form .topic_board_row .formitem, .topic_create_form .topic_name_row .formitem {
padding-bottom: 5px;
}
@ -773,7 +802,7 @@ input, select, textarea {
height: 26px;
}
.menu_overview {
#menu_overview {
margin-right: 9px;
margin-left: 0px;
font-size: 15px;
@ -783,7 +812,7 @@ input, select, textarea {
.menu_left {
margin-right: 7px;
}
.menu_left:not(.menu_overview) {
.menu_left:not(#menu_overview) {
font-size: 13px;
padding-top: 10px;
}
@ -847,10 +876,10 @@ input, select, textarea {
ul {
height: 40px;
}
.menu_overview {
#menu_overview {
font-size: 16px;
}
.menu_left:not(.menu_overview) {
.menu_left:not(#menu_overview) {
font-size: 14px;
padding-top: 13px;
}
@ -881,14 +910,11 @@ input, select, textarea {
}
@media(max-width: 500px) {
.topic_list .topic_inner_right {
display: block;
}
.topic_list .rowitem {
float: none;
}
.topic_list .topic_left {
width: calc(100% - 84px);
width: 100%;
}
.topic_list .topic_right {
display: none;

View File

@ -1,13 +1,31 @@
.bgsub {
display: none;
}
.rowlist .tag-mini {
font-size: 10px;
margin-left: 2px;
}
.panel_floater {
margin-left: auto;
}
.panel_right_button {
float: right;
margin-left: 5px;
}
.edit_button:before {
content: "Edit";
}
.delete_button:after {
content: "Delete";
}
#panel_forums .rowitem {
display: flex;
}
#panel_users .ban_button {
font-size: 10px;
float: none;
@ -29,3 +47,9 @@
.builtin_forum_divider {
margin-bottom: 5px;
}
#panel_word_filters .itemSeparator:before {
content: " || ";
padding-left: 2px;
padding-right: 2px;
}

View File

@ -19,9 +19,7 @@ body {
}
/* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; }
}
@supports (-ms-ime-align:auto) { .user_content { font-family: Segoe UI Emoji, arial; } }
ul {
padding-left: 0px;
@ -47,7 +45,6 @@ li:hover {
}
li a {
text-decoration: none;
/*color: #515151;*/
color: black;
font-size: 17px;
}
@ -64,6 +61,31 @@ li a {
padding-right: 10px;
}
#menu_forums a:after {
content: "Forums";
}
.menu_topics a:after {
content: "Topics";
}
.menu_account a:after {
content: "Account";
}
.menu_profile a:after {
content: "Profile";
}
.menu_panel a:after {
content: "Panel";
}
.menu_logout a:after {
content: "Logout";
}
.menu_login a:after {
content: "Login";
}
.menu_register a:after {
content: "Register";
}
.alert_bell:before {
content: '🔔︎';
}
@ -71,7 +93,6 @@ li a {
cursor: default;
}
.menu_alerts {
/*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px;
color: rgb(80,80,80);
@ -457,6 +478,13 @@ li a {
padding: 10px;
}
.to_right {
margin-left: auto;
float: right;
}
.little_row_avatar {
display: none;
}
.topic_create_form .topic_button_row .formitem {
display: flex;
}
@ -573,10 +601,6 @@ button.username {
top: -0.25px;
}
/* We'll be rewriting the profiles soon too! */
/*.username.real_username { color: #404040; font-size: 16px; padding-right: 4px; }
.username.real_username:hover { color: black; }*/
.postQuote {
border: rgb(200,200,210);
background: rgb(245,245,255);
@ -882,6 +906,10 @@ button.username {
#poweredBy span {
font-size: 12px;
}
#poweredByName {
color: black;
text-decoration: none;
}
.pageset {
display: flex;

View File

@ -91,6 +91,18 @@
.grid_istat { margin-bottom: 0px; }
}
@media(max-width: 550px) {
#poweredByDash, #poweredByMaker {
display: none;
}
}
@media (max-width: 500px) {
.topic_list .topic_row {
grid-template-columns: calc(100% - 194px) 194px;
}
}
@media (max-width: 470px) {
.container {
border: none;
@ -182,6 +194,15 @@
.container { width: 100% !important; }
}
@media(max-width: 390px) {
.topic_list .topic_row {
display: block;
}
.topic_row .topic_right {
display: none;
}
}
@media (max-width: 330px) {
li { padding-left: 6px; }
.menu_left { padding-right: 6px; }

View File

@ -1,6 +1,19 @@
/* Control Panel */
.panel_upshift:visited { color: black; }
.bgsub {
display: none;
}
.edit_button:before {
content: "Edit";
}
.delete_button:after {
content: "Delete";
}
.panel_upshift:visited {
color: black;
}
.panel_tag {
padding-left: 0px;
@ -10,7 +23,6 @@
color: #202020;
font-size: 14px;
}
.tag-mini {
margin-left: 0px;
padding-left: 0px;
@ -22,7 +34,8 @@
font-size: 13px;
}
.panel_floater {
.panel_floater, .panel_buttons {
margin-left: auto;
float: right;
}
#panel_groups > .rowitem > .panel_floater {
@ -31,11 +44,11 @@
#panel_groups > .rowitem > .panel_floater > .panel_right_button {
float: right;
}
#panel_forums > .rowitem > .panel_floater {
float: none;
#panel_forums .rowitem {
display: flex;
}
#panel_forums > .rowitem > .panel_floater > .panel_buttons {
float: right;
#panel_forums > .rowitem > .panel_floater {
margin-left: 0px;
}
#panel_forums > .rowitem > span > .forum_name {
margin-right: 4px;
@ -82,6 +95,12 @@
.theme_row > .panel_floater > .panel_right_button { margin-left: 5px; }
#panel_word_filters .itemSeparator:before {
content: " || ";
padding-left: 2px;
padding-right: 2px;
}
@media(max-width: 1300px) {
.theme_row { background-image: none !important; }
}

View File

@ -10,9 +10,7 @@ body {
}
/* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; }
}
@supports (-ms-ime-align:auto) { .user_content { font-family: Segoe UI Emoji, arial; } }
ul {
padding-left: 0px;
@ -32,7 +30,6 @@ li {
li:hover { background: rgb(250,250,250); }
li a {
text-decoration: none;
/*color: #515151;*/
color: black;
font-size: 17px;
}
@ -49,6 +46,31 @@ li a {
padding-right: 10px;
}
#menu_forums a:after {
content: "Forums";
}
.menu_topics a:after {
content: "Topics";
}
.menu_account a:after {
content: "Account";
}
.menu_profile a:after {
content: "Profile";
}
.menu_panel a:after {
content: "Panel";
}
.menu_logout a:after {
content: "Logout";
}
.menu_login a:after {
content: "Login";
}
.menu_register a:after {
content: "Register";
}
.alert_bell:before {
content: '🔔︎';
}
@ -56,7 +78,6 @@ li a {
cursor: default;
}
.menu_alerts {
/*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px;
color: rgb(80,80,80);
@ -649,7 +670,7 @@ button.username {
}
@media (max-width: 470px) {
.menu_overview, .menu_profile, .hide_on_micro { display: none; }
#menu_overview, .menu_profile, .hide_on_micro { display: none; }
.selectedAlert .alertList {
width: 135px;
margin-bottom: 5px;

View File

@ -1,5 +1,12 @@
/* Control Panel */
.edit_button:before {
content: "Edit";
}
.delete_button:after {
content: "Delete";
}
.tag-mini {
margin-left: 0px;
padding-left: 0px;
@ -36,6 +43,12 @@
font-size: 14px;
}
#panel_word_filters .itemSeparator:before {
content: " || ";
padding-left: 2px;
padding-right: 2px;
}
.panel_rank_tag, .forum_preset, .forum_active {
float: none;
color: #202020;

View File

@ -32,7 +32,6 @@ li {
li:hover { background: rgb(252,252,252); }
li a {
text-decoration: none;
/*color: #515151;*/
color: black;
font-size: 17px;
}
@ -46,14 +45,39 @@ li a {
border-left: 1px solid hsl(0, 0%, 80%);
padding-right: 10px;
}
.menu_overview {
#menu_overview {
background: none;
padding-right: 13px;
}
.menu_overview a {
#menu_overview a {
padding-left: 3px;
}
#menu_forums a:after {
content: "Forums";
}
.menu_topics a:after {
content: "Topics";
}
.menu_account a:after {
content: "Account";
}
.menu_profile a:after {
content: "Profile";
}
.menu_panel a:after {
content: "Panel";
}
.menu_logout a:after {
content: "Logout";
}
.menu_login a:after {
content: "Login";
}
.menu_register a:after {
content: "Register";
}
.alert_bell:before {
content: '🔔︎';
}
@ -196,7 +220,6 @@ li a {
.colstack_grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
/*grid-gap: 15px;*/
grid-gap: 12px;
margin-left: 5px;
margin-top: 2px;
@ -209,10 +232,7 @@ li a {
overflow: hidden;
}
.grid_stat, .grid_istat {
/*padding-top: 15px;*/
text-align: center;
/*padding-bottom: 15px;
font-size: 20px;*/
padding-top: 12px;
padding-bottom: 12px;
font-size: 16px;
@ -252,10 +272,6 @@ li a {
.rowitem {
width: 100%;
/*padding-left: 8px;
padding-right: 8px;
padding-top: 17px;
padding-bottom: 12px;*/
padding-left: 10px;
padding-top: 14px;
padding-bottom: 12px;
@ -309,6 +325,11 @@ li a {
content: '🔒︎';
}
.to_right {
margin-left: auto;
float: right;
}
.rowlist {
font-size: 15px;
}
@ -339,7 +360,6 @@ li a {
float: left;
padding: 10px;
min-width: 20%;
/*font-size: 17px;*/
font-weight: normal;
}
.formitem:not(:last-child) {
@ -361,12 +381,11 @@ li a {
float: none;
}
.formitem:not(:only-child) input, .formitem:not(:only-child) select {
padding: 3px;/*5px;*/
padding: 3px;
}
.formitem:not(:only-child).formlabel {
padding-top: 15px;/*18px;*/
padding-bottom: 12px;/*16px;*/
/*padding-left: 15px;*/
padding-top: 15px;
padding-bottom: 12px;
}
.formbutton, button {
@ -450,6 +469,9 @@ li a {
padding: 10px;
}
.little_row_avatar {
display: none;
}
.topic_create_form .topic_button_row .formitem {
display: flex;
}
@ -631,7 +653,6 @@ button.username {
display: inline-block;
width: 100%;
}
.action_item {
padding: 14px;
text-align: center;
@ -647,7 +668,6 @@ button.username {
width: 100%;
margin-bottom: 8px;
}
.level {
float: right;
color: #505050;
@ -656,7 +676,6 @@ button.username {
padding-right: 5px;
font-size: 17px;
}
.mention {
font-weight: bold;
}
@ -738,6 +757,10 @@ button.username {
#poweredBy span {
font-size: 12px;
}
#poweredByName {
color: black;
text-decoration: none;
}
#profile_comments .rowitem {
background-repeat: no-repeat, repeat-y;

View File

@ -67,6 +67,18 @@
.grid_istat { margin-bottom: 0px; }
}
@media(max-width: 550px) {
#poweredByDash, #poweredByMaker {
display: none;
}
}
@media (max-width: 500px) {
.topic_list .topic_row {
grid-template-columns: calc(100% - 194px) 194px;
}
}
@media (max-width: 470px) {
.menu_overview, .menu_profile { display: none; }
.selectedAlert .alertList {
@ -145,6 +157,15 @@
.container { width: 100% !important; }
}
@media(max-width: 390px) {
.topic_list .topic_row {
display: block;
}
.topic_row .topic_right {
display: none;
}
}
@media (max-width: 330px) {
li { padding-left: 6px; }
.menu_left { padding-right: 6px; }

View File

@ -1,5 +1,16 @@
/* Control Panel */
.bgsub {
display: none;
}
.edit_button:before {
content: "Edit";
}
.delete_button:after {
content: "Delete";
}
.tag-mini {
text-transform: none;
margin-left: 0px;
@ -15,7 +26,7 @@
font-size: 10px;
}
.panel_compactrow .panel_tag {
.panel_compactrow .panel_tag, .panel_compacttext {
font-size: 14px;
}
.panel_compactrow {
@ -24,9 +35,6 @@
padding-bottom: 10px;
padding-right: 10px;
}
.panel_compacttext {
font-size: 14px;
}
.panel_upshift {
font-size: 18px;
@ -40,47 +48,33 @@
.panel_upshift:visited {
color: black;
}
/*.panel_tag_upshift {
margin-left: 2px;
position: relative;
top:-3px;
color: #505050;
}*/
.panel_floater {
.panel_floater, .panel_buttons {
margin-left: auto;
float: right;
}
.panel_rank_tag_admin:before {
content: "👑";
#panel_forums .rowitem {
display: flex;
}
.panel_rank_tag_mod:before {
content: "👮";
#panel_forums .panel_floater {
margin-left: auto;
margin-top: -2px;
}
.panel_rank_tag_banned:before {
content: "⛓️";
}
.panel_rank_tag_guest:before {
content: "👽";
}
.panel_rank_tag_member:before {
content: "👪";
#panel_forums .panel_buttons {
margin-left: 3px;
}
.forum_preset_announce:before {
content: "📣";
}
.forum_preset_members:before {
content: "👪";
}
.forum_preset_staff:before {
content: "👮";
}
.forum_preset_admins:before {
content: "👑";
}
.forum_preset_archive:before {
content: "☠️";
}
.panel_rank_tag_admin:before { content: "👑"; }
.panel_rank_tag_mod:before { content: "👮"; }
.panel_rank_tag_banned:before { content: "⛓️"; }
.panel_rank_tag_guest:before { content: "👽"; }
.panel_rank_tag_member:before { content: "👪"; }
.forum_preset_announce:before { content: "📣"; }
.forum_preset_members:before { content: "👪"; }
.forum_preset_staff:before { content: "👮"; }
.forum_preset_admins:before { content: "👑"; }
.forum_preset_archive:before { content: "☠️"; }
.forum_preset_all, .forum_preset_custom, .forum_preset_ {
display: none !important;
}
@ -101,13 +95,14 @@
content: "No Access";
color: maroon;
}
.perm_preset_read_only:before, .perm_preset_can_post:before {
color: green;
}
.perm_preset_read_only:before {
content: "Read Only";
color: green;
}
.perm_preset_can_post:before {
content: "Can Post";
color: green;
}
.perm_preset_can_moderate:before {
content: "Can Moderate";
@ -128,4 +123,10 @@
/* TODO: Figure out how to handle this on the Control Panel */
.footer {
display: none;
}
#panel_word_filters .itemSeparator:before {
content: " || ";
padding-left: 2px;
padding-right: 2px;
}