Merge branch 'dev' into websocket_scopes
This commit is contained in:
commit
8c2c0f0440
16 changed files with 1061 additions and 90 deletions
2
README.md
vendored
2
README.md
vendored
|
@ -175,7 +175,7 @@ es | 100% | old
|
||||||
fi | 100% | old
|
fi | 100% | old
|
||||||
fr | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
fr | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||||
it | 84% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
it | 84% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||||
nl | 92% | create_private_message,send_secure_message,send_message,message,old,message_sent,messages,matrix_user_id,private_message_disclaimer,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
nl | 100% |
|
||||||
ru | 72% | cross_posts,cross_post,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
ru | 72% | cross_posts,cross_post,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||||
sv | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
sv | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||||
zh | 70% | cross_posts,cross_post,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
zh | 70% | cross_posts,cross_post,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||||
|
|
2
docker/prod/docker-compose.yml
vendored
2
docker/prod/docker-compose.yml
vendored
|
@ -11,7 +11,7 @@ services:
|
||||||
- lemmy_db:/var/lib/postgresql/data
|
- lemmy_db:/var/lib/postgresql/data
|
||||||
restart: always
|
restart: always
|
||||||
lemmy:
|
lemmy:
|
||||||
image: dessalines/lemmy:v0.6.7
|
image: dessalines/lemmy:v0.6.8
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:8536:8536"
|
- "127.0.0.1:8536:8536"
|
||||||
restart: always
|
restart: always
|
||||||
|
|
2
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/down.sql
vendored
Normal file
2
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/down.sql
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
drop index idx_user_name_lower;
|
||||||
|
drop index idx_user_email_lower;
|
29
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/up.sql
vendored
Normal file
29
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/up.sql
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
-- Add case insensitive username and email uniqueness
|
||||||
|
|
||||||
|
-- An example of showing the dupes:
|
||||||
|
-- select
|
||||||
|
-- max(id) as id,
|
||||||
|
-- lower(name) as lname,
|
||||||
|
-- count(*)
|
||||||
|
-- from user_
|
||||||
|
-- group by lower(name)
|
||||||
|
-- having count(*) > 1;
|
||||||
|
|
||||||
|
-- Delete username dupes, keeping the first one
|
||||||
|
delete
|
||||||
|
from user_
|
||||||
|
where id not in (
|
||||||
|
select min(id)
|
||||||
|
from user_
|
||||||
|
group by lower(name), lower(fedi_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- The user index
|
||||||
|
create unique index idx_user_name_lower on user_ (lower(name));
|
||||||
|
|
||||||
|
-- Email lower
|
||||||
|
create unique index idx_user_email_lower on user_ (lower(email));
|
||||||
|
|
||||||
|
-- Set empty emails properly to null
|
||||||
|
update user_ set email = null where email = '';
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
pub const VERSION: &str = "v0.6.7";
|
pub const VERSION: &str = "v0.6.8";
|
||||||
|
|
902
ui/assets/css/themes/_variables.bootstra_386-tmp.scss
vendored
Normal file
902
ui/assets/css/themes/_variables.bootstra_386-tmp.scss
vendored
Normal file
|
@ -0,0 +1,902 @@
|
||||||
|
//
|
||||||
|
// Variables
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//== Colors
|
||||||
|
//
|
||||||
|
//## Gray and brand colors for use across Bootstrap.
|
||||||
|
|
||||||
|
//// colors from bs-2
|
||||||
|
// Grays
|
||||||
|
// -------------------------
|
||||||
|
$black: #000;
|
||||||
|
$grayDark: #555;
|
||||||
|
$gray: #bbb;
|
||||||
|
$grayLight: #bbb;
|
||||||
|
$white: #FFF;
|
||||||
|
|
||||||
|
|
||||||
|
// Accent colors
|
||||||
|
// -------------------------
|
||||||
|
$blue: #5555Ff;
|
||||||
|
$cyan: #55FFFF;
|
||||||
|
$cyanDark: #00AAAA;
|
||||||
|
$blueDark: #000084;
|
||||||
|
$green: #55FF55;
|
||||||
|
$greenDark: #00AA00;
|
||||||
|
$magenta: #FF55FF;
|
||||||
|
$magentaDark: #AA00AA;
|
||||||
|
$red: #FF5555;
|
||||||
|
$redDark: #AA0000;
|
||||||
|
$yellow: #FEFE54;
|
||||||
|
$brown: #AA5500;
|
||||||
|
$orange: #A85400;
|
||||||
|
$pink: #FE54FE;
|
||||||
|
$purple: #FE5454;
|
||||||
|
|
||||||
|
// end colors
|
||||||
|
|
||||||
|
$gray-base: $gray;
|
||||||
|
$gray-darker: $grayDark;
|
||||||
|
$gray-dark: $grayDark;
|
||||||
|
$gray-light: $grayLight;
|
||||||
|
$gray-lighter: $grayLight;
|
||||||
|
|
||||||
|
$brand-primary: $gray;
|
||||||
|
$brand-primary-bg: $cyanDark;
|
||||||
|
$brand-success: $greenDark;
|
||||||
|
$brand-info: $brown;
|
||||||
|
$brand-warning: $magentaDark;
|
||||||
|
$brand-danger: $redDark;
|
||||||
|
|
||||||
|
|
||||||
|
//== Scaffolding
|
||||||
|
//
|
||||||
|
//## Settings for some of the most global styles.
|
||||||
|
|
||||||
|
//** Background color for `<body>`.
|
||||||
|
$body-bg: $blueDark;
|
||||||
|
//** Global text color on `<body>`.
|
||||||
|
$text-color: $gray-light;
|
||||||
|
|
||||||
|
//** Global textual link color.
|
||||||
|
$link-color: $brand-primary;
|
||||||
|
//** Link hover color set via `darken()` function.
|
||||||
|
$link-hover-color: $white;
|
||||||
|
//** Link hover decoration.
|
||||||
|
$link-hover-decoration: none;
|
||||||
|
|
||||||
|
|
||||||
|
//== Typography
|
||||||
|
//
|
||||||
|
//## Font, line-height, and color for body text, headings, and more.
|
||||||
|
|
||||||
|
$font-family-sans-serif: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||||
|
$font-family-serif: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||||
|
//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
|
||||||
|
$font-family-monospace: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||||
|
$font-family-base: $font-family-sans-serif;
|
||||||
|
|
||||||
|
$baseWidth: 10px;
|
||||||
|
$font-size-base: 18px;
|
||||||
|
$font-size-large: $font-size-base;
|
||||||
|
$font-size-small: $font-size-base;
|
||||||
|
|
||||||
|
$font-size-h1: $font-size-base;
|
||||||
|
$font-size-h2: $font-size-base;
|
||||||
|
$font-size-h3: $font-size-base;
|
||||||
|
$font-size-h4: $font-size-base;
|
||||||
|
$font-size-h5: $font-size-base;
|
||||||
|
$font-size-h6: $font-size-base;
|
||||||
|
|
||||||
|
//** Unit-less `line-height` for use in components like buttons.
|
||||||
|
$baseLineHeight: 19px;
|
||||||
|
$line-height-base: $baseLineHeight;
|
||||||
|
//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
|
||||||
|
$line-height-computed: $line-height-base;
|
||||||
|
|
||||||
|
//** By default, this inherits from the `<body>`.
|
||||||
|
$headings-font-family: inherit;
|
||||||
|
$headings-font-weight: normal;
|
||||||
|
$headings-line-height: $line-height-base;
|
||||||
|
$headings-color: inherit;
|
||||||
|
|
||||||
|
$space: $baseWidth;
|
||||||
|
$halfbaseLineHeight: ($baseLineHeight / 2);
|
||||||
|
$borderWidth: 2px;
|
||||||
|
$baseLineWidth: ($baseLineHeight / 2);
|
||||||
|
$halfSpace: ($baseWidth / 2);
|
||||||
|
$lhsNB: ($baseWidth / 2 + 1);
|
||||||
|
$rhsNB: ($baseWidth / 2 - 1);
|
||||||
|
$lhs: ($lhsNB - ($borderWidth));
|
||||||
|
$rhs: ($rhsNB - ($borderWidth / 2));
|
||||||
|
$tsNB: ($baseLineHeight / 2);
|
||||||
|
$bsNB: $tsNB;
|
||||||
|
$ts: ($tsNB - ($borderWidth / 2));
|
||||||
|
$bs: $ts;
|
||||||
|
$tsMargin: 3px;
|
||||||
|
|
||||||
|
|
||||||
|
//== Iconography
|
||||||
|
//
|
||||||
|
//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
|
||||||
|
|
||||||
|
//** Load fonts from this directory.
|
||||||
|
$icon-font-path: "../fonts/";
|
||||||
|
//** File name for all font files.
|
||||||
|
$icon-font-name: "glyphicons-halflings-regular";
|
||||||
|
//** Element ID within SVG icon file.
|
||||||
|
$icon-font-svg-id: "glyphicons_halflingsregular";
|
||||||
|
|
||||||
|
|
||||||
|
//== Components
|
||||||
|
//
|
||||||
|
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
|
||||||
|
|
||||||
|
$padding-base-vertical: 0px;
|
||||||
|
$padding-base-horizontal: 0px;
|
||||||
|
|
||||||
|
$padding-large-vertical: 0px;
|
||||||
|
$padding-large-horizontal: $halfSpace;
|
||||||
|
|
||||||
|
$padding-small-vertical: 0px;
|
||||||
|
$padding-small-horizontal: 0px;
|
||||||
|
|
||||||
|
$padding-xs-vertical: 0px;
|
||||||
|
$padding-xs-horizontal: 0px;
|
||||||
|
|
||||||
|
$line-height-large: $baseLineHeight;
|
||||||
|
$line-height-small: $baseLineHeight;
|
||||||
|
|
||||||
|
$border-radius-base: 0;
|
||||||
|
$border-radius-large: 0;
|
||||||
|
$border-radius-small: 0;
|
||||||
|
|
||||||
|
//** Global color for active items (e.g., navs or dropdowns).
|
||||||
|
$component-active-color: $white;
|
||||||
|
//** Global background color for active items (e.g., navs or dropdowns).
|
||||||
|
$component-active-bg: $black;
|
||||||
|
|
||||||
|
//** Width of the `border` for generating carets that indicator dropdowns.
|
||||||
|
$caret-width-base: 4px;
|
||||||
|
//** Carets increase slightly in size for larger components.
|
||||||
|
$caret-width-large: 5px;
|
||||||
|
|
||||||
|
|
||||||
|
//== Tables
|
||||||
|
//
|
||||||
|
//## Customizes the `.table` component with basic values, each used across all table variations.
|
||||||
|
|
||||||
|
//** Padding for `<th>`s and `<td>`s.
|
||||||
|
$table-cell-padding: $ts $rhs $bs $lhs;
|
||||||
|
//** Padding for cells in `.table-condensed`.
|
||||||
|
$table-condensed-cell-padding: $ts $rhs $bs $lhs;
|
||||||
|
|
||||||
|
//** Default background color used for all tables.
|
||||||
|
$table-bg: transparent;
|
||||||
|
//** Background color used for `.table-striped`.
|
||||||
|
$table-bg-accent: $black;
|
||||||
|
//** Background color used for `.table-hover`.
|
||||||
|
$table-bg-hover: #f5f5f5;
|
||||||
|
$table-bg-active: $table-bg-hover;
|
||||||
|
|
||||||
|
//** Border color for table and cell borders.
|
||||||
|
$table-border-color: $gray;
|
||||||
|
|
||||||
|
|
||||||
|
//== Buttons
|
||||||
|
//
|
||||||
|
//## For each of Bootstrap's buttons, define text, background and border color.
|
||||||
|
|
||||||
|
$btn-font-weight: normal;
|
||||||
|
|
||||||
|
$btn-default-color: $black;
|
||||||
|
$btn-default-bg: $grayLight;
|
||||||
|
$btn-default-border: $grayLight;
|
||||||
|
|
||||||
|
$btn-primary-color: $black;
|
||||||
|
$btn-primary-bg: $cyanDark;
|
||||||
|
$btn-primary-border: $grayLight;
|
||||||
|
|
||||||
|
$btn-success-color: #fff;
|
||||||
|
$btn-success-bg: $brand-success;
|
||||||
|
$btn-success-border: $btn-success-bg;
|
||||||
|
|
||||||
|
$btn-info-color: #fff;
|
||||||
|
$btn-info-bg: $brand-info;
|
||||||
|
$btn-info-border: $btn-info-bg;
|
||||||
|
|
||||||
|
$btn-warning-color: #fff;
|
||||||
|
$btn-warning-bg: $brand-warning;
|
||||||
|
$btn-warning-border: $btn-warning-bg;
|
||||||
|
|
||||||
|
$btn-danger-color: #fff;
|
||||||
|
$btn-danger-bg: $brand-danger;
|
||||||
|
$btn-danger-border: $btn-danger-bg;
|
||||||
|
|
||||||
|
$btn-link-disabled-color: $gray-light;
|
||||||
|
|
||||||
|
|
||||||
|
//== Forms
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** `<input>` background color
|
||||||
|
$input-bg: $cyanDark;
|
||||||
|
//** `<input disabled>` background color
|
||||||
|
$input-bg-disabled: $gray-lighter;
|
||||||
|
|
||||||
|
//** Text color for `<input>`s
|
||||||
|
$input-color: $white;
|
||||||
|
//** `<input>` border color
|
||||||
|
$input-border: #ccc;
|
||||||
|
|
||||||
|
// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
|
||||||
|
//** Default `.form-control` border radius
|
||||||
|
// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
|
||||||
|
$input-border-radius: $border-radius-base;
|
||||||
|
//** Large `.form-control` border radius
|
||||||
|
$input-border-radius-large: $border-radius-large;
|
||||||
|
//** Small `.form-control` border radius
|
||||||
|
$input-border-radius-small: $border-radius-small;
|
||||||
|
|
||||||
|
//** Border color for inputs on focus
|
||||||
|
$input-border-focus: $black;
|
||||||
|
|
||||||
|
//** Placeholder text color
|
||||||
|
$input-color-placeholder: $black;
|
||||||
|
|
||||||
|
//** Default `.form-control` height
|
||||||
|
$input-height-base: $line-height-computed;
|
||||||
|
//** Large `.form-control` height
|
||||||
|
$input-height-large: $input-height-base;
|
||||||
|
//** Small `.form-control` height
|
||||||
|
$input-height-small: $input-height-base;
|
||||||
|
|
||||||
|
$legend-color: $gray-dark;
|
||||||
|
$legend-border-color: #e5e5e5;
|
||||||
|
|
||||||
|
//** Background color for textual input addons
|
||||||
|
$input-group-addon-bg: $gray-lighter;
|
||||||
|
//** Border color for textual input addons
|
||||||
|
$input-group-addon-border-color: $input-border;
|
||||||
|
|
||||||
|
//** Disabled cursor for form controls and buttons.
|
||||||
|
$cursor-disabled: not-allowed;
|
||||||
|
|
||||||
|
|
||||||
|
//== Dropdowns
|
||||||
|
//
|
||||||
|
//## Dropdown menu container and contents.
|
||||||
|
|
||||||
|
//** Background for the dropdown menu.
|
||||||
|
$dropdown-bg: $gray;
|
||||||
|
//** Dropdown menu `border-color`.
|
||||||
|
$dropdown-border: rgb(0,0,0);
|
||||||
|
//** Dropdown menu `border-color` **for IE8**.
|
||||||
|
$dropdown-fallback-border: #ccc;
|
||||||
|
//** Divider color for between dropdown items.
|
||||||
|
$dropdown-divider-bg: $black;
|
||||||
|
|
||||||
|
//** Dropdown link text color.
|
||||||
|
$dropdown-link-color: $black;
|
||||||
|
//** Hover color for dropdown links.
|
||||||
|
$dropdown-link-hover-color: $gray;
|
||||||
|
//** Hover background for dropdown links.
|
||||||
|
$dropdown-link-hover-bg: $black;
|
||||||
|
|
||||||
|
//** Active dropdown menu item text color.
|
||||||
|
$dropdown-link-active-color: $component-active-color;
|
||||||
|
//** Active dropdown menu item background color.
|
||||||
|
$dropdown-link-active-bg: $component-active-bg;
|
||||||
|
|
||||||
|
//** Disabled dropdown menu item background color.
|
||||||
|
$dropdown-link-disabled-color: $gray-light;
|
||||||
|
|
||||||
|
//** Text color for headers within dropdown menus.
|
||||||
|
$dropdown-header-color: $black;
|
||||||
|
|
||||||
|
//** Deprecated `$dropdown-caret-color` as of v3.1.0
|
||||||
|
$dropdown-caret-color: #000;
|
||||||
|
|
||||||
|
|
||||||
|
//-- Z-index master list
|
||||||
|
//
|
||||||
|
// Warning: Avoid customizing these values. They're used for a bird's eye view
|
||||||
|
// of components dependent on the z-axis and are designed to all work together.
|
||||||
|
//
|
||||||
|
// Note: These variables are not generated into the Customizer.
|
||||||
|
|
||||||
|
$zindex-navbar: 1000;
|
||||||
|
$zindex-dropdown: 1000;
|
||||||
|
$zindex-popover: 1060;
|
||||||
|
$zindex-tooltip: 1070;
|
||||||
|
$zindex-navbar-fixed: 1030;
|
||||||
|
$zindex-modal: 1040;
|
||||||
|
|
||||||
|
|
||||||
|
//== Media queries breakpoints
|
||||||
|
//
|
||||||
|
//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
|
||||||
|
|
||||||
|
// Extra small screen / phone
|
||||||
|
//** Deprecated `$screen-xs` as of v3.0.1
|
||||||
|
$screen-xs: 480px;
|
||||||
|
//** Deprecated `$screen-xs-min` as of v3.2.0
|
||||||
|
$screen-xs-min: $screen-xs;
|
||||||
|
//** Deprecated `$screen-phone` as of v3.0.1
|
||||||
|
$screen-phone: $screen-xs-min;
|
||||||
|
|
||||||
|
// Small screen / tablet
|
||||||
|
//** Deprecated `$screen-sm` as of v3.0.1
|
||||||
|
$screen-sm: 768px;
|
||||||
|
$screen-sm-min: $screen-sm;
|
||||||
|
//** Deprecated `$screen-tablet` as of v3.0.1
|
||||||
|
$screen-tablet: $screen-sm-min;
|
||||||
|
|
||||||
|
// Medium screen / desktop
|
||||||
|
//** Deprecated `$screen-md` as of v3.0.1
|
||||||
|
$screen-md: 992px;
|
||||||
|
$screen-md-min: $screen-md;
|
||||||
|
//** Deprecated `$screen-desktop` as of v3.0.1
|
||||||
|
$screen-desktop: $screen-md-min;
|
||||||
|
|
||||||
|
// Large screen / wide desktop
|
||||||
|
//** Deprecated `$screen-lg` as of v3.0.1
|
||||||
|
$screen-lg: 1200px;
|
||||||
|
$screen-lg-min: $screen-lg;
|
||||||
|
//** Deprecated `$screen-lg-desktop` as of v3.0.1
|
||||||
|
$screen-lg-desktop: $screen-lg-min;
|
||||||
|
|
||||||
|
// So media queries don't overlap when required, provide a maximum
|
||||||
|
$screen-xs-max: ($screen-sm-min - 1);
|
||||||
|
$screen-sm-max: ($screen-md-min - 1);
|
||||||
|
$screen-md-max: ($screen-lg-min - 1);
|
||||||
|
|
||||||
|
|
||||||
|
//== Grid system
|
||||||
|
//
|
||||||
|
//## Define your custom responsive grid.
|
||||||
|
|
||||||
|
//** Number of columns in the grid.
|
||||||
|
$grid-columns: 12;
|
||||||
|
//** Padding between columns. Gets divided in half for the left and right.
|
||||||
|
$grid-gutter-width: ($baseWidth * 2);
|
||||||
|
// Navbar collapse
|
||||||
|
//** Point at which the navbar becomes uncollapsed.
|
||||||
|
$grid-float-breakpoint: $screen-sm-min;
|
||||||
|
//** Point at which the navbar begins collapsing.
|
||||||
|
$grid-float-breakpoint-max: ($grid-float-breakpoint);
|
||||||
|
|
||||||
|
|
||||||
|
//== Container sizes
|
||||||
|
//
|
||||||
|
//## Define the maximum width of `.container` for different screen sizes.
|
||||||
|
|
||||||
|
// Small screen / tablet
|
||||||
|
$container-tablet: (720px + $grid-gutter-width);
|
||||||
|
//** For `$screen-sm-min` and up.
|
||||||
|
$container-sm: $container-tablet;
|
||||||
|
|
||||||
|
// Medium screen / desktop
|
||||||
|
$container-desktop: (940px + $grid-gutter-width);
|
||||||
|
//** For `$screen-md-min` and up.
|
||||||
|
$container-md: $container-desktop;
|
||||||
|
|
||||||
|
// Large screen / wide desktop
|
||||||
|
$container-large-desktop: (1140px + $grid-gutter-width);
|
||||||
|
//** For `$screen-lg-min` and up.
|
||||||
|
$container-lg: $container-large-desktop;
|
||||||
|
|
||||||
|
|
||||||
|
//== Navbar
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
// Basics of a navbar
|
||||||
|
$navbar-height: 0px;
|
||||||
|
$navbar-margin-bottom: $line-height-computed;
|
||||||
|
$navbar-border-radius: $border-radius-base;
|
||||||
|
$navbar-padding-horizontal: ($baseWidth * 2);
|
||||||
|
$navbar-padding-vertical: 0;
|
||||||
|
$navbar-collapse-max-height: 340px;
|
||||||
|
|
||||||
|
$navbar-default-color: $black;
|
||||||
|
$navbar-default-bg: $grayLight;
|
||||||
|
$navbar-default-border: $navbar-default-bg;
|
||||||
|
|
||||||
|
// Navbar links
|
||||||
|
$navbar-default-link-color: $black;
|
||||||
|
$navbar-default-link-hover-color: $white;
|
||||||
|
$navbar-default-link-hover-bg: $black;
|
||||||
|
$navbar-default-link-active-color: $white;
|
||||||
|
$navbar-default-link-active-bg: $black;
|
||||||
|
$navbar-default-link-disabled-color: $gray;
|
||||||
|
$navbar-default-link-disabled-bg: transparent;
|
||||||
|
|
||||||
|
// Navbar brand label
|
||||||
|
$navbar-default-brand-color: $navbar-default-link-color;
|
||||||
|
$navbar-default-brand-hover-color: $navbar-default-brand-color;
|
||||||
|
$navbar-default-brand-hover-bg: transparent;
|
||||||
|
|
||||||
|
// Navbar toggle
|
||||||
|
$navbar-default-toggle-hover-bg: #ddd;
|
||||||
|
$navbar-default-toggle-icon-bar-bg: #888;
|
||||||
|
$navbar-default-toggle-border-color: #ddd;
|
||||||
|
|
||||||
|
|
||||||
|
// Inverted navbar
|
||||||
|
// Reset inverted navbar basics
|
||||||
|
$navbar-inverse-color: $gray;
|
||||||
|
$navbar-inverse-bg: $black;
|
||||||
|
$navbar-inverse-border: $navbar-inverse-bg;
|
||||||
|
|
||||||
|
// Inverted navbar links
|
||||||
|
$navbar-inverse-link-color: $gray-light;
|
||||||
|
$navbar-inverse-link-hover-color: $black;
|
||||||
|
$navbar-inverse-link-hover-bg: $grayLight;
|
||||||
|
$navbar-inverse-link-active-color: $white;
|
||||||
|
$navbar-inverse-link-active-bg: $grayDark;
|
||||||
|
$navbar-inverse-link-disabled-color: $gray;
|
||||||
|
$navbar-inverse-link-disabled-bg: transparent;
|
||||||
|
|
||||||
|
// Inverted navbar brand label
|
||||||
|
$navbar-inverse-brand-color: $navbar-inverse-link-color;
|
||||||
|
$navbar-inverse-brand-hover-color: #fff;
|
||||||
|
$navbar-inverse-brand-hover-bg: transparent;
|
||||||
|
|
||||||
|
// Inverted navbar toggle
|
||||||
|
$navbar-inverse-toggle-hover-bg: $grayLight;
|
||||||
|
$navbar-inverse-toggle-icon-bar-bg: #fff;
|
||||||
|
$navbar-inverse-toggle-border-color: #333;
|
||||||
|
|
||||||
|
|
||||||
|
//== Navs
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//=== Shared nav styles
|
||||||
|
$nav-link-padding: 0 $baseWidth;
|
||||||
|
$nav-link-hover-bg: $gray-lighter;
|
||||||
|
|
||||||
|
$nav-disabled-link-color: $gray-light;
|
||||||
|
$nav-disabled-link-hover-color: $gray-light;
|
||||||
|
|
||||||
|
//== Tabs
|
||||||
|
$nav-tabs-border-color: #ddd;
|
||||||
|
|
||||||
|
$nav-tabs-link-hover-border-color: $gray-lighter;
|
||||||
|
|
||||||
|
$nav-tabs-active-link-hover-bg: $black;
|
||||||
|
$nav-tabs-active-link-hover-color: $white;
|
||||||
|
|
||||||
|
$nav-tabs-justified-active-link-border-color: $body-bg;
|
||||||
|
|
||||||
|
//== Pills
|
||||||
|
$nav-pills-border-radius: $border-radius-base;
|
||||||
|
$nav-pills-active-link-hover-bg: $component-active-bg;
|
||||||
|
$nav-pills-active-link-hover-color: $component-active-color;
|
||||||
|
|
||||||
|
|
||||||
|
//== Pagination
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$pagination-color: $black;
|
||||||
|
$pagination-bg: $gray;
|
||||||
|
$pagination-border: #ddd;
|
||||||
|
|
||||||
|
$pagination-hover-color: $link-hover-color;
|
||||||
|
$pagination-hover-bg: $gray-lighter;
|
||||||
|
$pagination-hover-border: #ddd;
|
||||||
|
|
||||||
|
$pagination-active-color: #fff;
|
||||||
|
$pagination-active-bg: $brand-primary;
|
||||||
|
$pagination-active-border: $brand-primary;
|
||||||
|
|
||||||
|
$pagination-disabled-color: $gray-light;
|
||||||
|
$pagination-disabled-bg: #fff;
|
||||||
|
$pagination-disabled-border: #ddd;
|
||||||
|
|
||||||
|
|
||||||
|
//== Pager
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$pager-bg: $pagination-bg;
|
||||||
|
$pager-border: $pagination-border;
|
||||||
|
$pager-border-radius: 0;
|
||||||
|
|
||||||
|
$pager-hover-bg: $pagination-hover-bg;
|
||||||
|
|
||||||
|
$pager-active-bg: $pagination-active-bg;
|
||||||
|
$pager-active-color: $pagination-active-color;
|
||||||
|
|
||||||
|
$pager-disabled-color: $pagination-disabled-color;
|
||||||
|
|
||||||
|
|
||||||
|
//== Jumbotron
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$jumbotron-padding: ($ts) ($rhs + $baseWidth) ($bs) ($lhs + $baseWidth);
|
||||||
|
$jumbotron-color: $white;
|
||||||
|
$jumbotron-bg: transparent;
|
||||||
|
$jumbotron-heading-color: inherit;
|
||||||
|
$jumbotron-font-size: $font-size-base;
|
||||||
|
|
||||||
|
|
||||||
|
//== Form states and alerts
|
||||||
|
//
|
||||||
|
//## Define colors for form feedback states and, by default, alerts.
|
||||||
|
|
||||||
|
$state-success-text: $green;
|
||||||
|
$state-success-bg: $greenDark;
|
||||||
|
$state-success-border: $state-success-bg;
|
||||||
|
|
||||||
|
$state-info-text: $yellow;
|
||||||
|
$state-info-bg: $brown;
|
||||||
|
$state-info-border: $state-info-bg;
|
||||||
|
|
||||||
|
$state-warning-text: $magenta;
|
||||||
|
$state-warning-bg: $magentaDark;
|
||||||
|
$state-warning-border: $state-warning-bg;
|
||||||
|
|
||||||
|
$state-danger-text: $red;
|
||||||
|
$state-danger-bg: $black;
|
||||||
|
$state-danger-border: $state-danger-bg;
|
||||||
|
|
||||||
|
|
||||||
|
//== Tooltips
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Tooltip max width
|
||||||
|
$tooltip-max-width: ($baseWidth * 25);
|
||||||
|
//** Tooltip text color
|
||||||
|
$tooltip-color: $white;
|
||||||
|
//** Tooltip background color
|
||||||
|
$tooltip-bg: $grayDark;
|
||||||
|
$tooltip-opacity: 1;
|
||||||
|
|
||||||
|
//** Tooltip arrow width
|
||||||
|
$tooltip-arrow-width: 0px;
|
||||||
|
//** Tooltip arrow color
|
||||||
|
$tooltip-arrow-color: $tooltip-bg;
|
||||||
|
|
||||||
|
|
||||||
|
//== Popovers
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Popover body background color
|
||||||
|
$popover-bg: $gray;
|
||||||
|
//** Popover maximum width
|
||||||
|
$popover-max-width: ($baseWidth * 20);
|
||||||
|
//** Popover border color
|
||||||
|
$popover-border-color: rgb(0,0,0);
|
||||||
|
//** Popover fallback border color
|
||||||
|
$popover-fallback-border-color: #ccc;
|
||||||
|
|
||||||
|
//** Popover title background color
|
||||||
|
$popover-title-bg: $greenDark;
|
||||||
|
|
||||||
|
//** Popover arrow width
|
||||||
|
$popover-arrow-width: 10px;
|
||||||
|
//** Popover arrow color
|
||||||
|
$popover-arrow-color: $popover-bg;
|
||||||
|
|
||||||
|
//** Popover outer arrow width
|
||||||
|
$popover-arrow-outer-width: ($popover-arrow-width + 1);
|
||||||
|
//** Popover outer arrow color
|
||||||
|
$popover-arrow-outer-color: $popover-border-color;
|
||||||
|
//** Popover outer arrow fallback color
|
||||||
|
$popover-arrow-outer-fallback-color: $popover-fallback-border-color;
|
||||||
|
|
||||||
|
|
||||||
|
//== Labels
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Default label background color
|
||||||
|
$label-default-bg: $gray-light;
|
||||||
|
//** Primary label background color
|
||||||
|
$label-primary-bg: $brand-primary-bg;
|
||||||
|
//** Success label background color
|
||||||
|
$label-success-bg: $brand-success;
|
||||||
|
//** Info label background color
|
||||||
|
$label-info-bg: $brand-info;
|
||||||
|
//** Warning label background color
|
||||||
|
$label-warning-bg: $brand-warning;
|
||||||
|
//** Danger label background color
|
||||||
|
$label-danger-bg: $brand-danger;
|
||||||
|
|
||||||
|
//** Default label text color
|
||||||
|
$label-color: #fff;
|
||||||
|
//** Default text color of a linked label
|
||||||
|
$label-link-hover-color: #fff;
|
||||||
|
|
||||||
|
|
||||||
|
//== Modals
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Padding applied to the modal body
|
||||||
|
$modal-inner-padding: 0 $baseWidth;
|
||||||
|
|
||||||
|
//** Padding applied to the modal title
|
||||||
|
$modal-title-padding: 0 $baseWidth;
|
||||||
|
//** Modal title line-height
|
||||||
|
$modal-title-line-height: $line-height-base;
|
||||||
|
|
||||||
|
//** Background color of modal content area
|
||||||
|
$modal-content-bg: $gray;
|
||||||
|
//** Modal content border color
|
||||||
|
$modal-content-border-color: rgb(0,0,0);
|
||||||
|
//** Modal content border color **for IE8**
|
||||||
|
$modal-content-fallback-border-color: #999;
|
||||||
|
|
||||||
|
//** Modal backdrop background color
|
||||||
|
$modal-backdrop-bg: #000;
|
||||||
|
//** Modal backdrop opacity
|
||||||
|
// $modal-backdrop-opacity: @include 5;
|
||||||
|
//** Modal header border color
|
||||||
|
$modal-header-border-color: #e5e5e5;
|
||||||
|
//** Modal footer border color
|
||||||
|
$modal-footer-border-color: $modal-header-border-color;
|
||||||
|
|
||||||
|
$modal-lg: 900px;
|
||||||
|
$modal-md: 600px;
|
||||||
|
$modal-sm: 300px;
|
||||||
|
|
||||||
|
|
||||||
|
//== Alerts
|
||||||
|
//
|
||||||
|
//## Define alert colors, border radius, and padding.
|
||||||
|
|
||||||
|
$alert-padding: $line-height-base ($baseWidth * 2);
|
||||||
|
$alert-border-radius: $border-radius-base;
|
||||||
|
$alert-link-font-weight: normal;
|
||||||
|
|
||||||
|
$alert-success-bg: $state-success-bg;
|
||||||
|
$alert-success-text: $state-success-text;
|
||||||
|
$alert-success-border: $state-success-border;
|
||||||
|
|
||||||
|
$alert-info-bg: $state-info-bg;
|
||||||
|
$alert-info-text: $state-info-text;
|
||||||
|
$alert-info-border: $state-info-border;
|
||||||
|
|
||||||
|
$alert-warning-bg: $state-warning-bg;
|
||||||
|
$alert-warning-text: $state-warning-text;
|
||||||
|
$alert-warning-border: $state-warning-border;
|
||||||
|
|
||||||
|
$alert-danger-bg: $state-danger-bg;
|
||||||
|
$alert-danger-text: $state-danger-text;
|
||||||
|
$alert-danger-border: $state-danger-border;
|
||||||
|
|
||||||
|
|
||||||
|
//== Progress bars
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Background color of the whole progress component
|
||||||
|
$progress-bg: $black;
|
||||||
|
//** Progress bar text color
|
||||||
|
$progress-bar-color: $black;
|
||||||
|
//** Variable for setting rounded corners on progress bar.
|
||||||
|
$progress-border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
//** Default progress bar color
|
||||||
|
$progress-bar-bg: $brand-primary;
|
||||||
|
//** Success progress bar color
|
||||||
|
$progress-bar-success-bg: $brand-success;
|
||||||
|
//** Warning progress bar color
|
||||||
|
$progress-bar-warning-bg: $brand-warning;
|
||||||
|
//** Danger progress bar color
|
||||||
|
$progress-bar-danger-bg: $brand-danger;
|
||||||
|
//** Info progress bar color
|
||||||
|
$progress-bar-info-bg: $brand-info;
|
||||||
|
|
||||||
|
|
||||||
|
//== List group
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Background color on `.list-group-item`
|
||||||
|
$list-group-bg: $gray;
|
||||||
|
//** `.list-group-item` border color
|
||||||
|
$list-group-border: #ddd;
|
||||||
|
//** List group border radius
|
||||||
|
$list-group-border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
//** Background color of single list items on hover
|
||||||
|
$list-group-hover-bg: $black;
|
||||||
|
//** Text color of active list items
|
||||||
|
$list-group-active-color: $component-active-color;
|
||||||
|
//** Background color of active list items
|
||||||
|
$list-group-active-bg: $component-active-bg;
|
||||||
|
//** Border color of active list elements
|
||||||
|
$list-group-active-border: $list-group-active-bg;
|
||||||
|
//** Text color for content within active list items
|
||||||
|
$list-group-active-text-color: $component-active-color;
|
||||||
|
|
||||||
|
//** Text color of disabled list items
|
||||||
|
$list-group-disabled-color: $gray-dark;
|
||||||
|
//** Background color of disabled list items
|
||||||
|
$list-group-disabled-bg: $gray-lighter;
|
||||||
|
//** Text color for content within disabled list items
|
||||||
|
$list-group-disabled-text-color: $list-group-disabled-color;
|
||||||
|
|
||||||
|
$list-group-link-color: $black;
|
||||||
|
$list-group-link-hover-color: $list-group-link-color;
|
||||||
|
$list-group-link-heading-color: #333;
|
||||||
|
|
||||||
|
|
||||||
|
//== Panels
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$panel-bg: $gray;
|
||||||
|
$panel-body-padding: 0 $rhsNB 0 $lhsNB;
|
||||||
|
$panel-heading-padding: 0 $rhsNB 0 $lhsNB;
|
||||||
|
$panel-footer-padding: $panel-heading-padding;
|
||||||
|
$panel-border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
//** Border color for elements within panels
|
||||||
|
$panel-inner-border: #ddd;
|
||||||
|
$panel-footer-bg: #f5f5f5;
|
||||||
|
|
||||||
|
$panel-default-text: $white;
|
||||||
|
$panel-default-border: #ddd;
|
||||||
|
$panel-default-heading-bg: $grayDark;
|
||||||
|
|
||||||
|
$panel-primary-text: $white;
|
||||||
|
$panel-primary-border: $brand-primary;
|
||||||
|
$panel-primary-heading-bg: $cyanDark;
|
||||||
|
|
||||||
|
$panel-success-text: $state-success-text;
|
||||||
|
$panel-success-border: $state-success-border;
|
||||||
|
$panel-success-heading-bg: $state-success-bg;
|
||||||
|
|
||||||
|
$panel-info-text: $state-info-text;
|
||||||
|
$panel-info-border: $state-info-border;
|
||||||
|
$panel-info-heading-bg: $state-info-bg;
|
||||||
|
|
||||||
|
$panel-warning-text: $state-warning-text;
|
||||||
|
$panel-warning-border: $state-warning-border;
|
||||||
|
$panel-warning-heading-bg: $state-warning-bg;
|
||||||
|
|
||||||
|
$panel-danger-text: $state-danger-text;
|
||||||
|
$panel-danger-border: $state-danger-border;
|
||||||
|
$panel-danger-heading-bg: $state-danger-bg;
|
||||||
|
|
||||||
|
|
||||||
|
//== Thumbnails
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Padding around the thumbnail image
|
||||||
|
$thumbnail-padding: 4px;
|
||||||
|
//** Thumbnail background color
|
||||||
|
$thumbnail-bg: $body-bg;
|
||||||
|
//** Thumbnail border color
|
||||||
|
$thumbnail-border: #ddd;
|
||||||
|
//** Thumbnail border radius
|
||||||
|
$thumbnail-border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
//** Custom text color for thumbnail captions
|
||||||
|
$thumbnail-caption-color: $text-color;
|
||||||
|
//** Padding around the thumbnail caption
|
||||||
|
$thumbnail-caption-padding: 9px;
|
||||||
|
|
||||||
|
|
||||||
|
//== Wells
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$well-bg: $greenDark;
|
||||||
|
$well-border: $well-bg;
|
||||||
|
|
||||||
|
|
||||||
|
//== Badges
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$badge-color: $black;
|
||||||
|
//** Linked badge text color on hover
|
||||||
|
$badge-link-hover-color: #fff;
|
||||||
|
$badge-bg: $gray-light;
|
||||||
|
|
||||||
|
//** Badge text color in active nav link
|
||||||
|
$badge-active-color: $link-color;
|
||||||
|
//** Badge background color in active nav link
|
||||||
|
$badge-active-bg: $black;
|
||||||
|
|
||||||
|
$badge-font-weight: normal;
|
||||||
|
$badge-line-height: $line-height-base;
|
||||||
|
$badge-border-radius: 0;
|
||||||
|
|
||||||
|
|
||||||
|
//== Breadcrumbs
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$breadcrumb-padding-vertical: 8px;
|
||||||
|
$breadcrumb-padding-horizontal: 15px;
|
||||||
|
//** Breadcrumb background color
|
||||||
|
$breadcrumb-bg: #f5f5f5;
|
||||||
|
//** Breadcrumb text color
|
||||||
|
$breadcrumb-color: #ccc;
|
||||||
|
//** Text color of current page in the breadcrumb
|
||||||
|
$breadcrumb-active-color: $gray-light;
|
||||||
|
//** Textual separator for between breadcrumb elements
|
||||||
|
$breadcrumb-separator: "/";
|
||||||
|
|
||||||
|
|
||||||
|
//== Carousel
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$carousel-text-shadow: none;
|
||||||
|
|
||||||
|
$carousel-control-color: #fff;
|
||||||
|
$carousel-control-width: 15%;
|
||||||
|
$carousel-control-opacity: 1;
|
||||||
|
$carousel-control-font-size: $font-size-base;
|
||||||
|
|
||||||
|
$carousel-indicator-active-bg: #fff;
|
||||||
|
$carousel-indicator-border-color: #fff;
|
||||||
|
|
||||||
|
$carousel-caption-color: #fff;
|
||||||
|
|
||||||
|
|
||||||
|
//== Close
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$close-font-weight: normal;
|
||||||
|
$close-color: #000;
|
||||||
|
$close-text-shadow: none;
|
||||||
|
|
||||||
|
|
||||||
|
//== Code
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
$code-color: #c7254e;
|
||||||
|
$code-bg: #f9f2f4;
|
||||||
|
|
||||||
|
$kbd-color: #fff;
|
||||||
|
$kbd-bg: #333;
|
||||||
|
|
||||||
|
$pre-bg: #f5f5f5;
|
||||||
|
$pre-color: $gray-dark;
|
||||||
|
$pre-border-color: #ccc;
|
||||||
|
$pre-scrollable-max-height: 340px;
|
||||||
|
|
||||||
|
|
||||||
|
//== Type
|
||||||
|
//
|
||||||
|
//##
|
||||||
|
|
||||||
|
//** Horizontal offset for forms and lists.
|
||||||
|
$component-offset-horizontal: 180px;
|
||||||
|
//** Text muted color
|
||||||
|
$text-muted: $gray-dark;
|
||||||
|
//** Abbreviations and acronyms border color
|
||||||
|
$abbr-border-color: $gray-light;
|
||||||
|
//** Headings small color
|
||||||
|
$headings-small-color: $gray-light;
|
||||||
|
//** Blockquote small color
|
||||||
|
$blockquote-small-color: $gray-light;
|
||||||
|
//** Blockquote font size
|
||||||
|
$blockquote-font-size: $font-size-base;
|
||||||
|
//** Blockquote border color
|
||||||
|
$blockquote-border-color: $gray-lighter;
|
||||||
|
//** Page header border color
|
||||||
|
$page-header-border-color: $gray-lighter;
|
||||||
|
//** Width of horizontal description list titles
|
||||||
|
$dl-horizontal-offset: $component-offset-horizontal;
|
||||||
|
//** Horizontal line color.
|
||||||
|
$hr-border: $black;
|
40
ui/assets/css/themes/_variables.i386.scss
vendored
Normal file
40
ui/assets/css/themes/_variables.i386.scss
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
|
||||||
|
$blue: #5555Ff;
|
||||||
|
$cyan: #55FFFF;
|
||||||
|
$green: #55FF55;
|
||||||
|
$indigo: #FF55FF;
|
||||||
|
$red: #FF5555;
|
||||||
|
$yellow: #FEFE54;
|
||||||
|
$orange: #A85400;
|
||||||
|
$pink: #FE54FE;
|
||||||
|
$purple: #FE5454;
|
||||||
|
$primary: #FEFE54;
|
||||||
|
$body-bg: #000084;
|
||||||
|
$gray-300: #bbb;
|
||||||
|
$body-color: $gray-300;
|
||||||
|
$link-hover-color: $white;
|
||||||
|
$font-family-sans-serif: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||||
|
$font-family-monospace: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||||
|
$navbar-dark-color: $gray-300;
|
||||||
|
$navbar-light-brand-color: $gray-300;
|
||||||
|
$success: #00AA00;
|
||||||
|
$danger: #AA0000;
|
||||||
|
$info: #00AAAA;
|
||||||
|
$warning: #AA00AA;
|
||||||
|
$navbar-dark-active-color: $gray-100;
|
||||||
|
$enable-rounded: false;
|
||||||
|
$input-color: $white;
|
||||||
|
$input-bg: rgb(102, 102, 102);
|
||||||
|
$input-disabled-bg: $gray-800;
|
||||||
|
$nav-tabs-link-active-color: $gray-100;
|
||||||
|
$navbar-dark-hover-color: rgba($gray-300, .75);
|
||||||
|
$light: $gray-800;
|
||||||
|
$navbar-light-disabled-color: $gray-800;
|
||||||
|
$navbar-light-active-color: $gray-100;
|
||||||
|
$navbar-light-hover-color: $gray-200;
|
||||||
|
$navbar-light-color: $gray-300;
|
||||||
|
$card-bg: $gray-800;
|
||||||
|
$card-border-color: $white;
|
||||||
|
$input-placeholder-color: $gray-500;
|
||||||
|
$mark-bg: #463b00;
|
||||||
|
$secondary: $gray-900;
|
1
ui/assets/css/themes/i386.min.css
vendored
Normal file
1
ui/assets/css/themes/i386.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
12
ui/assets/css/themes/materia.min.css
vendored
Normal file
12
ui/assets/css/themes/materia.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
ui/package.json
vendored
1
ui/package.json
vendored
|
@ -35,6 +35,7 @@
|
||||||
"markdown-it-emoji": "^1.4.0",
|
"markdown-it-emoji": "^1.4.0",
|
||||||
"moment": "^2.24.0",
|
"moment": "^2.24.0",
|
||||||
"prettier": "^1.18.2",
|
"prettier": "^1.18.2",
|
||||||
|
"reconnecting-websocket": "^4.3.0",
|
||||||
"rxjs": "^6.4.0",
|
"rxjs": "^6.4.0",
|
||||||
"terser": "^4.6.3",
|
"terser": "^4.6.3",
|
||||||
"toastify-js": "^1.6.2",
|
"toastify-js": "^1.6.2",
|
||||||
|
|
4
ui/src/components/comment-node.tsx
vendored
4
ui/src/components/comment-node.tsx
vendored
|
@ -117,7 +117,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
.viewOnly && 'no-click'}`}
|
.viewOnly && 'no-click'}`}
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
className={`btn p-0 ${
|
className={`btn btn-link p-0 ${
|
||||||
node.comment.my_vote == 1 ? 'text-info' : 'text-muted'
|
node.comment.my_vote == 1 ? 'text-info' : 'text-muted'
|
||||||
}`}
|
}`}
|
||||||
onClick={linkEvent(node, this.handleCommentUpvote)}
|
onClick={linkEvent(node, this.handleCommentUpvote)}
|
||||||
|
@ -137,7 +137,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
</div>
|
</div>
|
||||||
{WebSocketService.Instance.site.enable_downvotes && (
|
{WebSocketService.Instance.site.enable_downvotes && (
|
||||||
<button
|
<button
|
||||||
className={`btn p-0 ${
|
className={`btn btn-link p-0 ${
|
||||||
node.comment.my_vote == -1 ? 'text-danger' : 'text-muted'
|
node.comment.my_vote == -1 ? 'text-danger' : 'text-muted'
|
||||||
}`}
|
}`}
|
||||||
onClick={linkEvent(node, this.handleCommentDownvote)}
|
onClick={linkEvent(node, this.handleCommentDownvote)}
|
||||||
|
|
4
ui/src/components/post-listing.tsx
vendored
4
ui/src/components/post-listing.tsx
vendored
|
@ -119,7 +119,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
<div class="listing col-12">
|
<div class="listing col-12">
|
||||||
<div className={`vote-bar mr-2 float-left small text-center`}>
|
<div className={`vote-bar mr-2 float-left small text-center`}>
|
||||||
<button
|
<button
|
||||||
className={`btn p-0 ${
|
className={`btn btn-link p-0 ${
|
||||||
post.my_vote == 1 ? 'text-info' : 'text-muted'
|
post.my_vote == 1 ? 'text-info' : 'text-muted'
|
||||||
}`}
|
}`}
|
||||||
onClick={linkEvent(this, this.handlePostLike)}
|
onClick={linkEvent(this, this.handlePostLike)}
|
||||||
|
@ -137,7 +137,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
<div class={`font-weight-bold text-muted`}>{post.score}</div>
|
<div class={`font-weight-bold text-muted`}>{post.score}</div>
|
||||||
{WebSocketService.Instance.site.enable_downvotes && (
|
{WebSocketService.Instance.site.enable_downvotes && (
|
||||||
<button
|
<button
|
||||||
className={`btn p-0 ${
|
className={`btn btn-link p-0 ${
|
||||||
post.my_vote == -1 ? 'text-danger' : 'text-muted'
|
post.my_vote == -1 ? 'text-danger' : 'text-muted'
|
||||||
}`}
|
}`}
|
||||||
onClick={linkEvent(this, this.handlePostDisLike)}
|
onClick={linkEvent(this, this.handlePostDisLike)}
|
||||||
|
|
141
ui/src/services/WebSocketService.ts
vendored
141
ui/src/services/WebSocketService.ts
vendored
|
@ -41,37 +41,33 @@ import {
|
||||||
UserJoinForm,
|
UserJoinForm,
|
||||||
MessageType,
|
MessageType,
|
||||||
} from '../interfaces';
|
} from '../interfaces';
|
||||||
import { webSocket } from 'rxjs/webSocket';
|
|
||||||
import { Subject } from 'rxjs';
|
|
||||||
import { retryWhen, delay } from 'rxjs/operators';
|
|
||||||
import { UserService } from './';
|
import { UserService } from './';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { toast } from '../utils';
|
import { toast } from '../utils';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
import { share } from 'rxjs/operators';
|
||||||
|
import ReconnectingWebSocket from 'reconnecting-websocket';
|
||||||
|
|
||||||
export class WebSocketService {
|
export class WebSocketService {
|
||||||
private static _instance: WebSocketService;
|
private static _instance: WebSocketService;
|
||||||
public subject: Subject<any>;
|
public ws: ReconnectingWebSocket;
|
||||||
|
public subject: Observable<any>;
|
||||||
|
|
||||||
public site: Site;
|
public site: Site;
|
||||||
public admins: Array<UserView>;
|
public admins: Array<UserView>;
|
||||||
public banned: Array<UserView>;
|
public banned: Array<UserView>;
|
||||||
|
|
||||||
private constructor() {
|
private constructor() {
|
||||||
this.subject = webSocket(wsUri);
|
this.ws = new ReconnectingWebSocket(wsUri);
|
||||||
|
this.ws.onopen = () => {
|
||||||
// Necessary to not keep reconnecting
|
|
||||||
this.subject
|
|
||||||
.pipe(
|
|
||||||
retryWhen(errors =>
|
|
||||||
errors.pipe(
|
|
||||||
delay(1000)
|
|
||||||
// take(999)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.subscribe();
|
|
||||||
|
|
||||||
console.log(`Connected to ${wsUri}`);
|
console.log(`Connected to ${wsUri}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.subject = Observable.create((obs: any) => {
|
||||||
|
this.ws.onmessage = e => {
|
||||||
|
obs.next(JSON.parse(e.data));
|
||||||
|
};
|
||||||
|
}).pipe(share());
|
||||||
|
|
||||||
if (UserService.Instance.user) {
|
if (UserService.Instance.user) {
|
||||||
this.userJoin();
|
this.userJoin();
|
||||||
|
@ -84,245 +80,227 @@ export class WebSocketService {
|
||||||
|
|
||||||
public userJoin() {
|
public userJoin() {
|
||||||
let form: UserJoinForm = { auth: UserService.Instance.auth };
|
let form: UserJoinForm = { auth: UserService.Instance.auth };
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.UserJoin, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.UserJoin, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public login(loginForm: LoginForm) {
|
public login(loginForm: LoginForm) {
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.Login, loginForm));
|
this.ws.send(this.wsSendWrapper(UserOperation.Login, loginForm));
|
||||||
}
|
}
|
||||||
|
|
||||||
public register(registerForm: RegisterForm) {
|
public register(registerForm: RegisterForm) {
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.Register, registerForm));
|
this.ws.send(this.wsSendWrapper(UserOperation.Register, registerForm));
|
||||||
}
|
}
|
||||||
|
|
||||||
public createCommunity(communityForm: CommunityForm) {
|
public createCommunity(communityForm: CommunityForm) {
|
||||||
this.setAuth(communityForm);
|
this.setAuth(communityForm);
|
||||||
this.subject.next(
|
this.ws.send(
|
||||||
this.wsSendWrapper(UserOperation.CreateCommunity, communityForm)
|
this.wsSendWrapper(UserOperation.CreateCommunity, communityForm)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public editCommunity(communityForm: CommunityForm) {
|
public editCommunity(communityForm: CommunityForm) {
|
||||||
this.setAuth(communityForm);
|
this.setAuth(communityForm);
|
||||||
this.subject.next(
|
this.ws.send(
|
||||||
this.wsSendWrapper(UserOperation.EditCommunity, communityForm)
|
this.wsSendWrapper(UserOperation.EditCommunity, communityForm)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public followCommunity(followCommunityForm: FollowCommunityForm) {
|
public followCommunity(followCommunityForm: FollowCommunityForm) {
|
||||||
this.setAuth(followCommunityForm);
|
this.setAuth(followCommunityForm);
|
||||||
this.subject.next(
|
this.ws.send(
|
||||||
this.wsSendWrapper(UserOperation.FollowCommunity, followCommunityForm)
|
this.wsSendWrapper(UserOperation.FollowCommunity, followCommunityForm)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public listCommunities(form: ListCommunitiesForm) {
|
public listCommunities(form: ListCommunitiesForm) {
|
||||||
this.setAuth(form, false);
|
this.setAuth(form, false);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.ListCommunities, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.ListCommunities, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getFollowedCommunities() {
|
public getFollowedCommunities() {
|
||||||
let form: GetFollowedCommunitiesForm = { auth: UserService.Instance.auth };
|
let form: GetFollowedCommunitiesForm = { auth: UserService.Instance.auth };
|
||||||
this.subject.next(
|
this.ws.send(
|
||||||
this.wsSendWrapper(UserOperation.GetFollowedCommunities, form)
|
this.wsSendWrapper(UserOperation.GetFollowedCommunities, form)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public listCategories() {
|
public listCategories() {
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.ListCategories, {}));
|
||||||
this.wsSendWrapper(UserOperation.ListCategories, {})
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public createPost(postForm: PostForm) {
|
public createPost(postForm: PostForm) {
|
||||||
this.setAuth(postForm);
|
this.setAuth(postForm);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.CreatePost, postForm));
|
this.ws.send(this.wsSendWrapper(UserOperation.CreatePost, postForm));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getPost(form: GetPostForm) {
|
public getPost(form: GetPostForm) {
|
||||||
this.setAuth(form, false);
|
this.setAuth(form, false);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetPost, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetPost, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getCommunity(form: GetCommunityForm) {
|
public getCommunity(form: GetCommunityForm) {
|
||||||
this.setAuth(form, false);
|
this.setAuth(form, false);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetCommunity, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetCommunity, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public createComment(commentForm: CommentForm) {
|
public createComment(commentForm: CommentForm) {
|
||||||
this.setAuth(commentForm);
|
this.setAuth(commentForm);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.CreateComment, commentForm));
|
||||||
this.wsSendWrapper(UserOperation.CreateComment, commentForm)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public editComment(commentForm: CommentForm) {
|
public editComment(commentForm: CommentForm) {
|
||||||
this.setAuth(commentForm);
|
this.setAuth(commentForm);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.EditComment, commentForm));
|
||||||
this.wsSendWrapper(UserOperation.EditComment, commentForm)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public likeComment(form: CommentLikeForm) {
|
public likeComment(form: CommentLikeForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.CreateCommentLike, form));
|
||||||
this.wsSendWrapper(UserOperation.CreateCommentLike, form)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public saveComment(form: SaveCommentForm) {
|
public saveComment(form: SaveCommentForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.SaveComment, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.SaveComment, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getPosts(form: GetPostsForm) {
|
public getPosts(form: GetPostsForm) {
|
||||||
this.setAuth(form, false);
|
this.setAuth(form, false);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetPosts, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetPosts, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public likePost(form: CreatePostLikeForm) {
|
public likePost(form: CreatePostLikeForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.CreatePostLike, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.CreatePostLike, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public editPost(postForm: PostForm) {
|
public editPost(postForm: PostForm) {
|
||||||
this.setAuth(postForm);
|
this.setAuth(postForm);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.EditPost, postForm));
|
this.ws.send(this.wsSendWrapper(UserOperation.EditPost, postForm));
|
||||||
}
|
}
|
||||||
|
|
||||||
public savePost(form: SavePostForm) {
|
public savePost(form: SavePostForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.SavePost, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.SavePost, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public banFromCommunity(form: BanFromCommunityForm) {
|
public banFromCommunity(form: BanFromCommunityForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.BanFromCommunity, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.BanFromCommunity, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public addModToCommunity(form: AddModToCommunityForm) {
|
public addModToCommunity(form: AddModToCommunityForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.AddModToCommunity, form));
|
||||||
this.wsSendWrapper(UserOperation.AddModToCommunity, form)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public transferCommunity(form: TransferCommunityForm) {
|
public transferCommunity(form: TransferCommunityForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.TransferCommunity, form));
|
||||||
this.wsSendWrapper(UserOperation.TransferCommunity, form)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public transferSite(form: TransferSiteForm) {
|
public transferSite(form: TransferSiteForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.TransferSite, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.TransferSite, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public banUser(form: BanUserForm) {
|
public banUser(form: BanUserForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.BanUser, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.BanUser, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public addAdmin(form: AddAdminForm) {
|
public addAdmin(form: AddAdminForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.AddAdmin, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.AddAdmin, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getUserDetails(form: GetUserDetailsForm) {
|
public getUserDetails(form: GetUserDetailsForm) {
|
||||||
this.setAuth(form, false);
|
this.setAuth(form, false);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetUserDetails, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetUserDetails, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getReplies(form: GetRepliesForm) {
|
public getReplies(form: GetRepliesForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetReplies, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetReplies, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getUserMentions(form: GetUserMentionsForm) {
|
public getUserMentions(form: GetUserMentionsForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetUserMentions, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetUserMentions, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public editUserMention(form: EditUserMentionForm) {
|
public editUserMention(form: EditUserMentionForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.EditUserMention, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.EditUserMention, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getModlog(form: GetModlogForm) {
|
public getModlog(form: GetModlogForm) {
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetModlog, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetModlog, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public createSite(siteForm: SiteForm) {
|
public createSite(siteForm: SiteForm) {
|
||||||
this.setAuth(siteForm);
|
this.setAuth(siteForm);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.CreateSite, siteForm));
|
this.ws.send(this.wsSendWrapper(UserOperation.CreateSite, siteForm));
|
||||||
}
|
}
|
||||||
|
|
||||||
public editSite(siteForm: SiteForm) {
|
public editSite(siteForm: SiteForm) {
|
||||||
this.setAuth(siteForm);
|
this.setAuth(siteForm);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.EditSite, siteForm));
|
this.ws.send(this.wsSendWrapper(UserOperation.EditSite, siteForm));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getSite() {
|
public getSite() {
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.GetSite, {}));
|
this.ws.send(this.wsSendWrapper(UserOperation.GetSite, {}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public search(form: SearchForm) {
|
public search(form: SearchForm) {
|
||||||
this.setAuth(form, false);
|
this.setAuth(form, false);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.Search, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.Search, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public markAllAsRead() {
|
public markAllAsRead() {
|
||||||
let form = {};
|
let form = {};
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.MarkAllAsRead, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.MarkAllAsRead, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public saveUserSettings(userSettingsForm: UserSettingsForm) {
|
public saveUserSettings(userSettingsForm: UserSettingsForm) {
|
||||||
this.setAuth(userSettingsForm);
|
this.setAuth(userSettingsForm);
|
||||||
this.subject.next(
|
this.ws.send(
|
||||||
this.wsSendWrapper(UserOperation.SaveUserSettings, userSettingsForm)
|
this.wsSendWrapper(UserOperation.SaveUserSettings, userSettingsForm)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public deleteAccount(form: DeleteAccountForm) {
|
public deleteAccount(form: DeleteAccountForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.DeleteAccount, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.DeleteAccount, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public passwordReset(form: PasswordResetForm) {
|
public passwordReset(form: PasswordResetForm) {
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.PasswordReset, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.PasswordReset, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public passwordChange(form: PasswordChangeForm) {
|
public passwordChange(form: PasswordChangeForm) {
|
||||||
this.subject.next(this.wsSendWrapper(UserOperation.PasswordChange, form));
|
this.ws.send(this.wsSendWrapper(UserOperation.PasswordChange, form));
|
||||||
}
|
}
|
||||||
|
|
||||||
public createPrivateMessage(form: PrivateMessageForm) {
|
public createPrivateMessage(form: PrivateMessageForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.CreatePrivateMessage, form));
|
||||||
this.wsSendWrapper(UserOperation.CreatePrivateMessage, form)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public editPrivateMessage(form: EditPrivateMessageForm) {
|
public editPrivateMessage(form: EditPrivateMessageForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.EditPrivateMessage, form));
|
||||||
this.wsSendWrapper(UserOperation.EditPrivateMessage, form)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public getPrivateMessages(form: GetPrivateMessagesForm) {
|
public getPrivateMessages(form: GetPrivateMessagesForm) {
|
||||||
this.setAuth(form);
|
this.setAuth(form);
|
||||||
this.subject.next(
|
this.ws.send(this.wsSendWrapper(UserOperation.GetPrivateMessages, form));
|
||||||
this.wsSendWrapper(UserOperation.GetPrivateMessages, form)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private wsSendWrapper(op: UserOperation, data: MessageType) {
|
private wsSendWrapper(op: UserOperation, data: MessageType) {
|
||||||
let send = { op: UserOperation[op], data: data };
|
let send = { op: UserOperation[op], data: data };
|
||||||
console.log(send);
|
console.log(send);
|
||||||
return send;
|
return JSON.stringify(send);
|
||||||
}
|
}
|
||||||
|
|
||||||
private setAuth(obj: any, throwErr: boolean = true) {
|
private setAuth(obj: any, throwErr: boolean = true) {
|
||||||
|
@ -335,6 +313,5 @@ export class WebSocketService {
|
||||||
}
|
}
|
||||||
|
|
||||||
window.onbeforeunload = () => {
|
window.onbeforeunload = () => {
|
||||||
WebSocketService.Instance.subject.unsubscribe();
|
WebSocketService.Instance.ws.close();
|
||||||
WebSocketService.Instance.subject = null;
|
|
||||||
};
|
};
|
||||||
|
|
2
ui/src/utils.ts
vendored
2
ui/src/utils.ts
vendored
|
@ -318,6 +318,7 @@ export function getMomentLanguage(): string {
|
||||||
|
|
||||||
export const themes = [
|
export const themes = [
|
||||||
'litera',
|
'litera',
|
||||||
|
'materia',
|
||||||
'minty',
|
'minty',
|
||||||
'solar',
|
'solar',
|
||||||
'united',
|
'united',
|
||||||
|
@ -327,6 +328,7 @@ export const themes = [
|
||||||
'sketchy',
|
'sketchy',
|
||||||
'vaporwave',
|
'vaporwave',
|
||||||
'vaporwave-dark',
|
'vaporwave-dark',
|
||||||
|
'i386',
|
||||||
];
|
];
|
||||||
|
|
||||||
export function setTheme(theme: string = 'darkly') {
|
export function setTheme(theme: string = 'darkly') {
|
||||||
|
|
2
ui/src/version.ts
vendored
2
ui/src/version.ts
vendored
|
@ -1 +1 @@
|
||||||
export const version: string = 'v0.6.7';
|
export const version: string = 'v0.6.8';
|
||||||
|
|
5
ui/yarn.lock
vendored
5
ui/yarn.lock
vendored
|
@ -3921,6 +3921,11 @@ realm-utils@^1.0.9:
|
||||||
app-root-path "^1.3.0"
|
app-root-path "^1.3.0"
|
||||||
mkdirp "^0.5.1"
|
mkdirp "^0.5.1"
|
||||||
|
|
||||||
|
reconnecting-websocket@^4.3.0:
|
||||||
|
version "4.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.3.0.tgz#aaefbc7629a89450aa45324b89aec2276e728cc5"
|
||||||
|
integrity sha512-3eaHIEVYB9Zb0GfYy1xdEHKJLA2JaawAegByZ1AZ8Npb3AiRgUN5l89cvE2H+pHTsFcoC88t32ky9qET6DJ75Q==
|
||||||
|
|
||||||
regenerate-unicode-properties@^8.1.0:
|
regenerate-unicode-properties@^8.1.0:
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
|
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
|
||||||
|
|
Loading…
Reference in a new issue