├── .gitignore ├── image ├── award.png ├── github.png ├── loading.gif ├── premium.png ├── creatures.png ├── save.svg └── load.svg ├── sass ├── _mediaquery.scss ├── _default.scss ├── base │ ├── _variable.scss │ ├── _layout.scss │ └── _mixin.scss ├── main.scss ├── components │ ├── _component.scss │ ├── _tools.scss │ ├── _export.scss │ ├── _generator.scss │ └── _header.scss └── partials │ ├── _review_tc.scss │ ├── _review.scss │ ├── _review_fh.scss │ ├── _review_th.scss │ └── _review_dh.scss ├── .vscode └── settings.json ├── pug ├── partial │ ├── review_tc.pug │ ├── review_fh.pug │ ├── review_dh.pug │ └── review_th.pug └── components │ ├── inputs.pug │ └── lists.pug ├── index.pug ├── script └── script.js └── style └── main.min.css /.gitignore: -------------------------------------------------------------------------------- 1 | pug/*/*.html -------------------------------------------------------------------------------- /image/award.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoshikata/PlurkCSSGenerator/HEAD/image/award.png -------------------------------------------------------------------------------- /image/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoshikata/PlurkCSSGenerator/HEAD/image/github.png -------------------------------------------------------------------------------- /image/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoshikata/PlurkCSSGenerator/HEAD/image/loading.gif -------------------------------------------------------------------------------- /image/premium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoshikata/PlurkCSSGenerator/HEAD/image/premium.png -------------------------------------------------------------------------------- /image/creatures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoshikata/PlurkCSSGenerator/HEAD/image/creatures.png -------------------------------------------------------------------------------- /image/save.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sass/_mediaquery.scss: -------------------------------------------------------------------------------- 1 | @include breakpoint(lg) { 2 | @include headerLG; 3 | @include navLG; 4 | @include sidebarLG; 5 | } 6 | @include breakpoint(sm) { 7 | @include navSM; 8 | @include toolsSM; 9 | @include exportSM; 10 | @include reviewSM; 11 | @include review_dh_SM; 12 | } -------------------------------------------------------------------------------- /image/load.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sass/_default.scss: -------------------------------------------------------------------------------- 1 | body { 2 | height: 100vh; 3 | overflow: hidden; 4 | background-image: linear-gradient(-160deg, #fdfbfb, #ebedee); 5 | color: color(Black); 6 | transition: 0.5s; 7 | &.dark-mode { 8 | color: color(White); 9 | } 10 | } 11 | 12 | .wrapper { 13 | display: flex; 14 | flex-direction: row-reverse; 15 | position: relative; 16 | @include size(100%); 17 | box-sizing: border-box; 18 | } 19 | 20 | //- usability 21 | .no-display { 22 | display: none; 23 | } 24 | -------------------------------------------------------------------------------- /sass/base/_variable.scss: -------------------------------------------------------------------------------- 1 | //- Var 2 | $color: ( 3 | Primary: #1b262c, 4 | Secondary: #0f4c81, 5 | Success: #18b0b0, 6 | Warning: #ffa372, 7 | Danger: #ed6663, 8 | Sun: yellow, 9 | PureBlack: black, 10 | Black: lighten(black, 20), //#333333 11 | BlackGray: lighten(black, 33), //#545454 12 | DarkGray: lighten(black, 45), //#737373 13 | Gray: lighten(black, 58), //#949494 14 | LightGray: lighten(black, 71), //#B5B5B5 15 | WhiteGray: lighten(black, 84), //#D6D6D6 16 | White: lighten(black, 96), //#F5F5F5 17 | PureWhite: white, 18 | ); 19 | 20 | $z-index: ( 21 | header: 100, 22 | ); 23 | 24 | $font-color: color(Black); 25 | $header-height: 45px; 26 | $nav-height-sm: 30px; 27 | 28 | $timeline-cnt-width: 2500px; 29 | 30 | -------------------------------------------------------------------------------- /sass/main.scss: -------------------------------------------------------------------------------- 1 | //- Font import 2 | @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap'); 3 | @import url('https://fonts.googleapis.com/css2?family=Baloo+Da+2:wght@400;600&display=swap'); 4 | @import url('https://fonts.googleapis.com/css2?family=Potta+One&display=swap'); 5 | 6 | @import 'base/mixin'; 7 | @import 'base/variable'; 8 | @import 'base/layout'; 9 | @import 'components/component'; 10 | @import 'components/header'; 11 | @import 'components/tools'; 12 | @import 'components/generator'; 13 | @import 'components/export'; 14 | @import 'partials/review'; 15 | @import 'partials/review_th'; 16 | @import 'partials/review_tc'; 17 | @import 'partials/review_dh'; 18 | @import 'partials/review_fh'; 19 | @import 'default'; 20 | @import 'mediaquery'; -------------------------------------------------------------------------------- /sass/components/_component.scss: -------------------------------------------------------------------------------- 1 | .customization-scroll { 2 | scrollbar-width: thin; 3 | scrollbar-color: color(Secondary) rgba(color(WhiteGray), 0.5); 4 | &::-webkit-scrollbar { 5 | width: 6px; 6 | } 7 | &::-webkit-scrollbar-track { 8 | background-color: rgba(color(WhiteGray), 0.5); 9 | border-radius: 5px; 10 | } 11 | 12 | &::-webkit-scrollbar-thumb { 13 | background-color: color(Secondary); 14 | border-radius: 5px; 15 | } 16 | &::-webkit-scrollbar-thumb:hover { 17 | background-color: lighten(color(Secondary), 10); 18 | } 19 | } 20 | 21 | .cross_btn { 22 | position: relative; 23 | @include size(15px); 24 | &::before, 25 | &::after { 26 | content: ''; 27 | display: block; 28 | position: absolute; 29 | top: 50%; 30 | left: 0; 31 | @include size(100%, 3px); 32 | transform: translateY(-50%) rotate(45deg); 33 | border-radius: 5px; 34 | background-color: currentColor; 35 | } 36 | &::after { 37 | transform: translateY(-50%) rotate(-45deg); 38 | } 39 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tokenColorCustomizations" : { "semanticHighlighting" : true }, 3 | "editor.rulers": [80, 120], // 編輯器參考線 4 | "editor.wordWrap": "on", // 編輯視窗自動換行 5 | "editor.tabSize": 2, // TAB的大小 6 | "editor.minimap.maxColumn": 90, // 迷你地圖的大小 7 | "editor.minimap.renderCharacters": false, // 迷你地圖要不要真實渲染 8 | "editor.fontSize": 13.5, // 字形大小 9 | "editor.fontFamily": "'Fira Code', 'Source Code Pro'", // 字形設定 10 | "editor.fontLigatures": "'ss01', 'ss02', 'ss03', 'ss04', 'ss05'", // Fira Code 的連號符設定 11 | "emmet.triggerExpansionOnTab": true, 12 | "liveServer.settings.port": 8080, // 及時預覽的PORT 13 | "liveSassCompile.settings.generateMap": false, // 要不要轉譯出MAP 14 | // 轉譯SCSS的位置 15 | "liveSassCompile.settings.formats": [ 16 | // This is Default. 17 | { 18 | "format": "expanded", 19 | "extensionName": ".css", 20 | "savePath": "/dist" 21 | }, 22 | // You can add more 23 | { 24 | "format": "compressed", 25 | "extensionName": ".min.css", 26 | "savePath": "/style" 27 | } 28 | ], 29 | // CSS自動前綴 30 | "liveSassCompile.settings.autoprefix": ["> 1%", "last 2 versions"], 31 | // Pug 相關 32 | "livePugCompiler.savePath": "./", // 轉譯PUG的位置 33 | "pugbeautify.fillTab": false, // pug beautify 是否把tab變成space(true為tab) 34 | "pugbeautify.omitDiv": true, // pug beautify 是否自動把有class的div標籤隱藏 35 | "pugbeautify.tabSize": 2, // pug beautify tab的大小 36 | // prettier 的設定 37 | "editor.defaultFormatter": "esbenp.prettier-vscode", // 是否用 prettier 38 | "editor.formatOnSave": false, // 要不要儲存時自動prettier 39 | "prettier.tabWidth": 2, // prettier tab的大小 40 | "prettier.printWidth": 200, // prettier 超過多少字要換行 41 | "prettier.singleQuote": true, // prettier JS是否為單引號 42 | "prettier.semi": true, // prettier 是否加上分號 43 | // "html.format.wrapAttributes": "force-expand-multiline" // html屬性設定換行 44 | } 45 | -------------------------------------------------------------------------------- /sass/base/_layout.scss: -------------------------------------------------------------------------------- 1 | //- Grid 2 | // $gridNumber: 12; 3 | // $gridGutter: 30px; 4 | // .container { 5 | // padding-left: 15px; 6 | // padding-right: 15px; 7 | // box-sizing: border-box; 8 | // } 9 | // .row { 10 | // display: flex; 11 | // flex-wrap: wrap; 12 | // margin-left: -15px; 13 | // margin-right: -15px; 14 | // } 15 | // %col-gutter { 16 | // box-sizing: border-box; 17 | // padding-left: ($gridGutter / 2); 18 | // padding-right: ($gridGutter / 2); 19 | // } 20 | // @for $i from 1 through $gridNumber { 21 | // .col-#{$i} { 22 | // width: (100% * ($i / $gridNumber)); 23 | // @extend %col-gutter; 24 | // } 25 | // } 26 | 27 | // 文字選擇時的樣式 28 | ::selection { 29 | background-color: color(Secondary); 30 | color: color(White); 31 | } 32 | //- Tag 33 | html, 34 | body { 35 | scroll-behavior: smooth; //卷軸平滑捲動 36 | width: 100%; 37 | margin: 0; 38 | padding: 0; 39 | font-family: 'Noto Sans TC', sans-serif; 40 | font-size: 14px; 41 | font-weight: 300; 42 | letter-spacing: 0.1em; 43 | background-color: color(White); 44 | } 45 | h1, 46 | h2, 47 | h3, 48 | h4, 49 | h5, 50 | h6, 51 | p { 52 | margin: 0; 53 | padding: 0; 54 | } 55 | h1 { 56 | font-size: 1.9rem; 57 | font-weight: 900; 58 | } 59 | h2 { 60 | font-size: 1.65rem; 61 | font-weight: 700; 62 | } 63 | h3 { 64 | font-size: 1.5rem; 65 | font-weight: 700; 66 | } 67 | h4 { 68 | font-size: 1.3rem; 69 | font-weight: 500; 70 | } 71 | h5 { 72 | font-size: 1.2rem; 73 | font-weight: 500; 74 | } 75 | h6 { 76 | font-size: 1.1rem; 77 | font-weight: 500; 78 | } 79 | p { 80 | font-size: 1rem; 81 | } 82 | img { 83 | vertical-align: middle; 84 | } 85 | ul, 86 | ol { 87 | margin: 0; 88 | padding: 0; 89 | list-style: none; 90 | } 91 | input, 92 | select, 93 | textarea, 94 | button { 95 | margin: 0; 96 | padding: 0; 97 | outline: none; 98 | } 99 | button { 100 | cursor: pointer; 101 | border: none; 102 | } 103 | -------------------------------------------------------------------------------- /sass/base/_mixin.scss: -------------------------------------------------------------------------------- 1 | // 可以判斷然後看要不要加上vw/vh 2 | @mixin size($w, $h: $w) { 3 | @if ($w == auto or $h == auto) { 4 | width: $w; 5 | height: $h; 6 | } @else if (unit($w) == 'v' and $h == $w) { 7 | width: $w + w; 8 | height: $h + h; 9 | } @else if (unit($w) == 'vw' and $h == $w) { 10 | width: $w; 11 | height: ($h / 1vw) + vh; 12 | } @else if (unit($w) == 'vh' and $h == $w) { 13 | width: ($w / 1vh) + vw; 14 | height: $h; 15 | } @else { 16 | width: $w; 17 | height: $h; 18 | } 19 | } 20 | 21 | // Media 22 | @mixin breakpoint($point) { 23 | @if ($point == sm) { 24 | @media only screen and (max-width: 576px) { 25 | @content; 26 | } 27 | } 28 | @if ($point == md) { 29 | @media only screen and (max-width: 768px) { 30 | @content; 31 | } 32 | } 33 | @if ($point == lg) { 34 | @media only screen and (max-width: 992px) { 35 | @content; 36 | } 37 | } 38 | } 39 | 40 | // 三角形的作法 41 | @mixin triangle($color, $angle: right, $w: 10px, $h: $w * 0.58) { 42 | width: 0; 43 | height: 0; 44 | @if ($angle == right) { 45 | border-top: $h solid transparent; 46 | border-bottom: $h solid transparent; 47 | border-left: $w solid $color; 48 | } @else if ($angle == left) { 49 | border-top: $h solid transparent; 50 | border-bottom: $h solid transparent; 51 | border-right: $w solid $color; 52 | } @else if ($angle == top) { 53 | border-right: $h solid transparent; 54 | border-left: $h solid transparent; 55 | border-bottom: $w solid $color; 56 | } @else if ($angle == bottom) { 57 | border-right: $h solid transparent; 58 | border-left: $h solid transparent; 59 | border-top: $w solid $color; 60 | } 61 | } 62 | 63 | // 拿取顏色群組的方法 64 | @function color($name, $theme: false, $group: $color) { 65 | @if $theme == false { 66 | @return map-get($group, $name); 67 | } @else if $theme != false { 68 | @return map-get(map-get($group, $theme), $name); 69 | } 70 | } 71 | 72 | // 字體 73 | @mixin Noto { 74 | font-family: 'Noto Sans TC', sans-serif; 75 | } 76 | -------------------------------------------------------------------------------- /pug/partial/review_tc.pug: -------------------------------------------------------------------------------- 1 | 2 | //- 控制列 3 | .timeline_control 4 | #timeline_control_holder 5 | 6 | //- 頻道 7 | ul#filter_tab 8 | li 9 | a#favorite_plurks_tab_btn.off_tab.has_unread(title='瀏覽您按過喜歡的訊息') 10 | i.pif-like 11 | | 喜歡的訊息 12 | span#count_favorite_plurks 13 | span.unread_generic 12 14 | li 15 | a#replurked_plurks_tab_btn.off_tab.no_unread(title='瀏覽您轉噗過的訊息') 16 | i.pif-replurk 17 | | 轉噗的訊息 18 | span#count_replurked_plurks 19 | li 20 | a#responded_plurks_tab_btn.off_tab.has_unread(title='瀏覽您回應過的訊息') 21 | i.pif-message 22 | | 回應過的訊息 23 | span#count_responded_plurks 24 | span.unread_generic 6 25 | li 26 | a#private_plurks_tab_btn.off_tab.no_unread(title='瀏覽您的私人訊息') 27 | i.pif-message-private 28 | | 私人訊息 29 | span#count_private_plurks 30 | li 31 | a#own_plurks_tab_btn.off_tab.no_unread(title='瀏覽您發表的訊息') 32 | i.pif-message-my 33 | | 我發表的訊息 34 | span#count_my_plurks 35 | li 36 | a#all_plurks.filter_selected.bottom_line_bg.has_unread(title='瀏覽所有訊息') 37 | i.pif-messages 38 | | 所有訊息 39 | span#count_all_plurk 40 | span.unread_generic 192 41 | 42 | //- 更新 43 | #updater(style="visibility: visible;") 44 | //- 新訊息 45 | #noti_np.item 46 | a 47 | i.pif-message-new 48 | span#noti_np_text 新訊息 49 | span#noti_np_count.unread_generic 15 50 | //- 檢視訊息 51 | #noti_re.item 52 | #noti_re_view.item 53 | a 54 | i.pif-message-new 55 | span#noti_re_text 檢視未讀訊息 56 | span#noti_re_count.unread_generic 80 57 | #noti_re_actions.item(style="display: none;") 58 | a#mark_all_link.updater_link 59 | i.pif-check 60 | span 全部標為已讀 61 | a#view_all_plurk.updater_link 62 | i.pif-cancel 63 | span 顯示所有訊息 64 | //- 查看置頂訊息 65 | #noti_pp.item(style="display:none") 66 | a 67 | i.pif-message-new 68 | span#noti_pp_text 查看置頂訊息 -------------------------------------------------------------------------------- /pug/partial/review_fh.pug: -------------------------------------------------------------------------------- 1 | 2 | //- 噗內回應 3 | #form_holder.plurk_box(style=`left: ${plurk_cut_left}px; top: ${plurk_cut_top}px; width: 450px;`) 4 | //- 最上方資訊列 5 | .response_box(style='max-height: 200px;') 6 | .response_info.clearfix 7 | .favorite_count.button.small-button 1 喜歡 8 | .replurk_count.button.small-button 1 轉噗 9 | .bookmark_info.button.small-button 書籤 10 | .private_info.pif-privacy.button.small-button 所有朋友 11 | .response-status 12 | span.response-count.pif-message 2 則回應 13 | .response-only-owner.button.small-button(style='display: inline-block;') 只顯示原作者的回應 14 | //- 回應內容 15 | .list 16 | .plurk.cboxAnchor.response.highlight_owner 17 | table 18 | tbody 19 | tr 20 | td 21 | .plurk_cnt 22 | table 23 | tbody 24 | tr.tr_cnt 25 | td.td_qual 26 | span 27 | a.name(href='javascript:;') 噗主 28 | span 29 | td.td_cnt 30 | .text_holder 噗主留言 31 | .plurk.cboxAnchor.response 32 | table 33 | tbody 34 | tr 35 | td 36 | .plurk_cnt 37 | table 38 | tbody 39 | tr.tr_cnt 40 | td.td_qual 41 | span 42 | a.name(href='javascript:;') 暱稱 43 | span 44 | td.td_cnt 45 | .text_holder 留言 46 | 47 | //- 有新回應 48 | .new_response_hint(style="display:none; opacity:0;") 有新回應 49 | 50 | //- 打字區 51 | .poster_holder(style='display: block;') 52 | .mini_form 53 | .plurkForm.mini-mode 54 | .input_holder 55 | .qual_holder(style='float: left;') 56 | .dd_img.m_qualifier.q_freestyle 57 | span(style='display: none;') 58 | i.pif-dropdown 59 | .textarea_holder 60 | textarea#input_small.content(style='height: 19px; color: black;') 61 | ul.icons_holder 62 | li.cmp_emoticon_mini_off.pif-emoticon 63 | li.cmp_media_mini_off.pif-media 64 | .plurk_schedule 65 | .plurk_to 66 | .char_updater 按 Enter 送出 -------------------------------------------------------------------------------- /sass/components/_tools.scss: -------------------------------------------------------------------------------- 1 | $tools-bar-width: 75px; 2 | $tools-bar-width-sm: 50px; 3 | $tools-main-width: 320px; 4 | $tools-container-pr: 10px; 5 | $tools-padding-tb: 15px; 6 | 7 | .tools { 8 | flex-shrink: 0; 9 | display: flex; 10 | width: 0; 11 | height: 100%; 12 | padding-top: $header-height; 13 | box-sizing: border-box; 14 | overflow: hidden; 15 | transition: 0.5s; 16 | &-open { 17 | width: $tools-bar-width + $tools-main-width; 18 | } 19 | &_main { 20 | flex-shrink: 0; 21 | position: relative; 22 | @include size($tools-main-width, 100%); 23 | background-color: color(PureWhite); 24 | } 25 | &_container { 26 | position: absolute; 27 | top: 0; 28 | right: 0; 29 | @include size(100%); 30 | padding: $tools-padding-tb 0; 31 | padding-left: 0; 32 | padding-right: $tools-container-pr; 33 | box-sizing: border-box; 34 | transform: translateX(100%); 35 | background-color: color(PureWhite); 36 | transition: 0.5s; 37 | &-open { 38 | transform: translateX(0); 39 | } 40 | } 41 | &_generator { 42 | @include size(100%); 43 | overflow-y: auto; 44 | } 45 | &_bar { 46 | flex-shrink: 0; 47 | position: relative; 48 | @include size($tools-bar-width, 100%); 49 | padding: $tools-padding-tb 0; 50 | box-sizing: border-box; 51 | background-color: lighten(color(Primary), 5); 52 | color: color(White); 53 | } 54 | } 55 | @mixin toolsSM { 56 | .tools { 57 | z-index: 10; 58 | position: absolute; 59 | top: 0; 60 | left: 0; 61 | width: 100%; 62 | padding-top: $header-height + $nav-height-sm; 63 | transform: translateY(-100%); 64 | &-open { 65 | width: 100%; 66 | transform: translateY(0); 67 | } 68 | &_main { 69 | flex-grow: 1; 70 | width: auto; 71 | } 72 | &_bar { 73 | width: $tools-bar-width-sm; 74 | } 75 | } 76 | } 77 | 78 | .menu { 79 | &_list { 80 | display: flex; 81 | flex-direction: column; 82 | height: 100%; 83 | } 84 | &_item { 85 | flex: 1; 86 | display: flex; 87 | justify-content: center; 88 | padding: 0 10px; 89 | cursor: pointer; 90 | writing-mode: vertical-lr; 91 | border-left: 5px solid transparent; 92 | & + & { 93 | margin-top: 10px; 94 | } 95 | &-active, 96 | &:hover { 97 | border-left-color: color(Success); 98 | background-color: color(Primary); 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /sass/partials/_review_tc.scss: -------------------------------------------------------------------------------- 1 | $tc-index: ( 2 | timeline_control: 10, 3 | ); 4 | 5 | //----- 控制列 6 | .review { 7 | .timeline_control { 8 | z-index: map-get($tc-index, timeline_control); 9 | position: absolute; 10 | width: 100%; 11 | height: 25px; 12 | margin-left: 16px; 13 | margin-top: -46px; 14 | pointer-events: none; 15 | } 16 | .timeline_control a { 17 | border-radius: 5px; 18 | padding: 0 8px; 19 | text-decoration: none; 20 | text-align: center; 21 | line-height: 25px; 22 | white-space: nowrap; 23 | } 24 | .timeline_control a i { 25 | opacity: 0.8; 26 | width: 18px; 27 | margin-right: 4px; 28 | } 29 | #timeline_control_holder { 30 | position: absolute; 31 | bottom: 0; 32 | } 33 | 34 | #updater { 35 | position: absolute; 36 | bottom: 0; 37 | left: 100%; 38 | pointer-events: auto; 39 | } 40 | #updater, 41 | #updater .item, 42 | #updater .item a { 43 | white-space: nowrap; 44 | display: inline-block; 45 | height: 25px; 46 | line-height: 25px; 47 | } 48 | #updater .item a { 49 | background: #fff; 50 | margin-left: 8px; 51 | cursor: pointer; 52 | } 53 | #updater .item a:hover { 54 | background: #ff574d; 55 | color: #fff; 56 | } 57 | 58 | #filter_tab { 59 | float: right; 60 | pointer-events: auto; 61 | } 62 | #filter_tab::after { 63 | content: ''; 64 | clear: both; 65 | display: block; 66 | height: 0; 67 | } 68 | #filter_tab li { 69 | list-style: none; 70 | float: right; 71 | clear: both; 72 | width: 100%; 73 | } 74 | #filter_tab a { 75 | display: block; 76 | height: 0; 77 | margin-top: 0; 78 | padding: 0 12px; 79 | overflow: hidden; 80 | cursor: pointer; 81 | opacity: 0.9; 82 | transition: height 200ms ease-in, margin-top 200ms ease-in; 83 | background: #fff; 84 | color: #999; 85 | } 86 | #filter_tab a:hover { 87 | opacity: 1; 88 | } 89 | #filter_tab a.filter_selected { 90 | color: #fff; 91 | background: #ff574d; 92 | } 93 | #filter_tab:hover a, 94 | #filter_tab a.filter_selected, 95 | #filter_tab a.has_unread, 96 | #filter_tab:hover a.filter_selected, 97 | #filter_tab:hover a.has_unread { 98 | height: 25px; 99 | margin-top: 6px; 100 | } 101 | 102 | .unread_generic { 103 | padding: 2px 4px 1px; 104 | margin-left: 5px; 105 | background-color: #f83010; 106 | color: #fff !important; 107 | border-radius: 4px; 108 | font-family: arial, sans-serif; 109 | font-size: 12px; 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /sass/partials/_review.scss: -------------------------------------------------------------------------------- 1 | .review { 2 | flex-grow: 1; 3 | position: relative; 4 | width: 100%; 5 | height: 100vh; 6 | padding-top: $header-height; 7 | box-sizing: border-box; 8 | &_container { 9 | width: 100%; 10 | height: 100%; 11 | overflow-y: auto; 12 | z-index: 0 !important; 13 | position: relative; 14 | top: auto !important; 15 | bottom: auto !important; 16 | width: 100%; 17 | min-height: 100%; 18 | margin: 0 !important; 19 | } 20 | } 21 | @mixin reviewSM { 22 | .review { 23 | padding-top: $header-height + $nav-height-sm; 24 | } 25 | } 26 | 27 | .review { 28 | div, 29 | dl, 30 | dt, 31 | dd, 32 | ul, 33 | ol, 34 | li, 35 | h1, 36 | h2, 37 | h3, 38 | h4, 39 | h5, 40 | h6, 41 | pre, 42 | code, 43 | form, 44 | fieldset, 45 | legend, 46 | input, 47 | textarea, 48 | p, 49 | blockquote, 50 | th, 51 | td { 52 | margin: 0; 53 | padding: 0; 54 | } 55 | h1, 56 | h2, 57 | h3, 58 | h4, 59 | h5, 60 | h6 { 61 | font-size: 100%; 62 | font-weight: normal; 63 | } 64 | h2 { 65 | font-family: Arial, Verdana, sans-serif; 66 | } 67 | p { 68 | margin-bottom: 18px; 69 | } 70 | a { 71 | cursor: pointer; 72 | text-decoration: none; 73 | color: #ff574d; 74 | } 75 | a img { 76 | border: none; 77 | } 78 | table { 79 | border-collapse: collapse; 80 | border-spacing: 0; 81 | } 82 | th { 83 | font-style: normal; 84 | } 85 | 86 | .clearfix { 87 | clear: both; 88 | &::after { 89 | content: ''; 90 | clear: both; 91 | display: block; 92 | width: 0px; 93 | height: 0px; 94 | font-size: 0px; 95 | line-height: 0px; 96 | } 97 | } 98 | [class^='pif-']::before, 99 | [class*=' pif-']::before { 100 | position: relative; 101 | display: inline-block; 102 | top: 1px; 103 | font-family: 'PlurkIconFont' !important; 104 | font-style: normal; 105 | font-weight: normal; 106 | font-variant: normal; 107 | text-transform: none; 108 | line-height: 1; 109 | text-rendering: auto; 110 | -webkit-font-smoothing: antialiased; 111 | -moz-osx-font-smoothing: grayscale; 112 | } 113 | [class^='pif-']::before, 114 | .pif-emoticon::before, 115 | .pif-user-add::before, 116 | .pif-follow_add::before, 117 | .pif-follow::before, 118 | .pif-volume::before, 119 | .pif-media::before { 120 | content: '❅'; 121 | font-size: 18px; 122 | margin-right: 0; 123 | } 124 | 125 | #layout_content { 126 | position: relative; 127 | top: auto !important; 128 | bottom: auto !important; 129 | // padding-top: 42px; 130 | width: 100%; 131 | min-height: 100%; 132 | margin: 0 !important; 133 | overflow-x: hidden; 134 | font-size: 13px; 135 | background-color: #eeebf0; 136 | color: #333; 137 | 138 | // 預覽背景設定 ** 139 | background-position: center center; 140 | background-size: cover; 141 | background-attachment: fixed; 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /index.pug: -------------------------------------------------------------------------------- 1 | 2 | html(lang="zh-Hant-TW") 3 | head 4 | meta(charset="UTF-8") 5 | meta(name="viewport", content="width=device-width, initial-scale=1.0") 6 | title Plurk CSS Generator 7 | link(rel="stylesheet", href="style/main.min.css") 8 | style#reviewStyle 9 | body 10 | include pug/components/inputs.pug 11 | include pug/components/lists.pug 12 | 13 | .wrapper 14 | header.header 15 | .logo 16 | span.logo_main P 17 | span.logo_sub css. 18 | a.logo_cover(href="index.html") 19 | h1.header_title Plurk CSS Generator 20 | spam.header_title-small v.2 21 | nav.nav 22 | ul.plurkbg_list 23 | li.plurkbg_item 24 | label(for="plurkbg_color").plurkbg_label 背景顏色 25 | input#plurkbg_color.no-display(type="color") 26 | .plurkbg_preview.plurkbg_color 27 | li.plurkbg_item 28 | label(for="plurkbg_image").plurkbg_label 背景圖片 29 | input#plurkbg_image.no-display(type="file" accept="image/*") 30 | .plurkbg_preview.plurkbg_image 31 | span.plurkbg_clear.cross_btn 32 | button.nav_btn.plurkbg_button 預覽背景 33 | button.nav_btn.plurkbox_button 隱藏噗內回應 34 | button.nav_btn.reset_button 清空設定 35 | button.nav_btn.export_button 輸出 36 | //- button.nav_btn.tip_button Tip 37 | a.nav_btn.github_button(href="https://github.com/hoshikata" target="_blank") 38 | //- .mode 39 | input#mode_switch.mode_input(type="checkbox") 40 | label.mode_label(for="mode_switch") 41 | .mode_sun 42 | .sidebar.sidebar-active 43 | .tools.tools-open 44 | .tools_main 45 | each list, index in contentList 46 | .tools_container(id=`${areaList[index]}_area`, class=index===0?'tools_container-open':'') 47 | .tools_generator.customization-scroll 48 | +generator(list) 49 | .tools_bar.menu 50 | ul.menu_list 51 | each item, index in menuList 52 | li.menu_item(id=`${areaList[index]}_button`, class=index===0?'menu_item-active':'')=item 53 | #review.review 54 | .review_container.customization-scroll 55 | #layout_content.clearfix 56 | - const plurk_box_width = 450 57 | - const plurk_cut_left = 80 58 | - const plurk_cut_width = 500 59 | - const plurk_cut_top = 50 60 | - const plurk_cut_height = 70 61 | include pug/partial/review_th.pug 62 | include pug/partial/review_tc.pug 63 | include pug/partial/review_dh.pug 64 | include pug/partial/review_fh.pug 65 | .export 66 | .export_control 67 | button.export_btn.create_button 生成 68 | .export_icon 69 | button.export_btn.select_button 全選 70 | .export_icon 71 | button.export_btn.clear_button 清除 72 | .export_icon 73 | button.export_btn.save_button 儲存 74 | .export_icon 75 | label.export_btn.load_button 載入 76 | .export_icon 77 | input.load_input.no-display(type="file", accept=".json") 78 | .export_container 79 | textarea.export_code.customization-scroll(spellcheck="false") 80 | 81 | 82 | script(src="script/script.js") 83 | -------------------------------------------------------------------------------- /sass/components/_export.scss: -------------------------------------------------------------------------------- 1 | .export { 2 | display: flex; 3 | position: fixed; 4 | top: 0; 5 | right: 10%; 6 | @include size(90%, 100%); 7 | max-width: 600px; 8 | max-height: 400px; 9 | padding: 20px; 10 | padding-top: $header-height + 20px; 11 | box-sizing: border-box; 12 | transform: translateY(-100%); 13 | border-radius: 0 0 10px 10px; 14 | background-color: color(PureWhite); 15 | box-shadow: 0 0 6px rgba(color(Black), 0.2); 16 | transition: 0.5s; 17 | &-open { 18 | transform: translateY(0); 19 | } 20 | &_control { 21 | display: flex; 22 | flex-direction: column; 23 | padding: 10px 0; 24 | margin-right: 20px; 25 | } 26 | &_btn { 27 | display: block; 28 | position: relative; 29 | padding: 5px 12px; 30 | padding-left: 25px + 12px; 31 | margin-bottom: 15px; 32 | border-radius: 3px; 33 | @include Noto; 34 | font-weight: 300; 35 | background-color: transparent; 36 | color: color(Black); 37 | box-shadow: 0 0 2px rgba(color(Black), 0.2); 38 | transition: 0.3s; 39 | &::before { 40 | content: ''; 41 | z-index: -1; 42 | position: absolute; 43 | top: 0; 44 | left: 0; 45 | @include size(25px, 100%); 46 | border-radius: 3px 0 0 3px; 47 | background-color: color(Secondary); 48 | transition: 0.3s; 49 | } 50 | &:hover { 51 | color: color(White); 52 | &::before { 53 | width: 100%; 54 | border-radius: 3px; 55 | } 56 | } 57 | } 58 | &_icon { 59 | position: absolute; 60 | top: 50%; 61 | left: 6px; 62 | @include size(13px); 63 | box-sizing: border-box; 64 | transform: translateY(-50%); 65 | color: color(White); 66 | &::before, 67 | &::after { 68 | content: ''; 69 | display: block; 70 | position: absolute; 71 | top: 50%; 72 | left: 50%; 73 | width: 100%; 74 | transform: translate(-50%, -50%); 75 | border-top: 2px solid currentColor; 76 | } 77 | &::after { 78 | transform: translate(-50%, -50%) rotate(90deg); 79 | } 80 | } 81 | &_container { 82 | flex-grow: 1; 83 | height: 100%; 84 | padding: 10px; 85 | box-sizing: border-box; 86 | border-radius: 10px; 87 | border: 1px solid color(LightGray); 88 | } 89 | &_code { 90 | @include size(100%); 91 | resize: none; 92 | border: none; 93 | @include Noto; 94 | font-size: 1rem; 95 | letter-spacing: 0.05em; 96 | background-color: transparent; 97 | color: color(Black); 98 | } 99 | } 100 | 101 | .select_button { 102 | .export_icon { 103 | border: 2px dashed currentColor; 104 | &::before, 105 | &::after { 106 | content: none; 107 | } 108 | } 109 | } 110 | .clear_button { 111 | &::before { 112 | background-color: color(Danger); 113 | } 114 | .export_icon { 115 | transform: translateY(-50%) rotate(45deg); 116 | } 117 | } 118 | .save_button, 119 | .load_button { 120 | margin-top: 50px; 121 | &::before { 122 | background-color: color(LightGray); 123 | } 124 | .export_icon { 125 | left: 3px; 126 | @include size(20px); 127 | box-sizing: content-box; 128 | background-image: url('../image/save.svg'); 129 | background-size: 20px; 130 | background-repeat: no-repeat; 131 | background-position: center center; 132 | &::before, 133 | &::after { 134 | content: none; 135 | } 136 | } 137 | } 138 | .load_button { 139 | margin-top: 0; 140 | .export_icon { 141 | background-image: url('../image/load.svg'); 142 | } 143 | } 144 | 145 | @mixin exportSM { 146 | .export { 147 | flex-direction: column; 148 | right: auto; 149 | left: 0; 150 | width: 100%; 151 | max-height: 80%; 152 | padding-top: $header-height + $nav-height-sm + 10px; 153 | &_control { 154 | display: flex; 155 | flex-direction: row; 156 | flex-wrap: wrap; 157 | margin-right: 0; 158 | } 159 | &_btn { 160 | margin-bottom: 10px; 161 | margin-right: 10px; 162 | } 163 | .save_button { 164 | margin-top: 0; 165 | } 166 | } 167 | } -------------------------------------------------------------------------------- /pug/partial/review_dh.pug: -------------------------------------------------------------------------------- 1 | //- 主控台 2 | #dashboard_holder 3 | #plurk-dashboard.own 4 | 5 | //- 發噗區 6 | .dash-group-form 7 | .dash-segment.dash-segment-post 8 | .segment-content 9 | #plurk_form(style="display: block;") 10 | form#pane_plurk.plurkaction.pane 11 | #main_poster 12 | .plurkForm 13 | .drop_indicator(style="display: none;") 拖放圖片到此上傳 14 | .click.submit_img.submit_img_color Plurk 15 | .input_holder 16 | .qual_holder(style="float: left;") 17 | .dd_img.m_qualifier.q_freestyle 18 | i.pif-dropdown 19 | .textarea_holder 20 | textarea#input_big.content(style="height: 37px; color: black;") 21 | .share_holder 22 | .share_list(style="display: none;") 23 | ul 24 | li.add_photo + 25 | input(style="opacity: 0; visibility: hidden; display: none;") 26 | ul.icons_holder 27 | li.cmp_emoticon_off.pif-emoticon 28 | li.pif-media.cmp_media_off 29 | li.pif-sync.cmp_sync_off 30 | li.pif-anynomous.cmp_anynomous_off 31 | li.pif-privacy.cmp_privacy_off 32 | //- .plurk_schedule 33 | .plurk_to 34 | .char_updater 35 | 36 | //- 個人資訊區 37 | .dash-group-left 38 | .dash-segment.dash-segment-profile 39 | .segment-content 40 | #dash-profile 41 | //- 大頭貼 42 | a(href="javascript:;") 43 | img#profile_pic.profile-pic(src="https://picsum.photos/86/86?random=1") 44 | //- 暱稱 45 | #full_name 46 | span.display_name 使用者名稱 47 | span.nick_name @帳號 48 | //- 年齡性別 49 | .profile-info 50 | span#span_years 年齡, 51 | span#m_or_f 性別 52 | //- 噗幣圖示 53 | .profile-icons 54 | .premium 55 | img#premium-icon(src="image/premium.png") 56 | .segment-content 57 | #dash-additional-info 58 | //- 私噗按鈕 59 | #private_plurk 60 | span#render_private_plurk 61 | a.friend_man.private_plurk.hideBlock 傳送私人訊息 62 | span#render_send_gift 63 | a.friend_man.send_gift.hideBlock 送禮物 64 | //- 自介 65 | p#about_me.aboutme.cboxAnchor 自介 66 | //- 地區 67 | p#location_container 68 | span#location 地區 69 | 70 | //- 卡瑪 71 | .dash-group-right 72 | .dash-segment.dash-segment-stats 73 | .segment-content 74 | #dash-stats 75 | h2 統計 76 | .dash-stats-karma 77 | .karma_hover 78 | | Karma: 79 | span#karma_holder 80 | span#karma_div 81 | span#karma.karma_red.karma_green 88.88 82 | span#karma_arrow.show.pif-arrow-down 83 | .help 84 | a(href="javascript:;") 假期模式已啟用,Karma 值已凍結. 85 | table#dash-stats-table 86 | tbody 87 | tr 88 | th 人氣指數 89 | td#profile_views 100 90 | th 成功募集人數 91 | td 1 92 | tr 93 | th Plurks 94 | td#plurks_count 100 95 | th 回應數 96 | td#response_count 1000 97 | tr 98 | th 註冊日期 99 | td#join_date(title="已經使用噗浪 10 年了。") 2020-4-1 100 | th 上次登入 101 | td#last_visit 2020-4-1 102 | //- 朋友 103 | .dash-segment.dash-segment-friends 104 | .segment-content 105 | #dash-friends 106 | h2 朋友 107 | #friend_managment 108 | span#render_friend 109 | a.friend_man.friend-editor.pif-user-add.add_friend 加為朋友 110 | #dash-friends-pics 111 | .show_all_friends 112 | a(href="javascript:;") 113 | | 所有朋友 ( 114 | span#num_of_friends 10 115 | | ) 116 | .show_mutual_friends 117 | a(href="javascript:;") 118 | | 共同好友 ( 119 | span#num_of_mutual_friends 1 120 | | ) 121 | #friend_holder.friend_holder 122 | ul.clearfix 123 | li 124 | a.user_link.name(href="javascript:;") 125 | img(src="https://picsum.photos/35/35?random=10") 126 | li 127 | a.user_link.name(href="javascript:;") 128 | img(src="https://picsum.photos/35/35?random=11") 129 | //- 粉絲 130 | .dash-segment.friendsList.dash-segment-fans 131 | .segment-content 132 | #dash-fans 133 | h2#h2_fans 粉絲 134 | #fan_managment 135 | span#render_follow 136 | a.friend_man.follow-editor.pif-follow.unfollow 關注中 137 | #dash-fans-pics 138 | .show_all_friends 139 | a(href="javascript:;") 140 | | 所有粉絲 ( 141 | span#num_of_fans 10 142 | | ) 143 | #fan_holder.friend_holder 144 | ul.clearfix 145 | li 146 | a.user_link.name(href="javascript:;") 147 | img(src="https://picsum.photos/35/35?random=12") 148 | li 149 | a.user_link.name(href="javascript:;") 150 | img(src="https://picsum.photos/35/35?random=13") 151 | //- 徽章 152 | .dash-segment.dash-segment-award 153 | .segment-content 154 | #dash-award 155 | .award_bar.clearfix 156 | .cmp_9 157 | a.link_arrow 158 | i.pif-arrow-points 159 | | 如何獲得徽章? -------------------------------------------------------------------------------- /sass/components/_generator.scss: -------------------------------------------------------------------------------- 1 | @mixin generatorStatus($status) { 2 | @at-root .generator_container#{$status} & { 3 | @content; 4 | } 5 | } 6 | @mixin generatorTitle { 7 | color: $font-color; 8 | &::after { 9 | @content; 10 | font-size: 0.7em; 11 | font-weight: 300; 12 | color: color(Gray); 13 | } 14 | } 15 | @mixin rangeThumb { 16 | @include size(15px); 17 | border-radius: 50%; 18 | border: none; 19 | background-color: color(Success); 20 | } 21 | @mixin radioStyle { 22 | color: color(White); 23 | &::before { 24 | height: 100%; 25 | border-radius: 3px; 26 | @content; 27 | } 28 | } 29 | 30 | .generator { 31 | width: 100%; 32 | padding: 0 10px; 33 | padding-left: 35px; 34 | box-sizing: border-box; 35 | &_container { 36 | position: relative; 37 | margin-bottom: 10px; 38 | padding: 5px 10px; 39 | cursor: pointer; 40 | border-radius: 5px; 41 | background-color: rgba(color(Black), 0.08); 42 | &::before { 43 | content: '+'; 44 | display: inline-block; 45 | position: absolute; 46 | top: 0; 47 | left: 0; 48 | width: 20px; 49 | padding-right: 5px; 50 | box-sizing: border-box; 51 | transform: translate(-100%, -2px); 52 | font-size: 1.8rem; 53 | font-weight: 700; 54 | line-height: 37px; 55 | text-align: center; 56 | color: color(Success); 57 | } 58 | &:hover { 59 | background-color: color(Success); 60 | } 61 | &-open { 62 | margin-bottom: 25px; 63 | cursor: auto; 64 | background-color: transparent; 65 | &::before { 66 | content: '-'; 67 | } 68 | &:hover { 69 | background-color: transparent; 70 | } 71 | } 72 | } 73 | &_title { 74 | border-bottom: 2px solid transparent; 75 | @include generatorTitle { 76 | content: attr(data-selector); 77 | display: none; 78 | } 79 | @at-root .generator_container-apply & { 80 | color: color(Success); 81 | } 82 | @at-root .generator_container-open.generator_container-apply & { 83 | color: $font-color; 84 | border-bottom-color: color(Success); 85 | } 86 | @include generatorStatus(':hover') { 87 | color: color(White); 88 | } 89 | @include generatorStatus('-open:hover') { 90 | color: $font-color; 91 | } 92 | @include generatorStatus('-open') { 93 | padding-bottom: 10px; 94 | cursor: pointer; 95 | border-bottom-color: color(WhiteGray); 96 | &::after { 97 | display: block; 98 | } 99 | &:hover { 100 | color: color(Success); 101 | } 102 | } 103 | } 104 | &_body { 105 | display: none; 106 | flex-wrap: wrap; 107 | margin: 0 -10px; 108 | @include generatorStatus('-open') { 109 | display: flex; 110 | } 111 | } 112 | &_box { 113 | width: 220px; 114 | margin-top: 15px; 115 | padding: 0 10px; 116 | box-sizing: border-box; 117 | } 118 | &_subtitle { 119 | @include generatorTitle { 120 | content: attr(data-css); 121 | margin-left: 5px; 122 | } 123 | } 124 | &_group { 125 | display: flex; 126 | align-items: center; 127 | width: 100%; 128 | margin-top: 5px; 129 | } 130 | &_input { 131 | flex: 1 1 auto; 132 | @include size(0, 25px); 133 | padding: 2px 5px; 134 | box-sizing: border-box; 135 | @include Noto; 136 | font-size: 1rem; 137 | font-weight: 300; 138 | letter-spacing: 0.05em; 139 | border-radius: 3px; 140 | border: 1px solid color(Gray); 141 | background-color: transparent; 142 | color: $font-color; 143 | &::placeholder { 144 | opacity: 0.3; 145 | color: $font-color; 146 | } 147 | &:focus { 148 | border-color: $font-color; 149 | } 150 | &-no-empty { 151 | border-color: $font-color; 152 | } 153 | } 154 | &_input-color { 155 | @include size(25px); 156 | margin-left: 5px; 157 | cursor: pointer; 158 | overflow: hidden; 159 | border-radius: 3px; 160 | border: none; 161 | &::-moz-color-swatch, 162 | &::-webkit-color-swatch { 163 | border-radius: 3px; 164 | border: 1px solid rgba(color(Gray), 0.2); 165 | } 166 | &::-webkit-color-swatch-wrapper { 167 | padding: 0; 168 | } 169 | } 170 | &_input-range { 171 | @include size(150px, 5px); 172 | margin-left: 5px; 173 | padding: 0 3px; 174 | box-sizing: border-box; 175 | cursor: pointer; 176 | appearance: none; 177 | border-radius: 5px; 178 | border: none; 179 | background-color: rgba(color(WhiteGray), 0.5); 180 | // 其他瀏覽器的滑桿頭設定 181 | &::-webkit-slider-thumb { 182 | appearance: none; 183 | @include rangeThumb; 184 | } 185 | // 火狐的滑桿頭設定 186 | &::-moz-range-thumb { 187 | @include size(15px); 188 | @include rangeThumb; 189 | } 190 | // 去除 focus 時候的外框虛線 191 | &::-moz-focus-outer { 192 | border: none; 193 | } 194 | } 195 | &_input-checkbox, 196 | &_input-radio { 197 | display: none; 198 | } 199 | &_label-checkbox { 200 | position: relative; 201 | height: 22px; 202 | padding-left: 50px; 203 | cursor: pointer; 204 | line-height: 22px; 205 | &::before { 206 | content: ''; 207 | position: absolute; 208 | display: block; 209 | top: 0; 210 | left: 0; 211 | @include size(40px, 100%); 212 | border-radius: 3px; 213 | background-color: color(WhiteGray); 214 | box-shadow: inset 0 0 2px rgba(color(Primary), 0.3); 215 | transition: 0.3s; 216 | } 217 | &::after { 218 | content: ''; 219 | position: absolute; 220 | display: block; 221 | top: 0; 222 | left: 0; 223 | @include size(18px); 224 | margin-left: 2px; 225 | margin-top: 2px; 226 | box-sizing: border-box; 227 | border-radius: 3px; 228 | background-color: color(White); 229 | transition: all 0.3s, box-shadow 0.1s; 230 | } 231 | &:hover::after { 232 | box-shadow: 0 0 3px 1px rgba(color(Primary), 0.3); 233 | } 234 | .generator_text-yes { 235 | display: none; 236 | } 237 | @at-root .generator_input-checkbox:checked + & { 238 | &::before { 239 | background-color: color(Success); 240 | } 241 | &::after { 242 | margin-left: 20px; 243 | } 244 | .generator_text-yes { 245 | display: inline; 246 | } 247 | .generator_text-no { 248 | display: none; 249 | } 250 | } 251 | } 252 | &_label-radio { 253 | z-index: 0; 254 | position: relative; 255 | padding: 3px 10px; 256 | cursor: pointer; 257 | transition: 0.3s; 258 | & ~ & { 259 | margin-left: 10px; 260 | } 261 | &::before { 262 | content: ''; 263 | z-index: -1; 264 | position: absolute; 265 | bottom: 0; 266 | left: 0; 267 | @include size(100%, 1px); 268 | border-radius: 0; 269 | background-color: color(WhiteGray); 270 | transition: 0.3s; 271 | } 272 | &:hover::before { 273 | background-color: color(Black); 274 | } 275 | @at-root .generator_input-radio:checked + & { 276 | @include radioStyle { 277 | background-color: color(Success); 278 | } 279 | } 280 | @at-root .generator_input-radio:disabled + & { 281 | @include radioStyle { 282 | background-color: color(WhiteGray); 283 | } 284 | } 285 | } 286 | &_text-unit { 287 | flex-grow: 1; 288 | margin: 0 5px; 289 | font-size: 1.05rem; 290 | text-align: right; 291 | } 292 | } 293 | -------------------------------------------------------------------------------- /sass/components/_header.scss: -------------------------------------------------------------------------------- 1 | $mode-label-width: 32px; 2 | $mode-label-height: 16px; 3 | $mode-circle-width: $mode-label-height - 4px; 4 | $sidebar-height: 21px; 5 | 6 | .header { 7 | display: flex; 8 | align-items: center; 9 | z-index: map-get($z-index, header); 10 | position: fixed; 11 | top: 0; 12 | left: 0; 13 | @include size(100%, $header-height); 14 | padding: 0; 15 | padding-left: 40px; 16 | box-sizing: border-box; 17 | background-image: linear-gradient(160deg, rgba(color(Secondary), 0.9), rgba(color(Primary), 0.9) 300%); 18 | color: color(White); 19 | &_title { 20 | flex-grow: 1; 21 | padding-left: 20px; 22 | font-family: 'Baloo Da 2', cursive; 23 | font-size: 1.5rem; 24 | font-weight: 500; 25 | text-transform: uppercase; 26 | letter-spacing: 0; 27 | color: currentColor; 28 | &-small { 29 | padding-left: 5px; 30 | font-size: 0.5em; 31 | font-weight: 300; 32 | } 33 | } 34 | } 35 | @mixin headerLG { 36 | .header { 37 | padding-left: 15px; 38 | &_title { 39 | padding-left: 0; 40 | font-size: 0; 41 | } 42 | } 43 | } 44 | 45 | .logo { 46 | flex-shrink: 0; 47 | position: relative; 48 | @include size(40px); 49 | box-sizing: border-box; 50 | overflow: hidden; 51 | transform: scale(0.8); 52 | border-radius: 5px; 53 | border: 3px solid currentColor; 54 | letter-spacing: 0; 55 | &_main, 56 | &_sub { 57 | position: absolute; 58 | top: -1px; 59 | right: 2px; 60 | font-family: 'Baloo Da 2', cursive; 61 | font-size: 16px; 62 | font-weight: 600; 63 | line-height: 16px; 64 | color: currentColor; 65 | } 66 | &_main { 67 | top: -1px; 68 | left: -1px; 69 | @include size(35px); 70 | transform: rotate(-90deg); 71 | font-size: 35px; 72 | line-height: 35px; 73 | color: currentColor; 74 | } 75 | &_cover { 76 | position: absolute; 77 | top: 0; 78 | left: 0; 79 | @include size(100%); 80 | } 81 | } 82 | 83 | .nav { 84 | display: flex; 85 | position: relative; 86 | height: 100%; 87 | margin-right: 10px; 88 | &_btn { 89 | display: flex; 90 | justify-content: center; 91 | align-items: center; 92 | height: 100%; 93 | margin-right: 5px; 94 | padding: 0 10px; 95 | @include Noto; 96 | font-size: 1.1rem; 97 | font-weight: 400; 98 | background-color: transparent; 99 | color: color(White); 100 | &-active, 101 | &:hover { 102 | &.plurkbg_button, 103 | &.plurkbox_button { 104 | background-color: rgba(color(Warning), 0.5); 105 | } 106 | &.reset_button { 107 | background-color: rgba(color(Danger), 0.5); 108 | } 109 | &.export_button { 110 | background-color: rgba(color(Success), 0.5); 111 | } 112 | &.tip_button, 113 | &.github_button { 114 | background-color: rgba(color(LightGray), 0.5); 115 | } 116 | } 117 | } 118 | } 119 | .load_button { 120 | cursor: pointer; 121 | } 122 | .github_button { 123 | width: 20px; 124 | margin-right: 0; 125 | background: url('../image/github.png') no-repeat center center; 126 | background-size: 20px; 127 | } 128 | .plurkbg { 129 | &_list { 130 | position: absolute; 131 | bottom: 0; 132 | left: 0; 133 | padding: 10px 20px; 134 | visibility: hidden; 135 | transform: translateY(100%); 136 | border-radius: 0 0 5px 5px; 137 | background-color: rgba(color(PureWhite), 1); 138 | color: color(Black); 139 | box-shadow: 3px 3px 6px rgba(color(Black), 0.2); 140 | @at-root .plurkbg-open & { 141 | visibility: visible; 142 | } 143 | } 144 | &_item { 145 | font-size: 1.1rem; 146 | font-weight: 500; 147 | text-align: left; 148 | white-space: nowrap; 149 | &:hover { 150 | opacity: 0.8; 151 | } 152 | & + & { 153 | margin-top: 10px; 154 | } 155 | } 156 | &_label { 157 | cursor: pointer; 158 | display: inline-flex; 159 | align-items: center; 160 | } 161 | &_preview { 162 | display: inline-block; 163 | @include size(20px); 164 | margin-left: 5px; 165 | border-radius: 3px; 166 | background: color(Black); 167 | } 168 | &_image { 169 | @include size(60px, 40px); 170 | background-position: center center; 171 | background-size: cover; 172 | } 173 | &_clear { 174 | display: inline-block; 175 | cursor: pointer; 176 | margin-left: 5px; 177 | color: color(Gray); 178 | &:hover { 179 | color: color(BlackGray); 180 | } 181 | } 182 | } 183 | @mixin navLG { 184 | .nav { 185 | &_btn { 186 | margin-right: 0; 187 | } 188 | } 189 | } 190 | @mixin navSM { 191 | .nav { 192 | position: absolute; 193 | justify-content: space-evenly; 194 | bottom: 0; 195 | left: 0; 196 | width: 100%; 197 | height: 30px; 198 | margin-right: 0; 199 | transform: translateY(100%); 200 | font-size: 1rem; 201 | background-image: linear-gradient(160deg, rgba(color(Secondary), 0.9), rgba(color(Primary), 0.9) 300%); 202 | &_btn { 203 | flex-grow: 1; 204 | padding: 0; 205 | } 206 | } 207 | .github_button { 208 | display: none; 209 | } 210 | } 211 | 212 | .sidebar { 213 | @include size(25px, $sidebar-height); 214 | align-self: flex-start; 215 | margin-left: 20px; 216 | padding: ($header-height - $sidebar-height) / 2 15px; 217 | cursor: pointer; 218 | color: color(White); 219 | &::before { 220 | content: ''; 221 | display: block; 222 | @include size(100%, 3px); 223 | transform: translateY(1px); 224 | border-radius: 5px; 225 | background-color: currentColor; 226 | box-shadow: 0 8px 0 currentColor, 0 16px 0 currentColor; 227 | } 228 | &-active, 229 | &:hover { 230 | background-color: rgba(color(Primary), 0.5); 231 | } 232 | } 233 | @mixin sidebarLG { 234 | .sidebar { 235 | margin-left: 0; 236 | } 237 | } 238 | 239 | // .mode { 240 | // position: relative; 241 | // &_input { 242 | // display: none; 243 | // } 244 | // &_label { 245 | // display: block; 246 | // z-index: 1; 247 | // position: relative; 248 | // @include size($mode-label-width, $mode-label-height); 249 | // margin: 0 20px; 250 | // cursor: pointer; 251 | // border-radius: 10px; 252 | // background-color: color(White); 253 | // transition: 0.5s; 254 | // &::after { 255 | // content: ''; 256 | // z-index: 2; 257 | // position: absolute; 258 | // top: 50%; 259 | // left: $mode-label-width - $mode-circle-width - 2px; 260 | // @include size($mode-circle-width); 261 | // transform: translateY(-50%); 262 | // border-radius: 50%; 263 | // background-color: color(Primary); 264 | // transition: all 0.5s, background-color 0s; 265 | // @at-root .mode_input:checked + & { 266 | // left: 2px; 267 | // } 268 | // } 269 | // &:hover::after { 270 | // background-color: color(Warning); 271 | // @at-root .mode_input:checked + & { 272 | // background-color: color(Warning); 273 | // } 274 | // } 275 | // } 276 | // &_sun { 277 | // z-index: 0; 278 | // position: absolute; 279 | // top: 50%; 280 | // left: 100%; 281 | // @include size(16px); 282 | // transform: translate(-80%, -50%); 283 | // border-radius: 50%; 284 | // background-color: currentColor; 285 | // box-shadow: 0 0 6px currentColor; 286 | // color: color(Sun); 287 | // transition: 0.5s; 288 | // @at-root .mode_input:checked ~ & { 289 | // left: 0; 290 | // transform: translate(-20%, -50%); 291 | // background-color: transparent; 292 | // box-shadow: inset 4px -4px 0 currentColor; 293 | // color: color(White); 294 | // } 295 | // } 296 | // } 297 | -------------------------------------------------------------------------------- /pug/components/inputs.pug: -------------------------------------------------------------------------------- 1 | //- 基本 input 種類 2 | mixin title(type, title, css) 3 | .generator_box(data-type=type, data-apply="false") 4 | h6.generator_subtitle(data-css=css)=title 5 | block 6 | 7 | mixin group 8 | .generator_group 9 | block 10 | 11 | mixin colorInput(name, type, ph) 12 | - const cla = `${name}_${type}` 13 | - const attr = {} 14 | - attr['data-need'] = 'true' 15 | - if (ph) attr['placeholder'] = ph 16 | +group 17 | input.generator_input.color_box(type="text", class=cla, name=cla)&attributes(attr) 18 | input.generator_input-color.color_box(type="color") 19 | 20 | mixin rangeInput(name, type, value, need, ph) 21 | - const cla = `${name}_${type}` 22 | - const attr = {} 23 | - if (need) attr['data-need'] = 'true' 24 | - if (ph) attr['placeholder'] = ph 25 | +group 26 | input.generator_input.range_box(type="text", class=cla, name=cla)&attributes(attr) 27 | input.generator_input-range.range_box(type="range", min=value[0], max=value[1], step=value[2], value="0") 28 | 29 | mixin checkInput(name, type, change) 30 | - const cla = `${name}_${type}` 31 | - const attr = {} 32 | - if (change) attr['data-change'] = 'true' 33 | +group 34 | input.generator_input-checkbox(type="checkbox", id=cla, name=cla)&attributes(attr) 35 | label.generator_label-checkbox(for=cla) 36 | span.generator_text-no NO 37 | span.generator_text-yes YES 38 | 39 | mixin radioInput(name, type, value, text, change) 40 | - const cla = `${name}_${type}` 41 | +group 42 | if (type === 'bdrs') 43 | span.generator_text-unit 單位 44 | - for (let i = 0; i < value.length; i++) 45 | - const attr = {} 46 | - if (change) attr['data-change'] = 'true' 47 | - if (i === 0) attr['checked'] = 'checked' 48 | input.generator_input-radio(type="radio", id=`${cla}_${i+1}`, class=cla, name=cla, value=value[i])&attributes(attr) 49 | label.generator_label-radio(for=`${cla}_${i+1}`)=text[i].toUpperCase() 50 | 51 | mixin textInput(name, type, ph) 52 | - const cla = `${name}_${type}` 53 | - const attr = {} 54 | - attr['data-need'] = 'true' 55 | - if (ph) attr['placeholder'] = ph 56 | +group 57 | input.generator_input(type="text", class=cla, name=cla)&attributes(attr) 58 | 59 | //- 通用 css type input 60 | mixin typeBgc(name) 61 | - const type = 'bgc' 62 | +title(type, '背景顏色', 'background-color') 63 | +colorInput(name, type, '顏色') 64 | +rangeInput(name, type, [0, 1, 0.1], false, '透明') 65 | 66 | mixin typeColor(name) 67 | - const type = 'c' 68 | +title(type, '文字顏色', 'color') 69 | +colorInput(name, type, '顏色') 70 | +rangeInput(name, type, [0, 1, 0.1], false, '透明') 71 | 72 | mixin typeFz(name) 73 | - const type = 'fz' 74 | +title(type, '文字大小', 'font-size') 75 | +rangeInput(name, type, [10, 30, 1], true) 76 | 77 | mixin typeOpacity(name) 78 | - const type = 'opa' 79 | +title(type, '透明度', 'opacity') 80 | +rangeInput(name, type, [0, 1, 0.1], true) 81 | 82 | mixin typeBdrs(name) 83 | - const type = 'bdrs' 84 | +title(type, '圓角', 'border-radius') 85 | +rangeInput(name, type, [0, 50, 1], true, '左上') 86 | +rangeInput(name, type, [0, 50, 1], true, '右上') 87 | +rangeInput(name, type, [0, 50, 1], true, '右下') 88 | +rangeInput(name, type, [0, 50, 1], true, '左下') 89 | +radioInput(name, type, ['px', '%'], ['px', '%']) 90 | 91 | mixin typeBorder(name) 92 | - const type = 'bd' 93 | +title(type, '邊框', 'border') 94 | +colorInput(name, type, '顏色') 95 | +rangeInput(name, type, [0, 1, 0.1], false, '透明') 96 | +rangeInput(name, type, [0, 5, 1], true, '粗細') 97 | 98 | mixin typeShadow(name) 99 | - const type = 'sha' 100 | +title(type, '陰影', 'box-shadow') 101 | +colorInput(name, type, '顏色') 102 | +rangeInput(name, type, [0, 1, 0.1], false, '透明') 103 | +rangeInput(name, type, [-10, 10, 1], true, '水平') 104 | +rangeInput(name, type, [-10, 10, 1], true, '垂直') 105 | +rangeInput(name, type, [0, 20, 1], true, '模糊') 106 | 107 | mixin typeDisplay(name) 108 | - const type = 'dp' 109 | +title(type, '隱藏區塊', 'display') 110 | +checkInput(name, type, true) 111 | 112 | mixin typeTransition(name) 113 | - const type = 'transi' 114 | +title(type, '變化時間', 'transition') 115 | +rangeInput(name, type, [0, 1, 0.1], true, '秒') 116 | 117 | //- 特殊 css type input 118 | mixin typeBlur(name) 119 | - const type = 'blur' 120 | +title(type, '模糊化', 'filter') 121 | +rangeInput(name, type, [0, 5, 1], true) 122 | 123 | mixin typePosition(name) 124 | - const type = 'posi' 125 | +title(type, '位置', 'top, left') 126 | +rangeInput(name, type, [-300, 1000, 1], true, '上方') 127 | +rangeInput(name, type, [-1000, 200, 1], true, '左方') 128 | 129 | mixin typeSize(name) 130 | - const type = 'size' 131 | +title(type, '大小', 'width, height') 132 | +textInput(name, type, '寬度') 133 | +textInput(name, type, '高度') 134 | 135 | mixin typeImage(name, type) 136 | //- dcbgi, pcoinbgi, tlbgi, browsealbgi, browsearbgi 137 | +title(type, '背景圖', 'background-image') 138 | +textInput(name, type, '圖片網址') 139 | 140 | mixin typeImgRepeat(name) 141 | - const type = 'tlbgirep' 142 | +title(type, '不要重複', 'background-repeat') 143 | +checkInput(name, type, true) 144 | 145 | mixin typeImgPosition(name) 146 | - const type = 'tlbgiposi' 147 | +title(type, '位置', 'background-position') 148 | +rangeInput(name, type, [0, 100, 1], true, '下方') 149 | +rangeInput(name, type, [0, 100, 1], true, '左方') 150 | 151 | mixin typeCursor(name) 152 | - const type = 'cursor' 153 | +title(type, '游標圖', 'cursor') 154 | +textInput(name, type, '圖片網址') 155 | 156 | mixin typeUp(name, type) 157 | //- up, boxup 158 | +title(type, '上移', '') 159 | +checkInput(name, type, true) 160 | 161 | mixin typeOpen(name) 162 | - const type = 'open' 163 | +title(type, '頻道展開', '') 164 | +radioInput(name, type, ['no', 'top', 'right'], ['不展開', '向上', '向右'], true) 165 | 166 | mixin typeFTPosi(name) 167 | - const type = 'ftposi' 168 | +title(type, '頻道位置', '') 169 | +radioInput(name, type, ['no', 'right'], ['原處', '往右放'], true) 170 | 171 | mixin typeToIcon(name) 172 | - const type = 'toicon' 173 | +title(type, '圖示化', '') 174 | +checkInput(name, type, true) 175 | 176 | mixin typeCountPosi(name) 177 | - const type = 'countposi' 178 | +title(type, '圖示化的未讀位置', '') 179 | +radioInput(name, type, ['right', 'left', 'top'], ['右邊', '左邊', '上面']) 180 | 181 | //- 182 | //- 按照 list 產出 input 183 | mixin createInputFromList(list, name) 184 | each cssType in list 185 | - const imageTypeList = ['dcbgi', 'pcoinbgi', 'tlbgi', 'browsealbgi', 'browsearbgi', 'browsettbgi', 'loadingbgi'] 186 | - const typeIsImage = imageTypeList.includes(cssType) 187 | - const typeIsUp = cssType === 'up'|| cssType === 'boxup' 188 | if (cssType === 'bgc') 189 | +typeBgc(name) 190 | if (cssType === 'c') 191 | +typeColor(name) 192 | if (cssType === 'fz') 193 | +typeFz(name) 194 | if (cssType === 'opa') 195 | +typeOpacity(name) 196 | if (cssType === 'bdrs') 197 | +typeBdrs(name) 198 | if (cssType === 'bd') 199 | +typeBorder(name) 200 | if (cssType === 'sha') 201 | +typeShadow(name) 202 | if (cssType === 'dp') 203 | +typeDisplay(name) 204 | if (cssType === 'transi') 205 | +typeTransition(name) 206 | if (cssType === 'blur') 207 | +typeBlur(name) 208 | if (cssType === 'posi') 209 | +typePosition(name) 210 | if (cssType === 'size') 211 | +typeSize(name) 212 | if (typeIsImage) 213 | +typeImage(name, cssType) 214 | if (cssType === 'tlbgirep') 215 | +typeImgRepeat(name) 216 | if (cssType === 'tlbgiposi') 217 | +typeImgPosition(name) 218 | if (cssType === 'cursor') 219 | +typeCursor(name) 220 | if (typeIsUp) 221 | +typeUp(name, cssType) 222 | if (cssType === 'open') 223 | +typeOpen(name) 224 | if (cssType === 'ftposi') 225 | +typeFTPosi(name) 226 | if (cssType === 'toicon') 227 | +typeToIcon(name) 228 | if (cssType === 'countposi') 229 | +typeCountPosi(name) 230 | 231 | //- 包裝 232 | mixin generator(list) 233 | .generator 234 | each item, index in list 235 | - const { name, title, subtitle, csstype: list, hover } = item 236 | - if (hover) list.push('transi') 237 | .generator_container(id=name) 238 | h5.generator_title(data-selector=subtitle)=title 239 | .generator_body 240 | +createInputFromList(list, name) 241 | if (hover) 242 | - const hasDp = list.indexOf('dp') 243 | - if (hasDp !== -1) list.splice(hasDp, 1) 244 | - const hasTransi = list.indexOf('transi') 245 | - if (hasTransi !== -1) list.splice(hasTransi, 1) 246 | .generator_container(id=`${name}_hover`) 247 | h5.generator_title(data-selector=`${subtitle}:hover`)=`${title}:滑鼠移至` 248 | .generator_body 249 | +createInputFromList(list, `${name}_hover`) -------------------------------------------------------------------------------- /sass/partials/_review_fh.scss: -------------------------------------------------------------------------------- 1 | $fh-index: ( 2 | plurk_box: 50, 3 | ); 4 | 5 | //----- 噗內回應 6 | .review { 7 | #form_holder { 8 | background: #fff; 9 | box-shadow: 1px 1px 3px -3px #000; 10 | } 11 | .plurk_box { 12 | z-index: map-get($fh-index, plurk_box); 13 | position: absolute; 14 | } 15 | .plurkForm::after, 16 | .input_holder::after, 17 | .share_list::after, 18 | .icons_holder::after { 19 | content: ''; 20 | clear: both; 21 | height: 0; 22 | display: block; 23 | } 24 | 25 | // 迷你發噗區 26 | .plurk_box .mini_form { 27 | padding: 4px 3px 2px; 28 | font-weight: normal; 29 | border-top: #eee 1px solid; 30 | background-color: #fff; 31 | } 32 | .plurkForm { 33 | position: relative; 34 | padding: 3px 3px 0; 35 | } 36 | .plurkForm.mini-mode .input_holder, 37 | .mini_form .input_holder { 38 | border-radius: 6px; 39 | } 40 | .input_holder { 41 | float: none; 42 | width: auto; 43 | overflow: hidden; 44 | border: #eee 1px solid; 45 | border-color: rgba(0, 0, 0, 0.1); 46 | border-radius: 8px; 47 | background: #fff; 48 | } 49 | .qual_holder { 50 | position: relative !important; 51 | padding: 3px; 52 | font-size: 24px; 53 | } 54 | .plurkForm.mini-mode .qual_holder, 55 | .mini_form .qual_holder { 56 | padding: 1px 1px 0; 57 | font-size: 12px; 58 | } 59 | #form_holder .qual_holder { 60 | color: black; 61 | } 62 | .m_qualifier { 63 | position: relative; 64 | padding: 3px 6px 4px; 65 | line-height: 100%; 66 | border-radius: 5px; 67 | background-color: #ccc; 68 | color: #fff; 69 | } 70 | .dd_img { 71 | cursor: pointer; 72 | } 73 | .plurkForm.mini-mode .m_qualifier, 74 | .mini_form .m_qualifier { 75 | padding: 3px 6px 2px; 76 | } 77 | 78 | .pif-dropdown::before { 79 | content: '▼'; 80 | } 81 | .m_qualifier i::before { 82 | top: 0; 83 | font-size: 16px; 84 | line-height: 16px; 85 | } 86 | .mini_form .m_qualifier i::before { 87 | top: 1px; 88 | font-size: 12px; 89 | line-height: 10px; 90 | } 91 | .textarea_holder { 92 | float: none; 93 | width: auto; 94 | overflow: hidden; 95 | } 96 | .textarea_holder textarea { 97 | display: block; 98 | clear: none; 99 | width: 100%; 100 | height: 37px; 101 | margin: 0 !important; 102 | padding: 0 0 0 2px !important; 103 | outline: none; 104 | resize: none; 105 | font-family: inherit; 106 | font-size: 25px; 107 | line-height: 37px; 108 | border: 0; 109 | border-radius: 7px; 110 | background: #fff; 111 | box-shadow: none; 112 | } 113 | .plurkForm.mini-mode .textarea_holder textarea, 114 | .mini_form .textarea_holder textarea { 115 | height: 19px; 116 | font-size: 12px; 117 | line-height: 19px; 118 | border-radius: 4px; 119 | } 120 | .icons_holder { 121 | float: left; 122 | margin: 4px 0 4px; 123 | overflow: hidden; 124 | font-size: 12px; 125 | } 126 | .plurkForm.mini-mode .icons_holder, 127 | .mini_form .icons_holder { 128 | margin: 1px 0 3px; 129 | } 130 | .icons_holder li { 131 | position: relative; 132 | float: left; 133 | width: 32px; 134 | margin: 4px 6px 0 0; 135 | cursor: pointer; 136 | font-size: 26px; 137 | line-height: 32px; 138 | text-align: center; 139 | } 140 | .plurkForm.mini-mode .icons_holder li, 141 | .mini_form .icons_holder li { 142 | width: 26px; 143 | margin: 1px 1px 0 0; 144 | font-size: 16px; 145 | line-height: 24px; 146 | } 147 | .plurkForm.mini-mode .icons_holder .pif-emoticon, 148 | .mini_form .icons_holder .pif-emoticon { 149 | &::after { 150 | width: 12px; 151 | height: 12px; 152 | border-radius: 6px; 153 | background: #333; 154 | margin: -19px 0 0 7px; 155 | } 156 | } 157 | .icons_holder .pif-emoticon { 158 | color: #fcd254; 159 | } 160 | .icons_holder .pif-media { 161 | color: #8bcfd6; 162 | } 163 | .plurkForm.mini-mode .icons_holder, 164 | .mini_form .icons_holder { 165 | .pif-emoticon, 166 | .pif-media { 167 | &::before { 168 | font-size: 20px; 169 | } 170 | } 171 | } 172 | .plurk_to, 173 | .plurkForm .whispers_hint, 174 | .priv, 175 | .plurk_schedule { 176 | float: right; 177 | margin-top: 6px; 178 | opacity: 0.6; 179 | font-size: 13px; 180 | line-height: 17px; 181 | text-align: right; 182 | } 183 | .char_updater { 184 | clear: both; 185 | display: block; 186 | opacity: 0.75; 187 | font-size: 12px; 188 | line-height: 18px; 189 | } 190 | .plurkForm.mini-mode .char_updater, 191 | .mini_form .char_updater { 192 | clear: none; 193 | float: right; 194 | margin: 4px 5px 0; 195 | color: #999; 196 | } 197 | 198 | // 回應區 199 | .response_box { 200 | position: relative; 201 | min-height: 260px; 202 | overflow: auto; 203 | overflow-x: hidden; 204 | border-top: #eee 1px solid; 205 | background: #fff; 206 | } 207 | 208 | // 回應區上方的資訊列 209 | .button, 210 | .orange-but { 211 | display: inline-block; 212 | width: auto; 213 | padding: 9px 13px; 214 | cursor: pointer; 215 | outline: none; 216 | font-size: 13px; 217 | font-weight: bold; 218 | line-height: 1; 219 | vertical-align: middle; 220 | border: 0; 221 | border-radius: 999px; 222 | background: #ff574d; 223 | color: #fff; 224 | box-shadow: none; 225 | } 226 | .button.small-button { 227 | font-size: 12px; 228 | padding: 6px 10px; 229 | } 230 | .favorite_count, 231 | .replurk_count, 232 | .bookmark_info, 233 | .private_info { 234 | margin: 9px 0 4px 10px; 235 | color: #fff; 236 | float: left; 237 | } 238 | .favorite_count { 239 | background: #54a4be; 240 | } 241 | .favorite_count:hover { 242 | background: #4494ae; 243 | } 244 | .replurk_count { 245 | background: #56b892; 246 | } 247 | .replurk_count:hover { 248 | background: #46a882; 249 | } 250 | .bookmark_info { 251 | background: #5abac5; 252 | } 253 | .bookmark_info:hover { 254 | background: #4a9aa5; 255 | } 256 | .private_info { 257 | background: #f4ca35; 258 | } 259 | .private_info:hover { 260 | background: #e4ba25; 261 | } 262 | .response-status { 263 | clear: both; 264 | margin-top: 5px; 265 | padding: 4px 0; 266 | font-size: 12px; 267 | } 268 | .response-status .response-count { 269 | height: 24px; 270 | padding: 5px 0 0 10px; 271 | font-weight: normal; 272 | line-height: 24px; 273 | background-color: transparent; 274 | color: #afb8cc; 275 | } 276 | .response-status .response-only-owner { 277 | margin-left: 10px; 278 | opacity: 0; 279 | transform: scale(0.9); 280 | font-weight: normal; 281 | vertical-align: top; 282 | background: #f5f5f9; 283 | color: #afb8cc; 284 | } 285 | .response-status:hover .response-only-owner { 286 | opacity: 1; 287 | } 288 | .response-status .response-only-owner:hover { 289 | background: #afb8cc; 290 | color: #fff; 291 | } 292 | 293 | // 回應區留言 294 | .language-large-font .list { 295 | font-size: 0.93em; 296 | } 297 | .plurk_box .list { 298 | clear: both; 299 | position: relative; 300 | height: auto !important; 301 | padding: 5px 5px; 302 | } 303 | .list .plurk { 304 | position: relative; 305 | margin: 3px 0; 306 | } 307 | .plurk { 308 | white-space: nowrap; 309 | color: #111; 310 | } 311 | .plurk_box table { 312 | width: 100%; 313 | } 314 | .plurk td { 315 | vertical-align: top; 316 | white-space: nowrap !important; 317 | } 318 | .plurk_cnt { 319 | position: relative; 320 | padding: 2px 0 0; 321 | // transition: background-color 5s; 322 | font-weight: normal; 323 | line-height: 1.3; 324 | background-color: #fff; 325 | color: #111; 326 | box-shadow: 1px 1px 3px -3px #000; 327 | } 328 | .list .plurk_cnt { 329 | padding-bottom: 0px; 330 | transition: background-color 0s; 331 | border: none; 332 | box-shadow: none; 333 | } 334 | .list .td_qual { 335 | width: 0%; 336 | } 337 | .plurk td { 338 | vertical-align: top; 339 | white-space: nowrap !important; 340 | } 341 | .td_qual { 342 | width: 0%; 343 | padding: 2px 0 2px 5px; 344 | } 345 | .name { 346 | font-weight: bold; 347 | text-decoration: none; 348 | } 349 | .td_cnt { 350 | width: 100%; 351 | padding: 2px 5px 5px 0; 352 | } 353 | .list .td_cnt { 354 | width: 100%; 355 | } 356 | .text_holder { 357 | position: relative; 358 | min-width: 48px; 359 | white-space: normal !important; 360 | background: none; 361 | } 362 | .list .text_holder { 363 | width: 100% !important; 364 | margin-left: 5px; 365 | margin-right: 5px; 366 | white-space: normal !important; 367 | word-break: break-word !important; 368 | } 369 | } 370 | -------------------------------------------------------------------------------- /sass/partials/_review_th.scss: -------------------------------------------------------------------------------- 1 | $th-index: ( 2 | timeline-cnt: 2, 3 | timeline-bg: 1, 4 | timeline-timeshow: 1, 5 | time_show: 1, 6 | dynamic_logo: 1, 7 | bottom-line: -100, 8 | ); 9 | 10 | //----- 河道 11 | .review { 12 | #timeline_holder { 13 | background: none; 14 | } 15 | .timeline-holder { 16 | padding: 0 !important; 17 | overflow: visible; 18 | height: 386px; 19 | position: relative; 20 | width: 100%; 21 | cursor: move; 22 | } 23 | .timeline-cnt, 24 | .timeline-bg, 25 | .timeline-cnt .block_cnt, 26 | .timeline-bg .block_bg { 27 | position: absolute; 28 | height: 100% !important; 29 | width: 100%; 30 | left: 0; 31 | top: 0; 32 | overflow: visible !important; 33 | } 34 | // 讓預覽河道可以滑動 ** 35 | .timeline-cnt .block_cnt { 36 | overflow-x: scroll !important; 37 | scrollbar-width: none; 38 | &::-webkit-scrollbar { 39 | width: 0; 40 | } 41 | &::after { 42 | content: ''; 43 | display: block; 44 | @include size($timeline-cnt-width, 1px); 45 | } 46 | } 47 | 48 | // 河道噗 49 | .timeline-cnt { 50 | z-index: map-get($th-index, timeline-cnt); 51 | } 52 | .timeline-cnt .display { 53 | width: 380px; 54 | } 55 | .timeline-cnt .plurk { 56 | position: absolute; 57 | cursor: pointer; 58 | } 59 | .plurk { 60 | color: #111; 61 | white-space: nowrap; 62 | } 63 | .plurk td { 64 | vertical-align: top; 65 | white-space: nowrap !important; 66 | } 67 | // 頭像 68 | .td_img { 69 | width: 20px; 70 | } 71 | .p_img, 72 | .p_img img { 73 | width: 20px; 74 | height: 20px; 75 | } 76 | // 回應數 77 | .td_response_count { 78 | width: 15px; 79 | height: 30px !important; 80 | } 81 | .new .response_count { 82 | background: #fb0047; 83 | color: #fff; 84 | } 85 | .response_count { 86 | padding: 1px 4px; 87 | font-weight: bold; 88 | background-color: rgba(0, 0, 0, 0.1); 89 | color: #fff; 90 | } 91 | // 噗文內容 92 | .plurk_cnt { 93 | position: relative; 94 | padding: 2px 0 0; 95 | // transition: background-color 5s; 96 | font-weight: normal; 97 | line-height: 1.3; 98 | box-shadow: 1px 1px 3px -3px #000; 99 | background-color: #fff; 100 | color: #111; 101 | } 102 | .plurk_cnt.new6 { 103 | transition: background-color 0s; 104 | background-color: #ffff99; 105 | } 106 | .plurk_cnt.new5 { 107 | background-color: #ffffaa; 108 | } 109 | .plurk_cnt.new4 { 110 | background-color: #ffffbb; 111 | } 112 | .plurk_cnt.new3 { 113 | background-color: #ffffcc; 114 | } 115 | .plurk_cnt.new2 { 116 | background-color: #ffffdd; 117 | } 118 | .plurk_cnt.new1 { 119 | background-color: #ffffee; 120 | } 121 | .timeline-cnt .display table { 122 | width: 100%; 123 | } 124 | // 發噗時間 125 | .timeline-cnt .plurk .time { 126 | position: absolute; 127 | bottom: 7px; 128 | left: 9px; 129 | transform: scale(0.95); 130 | transform-origin: left; 131 | font-size: 12px; 132 | } 133 | .timeline-cnt .plurk .time a { 134 | color: #afb8cc; 135 | } 136 | // 暱稱 137 | .td_qual { 138 | width: 0%; 139 | padding: 2px 5px 2px 5px; 140 | } 141 | .name { 142 | color: #111; 143 | font-weight: bold; 144 | text-decoration: none; 145 | } 146 | .name:hover { 147 | text-decoration: underline; 148 | } 149 | .q_replurks { 150 | background: #3b8610; 151 | } 152 | .qualifier { 153 | padding: 0 3px 0 3px; 154 | color: #fff; 155 | margin: 0 3px 0 4px; 156 | border-radius: 3px; 157 | } 158 | .q_replurks i { 159 | font-size: 12px; 160 | margin-left: 2px; 161 | } 162 | .porn-icon { 163 | display: inline-block; 164 | margin: 0 4px 0 1px; 165 | } 166 | .porn-icon::before { 167 | content: ''; 168 | position: relative; 169 | top: 6px; 170 | left: 0; 171 | @include size(20px); 172 | margin-top: -6px; 173 | line-height: 0; 174 | border-radius: 50%; 175 | background-color: #ff3600; 176 | } 177 | .porn-icon::after { 178 | content: 'R18'; 179 | position: relative; 180 | top: -1px; 181 | left: -18px; 182 | font-size: 9px; 183 | letter-spacing: 0; 184 | color: #fff; 185 | } 186 | // 噗文 187 | .td_cnt { 188 | width: 100%; 189 | padding: 2px 5px 5px 0; 190 | } 191 | .text_holder { 192 | position: relative; 193 | min-width: 48px; 194 | white-space: normal !important; 195 | background: none; 196 | } 197 | .timeline-cnt .plurk .text_holder { 198 | width: 180px; 199 | height: auto; 200 | min-height: 1.3em; 201 | white-space: normal; 202 | overflow: hidden !important; 203 | } 204 | .timeline-cnt .display .text_holder { 205 | width: 100%; 206 | max-width: 80vw; 207 | min-width: 180px; 208 | height: auto !important; 209 | min-height: 2em; 210 | max-height: none !important; 211 | white-space: normal; 212 | } 213 | #timeline_holder .plurk .text_holder { 214 | max-height: 37.210875px; 215 | } 216 | // Hashtag 217 | .plurk_content a.hashtag, 218 | .plurk .text_holder a.hashtag { 219 | margin: 0 0.1em; 220 | font-size: 0.9em; 221 | border-radius: 4px; 222 | color: #cf682f; 223 | } 224 | .plurk_content a.hashtag:hover, 225 | .plurk .text_holder a.hashtag:hover { 226 | margin: auto -0.1em; 227 | padding: 0.05em 0.2em; 228 | text-decoration: none; 229 | background-color: #cf682f; 230 | color: white; 231 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); 232 | } 233 | // 表符 234 | .emoticon, 235 | .emoticon_my, 236 | .emo_campaign, 237 | .emoticons_campaign { 238 | vertical-align: top; 239 | } 240 | // 連結 241 | .plurk a.ex_link { 242 | color: #0435d2; 243 | text-decoration: none; 244 | } 245 | .plurk a.ex_link:hover { 246 | text-decoration: underline; 247 | } 248 | // 有圖連結 249 | .plurk a.meta { 250 | position: relative; 251 | display: block; 252 | margin: 1px 4px 4px 0px; 253 | padding: 4px; 254 | cursor: pointer; 255 | overflow: hidden; 256 | border: none; 257 | border: #e5ebfb 1px solid; 258 | border: rgba(33, 83, 210, 0.08) 1px solid; 259 | border-radius: 7px; 260 | background: #f6f8fe; 261 | background: rgba(33, 83, 210, 0.04); 262 | color: #2153d2; 263 | } 264 | .plurk a.meta img { 265 | float: left; 266 | height: 48px; 267 | max-width: 80px; 268 | margin: 0 5px 0 0; 269 | border-radius: 5px; 270 | } 271 | .plurk a.meta:hover { 272 | text-decoration: none; 273 | border: #d4dff7 1px solid; 274 | border: rgba(33, 83, 210, 0.12) 1px solid; 275 | background: #edf1fc; 276 | background: rgba(33, 83, 210, 0.08); 277 | } 278 | // 圖片 279 | .plurk a.pictureservices { 280 | position: relative; 281 | display: inline-block; 282 | max-width: 200px; 283 | margin: 1px 2px 4px 0px; 284 | overflow: hidden; 285 | cursor: pointer; 286 | vertical-align: text-top; 287 | border: none; 288 | border-radius: 5px; 289 | } 290 | .plurk a.pictureservices:hover { 291 | text-decoration: none; 292 | } 293 | .plurk a.pictureservices img { 294 | display: block; 295 | max-width: 240px; 296 | height: 64px; 297 | } 298 | .plurk a.pictureservices:hover img { 299 | filter: brightness(90%); 300 | } 301 | 302 | // 控制列 303 | .manager::after { 304 | content: ''; 305 | clear: both; 306 | display: block; 307 | height: 0; 308 | } 309 | .timeline-cnt .plurk .manager { 310 | display: none; 311 | } 312 | .link_extend .manager, 313 | .plurk_box .manager { 314 | display: block !important; 315 | } 316 | .manager { 317 | float: right; 318 | margin-top: 4px; 319 | padding: 3px 4px 0; 320 | color: #afb8cc; 321 | } 322 | .manager > a { 323 | display: inline-block; 324 | margin-left: 12px; 325 | padding: 2px 5px 3px; 326 | cursor: pointer; 327 | text-decoration: none !important; 328 | border-radius: 3px; 329 | color: #afb8cc; 330 | } 331 | .manager > a.gift { 332 | margin-left: 10px; 333 | } 334 | .manager > a:hover { 335 | color: #fff !important; 336 | background: #3667a5 !important; 337 | } 338 | .manager .mute-off:hover { 339 | background: #000 !important; 340 | } 341 | .manager .replurk-off:hover { 342 | background: #45b03f !important; 343 | } 344 | .manager .like-off:hover { 345 | background: #e8443d !important; 346 | } 347 | .manager .mark-off:hover { 348 | background: #5abac5 !important; 349 | } 350 | 351 | // 時間軸 352 | .timeline-bg .block_bg .bottom_start, 353 | .timeline-timeshow { 354 | position: absolute; 355 | padding: 0 4px; 356 | font-size: 12px; 357 | bottom: -8px; 358 | white-space: nowrap; 359 | } 360 | .timeline-bg { 361 | z-index: map-get($th-index, timeline-bg); 362 | } 363 | .bottom-line { 364 | z-index: map-get($th-index, bottom-line); 365 | position: absolute; 366 | bottom: -1px; 367 | width: 100%; 368 | height: 2px; 369 | overflow: hidden; 370 | background-color: #fff; 371 | } 372 | .bottom_start { 373 | background: #fff; 374 | color: #ccc; 375 | border-radius: 5px; 376 | } 377 | 378 | // loading 379 | .timeline-holder .loading-div { 380 | position: absolute; 381 | top: 50%; 382 | margin-top: -100px; 383 | width: 100%; 384 | text-align: center; 385 | padding: 0; 386 | } 387 | .timeline-holder .loading-div .cnt { 388 | padding: 0 !important; 389 | } 390 | .timeline-holder .timeline-bg .block_bg .loading-div { 391 | width: auto; 392 | right: 100px; 393 | } 394 | 395 | // 噗下時間 396 | .timeline-timeshow { 397 | z-index: map-get($th-index, timeline-timeshow); 398 | border-radius: 5px; 399 | background: #ff574d; 400 | color: #fff; 401 | } 402 | #time_show { 403 | z-index: map-get($th-index, time_show); 404 | position: absolute; 405 | margin-top: -9px; 406 | padding: 0 4px; 407 | font-size: 11px; 408 | white-space: nowrap; 409 | border-radius: 5px; 410 | } 411 | #time_show span { 412 | color: #fff; 413 | } 414 | .evening, 415 | .night, 416 | .day, 417 | .morning { 418 | background: #ff574d; 419 | } 420 | 421 | // 往前往後按鈕 422 | .browse_button { 423 | position: absolute; 424 | z-index: 5000; 425 | top: 167px; 426 | } 427 | .browse_button_last { 428 | opacity: 0 !important; 429 | &:hover { 430 | opacity: 1 !important; 431 | } 432 | } 433 | .browse_button .cmp_arrow_right, 434 | .browse_button .cmp_arrow_left { 435 | color: #ff574d; 436 | font-size: 56px; 437 | } 438 | .browse_button .cmp_arrow_right { 439 | &::before { 440 | content: '→'; 441 | font-family: 'Potta One', cursive !important; 442 | } 443 | } 444 | .browse_button .cmp_arrow_left { 445 | &::before { 446 | content: '←'; 447 | font-family: 'Potta One', cursive !important; 448 | } 449 | } 450 | .browse_button .cmp_back_to_today { 451 | font-size: 12px; 452 | line-height: 18px; 453 | margin-top: 10px; 454 | background: #ff574d; 455 | color: #fff; 456 | border-radius: 10px; 457 | position: absolute; 458 | margin-left: 11px; 459 | padding: 0px 9px; 460 | } 461 | .cmp_back_to_today::before { 462 | content: '←'; 463 | font-family: 'Potta One', cursive !important; 464 | position: absolute; 465 | color: #ff574d; 466 | margin-left: -19px; 467 | margin-top: 4px; 468 | } 469 | .browse_button div { 470 | border: none !important; 471 | cursor: pointer; 472 | } 473 | 474 | // 噗浪生物 475 | #dynamic_logo { 476 | z-index: map-get($th-index, dynamic_logo); 477 | display: inline-block; 478 | position: absolute; 479 | right: 10px; 480 | margin-top: 12px; 481 | cursor: move; 482 | white-space: nowrap; 483 | } 484 | } 485 | -------------------------------------------------------------------------------- /pug/partial/review_th.pug: -------------------------------------------------------------------------------- 1 | - 2 | const first_left = plurk_box_width + plurk_cut_left * 2 3 | const second_left = plurk_box_width + plurk_cut_left * 2 + plurk_cut_width 4 | const third_left = plurk_box_width + plurk_cut_left * 3 + plurk_cut_width * 2 5 | 6 | - 7 | const normal_left = first_left 8 | const normal_top = plurk_cut_top 9 | const extend_left = first_left 10 | const extend_top = plurk_cut_top + plurk_cut_height 11 | const box_left = second_left 12 | const box_top = plurk_cut_top 13 | const new_left = third_left 14 | const new_top = plurk_cut_top 15 | const muted_left = third_left 16 | const muted_top = plurk_cut_top + plurk_cut_height 17 | const anonymous_left = third_left 18 | const anonymous_top = plurk_cut_top + plurk_cut_height * 2 19 | const r18_left = third_left 20 | const r18_top = plurk_cut_top + plurk_cut_height * 3 21 | 22 | 23 | //- 河道 24 | #timeline_holder.timeline-holder(style="height: 450px;") 25 | //- 河道的噗 26 | #timeline_cnt.timeline-cnt(style="padding-bottom: 0px;") 27 | .block_cnt(style="height: 100% !important; width: 100% !important; left: 0px; transition: left 90ms linear 0s;") 28 | //- 普通新噗 29 | .plurk.cboxAnchor.new(style=`left: ${normal_left}px; top: ${normal_top}px;`) 30 | table 31 | tbody 32 | tr 33 | //- 噗頭像 34 | td.td_img 35 | .p_img 36 | a(href="javascript:;") 37 | img(src="https://picsum.photos/20/20?random=21") 38 | //- 噗內容 39 | td 40 | .plurk_cnt 41 | table 42 | tbody 43 | tr.tr_cnt 44 | //- 噗暱稱&轉噗標示 45 | td.td_qual 46 | span 47 | a.name(href="javascript:;") 暱稱 48 | //- 發噗內容 49 | td.td_cnt 50 | .text_holder 51 | //- 轉噗人名 52 | | 這是普通外觀 53 | //- 回應數 54 | td.td_response_count 55 | a(href="javascript:;") 56 | span.response_count 20 57 | //- 滑鼠移至噗 58 | .plurk.cboxAnchor.new.display.link_extend(style=`left: ${extend_left}px; top: ${extend_top}px;`) 59 | table 60 | tbody 61 | tr 62 | //- 噗頭像 63 | td.td_img 64 | .p_img 65 | a(href="javascript:;") 66 | img(src="https://picsum.photos/20/20?random=21") 67 | //- 噗內容 68 | td 69 | .plurk_cnt 70 | table 71 | tbody 72 | tr.tr_cnt 73 | //- 噗暱稱&轉噗標示 74 | td.td_qual 75 | span 76 | a.name(href="javascript:;") 暱稱 77 | //- 發噗內容 78 | td.td_cnt 79 | .text_holder 80 | //- 轉噗人名 81 | | 這是被滑鼠移至的外觀 82 | //- 移至與展開才會出現 83 | .manager 84 | a.pif-edit.edit 85 | a.mute.pif-volume.mute-off 86 | a.pif-replurk.replurk.replurk-off 87 | span 5 88 | a.pif-like.like.like-off 89 | span 10 90 | a.pif-star.bookmark.mark-off 91 | a.pif-bone.gift 92 | span 1 93 | a.pif-option.option 94 | //- 回應數 95 | td.td_response_count 96 | a(href="javascript:;") 97 | span.response_count 20 98 | //- 展開後的噗 99 | .plurk.cboxAnchor.display.link_extend.plurk_box(style=`left: ${box_left}px; top: ${box_top}px;`) 100 | table 101 | tbody 102 | tr 103 | //- 噗頭像 104 | td.td_img 105 | .p_img 106 | a(href="javascript:;") 107 | img(src="https://picsum.photos/20/20?random=21") 108 | //- 噗內容 109 | td 110 | .plurk_cnt 111 | table 112 | tbody 113 | tr.tr_cnt 114 | //- 噗暱稱&轉噗標示 115 | td.td_qual 116 | span 117 | a.name(href="javascript:;") 暱稱 118 | span.qualifier.q_replurks 119 | | 轉噗 120 | i.pif-replurk 121 | //- 發噗內容 122 | td.td_cnt 123 | .text_holder 124 | //- 轉噗人名 125 | span 126 | a.name(href="javascript:;" style="color: #86CA6F;") 轉噗人名 127 | span.text_holder 128 | span.hashtag 129 | a.hashtag(href="javascript:;") #Hashtag 130 | br 131 | | 這是被展開後的外觀 132 | br 133 | //- 普通連結 134 | a.ex_link(href="javascript:;") 普通連結 135 | br 136 | //- 有圖連結 137 | a.ex_link.meta(href="javascript:;") 138 | img(src="https://picsum.photos/86/86?random=24" height="40px") 139 | | 有圖連結 140 | //- 圖片 141 | a.ex_link.pictureservices(href="javascript:;") 142 | img(src="https://picsum.photos/48/64?random=22" height="48") 143 | | 圖片 144 | br 145 | //- 表符 146 | | 表符 147 | br 148 | img.emoticon_my(src="https://picsum.photos/48/48?random=23" width="48" height="48") 149 | //- 移至與展開才會出現 150 | .manager 151 | a.pif-edit.edit 152 | a.mute.pif-volume.mute-off 153 | a.pif-replurk.replurk.replurk-off 154 | span 5 155 | a.pif-like.like.like-off 156 | span 10 157 | a.pif-star.bookmark.mark-off 158 | a.pif-bone.gift 159 | span 1 160 | a.pif-option.option 161 | //- 展開才會出現的時間 162 | .time 163 | a(href="javascript:;") 164 | span.posted 165 | time.timeago 發噗時間 166 | //- 回應數 167 | td.td_response_count 168 | a(href="javascript:;") 169 | span.response_count 20 170 | //- 新訊息新噗 171 | .plurk.cboxAnchor.new(style=`left: ${new_left}px; top: ${new_top}px;`) 172 | table 173 | tbody 174 | tr 175 | //- 噗頭像 176 | td.td_img 177 | .p_img 178 | a(href="javascript:;") 179 | img(src="https://picsum.photos/20/20?random=21") 180 | //- 噗內容 181 | td 182 | .plurk_cnt.new1 183 | table 184 | tbody 185 | tr.tr_cnt 186 | //- 噗暱稱&轉噗標示 187 | td.td_qual 188 | span 189 | a.name(href="javascript:;") 暱稱 190 | //- 發噗內容 191 | td.td_cnt 192 | .text_holder 193 | //- 轉噗人名 194 | | 這是新訊息外觀 195 | //- 消音噗 196 | .plurk.cboxAnchor.muted(style=`left: ${muted_left}px; top: ${muted_top}px;`) 197 | table 198 | tbody 199 | tr 200 | //- 噗頭像 201 | td.td_img 202 | .p_img 203 | a(href="javascript:;") 204 | img(src="https://picsum.photos/20/20?random=21") 205 | //- 噗內容 206 | td 207 | .plurk_cnt 208 | table 209 | tbody 210 | tr.tr_cnt 211 | //- 噗暱稱&轉噗標示 212 | td.td_qual 213 | span 214 | a.name(href="javascript:;") 暱稱 215 | //- 發噗內容 216 | td.td_cnt 217 | .text_holder 218 | //- 轉噗人名 219 | | 這是消音噗外觀 220 | //- 偷偷說 221 | .plurk.cboxAnchor(data-uid="99999" style=`left: ${anonymous_left}px; top: ${anonymous_top}px;`) 222 | table 223 | tbody 224 | tr 225 | //- 噗頭像 226 | td.td_img 227 | .p_img 228 | a(href="javascript:;") 229 | img(src="https://picsum.photos/20/20?random=21") 230 | //- 噗內容 231 | td 232 | .plurk_cnt 233 | table 234 | tbody 235 | tr.tr_cnt 236 | //- 噗暱稱&轉噗標示 237 | td.td_qual 238 | span 239 | a.name(href="javascript:;") ಠ_ಠ 240 | //- 發噗內容 241 | td.td_cnt 242 | .text_holder 243 | //- 轉噗人名 244 | | 這是偷偷說外觀 245 | //- R18噗 246 | .plurk.cboxAnchor.porn(style=`left: ${r18_left}px; top: ${r18_top}px;`) 247 | table 248 | tbody 249 | tr 250 | //- 噗頭像 251 | td.td_img 252 | .p_img 253 | a(href="javascript:;") 254 | img(src="https://picsum.photos/20/20?random=21") 255 | //- 噗內容 256 | td 257 | .plurk_cnt 258 | table 259 | tbody 260 | tr.tr_cnt 261 | //- 噗暱稱&轉噗標示 262 | td.td_qual 263 | span 264 | a.name(href="javascript:;") 暱稱 265 | //- 發噗內容 266 | td.td_cnt 267 | .text_holder 268 | span 269 | a.name(href="javascript:;" style="color:#E8AF37") 轉噗人名 270 | span.porn-icon.pif-porn 271 | .text_holder 272 | | 這是R18噗的外觀 273 | 274 | //- 時間軸 275 | #timeline_bg.timeline-bg(style="padding-bottom: 0px;") 276 | #bottom_line.bottom-line(style="display: block;") 277 | .block_bg(style="height: 100% !important; width: 100% !important; left: 0px; transition: left 90ms linear 0s;") 278 | .bottom_start.day_start.div_bottom(style="left: 15px;") 今天 279 | .bottom_start.time_start.div_bottom(style="left: 300px;") 20:00 280 | #div_loading.loading-div 281 | .cnt 282 | img(src="image/loading.gif") 283 | 284 | //- 噗下時間 285 | #time_show.timeline-timeshow.morning(style=`left: ${plurk_cut_left}px;`) 286 | span 今天 20:00 287 | 288 | //- 往前往後按鈕 289 | .browse_button(style="right: 10px; top: 35%") 290 | .cmp_arrow_right.pif-arrow-right 291 | .cmp_back_to_today.pif-arrow-left Begin 292 | .browse_button.browse_button_last(style="left: 10px; top: 35%;") 293 | .cmp_arrow_left.pif-arrow-left 294 | .cmp_back_to_today.pif-arrow-left Begin 295 | 296 | //- 噗浪生物 297 | #dynamic_logo 298 | img#creature(src="image/creatures.png") -------------------------------------------------------------------------------- /sass/partials/_review_dh.scss: -------------------------------------------------------------------------------- 1 | //----- 主控台 2 | .review { 3 | #dashboard_holder { 4 | width: 98%; 5 | max-width: 980px; 6 | min-width: 580px; 7 | position: relative; 8 | margin: 0 auto 21px; 9 | padding: 35px 0 20px; 10 | } 11 | #plurk-dashboard { 12 | color: #666; 13 | overflow: visible; 14 | line-height: 15px; 15 | height: 1%; 16 | } 17 | #plurk-dashboard h2 { 18 | display: block; 19 | padding: 2px; 20 | font-size: 14px; 21 | } 22 | #plurk-dashboard p { 23 | margin: 0; 24 | } 25 | #plurk-dashboard a { 26 | color: #e88d43; 27 | } 28 | #dashboard_holder a:hover { 29 | text-decoration: underline; 30 | } 31 | #plurk-dashboard::after, 32 | .segment-content::after { 33 | content: ''; 34 | clear: both; 35 | display: block; 36 | width: 0; 37 | height: 0; 38 | font-size: 0; 39 | line-height: 0; 40 | } 41 | #plurk-dashboard .dash-group-form, 42 | #plurk-dashboard .dash-group-right { 43 | position: relative; 44 | float: right; 45 | width: 67%; 46 | } 47 | #plurk-dashboard .dash-group-left { 48 | position: relative; 49 | float: left; 50 | width: 33%; 51 | padding-right: 10px; 52 | box-sizing: border-box; 53 | } 54 | #plurk-dashboard .dash-segment { 55 | float: left; 56 | position: relative; 57 | } 58 | .dash-segment .segment-content { 59 | margin-top: 10px; 60 | padding: 5px; 61 | border-radius: 10px; 62 | background: #fff; 63 | } 64 | #plurk-dashboard .dash-segment-post, 65 | #plurk-dashboard .dash-segment-stats { 66 | width: 100%; 67 | } 68 | .friend_man { 69 | display: inline-block; 70 | margin: 0 2px; 71 | padding: 6px 10px; 72 | overflow: hidden; 73 | cursor: pointer !important; 74 | transition: background-color 300ms; 75 | font-size: 12px; 76 | line-height: 15px; 77 | text-decoration: none !important; 78 | white-space: nowrap; 79 | border-radius: 5px; 80 | color: white !important; 81 | } 82 | .friend_man::before { 83 | width: 16px; 84 | margin-right: 5px; 85 | margin-left: -1px; 86 | font-size: 14px; 87 | line-height: 14px; 88 | text-align: center; 89 | vertical-align: top; 90 | } 91 | 92 | // 發噗區 93 | #plurk-dashboard .dash-group-form .segment-content { 94 | min-height: 96px; 95 | overflow: visible; 96 | } 97 | .plurkForm::after, 98 | .input_holder::after, 99 | .share_list::after, 100 | .icons_holder::after { 101 | content: ''; 102 | clear: both; 103 | display: block; 104 | height: 0; 105 | } 106 | .plurkForm { 107 | position: relative; 108 | padding: 3px 3px 0; 109 | } 110 | .submit_img_color { 111 | background: #ff574d; 112 | } 113 | .submit_img { 114 | float: right; 115 | width: 80px; 116 | height: 38px; 117 | margin-left: 6px; 118 | cursor: pointer; 119 | font-size: 25px; 120 | line-height: 38px; 121 | text-align: center; 122 | border: none; 123 | border-radius: 5px; 124 | color: #fff; 125 | } 126 | .input_holder { 127 | float: none; 128 | width: auto; 129 | overflow: hidden; 130 | border: #eee 1px solid; 131 | border-color: rgba(0, 0, 0, 0.1); 132 | border-radius: 8px; 133 | background: #fff; 134 | } 135 | .qual_holder { 136 | position: relative !important; 137 | padding: 3px; 138 | font-size: 24px; 139 | } 140 | .dd_img { 141 | cursor: pointer; 142 | } 143 | .m_qualifier { 144 | position: relative; 145 | padding: 3px 6px 4px; 146 | border-radius: 5px; 147 | line-height: 100%; 148 | background-color: #ccc; 149 | color: #fff; 150 | } 151 | .m_qualifier i::before { 152 | top: 0; 153 | font-size: 16px; 154 | line-height: 16px; 155 | } 156 | .pif-dropdown::before { 157 | content: '▼'; 158 | } 159 | .textarea_holder { 160 | float: none; 161 | width: auto; 162 | overflow: hidden; 163 | } 164 | .textarea_holder textarea { 165 | display: block; 166 | clear: none; 167 | width: 100%; 168 | height: 37px; 169 | padding: 0 0 0 2px !important; 170 | margin: 0 !important; 171 | resize: none; 172 | outline: none; 173 | font-family: inherit; 174 | font-size: 25px; 175 | font-weight: inherit; 176 | line-height: 37px; 177 | border: 0; 178 | box-shadow: none; 179 | border-radius: 7px; 180 | background: #fff; 181 | } 182 | .icons_holder { 183 | float: left; 184 | margin: 4px 0 4px; 185 | overflow: hidden; 186 | font-size: 12px; 187 | } 188 | .icons_holder li { 189 | position: relative; 190 | float: left; 191 | width: 32px; 192 | margin: 4px 6px 0 0; 193 | cursor: pointer; 194 | font-size: 26px; 195 | line-height: 32px; 196 | text-align: center; 197 | } 198 | .icons_holder .pif-emoticon, 199 | .icons_holder .pif-media, 200 | .icons_holder .pif-sync, 201 | .icons_holder .pif-anynomous, 202 | .icons_holder .pif-privacy { 203 | &::before { 204 | font-size: 26px; 205 | } 206 | } 207 | .icons_holder .pif-emoticon { 208 | color: #fcd254; 209 | } 210 | .icons_holder .pif-emoticon:hover { 211 | color: #e7b237; 212 | } 213 | .icons_holder .pif-media { 214 | color: #8bcfd6; 215 | } 216 | .icons_holder .pif-media:hover { 217 | color: #7ab1b7; 218 | } 219 | .icons_holder .pif-sync { 220 | color: #96cb84; 221 | } 222 | .icons_holder .pif-sync:hover { 223 | color: #81ac72; 224 | } 225 | .icons_holder .pif-anynomous { 226 | color: #a98ab8; 227 | } 228 | .icons_holder .pif-anynomous:hover { 229 | color: #997aa8; 230 | } 231 | .icons_holder .pif-privacy { 232 | color: #f4cb35; 233 | } 234 | .icons_holder .pif-privacy:hover { 235 | color: #e7b237; 236 | } 237 | .plurk_to, 238 | .plurkForm .whispers_hint, 239 | .priv, 240 | .plurk_schedule { 241 | float: right; 242 | font-size: 13px; 243 | line-height: 17px; 244 | opacity: 0.6; 245 | margin-top: 6px; 246 | text-align: right; 247 | } 248 | .char_updater { 249 | clear: both; 250 | font-size: 12px; 251 | display: block; 252 | line-height: 18px; 253 | opacity: 0.75; 254 | } 255 | 256 | // 個人資訊區 257 | #plurk-dashboard .dash-segment-profile { 258 | width: 100%; 259 | } 260 | #plurk-dashboard .dash-segment-profile #dash-profile { 261 | height: 86px; 262 | position: relative; 263 | text-align: left; 264 | } 265 | #plurk-dashboard .dash-segment-profile #dash-profile img.profile-pic { 266 | position: absolute; 267 | width: 86px; 268 | height: 86px; 269 | border-radius: 8px; 270 | } 271 | #plurk-dashboard.own img.profile-pic { 272 | cursor: pointer; 273 | } 274 | #profile_pic { 275 | margin-bottom: 5px; 276 | } 277 | #plurk-dashboard .dash-segment-profile #dash-profile #full_name { 278 | margin-left: 92px; 279 | padding-top: 1px; 280 | font-size: 17px; 281 | } 282 | #plurk-dashboard .dash-segment-profile #dash-profile #full_name .display_name { 283 | display: block; 284 | margin-bottom: 1px; 285 | line-height: 1.1em; 286 | } 287 | #plurk-dashboard .dash-segment-profile #dash-profile #full_name .nick_name { 288 | display: block; 289 | } 290 | .nick_name { 291 | opacity: 0.85; 292 | font-size: 12px; 293 | } 294 | #plurk-dashboard .dash-segment-profile #dash-profile .profile-info { 295 | position: absolute; 296 | bottom: 0; 297 | margin-left: 92px; 298 | opacity: 0.85; 299 | } 300 | #plurk-dashboard .dash-segment-profile #dash-profile .profile-icons { 301 | position: absolute; 302 | bottom: 0; 303 | height: 20px; 304 | right: 2px; 305 | font-size: 0; 306 | white-space: nowrap; 307 | } 308 | #plurk-dashboard .dash-segment-profile #dash-profile .profile-icons .premium { 309 | display: inline-block; 310 | margin-left: 5px; 311 | } 312 | #plurk-dashboard .dash-segment-profile #dash-profile .profile-icons img { 313 | width: auto; 314 | height: 20px; 315 | } 316 | #plurk-dashboard .dash-segment-profile #dash-additional-info { 317 | padding: 5px; 318 | } 319 | #plurk-dashboard .dash-segment-profile #dash-additional-info #about_me { 320 | padding-bottom: 10px; 321 | line-height: 1.4em; 322 | } 323 | #plurk-dashboard .dash-segment-profile #dash-additional-info #location_container, 324 | #plurk-dashboard .dash-segment-profile #dash-additional-info #relationship_container { 325 | margin-top: 10px; 326 | } 327 | #plurk-dashboard .dash-segment-profile #dash-additional-info #private_plurk { 328 | margin-bottom: 10px; 329 | } 330 | .friend_man.private_plurk { 331 | background-color: #207298; 332 | } 333 | .friend_man.send_gift { 334 | background-color: #e8ad40; 335 | } 336 | 337 | // 統計區 338 | #plurk-dashboard #dash-stats .dash-stats-karma { 339 | float: left; 340 | width: 37%; 341 | min-width: 210px; 342 | margin: 15px 0; 343 | text-align: center; 344 | } 345 | .karma_hover { 346 | position: relative; 347 | margin: 10px 0 10px 10px; 348 | font-family: Georgia, 'Times New Roman', Times, serif; 349 | font-size: 28px; 350 | line-height: 30px; 351 | white-space: nowrap; 352 | } 353 | .karma_hover .karma_red { 354 | color: #c60900; 355 | } 356 | .karma_hover .karma_green { 357 | color: #00ff24; 358 | } 359 | .karma_hover #karma_arrow { 360 | display: none; 361 | margin-top: -8px; 362 | font-size: 12px; 363 | vertical-align: top; 364 | } 365 | #plurk-dashboard #dash-stats table { 366 | float: none; 367 | width: auto; 368 | height: 72px; 369 | overflow: hidden; 370 | } 371 | #plurk-dashboard #dash-stats table th { 372 | padding: 8px 3px 0 0; 373 | opacity: 0.7; 374 | font-size: 12px; 375 | font-weight: normal; 376 | text-align: center; 377 | vertical-align: bottom; 378 | } 379 | #plurk-dashboard #dash-stats table td { 380 | vertical-align: bottom; 381 | padding: 8px 5px 0 0; 382 | color: #333; 383 | font-size: 15px; 384 | width: 26%; 385 | white-space: nowrap; 386 | } 387 | 388 | // 徽章區 389 | #plurk-dashboard .dash-segment-award { 390 | clear: both; 391 | } 392 | #plurk-dashboard .dash-segment-award .segment-content { 393 | background: none; 394 | } 395 | #plurk-dashboard .dash-segment-award .segment-content .award_bar div { 396 | float: left; 397 | width: 39px; 398 | height: 39px; 399 | margin: 0 8px 6px 0; 400 | cursor: default; 401 | font-weight: bold; 402 | text-align: center; 403 | } 404 | .cmp_9 { 405 | width: 39px; 406 | height: 39px; 407 | font-size: 1px; 408 | background: transparent url('../image/award.png') 0 -2420px no-repeat; 409 | } 410 | #plurk-dashboard .link_arrow { 411 | display: block; 412 | margin-top: 10px; 413 | margin-left: 10px; 414 | font-size: 11px; 415 | text-align: left; 416 | } 417 | #plurk-dashboard .link_arrow i { 418 | margin-right: 5px; 419 | } 420 | .pif-arrow-points::before { 421 | font-size: 15px; 422 | margin-right: 0; 423 | } 424 | 425 | // 好友粉絲區 426 | #plurk-dashboard #dash-friends-pics, 427 | #plurk-dashboard #dash-fans-pics { 428 | margin: 10px 0 0 0; 429 | } 430 | .show_all_friends, 431 | .show_mutual_friends { 432 | float: left; 433 | margin: 0 15px 5px 0; 434 | } 435 | .friend_holder { 436 | clear: both; 437 | } 438 | .friend_holder ul li { 439 | margin: 5px 2px; 440 | float: left; 441 | } 442 | .friend_holder img { 443 | width: 35px; 444 | height: 35px; 445 | border: 0; 446 | } 447 | 448 | // 好友區 449 | #plurk-dashboard .dash-segment-friends { 450 | width: 49.3%; 451 | margin-right: 1.4%; 452 | } 453 | #plurk-dashboard .dash-segment-friends #dash-friends #friend_managment { 454 | margin-top: 5px; 455 | text-align: center; 456 | } 457 | .friend_man.add_friend, 458 | .friend_man.accpet { 459 | background-color: #7aa716; 460 | } 461 | .friend_man.add_friend:hover, 462 | .friend_man.accpet:hover { 463 | background-color: #6a9706; 464 | } 465 | 466 | // 粉絲區 467 | #plurk-dashboard .dash-segment-fans { 468 | width: 49.3%; 469 | } 470 | #plurk-dashboard .dash-segment-fans #dash-fans #fan_managment { 471 | margin-top: 5px; 472 | text-align: center; 473 | } 474 | .friend_man.unfollow, 475 | .friend_man.add_follow, 476 | .friend_man.add-as-fan { 477 | background-color: #207298; 478 | } 479 | .friend_man.unfollow:hover, 480 | .friend_man.add_follow:hover, 481 | .friend_man.add-as-fan:hover { 482 | background-color: #106288; 483 | } 484 | } 485 | @mixin review_dh_SM { 486 | .review { 487 | #plurk-dashboard .dash-group-form, 488 | #plurk-dashboard .dash-group-right { 489 | width: 100%; 490 | padding: 0 10px; 491 | box-sizing: border-box; 492 | } 493 | #plurk-dashboard .dash-group-left { 494 | width: 100%; 495 | padding: 0 10px; 496 | box-sizing: border-box; 497 | } 498 | #plurk-dashboard .dash-segment-friends { 499 | width: 100%; 500 | margin-right: 0; 501 | box-sizing: border-box; 502 | } 503 | #plurk-dashboard .dash-segment-fans { 504 | width: 100%; 505 | box-sizing: border-box; 506 | } 507 | } 508 | } 509 | -------------------------------------------------------------------------------- /pug/components/lists.pug: -------------------------------------------------------------------------------- 1 | - 2 | const plurkCntList = [ 3 | { 4 | title: '噗首外觀', 5 | subtitle: '.timeline-cnt .plurk', 6 | name: 'plurkcnt_normal', 7 | csstype: ['opa'], 8 | }, 9 | { 10 | title: '噗首外觀:滑鼠移至', 11 | subtitle: '.timeline-cnt .link_extend', 12 | name: 'plurkcnt_hover', 13 | csstype: ['opa'], 14 | }, 15 | { 16 | title: '噗首外觀:被展開', 17 | subtitle: '.timeline-cnt .plurk_box', 18 | name: 'plurkcnt_extend', 19 | csstype: ['opa'], 20 | }, 21 | { 22 | title: '噗首外觀:消音', 23 | subtitle: '.timeline-cnt .muted', 24 | name: 'plurkcnt_muted', 25 | csstype: ['opa'], 26 | }, 27 | { 28 | title: '噗首外觀:偷偷說', 29 | subtitle: '.timeline-cnt [data-uid="99999"]', 30 | name: 'plurkcnt_anonymous', 31 | csstype: ['opa'], 32 | }, 33 | { 34 | title: '噗首內文', 35 | subtitle: '.timeline-cnt .plurk_cnt', 36 | name: 'plurkcnt_cnt', 37 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 38 | }, 39 | { 40 | title: '噗首內文:新訊息', 41 | subtitle: '.timeline-cnt .plurk_cnt[class*="new"]', 42 | name: 'plurkcnt_new', 43 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 44 | }, 45 | { 46 | title: '噗首內文:R18', 47 | subtitle: '.timeline-cnt .porn:not(.link_extend) .text_holder', 48 | name: 'plurkcnt_r18', 49 | csstype: ['blur'], 50 | }, 51 | { 52 | title: '噗首的頭像', 53 | subtitle: '.timeline-cnt .p_img', 54 | name: 'plurkcnt_pimg', 55 | csstype: ['opa', 'bdrs', 'bd', 'sha'], 56 | }, 57 | { 58 | title: '噗的回應數', 59 | subtitle: '.timeline-cnt .response_count', 60 | name: 'plurkcnt_count', 61 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 62 | }, 63 | { 64 | title: '噗的未讀回應數', 65 | subtitle: '.timeline-cnt .new .response_count', 66 | name: 'plurkcnt_newcount', 67 | csstype: ['bgc', 'c', 'opa'], 68 | }, 69 | { 70 | title: '噗友暱稱', 71 | subtitle: '.timeline-cnt .td_qual > span', 72 | name: 'plurkcnt_pname', 73 | csstype: ['up'], 74 | }, 75 | { 76 | title: '噗的Hashtag', 77 | subtitle: '.plurk .text_holder a.hashtag', 78 | name: 'plurkcnt_hash', 79 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 80 | hover: true, 81 | }, 82 | { 83 | title: '噗的圖片', 84 | subtitle: '.plurk a.pictureservices', 85 | name: 'plurkcnt_pic', 86 | csstype: ['opa', 'bdrs'], 87 | hover: true, 88 | }, 89 | { 90 | title: '噗的有圖連結', 91 | subtitle: '.plurk a.meta', 92 | name: 'plurkcnt_piclink', 93 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd'], 94 | hover: true, 95 | }, 96 | { 97 | title: '噗的有圖連結內的圖片', 98 | subtitle: '.plurk a.meta img', 99 | name: 'plurkcnt_piclinkimg', 100 | csstype: ['opa', 'bdrs'], 101 | }, 102 | { 103 | title: '噗的普通連結', 104 | subtitle: '.plurk a.ex_link', 105 | name: 'plurkcnt_link', 106 | csstype: ['c', 'fz'], 107 | hover: true, 108 | }, 109 | { 110 | title: '噗的編輯鈕', 111 | subtitle: '.manager > a.edit', 112 | name: 'manager_edit', 113 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 114 | hover: true, 115 | }, 116 | { 117 | title: '噗的消音鈕', 118 | subtitle: '.manager .mute-off', 119 | name: 'manager_mute', 120 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 121 | hover: true, 122 | }, 123 | { 124 | title: '噗的轉噗鈕', 125 | subtitle: '.manager .replurk-off', 126 | name: 'manager_replurk', 127 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 128 | hover: true, 129 | }, 130 | { 131 | title: '噗的喜歡鈕', 132 | subtitle: '.manager .like-off', 133 | name: 'manager_like', 134 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 135 | hover: true, 136 | }, 137 | { 138 | title: '噗的書籤鈕', 139 | subtitle: '.manager .mark-off', 140 | name: 'manager_mark', 141 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 142 | hover: true, 143 | }, 144 | { 145 | title: '噗的噗幣鈕', 146 | subtitle: '.manager > a.gift', 147 | name: 'manager_gift', 148 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 149 | hover: true, 150 | }, 151 | { 152 | title: '噗的選項鈕', 153 | subtitle: '.manager > a.option', 154 | name: 'manager_option', 155 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 156 | hover: true, 157 | }, 158 | { 159 | title: '噗的時間顯示', 160 | subtitle: '.timeline-timeshow', 161 | name: 'timeline_plurktime', 162 | csstype: ['bgc', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 163 | }, 164 | { 165 | title: '時間軸的時間', 166 | subtitle: '.bottom_start', 167 | name: 'timeline_time', 168 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 169 | }, 170 | { 171 | title: '時間軸的線', 172 | subtitle: '#bottom_line', 173 | name: 'timeline_line', 174 | csstype: ['bgc', 'opa'], 175 | }, 176 | { 177 | title: '河道往前往後鈕', 178 | subtitle: '.browse_button', 179 | name: 'browse_btn', 180 | csstype: ['opa'], 181 | hover: true, 182 | }, 183 | ]; 184 | 185 | const plurkBoxList = [ 186 | { 187 | title: '噗內整體調整', 188 | subtitle: '#form_holder', 189 | name: 'plurkbox_holder', 190 | csstype: ['opa', 'bdrs', 'bd', 'sha'], 191 | }, 192 | { 193 | title: '噗內喜歡數', 194 | subtitle: '.favorite_count', 195 | name: 'plurkbox_favorite', 196 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 197 | hover: true, 198 | }, 199 | { 200 | title: '噗內轉噗數', 201 | subtitle: '.replurk_count', 202 | name: 'plurkbox_replurk', 203 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 204 | hover: true, 205 | }, 206 | { 207 | title: '噗內書籤標籤', 208 | subtitle: '.bookmark_info', 209 | name: 'plurkbox_bookmark', 210 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 211 | hover: true, 212 | }, 213 | { 214 | title: '噗內私噗標籤', 215 | subtitle: '.private_info', 216 | name: 'plurkbox_private', 217 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 218 | hover: true, 219 | }, 220 | { 221 | title: '噗內回應區', 222 | subtitle: '.response_box', 223 | name: 'plurkbox_resbox', 224 | csstype: ['bgc'], 225 | hover: true, 226 | }, 227 | { 228 | title: '回應內容', 229 | subtitle: '.response_box .list .plurk_cnt', 230 | name: 'plurkbox_reslist', 231 | csstype: ['bgc', 'c', 'fz', 'bdrs', 'bd'], 232 | hover: true, 233 | }, 234 | { 235 | title: '噗主回應內容', 236 | subtitle: '.response_box .list .highlight_owner .plurk_cnt', 237 | name: 'plurkbox_ownlist', 238 | csstype: ['bgc', 'c', 'fz', 'bdrs', 'bd'], 239 | hover: true, 240 | }, 241 | { 242 | title: '噗內暱稱上移', 243 | subtitle: '#form_holder .plurk_cnt .td_qual', 244 | name: 'plurkbox_listname', 245 | csstype: ['boxup'], 246 | }, 247 | { 248 | title: '噗內輸入區', 249 | subtitle: '.plurk_box .mini_form', 250 | name: 'plurkbox_form', 251 | csstype: ['bgc'], 252 | }, 253 | ]; 254 | 255 | const controlList = [ 256 | { 257 | title: '更新的按鈕', 258 | subtitle: '#updater .item a', 259 | name: 'control_updatebtn', 260 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 261 | hover: true, 262 | }, 263 | { 264 | title: '更新的未讀數字', 265 | subtitle: '#updater .unread_generic', 266 | name: 'control_updatecount', 267 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 268 | }, 269 | { 270 | title: '頻道的型態', 271 | subtitle: '#filter_tab', 272 | name: 'control_filterstyle', 273 | csstype: ['open', 'ftposi', 'toicon', 'countposi'], 274 | }, 275 | { 276 | title: '頻道的普通按鈕', 277 | subtitle: '#filter_tab a', 278 | name: 'control_filterbtn', 279 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 280 | hover: true, 281 | }, 282 | { 283 | title: '頻道的選中按鈕', 284 | subtitle: '#filter_tab a.filter_selected', 285 | name: 'control_filterselect', 286 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 287 | hover: true, 288 | }, 289 | { 290 | title: '頻道的未讀數字', 291 | subtitle: '#filter_tab a .unread_generic', 292 | name: 'control_filtercount', 293 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 294 | }, 295 | ]; 296 | 297 | const dashboardLeftList = [ 298 | { 299 | title: '主控台整體', 300 | subtitle: '#plurk-dashboard', 301 | name: 'dashboard_board', 302 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 303 | hover: true, 304 | }, 305 | { 306 | title: '主控台內分區', 307 | subtitle: '.dash-segment .segment-content', 308 | name: 'dashboard_segment', 309 | csstype: ['bgc', 'opa', 'bdrs', 'bd', 'sha'], 310 | hover: true, 311 | }, 312 | { 313 | title: '個人資料區整體', 314 | subtitle: '.dash-segment-profile .segment-content', 315 | name: 'profile_segment', 316 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 317 | hover: true, 318 | }, 319 | { 320 | title: '個人頭像', 321 | subtitle: '#plurk-dashboard .dash-group-left #dash-profile img.profile-pic', 322 | name: 'profile_img', 323 | csstype: ['opa', 'bdrs', 'sha'], 324 | hover: true, 325 | }, 326 | { 327 | title: '個人暱稱', 328 | subtitle: '#plurk-dashboard .dash-group-left #dash-profile #full_name .display_name', 329 | name: 'profile_name', 330 | csstype: ['c', 'fz', 'opa'], 331 | hover: true, 332 | }, 333 | { 334 | title: '私噗按鈕', 335 | subtitle: '.friend_man.private_plurk', 336 | name: 'profile_private', 337 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 338 | hover: true, 339 | }, 340 | { 341 | title: '送禮按鈕', 342 | subtitle: '.friend_man.send_gift', 343 | name: 'profile_gift', 344 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 345 | hover: true, 346 | }, 347 | ]; 348 | 349 | const dashboardRightList = [ 350 | { 351 | title: '發噗區整體', 352 | subtitle: '.dash-segment-post .segment-content', 353 | name: 'post_segment', 354 | csstype: ['bgc', 'opa', 'bdrs', 'bd', 'sha'], 355 | hover: true, 356 | }, 357 | { 358 | title: '發噗鈕', 359 | subtitle: '.submit_img_color', 360 | name: 'post_submit', 361 | csstype: ['bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 362 | hover: true, 363 | }, 364 | { 365 | title: '發噗區表符鈕', 366 | subtitle: '.dash-segment-post .icons_holder .pif-emoticon', 367 | name: 'post_emoticon', 368 | csstype: ['c', 'opa'], 369 | hover: true, 370 | }, 371 | { 372 | title: '發噗區分享鈕', 373 | subtitle: '.dash-segment-post .icons_holder .pif-media', 374 | name: 'post_media', 375 | csstype: ['c', 'opa'], 376 | hover: true, 377 | }, 378 | { 379 | title: '發噗區同步鈕', 380 | subtitle: '.dash-segment-post .icons_holder .pif-sync', 381 | name: 'post_sync', 382 | csstype: ['c', 'opa'], 383 | hover: true, 384 | }, 385 | { 386 | title: '發噗區偷偷說鈕', 387 | subtitle: '.dash-segment-post .icons_holder .pif-anynomous', 388 | name: 'post_anynomous', 389 | csstype: ['c', 'opa'], 390 | hover: true, 391 | }, 392 | { 393 | title: '發噗區私人鈕', 394 | subtitle: '.dash-segment-post .icons_holder .pif-privacy', 395 | name: 'post_privacy', 396 | csstype: ['c', 'opa'], 397 | hover: true, 398 | }, 399 | { 400 | title: '卡碼資訊區整體', 401 | subtitle: '.dash-segment-stats .segment-content', 402 | name: 'stats_segment', 403 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 404 | hover: true, 405 | }, 406 | { 407 | title: '統計資訊', 408 | subtitle: '#plurk-dashboard .dash-segment #dash-stats table td', 409 | name: 'stats_fzcolor', 410 | csstype: ['c', 'fz'], 411 | }, 412 | { 413 | title: '卡碼區', 414 | subtitle: '.dash-stats-karma', 415 | name: 'stats_karma', 416 | csstype: ['dp'], 417 | }, 418 | { 419 | title: '卡碼', 420 | subtitle: '#karma', 421 | name: 'karma_font', 422 | csstype: ['c', 'fz', 'opa'], 423 | }, 424 | { 425 | title: '好友區整體', 426 | subtitle: '.dash-segment-friends .segment-content', 427 | name: 'friends_segment', 428 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 429 | hover: true, 430 | }, 431 | { 432 | title: '紛絲區整體', 433 | subtitle: '.dash-segment-fans .segment-content', 434 | name: 'fans_segment', 435 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 436 | hover: true, 437 | }, 438 | { 439 | title: '好友粉絲頭像', 440 | subtitle: '.friend_holder img', 441 | name: 'friends_img', 442 | csstype: ['opa', 'bdrs', 'bd', 'sha'], 443 | hover: true, 444 | }, 445 | { 446 | title: '好友按鈕', 447 | subtitle: '#dash-friends .friend_man', 448 | name: 'friends_friendbtn', 449 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 450 | hover: true, 451 | }, 452 | { 453 | title: '好友連結', 454 | subtitle: '#dash-friends .show_all_friends a, #dash-friends .show_mutual_friends a', 455 | name: 'friends_friendlink', 456 | csstype: ['dp', 'c', 'fz', 'opa'], 457 | hover: true, 458 | }, 459 | { 460 | title: '好友頭像區', 461 | subtitle: '#dash-friends .friend_holder', 462 | name: 'friends_friendimg', 463 | csstype: ['dp', 'bgc', 'opa', 'bdrs', 'bd', 'sha'], 464 | hover: true, 465 | }, 466 | { 467 | title: '粉絲按鈕', 468 | subtitle: '#dash-fans .friend_man', 469 | name: 'fans_fanbtn', 470 | csstype: ['dp', 'bgc', 'c', 'fz', 'opa', 'bdrs', 'bd', 'sha'], 471 | hover: true, 472 | }, 473 | { 474 | title: '粉絲連結', 475 | subtitle: '#dash-fans .show_all_friends a', 476 | name: 'fans_fanlink', 477 | csstype: ['dp', 'c', 'fz', 'opa'], 478 | hover: true, 479 | }, 480 | { 481 | title: '粉絲頭像區', 482 | subtitle: '#dash-fans .friend_holder', 483 | name: 'fans_fanimg', 484 | csstype: ['dp', 'bgc', 'opa', 'bdrs', 'bd', 'sha'], 485 | hover: true, 486 | }, 487 | { 488 | title: '徽章區', 489 | subtitle: '#plurk-dashboard .dash-segment-award', 490 | name: 'award_segment', 491 | csstype: ['dp', 'opa'], 492 | hover: true, 493 | }, 494 | ]; 495 | 496 | const otherList = [ 497 | { 498 | title: '噗浪生物', 499 | subtitle: '#dynamic_logo::after', 500 | name: 'dynamic_ori', 501 | csstype: ['dcbgi', 'size', 'posi', 'opa'], 502 | }, 503 | { 504 | title: '官方生物', 505 | subtitle: '#dynamic_logo #creature', 506 | name: 'dynamic_creature', 507 | csstype: ['opa'], 508 | }, 509 | { 510 | title: '時間軸生物', 511 | subtitle: '.timeline-bg', 512 | name: 'tl_bg', 513 | csstype: ['tlbgi', 'tlbgirep', 'tlbgiposi'], 514 | }, 515 | { 516 | title: '噗幣旁生物', 517 | subtitle: '.profile-icons::before', 518 | name: 'p_coin', 519 | csstype: ['pcoinbgi', 'size', 'opa'], 520 | }, 521 | { 522 | title: '往前按鈕', 523 | subtitle: '.browse_button .cmp_arrow_left', 524 | name: 'browse_al', 525 | csstype: ['browsealbgi', 'size', 'opa'], 526 | }, 527 | { 528 | title: '往後按鈕', 529 | subtitle: '.browse_button .cmp_arrow_right', 530 | name: 'browse_ar', 531 | csstype: ['browsearbgi', 'size', 'opa'], 532 | }, 533 | { 534 | title: '回到最前按鈕', 535 | subtitle: '.browse_button .cmp_back_to_today', 536 | name: 'browse_tt', 537 | csstype: ['browsettbgi', 'size', 'bgc', 'opa', 'bdrs'], 538 | }, 539 | { 540 | title: 'Loading 圖示', 541 | subtitle: '.loading-div .cnt', 542 | name: 'loading_cut', 543 | csstype: ['loadingbgi', 'size', 'opa'], 544 | }, 545 | { 546 | title: '官方 Loading', 547 | subtitle: '.loading-div .cnt img', 548 | name: 'loading_img', 549 | csstype: ['opa'], 550 | }, 551 | { 552 | title: '游標更改', 553 | subtitle: '*, body, a', 554 | name: 'cursor_normal', 555 | csstype: ['cursor'], 556 | }, 557 | { 558 | title: '游標更改:移到連結上', 559 | subtitle: 'a:hover', 560 | name: 'cursor_hover', 561 | csstype: ['cursor'], 562 | } 563 | ]; 564 | 565 | - const contentList = [plurkCntList, plurkBoxList, controlList, dashboardLeftList, dashboardRightList, otherList]; 566 | 567 | - const areaList = ['th', 'fh', 'tc', 'dhl', 'dhr', 'other'] 568 | 569 | - const menuList = ['河道', '噗內回應', '控制列', '主控台左', '主控台右', '圖示更改'] -------------------------------------------------------------------------------- /script/script.js: -------------------------------------------------------------------------------- 1 | { 2 | const noEmptyClass = 'generator_input-no-empty'; 3 | const generatorApplyClass = 'generator_container-apply'; 4 | const hasImportantList = { 5 | bgc: ['manager_edit_hover', 'manager_mute_hover', 'manager_replurk_hover', 'manager_like_hover', 'manager_mark_hover', 'manager_gift_hover', 'manager_option_hover'], 6 | c: ['manager_edit_hover', 'manager_gift_hover', 'manager_option_hover', 'control_updatecount', 'control_filtercount', 'profile_private', 'profile_gift', 'friends_friendbtn', 'fans_fanbtn'], 7 | }; 8 | const hasOverflowList = { bdrs: ['plurkcnt_pimg', 'plurkbox_holder'] }; 9 | const reviewStyleBlock = document.querySelector('#reviewStyle'); 10 | const exportCode = document.querySelector('.export_code'); 11 | const generatorOriginValueList = []; 12 | 13 | //========== header 14 | //== theme mode switch 15 | const themeNodeSwitch = () => { 16 | const modeButton = document.querySelector('#mode_switch'); 17 | modeButton.addEventListener('click', () => { 18 | const status = modeButton.checked ? 'add' : 'remove'; 19 | document.body.classList[status]('dark-mode'); 20 | }); 21 | }; 22 | 23 | //== export switch 24 | const exportSwitch = () => { 25 | const exportButton = document.querySelector('.export_button'); 26 | const exportArea = document.querySelector('.export'); 27 | exportButton.addEventListener('click', () => { 28 | exportButton.classList.toggle('nav_btn-active'); 29 | exportArea.classList.toggle('export-open'); 30 | }); 31 | }; 32 | 33 | //== sidebar switch 34 | const sidebarSwitch = () => { 35 | const sidebarButton = document.querySelector('.sidebar'); 36 | const tools = document.querySelector('.tools'); 37 | const sidebarClass = 'sidebar-active'; 38 | const toolsClass = 'tools-open'; 39 | const isSmMedia = window.matchMedia('(max-width: 576px)'); 40 | if (isSmMedia.matches) { 41 | sidebarButton.classList.remove(sidebarClass); 42 | tools.classList.remove(toolsClass); 43 | } 44 | sidebarButton.addEventListener('click', () => { 45 | sidebarButton.classList.toggle(sidebarClass); 46 | tools.classList.toggle(toolsClass); 47 | }); 48 | }; 49 | 50 | //== reset handler 51 | const inputsResetValue = (box, inputType, resetValue) => { 52 | const inputs = box.querySelectorAll(`input[type="${inputType}"]`); 53 | inputs.forEach((input) => { 54 | input.classList.remove(noEmptyClass); 55 | input.value = resetValue; 56 | }); 57 | }; 58 | const checkedResetValue = (box, inputType) => { 59 | const checkbox = box.querySelectorAll(`input[type="${inputType}"]`); 60 | checkbox.forEach((input) => (input.checked = false)); 61 | if (inputType === 'radio') { 62 | if (checkbox.length) checkbox[0].checked = true; 63 | toIconAndCountPositionSync(false); 64 | } 65 | }; 66 | const resetButtonClickHandler = () => { 67 | const generatorContainer = document.querySelectorAll('.generator_container'); 68 | generatorContainer.forEach((container) => { 69 | container.classList.remove(generatorApplyClass); 70 | const generatorBox = container.querySelectorAll('.generator_box'); 71 | generatorBox.forEach((box) => { 72 | box.dataset.apply = false; 73 | inputsResetValue(box, 'text', ''); 74 | inputsResetValue(box, 'color', '#000000'); 75 | inputsResetValue(box, 'range', 0); 76 | checkedResetValue(box, 'checkbox'); 77 | checkedResetValue(box, 'radio'); 78 | reviewStyleBlock.textContent = ''; 79 | }); 80 | }); 81 | }; 82 | const resetHandler = () => { 83 | const resetButton = document.querySelector('.reset_button'); 84 | resetButton.addEventListener('click', () => { 85 | const isReset = confirm('確定要清空所有設定嗎?'); 86 | if (!isReset) return; 87 | resetButtonClickHandler(); 88 | exportCode.value = ''; 89 | }); 90 | }; 91 | 92 | //== plurkbox no display 93 | const plurkboxNoDisplay = () => { 94 | const plurkboxButton = document.querySelector('.plurkbox_button'); 95 | const plurkbox = document.querySelector('#form_holder'); 96 | plurkboxButton.addEventListener('click', () => { 97 | plurkbox.classList.toggle('no-display'); 98 | const newText = plurkboxButton.textContent === '隱藏噗內回應' ? '顯示噗內回應' : '隱藏噗內回應'; 99 | plurkboxButton.textContent = newText; 100 | }); 101 | }; 102 | 103 | //== plurkbg handler 104 | const plurkbgHandler = () => { 105 | const plurkbgButton = document.querySelector('.plurkbg_button'); 106 | const plurkbgColor = document.querySelector('#plurkbg_color'); 107 | const plurkbgImage = document.querySelector('#plurkbg_image'); 108 | const colorPreview = document.querySelector(`.${plurkbgColor.id}`); 109 | const imagePreview = document.querySelector(`.${plurkbgImage.id}`); 110 | const plurkbgClear = document.querySelector('.plurkbg_clear'); 111 | const layoutContent = document.querySelector('#layout_content'); 112 | let src = null; 113 | plurkbgButton.addEventListener('click', () => { 114 | plurkbgButton.classList.toggle('nav_btn-active'); 115 | plurkbgButton.parentNode.classList.toggle('plurkbg-open'); 116 | }); 117 | plurkbgColor.addEventListener('change', () => { 118 | const color = plurkbgColor.value; 119 | colorPreview.style.backgroundColor = color; 120 | layoutContent.style.backgroundColor = color; 121 | }); 122 | plurkbgImage.addEventListener('change', (e) => { 123 | URL.revokeObjectURL(src); 124 | src = URL.createObjectURL(e.target.files[0]); 125 | const image = `url('${src}')`; 126 | imagePreview.style.backgroundImage = image; 127 | layoutContent.style.backgroundImage = image; 128 | }); 129 | plurkbgClear.addEventListener('click', (e) => { 130 | e.preventDefault(); 131 | URL.revokeObjectURL(src); 132 | imagePreview.style.backgroundImage = ''; 133 | layoutContent.style.backgroundImage = ''; 134 | }); 135 | }; 136 | 137 | //========== header all handler 138 | const headerAllHandler = () => { 139 | // themeNodeSwitch(); 140 | sidebarSwitch(); 141 | exportSwitch(); 142 | resetHandler(); 143 | plurkboxNoDisplay(); 144 | plurkbgHandler(); 145 | }; 146 | headerAllHandler(); 147 | document.addEventListener('DOMContentLoaded', resetButtonClickHandler); 148 | 149 | //========== tools 150 | //== tools container 開關 151 | const toolsContainerSwitch = () => { 152 | const toolsContainer = document.querySelectorAll('.tools_container'); 153 | const menuItem = document.querySelectorAll('.menu_item'); 154 | const menuClass = 'menu_item-active'; 155 | const toolsClass = 'tools_container-open'; 156 | menuItem.forEach((menu, i) => { 157 | menu.addEventListener('click', () => { 158 | const menuActive = document.querySelector(`.${menuClass}`); 159 | const toolsOpen = document.querySelector(`.${toolsClass}`); 160 | menuActive.classList.remove(menuClass); 161 | toolsOpen.classList.remove(toolsClass); 162 | menu.classList.add(menuClass); 163 | toolsContainer[i].classList.add(toolsClass); 164 | }); 165 | }); 166 | }; 167 | 168 | //== generator container 開關 169 | const generatorContainerClickHandler = (e, container) => { 170 | const openClass = 'generator_container-open'; 171 | const isOpen = container.classList.contains(openClass); 172 | if (isOpen) { 173 | const isTitle = e.target.matches('.generator_title'); 174 | if (isTitle) container.classList.remove(openClass); 175 | } else { 176 | container.classList.add(openClass); 177 | } 178 | }; 179 | const generatorOpened = () => { 180 | const generatorContainer = document.querySelectorAll('.generator_container'); 181 | generatorContainer.forEach((container) => { 182 | container.addEventListener('click', (e) => generatorContainerClickHandler(e, container)); 183 | }); 184 | }; 185 | 186 | //== 圖示化 作用後才開啟 圖示化的未讀位置 187 | const radioDisable = (countPosition, toIcon) => { 188 | countPosition.forEach((radio) => (radio.disabled = !toIcon.checked)); 189 | }; 190 | const toIconAndCountPositionSync = (whenClick = true) => { 191 | const toIcon = document.querySelector('#control_filterstyle_toicon'); 192 | const countPosition = document.querySelectorAll('.control_filterstyle_countposi'); 193 | radioDisable(countPosition, toIcon); 194 | if (whenClick) toIcon.addEventListener('change', () => radioDisable(countPosition, toIcon)); 195 | }; 196 | 197 | //== input apply status 198 | //== inputs apply 199 | const generatorContainerIsApply = (container, boxes) => { 200 | const hasApply = [...boxes].some((box) => box.dataset.apply === 'true'); 201 | const status = hasApply ? 'add' : 'remove'; 202 | container.classList[status](generatorApplyClass); 203 | }; 204 | const isApplyByNeed = (inputs) => { 205 | const hasNeed = [...inputs].filter((input) => input.dataset.need === 'true'); 206 | const isNeedApply = !!hasNeed.length && hasNeed.every((input) => input.classList.contains(noEmptyClass)); 207 | return isNeedApply; 208 | }; 209 | const isApplyByCheckboxChange = (inputs) => { 210 | const [hasChangeInCheckbox] = [...inputs].filter((input) => input.dataset.change === 'true' && input.type === 'checkbox'); 211 | const isCheckboxChangeApply = !!hasChangeInCheckbox && hasChangeInCheckbox.checked; 212 | return isCheckboxChangeApply; 213 | }; 214 | const isApplyByRadioChange = (inputs) => { 215 | const hasChangeInRadio = [...inputs].filter((input) => input.dataset.change === 'true' && input.type === 'radio'); 216 | const isRadioChangeApply = !!hasChangeInRadio.length && !hasChangeInRadio[0].checked; 217 | return isRadioChangeApply; 218 | }; 219 | const inputGroupApplyConfirm = (box, inputs) => { 220 | const isNeedApply = isApplyByNeed(inputs); 221 | const isCheckboxChangeApply = isApplyByCheckboxChange(inputs); 222 | const isRadioChangeApply = isApplyByRadioChange(inputs); 223 | box.dataset.apply = isNeedApply || isCheckboxChangeApply || isRadioChangeApply; 224 | }; 225 | //== input no empty 226 | const inputNoEmptyChangeHandler = (input) => { 227 | if (input.type !== 'text') return; 228 | const status = input.value === '' ? 'remove' : 'add'; 229 | input.classList[status](noEmptyClass); 230 | }; 231 | //== generator inputs handler 232 | const generatorInputsHandler = () => { 233 | const generatorContainer = document.querySelectorAll('.generator_container'); 234 | generatorContainer.forEach((container) => { 235 | const generatorBox = container.querySelectorAll('.generator_box'); 236 | generatorBox.forEach((box) => { 237 | const generatorInput = box.querySelectorAll('input'); 238 | generatorInput.forEach((input) => { 239 | inputNoEmptyChangeHandler(input); 240 | input.addEventListener('input', () => { 241 | inputNoEmptyChangeHandler(input); 242 | inputGroupApplyConfirm(box, generatorInput); 243 | generatorContainerIsApply(container, generatorBox); 244 | }); 245 | }); 246 | inputGroupApplyConfirm(box, generatorInput); 247 | }); 248 | generatorContainerIsApply(container, generatorBox); 249 | }); 250 | }; 251 | 252 | //== input value 同步 253 | const inputBoxClickHandler = (input, output) => { 254 | input.addEventListener('input', () => { 255 | output.value = input.value; 256 | if (output.type === 'text') inputNoEmptyChangeHandler(output); 257 | }); 258 | }; 259 | const inputValueSync = () => { 260 | const generatorGroup = document.querySelectorAll('.generator_group'); 261 | generatorGroup.forEach((group) => { 262 | const boxes = group.querySelectorAll('.color_box, .range_box'); 263 | if (!boxes.length) return; 264 | const [input, box] = boxes; 265 | inputBoxClickHandler(input, box); 266 | inputBoxClickHandler(box, input); 267 | }); 268 | }; 269 | 270 | //========== generator basic handler 271 | const generatorBasicHandler = () => { 272 | toolsContainerSwitch(); 273 | generatorOpened(); 274 | toIconAndCountPositionSync(); 275 | inputValueSync(); 276 | generatorInputsHandler(); 277 | }; 278 | generatorBasicHandler(); 279 | 280 | //========== get values function 281 | const valueHasImportant = (value, type, areaName) => { 282 | if (!hasImportantList[type]) return; 283 | if (hasImportantList[type].includes(areaName)) { 284 | value[0] += ' !important'; 285 | } 286 | }; 287 | const valueHasOverflow = (value, type, areaName) => { 288 | if (!hasOverflowList[type]) return; 289 | if (hasOverflowList[type].includes(areaName)) { 290 | value.push('overflow: hidden'); 291 | } 292 | }; 293 | const valueHexToRgba = (hex, opacity = '') => { 294 | const isHex = String(hex).match(/#(.{2})(.{2})(.{2})/); 295 | const color = isHex ? isHex.slice(1).map((hex) => parseInt(hex, 16)) : []; 296 | return opacity ? [`rgba(${color.join(', ')}, ${opacity})`] : [hex]; 297 | }; 298 | const valuePlusUnit = (value, unit = 'px') => { 299 | return value.map((string) => string + unit); 300 | }; 301 | const valueBdrs = (value) => { 302 | const values = [...value]; 303 | const unit = values.splice(-1, 1); 304 | const result = values.map((num) => num + unit); 305 | return [result.join(' ')]; 306 | }; 307 | const valueDcbgi = (value) => { 308 | return [`url('${value}')`, `content: ''`, 'position: absolute', 'display: block', 'background-repeat: no-repeat']; 309 | }; 310 | const valuePcoinbgi = (value) => { 311 | return [ 312 | `url('${value}')`, 313 | `content: ''`, 314 | 'position: absolute', 315 | 'display: block', 316 | 'bottom: 0', 317 | 'left: 0', 318 | 'pointer-events: none', 319 | 'transform: translateX(-100%)', 320 | 'background-position: bottom right', 321 | 'background-repeat: no-repeat', 322 | ]; 323 | }; 324 | const valueTlbgi = (value) => { 325 | return [`url('${value}')`, 'position: relative', 'pointer-events: none', 'background-repeat: repeat-x', 'background-position: bottom left']; 326 | }; 327 | const valueBrowsebgi = (value) => { 328 | return [`url('${value}')`, 'padding: 0', 'font-size: 0', 'background-repeat: no-repeat']; 329 | }; 330 | const valueLoadingbgi = (value) => { 331 | return [`url('${value}')`, 'position: relative', 'margin: 0 auto', 'background-repeat: no-repeat', 'background-position: center center']; 332 | }; 333 | const valueUp = () => { 334 | const result = ['噗友暱稱', ['.timeline-cnt .td_qual > span', ['position: absolute', 'transform: translate(-25px, -150%)']]]; 335 | return [result]; 336 | }; 337 | const valueBoxup = () => { 338 | const result = ['噗內暱稱上移', ['#form_holder .plurk_cnt .td_qual', ['position: absolute']], ['#form_holder .plurk_cnt .text_holder', ['margin-top: 1.5em', 'padding-left: 0.7em']]]; 339 | return [result]; 340 | }; 341 | const valueOpen = (value) => { 342 | const top = ['頻道向上展開', ['#filter_tab a, #filter_tab:hover a.no_unread', ['height: 25px', 'margin-top: 6px', 'margin-right: 6px']]]; 343 | const right = ['頻道向右展開', ...top.slice(1), ['#filter_tab li', ['clear: none', 'width: auto']]]; 344 | const result = { top, right }; 345 | return [result[value]]; 346 | }; 347 | const valueFtposi = () => { 348 | const result = ['頻道往右放', ['.timeline_control', ['margin-left: 0']], ['#timeline_control_holder', ['width: 100%']], ['#updater', ['left: 10px']], ['#filter_tab', ['padding-right: 20px']]]; 349 | return [result]; 350 | }; 351 | const valueToicon = () => { 352 | const countposiValue = document.querySelector('.control_filterstyle_countposi:checked').value; 353 | const top = [ 354 | '讓頻道未讀數字出現在上面', 355 | [ 356 | '#filter_tab a .unread_generic', 357 | ['position: absolute', 'left: 0', 'width: 30px', 'height: 20px', 'line-height: 20px', 'margin: 0', 'padding: 0', 'transform: translateY(-100%)', 'border-radius: 5px'], 358 | ], 359 | ]; 360 | const right = [ 361 | '讓頻道未讀數字出現在右邊', 362 | ['#updater', ['margin-left: 35px']], 363 | [ 364 | '#filter_tab a .unread_generic', 365 | ['position: absolute', 'top: 0', 'left: 30px', 'width: 30px', 'height: 25px', 'line-height: 25px', 'margin-top: 6px', 'margin-left: 0', 'padding: 0 4px', 'border-radius: 5px'], 366 | ], 367 | ]; 368 | const left = [ 369 | '讓頻道未讀數字出現在左邊', 370 | [ 371 | '#filter_tab a .unread_generic', 372 | [ 373 | 'position: absolute', 374 | 'top: 0', 375 | 'left: 0', 376 | 'width: 30px', 377 | 'height: 25px', 378 | 'line-height: 25px', 379 | 'margin-top: 6px', 380 | 'margin-left: 0', 381 | 'padding: 0 4px', 382 | 'transform: translateX(-100%)', 383 | 'border-radius: 5px', 384 | ], 385 | ], 386 | ]; 387 | const countposi = { top, right, left }; 388 | const icon = [ 389 | '頻道圖示化', 390 | ['#filter_tab li', ['position: relative']], 391 | ['#filter_tab a', ['width: 30px', 'padding: 0', 'overflow: hidden']], 392 | ['#filter_tab a i', ['float: left', 'width: 30px', 'line-height: 25px']], 393 | ['#filter_tab a i::before', ['width: 30px']], 394 | ]; 395 | return [icon, countposi[countposiValue]]; 396 | }; 397 | 398 | //========== generator value catch and conversion 399 | const generatorValuesGet = (box, generatorValues) => { 400 | const boxType = box.dataset.type; 401 | const inputs = [...box.querySelectorAll(`.generator_input, .generator_input-radio:checked, .generator_input-checkbox`)]; 402 | const values = inputs.map((input) => { 403 | let result = null; 404 | if (input.type === 'checkbox') result = input.checked; 405 | else result = input.value; 406 | return result; 407 | }); 408 | generatorValues[boxType] = { 409 | css: box.querySelector('.generator_subtitle').dataset.css, 410 | value: values, 411 | }; 412 | }; 413 | const generatorValueBasic = (generator, originValueList) => { 414 | const generatorTitle = generator.querySelector('.generator_title'); 415 | const generatorValues = { 416 | areaName: generator.id, 417 | selector: generatorTitle.dataset.selector, 418 | detail: generatorTitle.textContent, 419 | }; 420 | const applyBoxes = [...generator.querySelectorAll('.generator_box')].filter((box) => box.dataset.apply === 'true'); 421 | applyBoxes.forEach((box) => generatorValuesGet(box, generatorValues)); 422 | originValueList.push(generatorValues); 423 | }; 424 | const generatorValueTypeFilter = (valueList) => { 425 | const typeFilterList = ['areaName', 'selector', 'detail']; 426 | const valueTypes = Object.keys(valueList).filter((key) => { 427 | if (!typeFilterList.includes(key)) return key; 428 | }); 429 | return valueTypes; 430 | }; 431 | const generatorValueConversion = (valueList, type) => { 432 | const value = valueList[type].value; 433 | const conversionFunction = { 434 | bgc: valueHexToRgba(...value), 435 | c: valueHexToRgba(...value), 436 | fz: valuePlusUnit(value), 437 | opa: value, 438 | bdrs: valueBdrs(value), 439 | bd: [`${value[2]}px solid ${valueHexToRgba(value[0], value[1])}`], 440 | sha: [`${value[2]}px ${value[3]}px ${value[4]}px ${valueHexToRgba(value[0], value[1])}`], 441 | dp: ['none'], 442 | transi: [`${value[0]}s`], 443 | blur: [`blur(${value[0]}px)`], 444 | posi: valuePlusUnit(value, '%'), 445 | size: valuePlusUnit(value), 446 | dcbgi: valueDcbgi(value[0]), 447 | pcoinbgi: valuePcoinbgi(value[0]), 448 | tlbgi: valueTlbgi(value[0]), 449 | tlbgirep: ['no-repeat'], 450 | tlbgiposi: [`bottom ${value[0]}% left ${value[1]}%`], 451 | browsealbgi: valueBrowsebgi(value[0]), 452 | browsearbgi: valueBrowsebgi(value[0]), 453 | browsettbgi: valueBrowsebgi(value[0]), 454 | loadingbgi: valueLoadingbgi(value[0]), 455 | cursor: [`url("${value[0]}"), auto`], 456 | up: valueUp(), 457 | boxup: valueBoxup(), 458 | open: valueOpen(value[0]), 459 | ftposi: valueFtposi(), 460 | toicon: valueToicon(), 461 | }; 462 | return conversionFunction[type]; 463 | }; 464 | const generatorValueToBeResult = (valueList, valueTypes, areaName) => { 465 | valueTypes.forEach((type) => { 466 | valueList[type].result = generatorValueConversion(valueList, type); 467 | valueHasImportant(valueList[type].result, type, areaName); 468 | valueHasOverflow(valueList[type].result, type, areaName); 469 | }); 470 | }; 471 | const generatorCssNormalContent = (valueList, valueTypes, exportResultList) => { 472 | const selector = valueList.selector; 473 | const detail = `/*${valueList.detail}*/`; 474 | const cssList = []; 475 | valueTypes.forEach((type) => { 476 | const resultList = [...valueList[type].result]; 477 | const attrList = valueList[type].css.split(', '); 478 | const value = resultList.splice(0, attrList.length); 479 | cssList.push(...resultList.map((value) => `\n ${value};`)); 480 | cssList.push(...attrList.map((css, i) => `\n ${css}: ${value[i]};`)); 481 | }); 482 | const content = `${detail}\n${selector} {${cssList.join('')}\n}`; 483 | exportResultList.push(content); 484 | }; 485 | const generatorCssSpacialContent = (valueList, valueTypes, exportResultList) => { 486 | valueTypes.forEach((type) => { 487 | const resultValue = valueList[type].result; 488 | resultValue.forEach((result) => { 489 | const contentList = []; 490 | const [detail, ...resultList] = result; 491 | resultList.forEach((result) => { 492 | const [spacialSelector, cssList] = result; 493 | const contentTemp = cssList.map((text) => `\n ${text};`).join(''); 494 | contentList.push(`${spacialSelector} {${contentTemp}\n}`); 495 | }); 496 | const content = `/*${detail}*/\n${contentList.join('\n')}`; 497 | exportResultList.push(content); 498 | }); 499 | }); 500 | }; 501 | const generatorCssContentCreate = (valueList, valueTypes, exportResultList) => { 502 | const typeSpacialList = ['up', 'boxup', 'open', 'ftposi', 'toicon']; 503 | const noSpacialType = valueTypes.every((type) => !typeSpacialList.includes(type)); 504 | if (noSpacialType) { 505 | generatorCssNormalContent(valueList, valueTypes, exportResultList); 506 | } else { 507 | generatorCssSpacialContent(valueList, valueTypes, exportResultList); 508 | } 509 | }; 510 | const generatorGetOriginValueList = (originValueList) => { 511 | originValueList.length = 0; 512 | const applyGenerator = document.querySelectorAll(`.${generatorApplyClass}`); 513 | applyGenerator.forEach((generator) => generatorValueBasic(generator, originValueList)); 514 | }; 515 | const generatorExportResult = (originValueList) => { 516 | const exportResultList = []; 517 | originValueList.forEach((valueList) => { 518 | const areaName = valueList.areaName; 519 | const valueTypes = generatorValueTypeFilter(valueList); 520 | generatorValueToBeResult(valueList, valueTypes, areaName); 521 | generatorCssContentCreate(valueList, valueTypes, exportResultList); 522 | }); 523 | return exportResultList; 524 | }; 525 | 526 | //========== review 527 | //== 讓河道滑動 528 | const reviewContainerNoScroll = (blockCnt) => { 529 | const reviewContainer = document.querySelector('.review_container'); 530 | const removeEvent = (e) => e.preventDefault(); 531 | blockCnt.addEventListener('mouseenter', () => { 532 | reviewContainer.addEventListener('wheel', removeEvent); 533 | }); 534 | blockCnt.addEventListener('mouseleave', () => { 535 | reviewContainer.removeEventListener('wheel', removeEvent); 536 | }); 537 | }; 538 | const blockCntDrag = (blockCnt) => { 539 | let isDrag = false; 540 | let preX = 0; 541 | blockCnt.addEventListener('mousedown', (e) => { 542 | isDrag = true; 543 | preX = e.pageX; 544 | }); 545 | blockCnt.addEventListener('mouseup', () => (isDrag = false)); 546 | blockCnt.addEventListener('mousemove', (e) => { 547 | if (isDrag) { 548 | const distance = preX - e.pageX; 549 | blockCnt.scrollBy(distance, 0); 550 | preX = e.pageX; 551 | } 552 | }); 553 | }; 554 | const blockCntScroll = () => { 555 | const blockCnt = document.querySelector('.block_cnt'); 556 | reviewContainerNoScroll(blockCnt); 557 | blockCntDrag(blockCnt); 558 | blockCnt.addEventListener('wheel', (e) => { 559 | const dir = e.deltaY > 0 ? 1 : -1; 560 | const nowLeft = blockCnt.scrollLeft; 561 | blockCnt.scrollTo(nowLeft + 100 * dir, 0); 562 | }); 563 | }; 564 | 565 | //== 將結果放到 style 中 566 | const generatorReviewResultWhenInput = (OriginValueList) => { 567 | const resultList = generatorExportResult(OriginValueList); 568 | const newResultList = resultList.map((result) => { 569 | result = result.replace(/\n\s\s/g, ''); 570 | result = result.replace(/\/\*(.+?)\*\//g, ''); 571 | result = result.replace(/\n}/g, '}'); 572 | result = result.replace(/\n/g, '#review '); 573 | return result; 574 | }); 575 | return newResultList.join(''); 576 | }; 577 | const generatorReviewHandler = () => { 578 | const generatorInput = document.querySelectorAll('.generator_box input'); 579 | let result = ''; 580 | generatorInput.forEach((input) => { 581 | input.addEventListener('input', () => { 582 | generatorGetOriginValueList(generatorOriginValueList); 583 | const newResult = generatorReviewResultWhenInput(generatorOriginValueList); 584 | if (result === newResult) return; 585 | result = newResult; 586 | reviewStyleBlock.textContent = result; 587 | }); 588 | }); 589 | }; 590 | 591 | //========== review all handler 592 | const reviewControl = () => { 593 | blockCntScroll(); 594 | generatorReviewHandler(); 595 | }; 596 | reviewControl(); 597 | 598 | //========== export control 599 | const exportRecoveryInputValue = (input, i, value, css) => { 600 | const type = input.type; 601 | const syncBoxClass = ['color_box', 'range_box']; 602 | const syncBox = syncBoxClass.some((classes) => input.classList.contains(classes)); 603 | if (type === 'text') { 604 | input.value = value[i]; 605 | input.classList.add(noEmptyClass); 606 | if (syncBox) input.nextElementSibling.value = value[i]; 607 | } 608 | if (type === 'checkbox') { 609 | input.checked = value[i]; 610 | toIconAndCountPositionSync(); 611 | } 612 | if (type === 'radio') { 613 | const [radioValue] = css === 'bdrs' ? [...value].splice(4, 1) : value; 614 | if (input.value === radioValue) input.checked = 'true'; 615 | } 616 | }; 617 | const exportLoadFileRecovery = (originValueList) => { 618 | originValueList.forEach((valueList) => { 619 | const { areaName, detail, selector, ...valueTypes } = valueList; 620 | const cssList = Object.keys(valueTypes); 621 | const container = document.querySelector(`#${areaName}`); 622 | container.classList.add(generatorApplyClass); 623 | cssList.forEach((css) => { 624 | const value = valueTypes[css].value; 625 | const box = container.querySelector(`[data-type="${css}"]`); 626 | const inputs = box.querySelectorAll('input[type="text"], input[type="radio"], input[type="checkbox"]'); 627 | box.dataset.apply = 'true'; 628 | inputs.forEach((input, i) => exportRecoveryInputValue(input, i, value, css)); 629 | }); 630 | }); 631 | }; 632 | const exportControlWhenLoad = (e, originValueList) => { 633 | const file = e.target.files[0]; 634 | const reader = new FileReader(); 635 | reader.addEventListener('load', (el) => { 636 | const valueList = JSON.parse(el.target.result); 637 | const dateIndex = valueList.findIndex((value) => value.save_date); 638 | valueList.splice(dateIndex, 1); 639 | originValueList.length = 0; 640 | originValueList.push(...valueList); 641 | exportLoadFileRecovery(originValueList); 642 | const result = generatorReviewResultWhenInput(valueList); 643 | reviewStyleBlock.textContent = result; 644 | }); 645 | reader.readAsText(file); 646 | }; 647 | const exportControlWhenSave = (originValueList) => { 648 | if (!originValueList.length) return; 649 | const result = [...originValueList]; 650 | const date = new Date().toString(); 651 | result.push({ save_date: date, url: location.href }); 652 | const json = JSON.stringify(result); 653 | const blob = new Blob([json], { type: 'application/json' }); 654 | const url = URL.createObjectURL(blob); 655 | const download = document.createElement('a'); 656 | download.download = 'plurk_css_backup.json'; 657 | download.href = url; 658 | download.click(); 659 | }; 660 | const exportControlWhenCreate = (originValueList) => { 661 | const info = ['/**======== Create by Plurk CSS Generator ========**/', '/**== https://hoshikata.github.io/PlurkCSSGenerator ==**/']; 662 | generatorGetOriginValueList(originValueList); 663 | const result = generatorExportResult(originValueList); 664 | result.unshift(...info); 665 | exportCode.value = result.join('\n'); 666 | }; 667 | const exportControl = () => { 668 | const createButton = document.querySelector('.create_button'); 669 | const selectButton = document.querySelector('.select_button'); 670 | const clearButton = document.querySelector('.clear_button'); 671 | const saveButton = document.querySelector('.save_button'); 672 | const loadInput = document.querySelector('.load_input'); 673 | saveButton.addEventListener('click', () => exportControlWhenSave(generatorOriginValueList)); 674 | loadInput.addEventListener('change', (e) => exportControlWhenLoad(e, generatorOriginValueList)); 675 | selectButton.addEventListener('click', () => exportCode.select()); 676 | clearButton.addEventListener('click', () => (exportCode.value = '')); 677 | createButton.addEventListener('click', () => exportControlWhenCreate(generatorOriginValueList)); 678 | }; 679 | exportControl(); 680 | } 681 | -------------------------------------------------------------------------------- /style/main.min.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap");@import url("https://fonts.googleapis.com/css2?family=Baloo+Da+2:wght@400;600&display=swap");@import url("https://fonts.googleapis.com/css2?family=Potta+One&display=swap");::-moz-selection{background-color:#0f4c81;color:#f5f5f5}::selection{background-color:#0f4c81;color:#f5f5f5}html,body{scroll-behavior:smooth;width:100%;margin:0;padding:0;font-family:'Noto Sans TC', sans-serif;font-size:14px;font-weight:300;letter-spacing:0.1em;background-color:#f5f5f5}h1,h2,h3,h4,h5,h6,p{margin:0;padding:0}h1{font-size:1.9rem;font-weight:900}h2{font-size:1.65rem;font-weight:700}h3{font-size:1.5rem;font-weight:700}h4{font-size:1.3rem;font-weight:500}h5{font-size:1.2rem;font-weight:500}h6{font-size:1.1rem;font-weight:500}p{font-size:1rem}img{vertical-align:middle}ul,ol{margin:0;padding:0;list-style:none}input,select,textarea,button{margin:0;padding:0;outline:none}button{cursor:pointer;border:none}.customization-scroll{scrollbar-width:thin;scrollbar-color:#0f4c81 rgba(214,214,214,0.5)}.customization-scroll::-webkit-scrollbar{width:6px}.customization-scroll::-webkit-scrollbar-track{background-color:rgba(214,214,214,0.5);border-radius:5px}.customization-scroll::-webkit-scrollbar-thumb{background-color:#0f4c81;border-radius:5px}.customization-scroll::-webkit-scrollbar-thumb:hover{background-color:#1467af}.cross_btn{position:relative;width:15px;height:15px}.cross_btn::before,.cross_btn::after{content:'';display:block;position:absolute;top:50%;left:0;width:100%;height:3px;-webkit-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg);border-radius:5px;background-color:currentColor}.cross_btn::after{-webkit-transform:translateY(-50%) rotate(-45deg);transform:translateY(-50%) rotate(-45deg)}.header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:100;position:fixed;top:0;left:0;width:100%;height:45px;padding:0;padding-left:40px;-webkit-box-sizing:border-box;box-sizing:border-box;background-image:linear-gradient(160deg, rgba(15,76,129,0.9), rgba(27,38,44,0.9) 300%);color:#f5f5f5}.header_title{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding-left:20px;font-family:'Baloo Da 2', cursive;font-size:1.5rem;font-weight:500;text-transform:uppercase;letter-spacing:0;color:currentColor}.header_title-small{padding-left:5px;font-size:0.5em;font-weight:300}.logo{-ms-flex-negative:0;flex-shrink:0;position:relative;width:40px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-webkit-transform:scale(0.8);transform:scale(0.8);border-radius:5px;border:3px solid currentColor;letter-spacing:0}.logo_main,.logo_sub{position:absolute;top:-1px;right:2px;font-family:'Baloo Da 2', cursive;font-size:16px;font-weight:600;line-height:16px;color:currentColor}.logo_main{top:-1px;left:-1px;width:35px;height:35px;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);font-size:35px;line-height:35px;color:currentColor}.logo_cover{position:absolute;top:0;left:0;width:100%;height:100%}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;height:100%;margin-right:10px}.nav_btn{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;margin-right:5px;padding:0 10px;font-family:'Noto Sans TC', sans-serif;font-size:1.1rem;font-weight:400;background-color:transparent;color:#f5f5f5}.nav_btn-active.plurkbg_button,.nav_btn-active.plurkbox_button,.nav_btn:hover.plurkbg_button,.nav_btn:hover.plurkbox_button{background-color:rgba(255,163,114,0.5)}.nav_btn-active.reset_button,.nav_btn:hover.reset_button{background-color:rgba(237,102,99,0.5)}.nav_btn-active.export_button,.nav_btn:hover.export_button{background-color:rgba(24,176,176,0.5)}.nav_btn-active.tip_button,.nav_btn-active.github_button,.nav_btn:hover.tip_button,.nav_btn:hover.github_button{background-color:rgba(181,181,181,0.5)}.load_button{cursor:pointer}.github_button{width:20px;margin-right:0;background:url("../image/github.png") no-repeat center center;background-size:20px}.plurkbg_list{position:absolute;bottom:0;left:0;padding:10px 20px;visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%);border-radius:0 0 5px 5px;background-color:#fff;color:#333;-webkit-box-shadow:3px 3px 6px rgba(51,51,51,0.2);box-shadow:3px 3px 6px rgba(51,51,51,0.2)}.plurkbg-open .plurkbg_list{visibility:visible}.plurkbg_item{font-size:1.1rem;font-weight:500;text-align:left;white-space:nowrap}.plurkbg_item:hover{opacity:0.8}.plurkbg_item+.plurkbg_item{margin-top:10px}.plurkbg_label{cursor:pointer;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.plurkbg_preview{display:inline-block;width:20px;height:20px;margin-left:5px;border-radius:3px;background:#333}.plurkbg_image{width:60px;height:40px;background-position:center center;background-size:cover}.plurkbg_clear{display:inline-block;cursor:pointer;margin-left:5px;color:#949494}.plurkbg_clear:hover{color:#545454}.sidebar{width:25px;height:21px;-ms-flex-item-align:start;align-self:flex-start;margin-left:20px;padding:12px 15px;cursor:pointer;color:#f5f5f5}.sidebar::before{content:'';display:block;width:100%;height:3px;-webkit-transform:translateY(1px);transform:translateY(1px);border-radius:5px;background-color:currentColor;-webkit-box-shadow:0 8px 0 currentColor, 0 16px 0 currentColor;box-shadow:0 8px 0 currentColor, 0 16px 0 currentColor}.sidebar-active,.sidebar:hover{background-color:rgba(27,38,44,0.5)}.tools{-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-ms-flexbox;display:flex;width:0;height:100%;padding-top:45px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-webkit-transition:0.5s;transition:0.5s}.tools-open{width:395px}.tools_main{-ms-flex-negative:0;flex-shrink:0;position:relative;width:320px;height:100%;background-color:#fff}.tools_container{position:absolute;top:0;right:0;width:100%;height:100%;padding:15px 0;padding-left:0;padding-right:10px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateX(100%);transform:translateX(100%);background-color:#fff;-webkit-transition:0.5s;transition:0.5s}.tools_container-open{-webkit-transform:translateX(0);transform:translateX(0)}.tools_generator{width:100%;height:100%;overflow-y:auto}.tools_bar{-ms-flex-negative:0;flex-shrink:0;position:relative;width:75px;height:100%;padding:15px 0;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#25343c;color:#f5f5f5}.menu_list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%}.menu_item{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:0 10px;cursor:pointer;-webkit-writing-mode:vertical-lr;-ms-writing-mode:tb-lr;writing-mode:vertical-lr;border-left:5px solid transparent}.menu_item+.menu_item{margin-top:10px}.menu_item-active,.menu_item:hover{border-left-color:#18b0b0;background-color:#1b262c}.generator{width:100%;padding:0 10px;padding-left:35px;-webkit-box-sizing:border-box;box-sizing:border-box}.generator_container{position:relative;margin-bottom:10px;padding:5px 10px;cursor:pointer;border-radius:5px;background-color:rgba(51,51,51,0.08)}.generator_container::before{content:'+';display:inline-block;position:absolute;top:0;left:0;width:20px;padding-right:5px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translate(-100%, -2px);transform:translate(-100%, -2px);font-size:1.8rem;font-weight:700;line-height:37px;text-align:center;color:#18b0b0}.generator_container:hover{background-color:#18b0b0}.generator_container-open{margin-bottom:25px;cursor:auto;background-color:transparent}.generator_container-open::before{content:'-'}.generator_container-open:hover{background-color:transparent}.generator_title{border-bottom:2px solid transparent;color:#333}.generator_title::after{content:attr(data-selector);display:none;font-size:0.7em;font-weight:300;color:#949494}.generator_container-apply .generator_title{color:#18b0b0}.generator_container-open.generator_container-apply .generator_title{color:#333;border-bottom-color:#18b0b0}.generator_container:hover .generator_title{color:#f5f5f5}.generator_container-open:hover .generator_title{color:#333}.generator_container-open .generator_title{padding-bottom:10px;cursor:pointer;border-bottom-color:#d6d6d6}.generator_container-open .generator_title::after{display:block}.generator_container-open .generator_title:hover{color:#18b0b0}.generator_body{display:none;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -10px}.generator_container-open .generator_body{display:-webkit-box;display:-ms-flexbox;display:flex}.generator_box{width:220px;margin-top:15px;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.generator_subtitle{color:#333}.generator_subtitle::after{content:attr(data-css);margin-left:5px;font-size:0.7em;font-weight:300;color:#949494}.generator_group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;margin-top:5px}.generator_input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:0;height:25px;padding:2px 5px;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:'Noto Sans TC', sans-serif;font-size:1rem;font-weight:300;letter-spacing:0.05em;border-radius:3px;border:1px solid #949494;background-color:transparent;color:#333}.generator_input::-webkit-input-placeholder{opacity:0.3;color:#333}.generator_input:-ms-input-placeholder{opacity:0.3;color:#333}.generator_input::-ms-input-placeholder{opacity:0.3;color:#333}.generator_input::placeholder{opacity:0.3;color:#333}.generator_input:focus{border-color:#333}.generator_input-no-empty{border-color:#333}.generator_input-color{width:25px;height:25px;margin-left:5px;cursor:pointer;overflow:hidden;border-radius:3px;border:none}.generator_input-color::-moz-color-swatch,.generator_input-color::-webkit-color-swatch{border-radius:3px;border:1px solid rgba(148,148,148,0.2)}.generator_input-color::-webkit-color-swatch-wrapper{padding:0}.generator_input-range{width:150px;height:5px;margin-left:5px;padding:0 3px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:5px;border:none;background-color:rgba(214,214,214,0.5)}.generator_input-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:15px;height:15px;border-radius:50%;border:none;background-color:#18b0b0}.generator_input-range::-moz-range-thumb{width:15px;height:15px;width:15px;height:15px;border-radius:50%;border:none;background-color:#18b0b0}.generator_input-range::-moz-focus-outer{border:none}.generator_input-checkbox,.generator_input-radio{display:none}.generator_label-checkbox{position:relative;height:22px;padding-left:50px;cursor:pointer;line-height:22px}.generator_label-checkbox::before{content:'';position:absolute;display:block;top:0;left:0;width:40px;height:100%;border-radius:3px;background-color:#d6d6d6;-webkit-box-shadow:inset 0 0 2px rgba(27,38,44,0.3);box-shadow:inset 0 0 2px rgba(27,38,44,0.3);-webkit-transition:0.3s;transition:0.3s}.generator_label-checkbox::after{content:'';position:absolute;display:block;top:0;left:0;width:18px;height:18px;margin-left:2px;margin-top:2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px;background-color:#f5f5f5;-webkit-transition:all 0.3s, -webkit-box-shadow 0.1s;transition:all 0.3s, -webkit-box-shadow 0.1s;transition:all 0.3s, box-shadow 0.1s;transition:all 0.3s, box-shadow 0.1s, -webkit-box-shadow 0.1s}.generator_label-checkbox:hover::after{-webkit-box-shadow:0 0 3px 1px rgba(27,38,44,0.3);box-shadow:0 0 3px 1px rgba(27,38,44,0.3)}.generator_label-checkbox .generator_text-yes{display:none}.generator_input-checkbox:checked+.generator_label-checkbox::before{background-color:#18b0b0}.generator_input-checkbox:checked+.generator_label-checkbox::after{margin-left:20px}.generator_input-checkbox:checked+.generator_label-checkbox .generator_text-yes{display:inline}.generator_input-checkbox:checked+.generator_label-checkbox .generator_text-no{display:none}.generator_label-radio{z-index:0;position:relative;padding:3px 10px;cursor:pointer;-webkit-transition:0.3s;transition:0.3s}.generator_label-radio ~ .generator_label-radio{margin-left:10px}.generator_label-radio::before{content:'';z-index:-1;position:absolute;bottom:0;left:0;width:100%;height:1px;border-radius:0;background-color:#d6d6d6;-webkit-transition:0.3s;transition:0.3s}.generator_label-radio:hover::before{background-color:#333}.generator_input-radio:checked+.generator_label-radio{color:#f5f5f5}.generator_input-radio:checked+.generator_label-radio::before{height:100%;border-radius:3px;background-color:#18b0b0}.generator_input-radio:disabled+.generator_label-radio{color:#f5f5f5}.generator_input-radio:disabled+.generator_label-radio::before{height:100%;border-radius:3px;background-color:#d6d6d6}.generator_text-unit{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:0 5px;font-size:1.05rem;text-align:right}.export{display:-webkit-box;display:-ms-flexbox;display:flex;position:fixed;top:0;right:10%;width:90%;height:100%;max-width:600px;max-height:400px;padding:20px;padding-top:65px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateY(-100%);transform:translateY(-100%);border-radius:0 0 10px 10px;background-color:#fff;-webkit-box-shadow:0 0 6px rgba(51,51,51,0.2);box-shadow:0 0 6px rgba(51,51,51,0.2);-webkit-transition:0.5s;transition:0.5s}.export-open{-webkit-transform:translateY(0);transform:translateY(0)}.export_control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:10px 0;margin-right:20px}.export_btn{display:block;position:relative;padding:5px 12px;padding-left:37px;margin-bottom:15px;border-radius:3px;font-family:'Noto Sans TC', sans-serif;font-weight:300;background-color:transparent;color:#333;-webkit-box-shadow:0 0 2px rgba(51,51,51,0.2);box-shadow:0 0 2px rgba(51,51,51,0.2);-webkit-transition:0.3s;transition:0.3s}.export_btn::before{content:'';z-index:-1;position:absolute;top:0;left:0;width:25px;height:100%;border-radius:3px 0 0 3px;background-color:#0f4c81;-webkit-transition:0.3s;transition:0.3s}.export_btn:hover{color:#f5f5f5}.export_btn:hover::before{width:100%;border-radius:3px}.export_icon{position:absolute;top:50%;left:6px;width:13px;height:13px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateY(-50%);transform:translateY(-50%);color:#f5f5f5}.export_icon::before,.export_icon::after{content:'';display:block;position:absolute;top:50%;left:50%;width:100%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border-top:2px solid currentColor}.export_icon::after{-webkit-transform:translate(-50%, -50%) rotate(90deg);transform:translate(-50%, -50%) rotate(90deg)}.export_container{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:100%;padding:10px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:10px;border:1px solid #b5b5b5}.export_code{width:100%;height:100%;resize:none;border:none;font-family:'Noto Sans TC', sans-serif;font-size:1rem;letter-spacing:0.05em;background-color:transparent;color:#333}.select_button .export_icon{border:2px dashed currentColor}.select_button .export_icon::before,.select_button .export_icon::after{content:none}.clear_button::before{background-color:#ed6663}.clear_button .export_icon{-webkit-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.save_button,.load_button{margin-top:50px}.save_button::before,.load_button::before{background-color:#b5b5b5}.save_button .export_icon,.load_button .export_icon{left:3px;width:20px;height:20px;-webkit-box-sizing:content-box;box-sizing:content-box;background-image:url("../image/save.svg");background-size:20px;background-repeat:no-repeat;background-position:center center}.save_button .export_icon::before,.save_button .export_icon::after,.load_button .export_icon::before,.load_button .export_icon::after{content:none}.load_button{margin-top:0}.load_button .export_icon{background-image:url("../image/load.svg")}.review{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;position:relative;width:100%;height:100vh;padding-top:45px;-webkit-box-sizing:border-box;box-sizing:border-box}.review_container{width:100%;height:100%;overflow-y:auto;z-index:0 !important;position:relative;top:auto !important;bottom:auto !important;width:100%;min-height:100%;margin:0 !important}.review div,.review dl,.review dt,.review dd,.review ul,.review ol,.review li,.review h1,.review h2,.review h3,.review h4,.review h5,.review h6,.review pre,.review code,.review form,.review fieldset,.review legend,.review input,.review textarea,.review p,.review blockquote,.review th,.review td{margin:0;padding:0}.review h1,.review h2,.review h3,.review h4,.review h5,.review h6{font-size:100%;font-weight:normal}.review h2{font-family:Arial, Verdana, sans-serif}.review p{margin-bottom:18px}.review a{cursor:pointer;text-decoration:none;color:#ff574d}.review a img{border:none}.review table{border-collapse:collapse;border-spacing:0}.review th{font-style:normal}.review .clearfix{clear:both}.review .clearfix::after{content:'';clear:both;display:block;width:0px;height:0px;font-size:0px;line-height:0px}.review [class^='pif-']::before,.review [class*=' pif-']::before{position:relative;display:inline-block;top:1px;font-family:'PlurkIconFont' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.review [class^='pif-']::before,.review .pif-emoticon::before,.review .pif-user-add::before,.review .pif-follow_add::before,.review .pif-follow::before,.review .pif-volume::before,.review .pif-media::before{content:'❅';font-size:18px;margin-right:0}.review #layout_content{position:relative;top:auto !important;bottom:auto !important;width:100%;min-height:100%;margin:0 !important;overflow-x:hidden;font-size:13px;background-color:#eeebf0;color:#333;background-position:center center;background-size:cover;background-attachment:fixed}.review #timeline_holder{background:none}.review .timeline-holder{padding:0 !important;overflow:visible;height:386px;position:relative;width:100%;cursor:move}.review .timeline-cnt,.review .timeline-bg,.review .timeline-cnt .block_cnt,.review .timeline-bg .block_bg{position:absolute;height:100% !important;width:100%;left:0;top:0;overflow:visible !important}.review .timeline-cnt .block_cnt{overflow-x:scroll !important;scrollbar-width:none}.review .timeline-cnt .block_cnt::-webkit-scrollbar{width:0}.review .timeline-cnt .block_cnt::after{content:'';display:block;width:2500px;height:1px}.review .timeline-cnt{z-index:2}.review .timeline-cnt .display{width:380px}.review .timeline-cnt .plurk{position:absolute;cursor:pointer}.review .plurk{color:#111;white-space:nowrap}.review .plurk td{vertical-align:top;white-space:nowrap !important}.review .td_img{width:20px}.review .p_img,.review .p_img img{width:20px;height:20px}.review .td_response_count{width:15px;height:30px !important}.review .new .response_count{background:#fb0047;color:#fff}.review .response_count{padding:1px 4px;font-weight:bold;background-color:rgba(0,0,0,0.1);color:#fff}.review .plurk_cnt{position:relative;padding:2px 0 0;font-weight:normal;line-height:1.3;-webkit-box-shadow:1px 1px 3px -3px #000;box-shadow:1px 1px 3px -3px #000;background-color:#fff;color:#111}.review .plurk_cnt.new6{-webkit-transition:background-color 0s;transition:background-color 0s;background-color:#ffff99}.review .plurk_cnt.new5{background-color:#ffffaa}.review .plurk_cnt.new4{background-color:#ffffbb}.review .plurk_cnt.new3{background-color:#ffffcc}.review .plurk_cnt.new2{background-color:#ffffdd}.review .plurk_cnt.new1{background-color:#ffffee}.review .timeline-cnt .display table{width:100%}.review .timeline-cnt .plurk .time{position:absolute;bottom:7px;left:9px;-webkit-transform:scale(0.95);transform:scale(0.95);-webkit-transform-origin:left;transform-origin:left;font-size:12px}.review .timeline-cnt .plurk .time a{color:#afb8cc}.review .td_qual{width:0%;padding:2px 5px 2px 5px}.review .name{color:#111;font-weight:bold;text-decoration:none}.review .name:hover{text-decoration:underline}.review .q_replurks{background:#3b8610}.review .qualifier{padding:0 3px 0 3px;color:#fff;margin:0 3px 0 4px;border-radius:3px}.review .q_replurks i{font-size:12px;margin-left:2px}.review .porn-icon{display:inline-block;margin:0 4px 0 1px}.review .porn-icon::before{content:'';position:relative;top:6px;left:0;width:20px;height:20px;margin-top:-6px;line-height:0;border-radius:50%;background-color:#ff3600}.review .porn-icon::after{content:'R18';position:relative;top:-1px;left:-18px;font-size:9px;letter-spacing:0;color:#fff}.review .td_cnt{width:100%;padding:2px 5px 5px 0}.review .text_holder{position:relative;min-width:48px;white-space:normal !important;background:none}.review .timeline-cnt .plurk .text_holder{width:180px;height:auto;min-height:1.3em;white-space:normal;overflow:hidden !important}.review .timeline-cnt .display .text_holder{width:100%;max-width:80vw;min-width:180px;height:auto !important;min-height:2em;max-height:none !important;white-space:normal}.review #timeline_holder .plurk .text_holder{max-height:37.210875px}.review .plurk_content a.hashtag,.review .plurk .text_holder a.hashtag{margin:0 0.1em;font-size:0.9em;border-radius:4px;color:#cf682f}.review .plurk_content a.hashtag:hover,.review .plurk .text_holder a.hashtag:hover{margin:auto -0.1em;padding:0.05em 0.2em;text-decoration:none;background-color:#cf682f;color:white;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.25);box-shadow:0 1px 1px rgba(0,0,0,0.25)}.review .emoticon,.review .emoticon_my,.review .emo_campaign,.review .emoticons_campaign{vertical-align:top}.review .plurk a.ex_link{color:#0435d2;text-decoration:none}.review .plurk a.ex_link:hover{text-decoration:underline}.review .plurk a.meta{position:relative;display:block;margin:1px 4px 4px 0px;padding:4px;cursor:pointer;overflow:hidden;border:none;border:#e5ebfb 1px solid;border:rgba(33,83,210,0.08) 1px solid;border-radius:7px;background:#f6f8fe;background:rgba(33,83,210,0.04);color:#2153d2}.review .plurk a.meta img{float:left;height:48px;max-width:80px;margin:0 5px 0 0;border-radius:5px}.review .plurk a.meta:hover{text-decoration:none;border:#d4dff7 1px solid;border:rgba(33,83,210,0.12) 1px solid;background:#edf1fc;background:rgba(33,83,210,0.08)}.review .plurk a.pictureservices{position:relative;display:inline-block;max-width:200px;margin:1px 2px 4px 0px;overflow:hidden;cursor:pointer;vertical-align:text-top;border:none;border-radius:5px}.review .plurk a.pictureservices:hover{text-decoration:none}.review .plurk a.pictureservices img{display:block;max-width:240px;height:64px}.review .plurk a.pictureservices:hover img{-webkit-filter:brightness(90%);filter:brightness(90%)}.review .manager::after{content:'';clear:both;display:block;height:0}.review .timeline-cnt .plurk .manager{display:none}.review .link_extend .manager,.review .plurk_box .manager{display:block !important}.review .manager{float:right;margin-top:4px;padding:3px 4px 0;color:#afb8cc}.review .manager>a{display:inline-block;margin-left:12px;padding:2px 5px 3px;cursor:pointer;text-decoration:none !important;border-radius:3px;color:#afb8cc}.review .manager>a.gift{margin-left:10px}.review .manager>a:hover{color:#fff !important;background:#3667a5 !important}.review .manager .mute-off:hover{background:#000 !important}.review .manager .replurk-off:hover{background:#45b03f !important}.review .manager .like-off:hover{background:#e8443d !important}.review .manager .mark-off:hover{background:#5abac5 !important}.review .timeline-bg .block_bg .bottom_start,.review .timeline-timeshow{position:absolute;padding:0 4px;font-size:12px;bottom:-8px;white-space:nowrap}.review .timeline-bg{z-index:1}.review .bottom-line{z-index:-100;position:absolute;bottom:-1px;width:100%;height:2px;overflow:hidden;background-color:#fff}.review .bottom_start{background:#fff;color:#ccc;border-radius:5px}.review .timeline-holder .loading-div{position:absolute;top:50%;margin-top:-100px;width:100%;text-align:center;padding:0}.review .timeline-holder .loading-div .cnt{padding:0 !important}.review .timeline-holder .timeline-bg .block_bg .loading-div{width:auto;right:100px}.review .timeline-timeshow{z-index:1;border-radius:5px;background:#ff574d;color:#fff}.review #time_show{z-index:1;position:absolute;margin-top:-9px;padding:0 4px;font-size:11px;white-space:nowrap;border-radius:5px}.review #time_show span{color:#fff}.review .evening,.review .night,.review .day,.review .morning{background:#ff574d}.review .browse_button{position:absolute;z-index:5000;top:167px}.review .browse_button_last{opacity:0 !important}.review .browse_button_last:hover{opacity:1 !important}.review .browse_button .cmp_arrow_right,.review .browse_button .cmp_arrow_left{color:#ff574d;font-size:56px}.review .browse_button .cmp_arrow_right::before{content:'→';font-family:'Potta One', cursive !important}.review .browse_button .cmp_arrow_left::before{content:'←';font-family:'Potta One', cursive !important}.review .browse_button .cmp_back_to_today{font-size:12px;line-height:18px;margin-top:10px;background:#ff574d;color:#fff;border-radius:10px;position:absolute;margin-left:11px;padding:0px 9px}.review .cmp_back_to_today::before{content:'←';font-family:'Potta One', cursive !important;position:absolute;color:#ff574d;margin-left:-19px;margin-top:4px}.review .browse_button div{border:none !important;cursor:pointer}.review #dynamic_logo{z-index:1;display:inline-block;position:absolute;right:10px;margin-top:12px;cursor:move;white-space:nowrap}.review .timeline_control{z-index:10;position:absolute;width:100%;height:25px;margin-left:16px;margin-top:-46px;pointer-events:none}.review .timeline_control a{border-radius:5px;padding:0 8px;text-decoration:none;text-align:center;line-height:25px;white-space:nowrap}.review .timeline_control a i{opacity:0.8;width:18px;margin-right:4px}.review #timeline_control_holder{position:absolute;bottom:0}.review #updater{position:absolute;bottom:0;left:100%;pointer-events:auto}.review #updater,.review #updater .item,.review #updater .item a{white-space:nowrap;display:inline-block;height:25px;line-height:25px}.review #updater .item a{background:#fff;margin-left:8px;cursor:pointer}.review #updater .item a:hover{background:#ff574d;color:#fff}.review #filter_tab{float:right;pointer-events:auto}.review #filter_tab::after{content:'';clear:both;display:block;height:0}.review #filter_tab li{list-style:none;float:right;clear:both;width:100%}.review #filter_tab a{display:block;height:0;margin-top:0;padding:0 12px;overflow:hidden;cursor:pointer;opacity:0.9;-webkit-transition:height 200ms ease-in, margin-top 200ms ease-in;transition:height 200ms ease-in, margin-top 200ms ease-in;background:#fff;color:#999}.review #filter_tab a:hover{opacity:1}.review #filter_tab a.filter_selected{color:#fff;background:#ff574d}.review #filter_tab:hover a,.review #filter_tab a.filter_selected,.review #filter_tab a.has_unread,.review #filter_tab:hover a.filter_selected,.review #filter_tab:hover a.has_unread{height:25px;margin-top:6px}.review .unread_generic{padding:2px 4px 1px;margin-left:5px;background-color:#f83010;color:#fff !important;border-radius:4px;font-family:arial, sans-serif;font-size:12px}.review #dashboard_holder{width:98%;max-width:980px;min-width:580px;position:relative;margin:0 auto 21px;padding:35px 0 20px}.review #plurk-dashboard{color:#666;overflow:visible;line-height:15px;height:1%}.review #plurk-dashboard h2{display:block;padding:2px;font-size:14px}.review #plurk-dashboard p{margin:0}.review #plurk-dashboard a{color:#e88d43}.review #dashboard_holder a:hover{text-decoration:underline}.review #plurk-dashboard::after,.review .segment-content::after{content:'';clear:both;display:block;width:0;height:0;font-size:0;line-height:0}.review #plurk-dashboard .dash-group-form,.review #plurk-dashboard .dash-group-right{position:relative;float:right;width:67%}.review #plurk-dashboard .dash-group-left{position:relative;float:left;width:33%;padding-right:10px;-webkit-box-sizing:border-box;box-sizing:border-box}.review #plurk-dashboard .dash-segment{float:left;position:relative}.review .dash-segment .segment-content{margin-top:10px;padding:5px;border-radius:10px;background:#fff}.review #plurk-dashboard .dash-segment-post,.review #plurk-dashboard .dash-segment-stats{width:100%}.review .friend_man{display:inline-block;margin:0 2px;padding:6px 10px;overflow:hidden;cursor:pointer !important;-webkit-transition:background-color 300ms;transition:background-color 300ms;font-size:12px;line-height:15px;text-decoration:none !important;white-space:nowrap;border-radius:5px;color:white !important}.review .friend_man::before{width:16px;margin-right:5px;margin-left:-1px;font-size:14px;line-height:14px;text-align:center;vertical-align:top}.review #plurk-dashboard .dash-group-form .segment-content{min-height:96px;overflow:visible}.review .plurkForm::after,.review .input_holder::after,.review .share_list::after,.review .icons_holder::after{content:'';clear:both;display:block;height:0}.review .plurkForm{position:relative;padding:3px 3px 0}.review .submit_img_color{background:#ff574d}.review .submit_img{float:right;width:80px;height:38px;margin-left:6px;cursor:pointer;font-size:25px;line-height:38px;text-align:center;border:none;border-radius:5px;color:#fff}.review .input_holder{float:none;width:auto;overflow:hidden;border:#eee 1px solid;border-color:rgba(0,0,0,0.1);border-radius:8px;background:#fff}.review .qual_holder{position:relative !important;padding:3px;font-size:24px}.review .dd_img{cursor:pointer}.review .m_qualifier{position:relative;padding:3px 6px 4px;border-radius:5px;line-height:100%;background-color:#ccc;color:#fff}.review .m_qualifier i::before{top:0;font-size:16px;line-height:16px}.review .pif-dropdown::before{content:'▼'}.review .textarea_holder{float:none;width:auto;overflow:hidden}.review .textarea_holder textarea{display:block;clear:none;width:100%;height:37px;padding:0 0 0 2px !important;margin:0 !important;resize:none;outline:none;font-family:inherit;font-size:25px;font-weight:inherit;line-height:37px;border:0;-webkit-box-shadow:none;box-shadow:none;border-radius:7px;background:#fff}.review .icons_holder{float:left;margin:4px 0 4px;overflow:hidden;font-size:12px}.review .icons_holder li{position:relative;float:left;width:32px;margin:4px 6px 0 0;cursor:pointer;font-size:26px;line-height:32px;text-align:center}.review .icons_holder .pif-emoticon::before,.review .icons_holder .pif-media::before,.review .icons_holder .pif-sync::before,.review .icons_holder .pif-anynomous::before,.review .icons_holder .pif-privacy::before{font-size:26px}.review .icons_holder .pif-emoticon{color:#fcd254}.review .icons_holder .pif-emoticon:hover{color:#e7b237}.review .icons_holder .pif-media{color:#8bcfd6}.review .icons_holder .pif-media:hover{color:#7ab1b7}.review .icons_holder .pif-sync{color:#96cb84}.review .icons_holder .pif-sync:hover{color:#81ac72}.review .icons_holder .pif-anynomous{color:#a98ab8}.review .icons_holder .pif-anynomous:hover{color:#997aa8}.review .icons_holder .pif-privacy{color:#f4cb35}.review .icons_holder .pif-privacy:hover{color:#e7b237}.review .plurk_to,.review .plurkForm .whispers_hint,.review .priv,.review .plurk_schedule{float:right;font-size:13px;line-height:17px;opacity:0.6;margin-top:6px;text-align:right}.review .char_updater{clear:both;font-size:12px;display:block;line-height:18px;opacity:0.75}.review #plurk-dashboard .dash-segment-profile{width:100%}.review #plurk-dashboard .dash-segment-profile #dash-profile{height:86px;position:relative;text-align:left}.review #plurk-dashboard .dash-segment-profile #dash-profile img.profile-pic{position:absolute;width:86px;height:86px;border-radius:8px}.review #plurk-dashboard.own img.profile-pic{cursor:pointer}.review #profile_pic{margin-bottom:5px}.review #plurk-dashboard .dash-segment-profile #dash-profile #full_name{margin-left:92px;padding-top:1px;font-size:17px}.review #plurk-dashboard .dash-segment-profile #dash-profile #full_name .display_name{display:block;margin-bottom:1px;line-height:1.1em}.review #plurk-dashboard .dash-segment-profile #dash-profile #full_name .nick_name{display:block}.review .nick_name{opacity:0.85;font-size:12px}.review #plurk-dashboard .dash-segment-profile #dash-profile .profile-info{position:absolute;bottom:0;margin-left:92px;opacity:0.85}.review #plurk-dashboard .dash-segment-profile #dash-profile .profile-icons{position:absolute;bottom:0;height:20px;right:2px;font-size:0;white-space:nowrap}.review #plurk-dashboard .dash-segment-profile #dash-profile .profile-icons .premium{display:inline-block;margin-left:5px}.review #plurk-dashboard .dash-segment-profile #dash-profile .profile-icons img{width:auto;height:20px}.review #plurk-dashboard .dash-segment-profile #dash-additional-info{padding:5px}.review #plurk-dashboard .dash-segment-profile #dash-additional-info #about_me{padding-bottom:10px;line-height:1.4em}.review #plurk-dashboard .dash-segment-profile #dash-additional-info #location_container,.review #plurk-dashboard .dash-segment-profile #dash-additional-info #relationship_container{margin-top:10px}.review #plurk-dashboard .dash-segment-profile #dash-additional-info #private_plurk{margin-bottom:10px}.review .friend_man.private_plurk{background-color:#207298}.review .friend_man.send_gift{background-color:#e8ad40}.review #plurk-dashboard #dash-stats .dash-stats-karma{float:left;width:37%;min-width:210px;margin:15px 0;text-align:center}.review .karma_hover{position:relative;margin:10px 0 10px 10px;font-family:Georgia, 'Times New Roman', Times, serif;font-size:28px;line-height:30px;white-space:nowrap}.review .karma_hover .karma_red{color:#c60900}.review .karma_hover .karma_green{color:#00ff24}.review .karma_hover #karma_arrow{display:none;margin-top:-8px;font-size:12px;vertical-align:top}.review #plurk-dashboard #dash-stats table{float:none;width:auto;height:72px;overflow:hidden}.review #plurk-dashboard #dash-stats table th{padding:8px 3px 0 0;opacity:0.7;font-size:12px;font-weight:normal;text-align:center;vertical-align:bottom}.review #plurk-dashboard #dash-stats table td{vertical-align:bottom;padding:8px 5px 0 0;color:#333;font-size:15px;width:26%;white-space:nowrap}.review #plurk-dashboard .dash-segment-award{clear:both}.review #plurk-dashboard .dash-segment-award .segment-content{background:none}.review #plurk-dashboard .dash-segment-award .segment-content .award_bar div{float:left;width:39px;height:39px;margin:0 8px 6px 0;cursor:default;font-weight:bold;text-align:center}.review .cmp_9{width:39px;height:39px;font-size:1px;background:transparent url("../image/award.png") 0 -2420px no-repeat}.review #plurk-dashboard .link_arrow{display:block;margin-top:10px;margin-left:10px;font-size:11px;text-align:left}.review #plurk-dashboard .link_arrow i{margin-right:5px}.review .pif-arrow-points::before{font-size:15px;margin-right:0}.review #plurk-dashboard #dash-friends-pics,.review #plurk-dashboard #dash-fans-pics{margin:10px 0 0 0}.review .show_all_friends,.review .show_mutual_friends{float:left;margin:0 15px 5px 0}.review .friend_holder{clear:both}.review .friend_holder ul li{margin:5px 2px;float:left}.review .friend_holder img{width:35px;height:35px;border:0}.review #plurk-dashboard .dash-segment-friends{width:49.3%;margin-right:1.4%}.review #plurk-dashboard .dash-segment-friends #dash-friends #friend_managment{margin-top:5px;text-align:center}.review .friend_man.add_friend,.review .friend_man.accpet{background-color:#7aa716}.review .friend_man.add_friend:hover,.review .friend_man.accpet:hover{background-color:#6a9706}.review #plurk-dashboard .dash-segment-fans{width:49.3%}.review #plurk-dashboard .dash-segment-fans #dash-fans #fan_managment{margin-top:5px;text-align:center}.review .friend_man.unfollow,.review .friend_man.add_follow,.review .friend_man.add-as-fan{background-color:#207298}.review .friend_man.unfollow:hover,.review .friend_man.add_follow:hover,.review .friend_man.add-as-fan:hover{background-color:#106288}.review #form_holder{background:#fff;-webkit-box-shadow:1px 1px 3px -3px #000;box-shadow:1px 1px 3px -3px #000}.review .plurk_box{z-index:50;position:absolute}.review .plurkForm::after,.review .input_holder::after,.review .share_list::after,.review .icons_holder::after{content:'';clear:both;height:0;display:block}.review .plurk_box .mini_form{padding:4px 3px 2px;font-weight:normal;border-top:#eee 1px solid;background-color:#fff}.review .plurkForm{position:relative;padding:3px 3px 0}.review .plurkForm.mini-mode .input_holder,.review .mini_form .input_holder{border-radius:6px}.review .input_holder{float:none;width:auto;overflow:hidden;border:#eee 1px solid;border-color:rgba(0,0,0,0.1);border-radius:8px;background:#fff}.review .qual_holder{position:relative !important;padding:3px;font-size:24px}.review .plurkForm.mini-mode .qual_holder,.review .mini_form .qual_holder{padding:1px 1px 0;font-size:12px}.review #form_holder .qual_holder{color:black}.review .m_qualifier{position:relative;padding:3px 6px 4px;line-height:100%;border-radius:5px;background-color:#ccc;color:#fff}.review .dd_img{cursor:pointer}.review .plurkForm.mini-mode .m_qualifier,.review .mini_form .m_qualifier{padding:3px 6px 2px}.review .pif-dropdown::before{content:'▼'}.review .m_qualifier i::before{top:0;font-size:16px;line-height:16px}.review .mini_form .m_qualifier i::before{top:1px;font-size:12px;line-height:10px}.review .textarea_holder{float:none;width:auto;overflow:hidden}.review .textarea_holder textarea{display:block;clear:none;width:100%;height:37px;margin:0 !important;padding:0 0 0 2px !important;outline:none;resize:none;font-family:inherit;font-size:25px;line-height:37px;border:0;border-radius:7px;background:#fff;-webkit-box-shadow:none;box-shadow:none}.review .plurkForm.mini-mode .textarea_holder textarea,.review .mini_form .textarea_holder textarea{height:19px;font-size:12px;line-height:19px;border-radius:4px}.review .icons_holder{float:left;margin:4px 0 4px;overflow:hidden;font-size:12px}.review .plurkForm.mini-mode .icons_holder,.review .mini_form .icons_holder{margin:1px 0 3px}.review .icons_holder li{position:relative;float:left;width:32px;margin:4px 6px 0 0;cursor:pointer;font-size:26px;line-height:32px;text-align:center}.review .plurkForm.mini-mode .icons_holder li,.review .mini_form .icons_holder li{width:26px;margin:1px 1px 0 0;font-size:16px;line-height:24px}.review .plurkForm.mini-mode .icons_holder .pif-emoticon::after,.review .mini_form .icons_holder .pif-emoticon::after{width:12px;height:12px;border-radius:6px;background:#333;margin:-19px 0 0 7px}.review .icons_holder .pif-emoticon{color:#fcd254}.review .icons_holder .pif-media{color:#8bcfd6}.review .plurkForm.mini-mode .icons_holder .pif-emoticon::before,.review .plurkForm.mini-mode .icons_holder .pif-media::before,.review .mini_form .icons_holder .pif-emoticon::before,.review .mini_form .icons_holder .pif-media::before{font-size:20px}.review .plurk_to,.review .plurkForm .whispers_hint,.review .priv,.review .plurk_schedule{float:right;margin-top:6px;opacity:0.6;font-size:13px;line-height:17px;text-align:right}.review .char_updater{clear:both;display:block;opacity:0.75;font-size:12px;line-height:18px}.review .plurkForm.mini-mode .char_updater,.review .mini_form .char_updater{clear:none;float:right;margin:4px 5px 0;color:#999}.review .response_box{position:relative;min-height:260px;overflow:auto;overflow-x:hidden;border-top:#eee 1px solid;background:#fff}.review .button,.review .orange-but{display:inline-block;width:auto;padding:9px 13px;cursor:pointer;outline:none;font-size:13px;font-weight:bold;line-height:1;vertical-align:middle;border:0;border-radius:999px;background:#ff574d;color:#fff;-webkit-box-shadow:none;box-shadow:none}.review .button.small-button{font-size:12px;padding:6px 10px}.review .favorite_count,.review .replurk_count,.review .bookmark_info,.review .private_info{margin:9px 0 4px 10px;color:#fff;float:left}.review .favorite_count{background:#54a4be}.review .favorite_count:hover{background:#4494ae}.review .replurk_count{background:#56b892}.review .replurk_count:hover{background:#46a882}.review .bookmark_info{background:#5abac5}.review .bookmark_info:hover{background:#4a9aa5}.review .private_info{background:#f4ca35}.review .private_info:hover{background:#e4ba25}.review .response-status{clear:both;margin-top:5px;padding:4px 0;font-size:12px}.review .response-status .response-count{height:24px;padding:5px 0 0 10px;font-weight:normal;line-height:24px;background-color:transparent;color:#afb8cc}.review .response-status .response-only-owner{margin-left:10px;opacity:0;-webkit-transform:scale(0.9);transform:scale(0.9);font-weight:normal;vertical-align:top;background:#f5f5f9;color:#afb8cc}.review .response-status:hover .response-only-owner{opacity:1}.review .response-status .response-only-owner:hover{background:#afb8cc;color:#fff}.review .language-large-font .list{font-size:0.93em}.review .plurk_box .list{clear:both;position:relative;height:auto !important;padding:5px 5px}.review .list .plurk{position:relative;margin:3px 0}.review .plurk{white-space:nowrap;color:#111}.review .plurk_box table{width:100%}.review .plurk td{vertical-align:top;white-space:nowrap !important}.review .plurk_cnt{position:relative;padding:2px 0 0;font-weight:normal;line-height:1.3;background-color:#fff;color:#111;-webkit-box-shadow:1px 1px 3px -3px #000;box-shadow:1px 1px 3px -3px #000}.review .list .plurk_cnt{padding-bottom:0px;-webkit-transition:background-color 0s;transition:background-color 0s;border:none;-webkit-box-shadow:none;box-shadow:none}.review .list .td_qual{width:0%}.review .plurk td{vertical-align:top;white-space:nowrap !important}.review .td_qual{width:0%;padding:2px 0 2px 5px}.review .name{font-weight:bold;text-decoration:none}.review .td_cnt{width:100%;padding:2px 5px 5px 0}.review .list .td_cnt{width:100%}.review .text_holder{position:relative;min-width:48px;white-space:normal !important;background:none}.review .list .text_holder{width:100% !important;margin-left:5px;margin-right:5px;white-space:normal !important;word-break:break-word !important}body{height:100vh;overflow:hidden;background-image:linear-gradient(-160deg, #fdfbfb, #ebedee);color:#333;-webkit-transition:0.5s;transition:0.5s}body.dark-mode{color:#f5f5f5}.wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;position:relative;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.no-display{display:none}@media only screen and (max-width: 992px){.header{padding-left:15px}.header_title{padding-left:0;font-size:0}.nav_btn{margin-right:0}.sidebar{margin-left:0}}@media only screen and (max-width: 576px){.nav{position:absolute;-webkit-box-pack:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly;bottom:0;left:0;width:100%;height:30px;margin-right:0;-webkit-transform:translateY(100%);transform:translateY(100%);font-size:1rem;background-image:linear-gradient(160deg, rgba(15,76,129,0.9), rgba(27,38,44,0.9) 300%)}.nav_btn{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:0}.github_button{display:none}.tools{z-index:10;position:absolute;top:0;left:0;width:100%;padding-top:75px;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.tools-open{width:100%;-webkit-transform:translateY(0);transform:translateY(0)}.tools_main{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;width:auto}.tools_bar{width:50px}.export{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;right:auto;left:0;width:100%;max-height:80%;padding-top:85px}.export_control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:0}.export_btn{margin-bottom:10px;margin-right:10px}.export .save_button{margin-top:0}.review{padding-top:75px}.review #plurk-dashboard .dash-group-form,.review #plurk-dashboard .dash-group-right{width:100%;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.review #plurk-dashboard .dash-group-left{width:100%;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.review #plurk-dashboard .dash-segment-friends{width:100%;margin-right:0;-webkit-box-sizing:border-box;box-sizing:border-box}.review #plurk-dashboard .dash-segment-fans{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}} 2 | --------------------------------------------------------------------------------