+
Manage collections
{% for collection in collections | sort(attribute='sort_order') %}
{% call(section) accordion(disabled=collection.is_empty()) %}
{% if section == 'header' %}
@@ -28,7 +29,7 @@
{{ thread.note }}
-
+ {{ bookmark_button(type='thread', id=thread.thread_id, message='Manage…', require_reload=true) }}
|
{% endfor %}
@@ -40,7 +41,7 @@
Posts{{" (no bookmarks)" if not collection.has_posts() else ""}}
{% else %}
{% for post in collection.get_posts() %}
- {{ full_post(post.get_post().get_full_post_view(), no_reply=false, render_sig=false, show_thread_title=true, show_bookmark=true, memo=post.note, bookmark_message="Manage…") }}
+ {{ full_post(post.get_post().get_full_post_view(), no_reply=false, render_sig=false, show_thread_title=true, show_bookmark=true, memo=post.note, bookmark_message="Manage…", reload_after_bookmark=true) }}
{% endfor %}
{% endif %}
{% endcall %}
diff --git a/data/static/css/style.css b/data/static/css/style.css
index 876cc81..459716c 100644
--- a/data/static/css/style.css
+++ b/data/static/css/style.css
@@ -1005,7 +1005,6 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus, select:focus
border-collapse: collapse;
width: 100%;
margin: 10px 0;
- overflow: hidden;
}
.colorful-table tr th {
@@ -1183,7 +1182,6 @@ ul, ol {
box-sizing: border-box;
border: 1px solid black;
margin: 10px 5px;
- overflow: hidden;
}
.accordion.hidden {
@@ -1303,3 +1301,58 @@ footer {
.babycode-guide-list {
border-bottom: 1px dashed;
}
+
+.bookmark-dropdown-inner {
+ position: relative;
+}
+
+.bookmarks-dropdown {
+ background-color: #c1ceb1;
+ border: 1px solid black;
+ border-radius: 4px;
+ box-shadow: 0 0 30px rgba(0, 0, 0, 0.25);
+ position: absolute;
+ right: 0;
+ min-width: 400px;
+ padding: 10px;
+ z-index: 100;
+}
+
+.bookmark-dropdown-item {
+ display: flex;
+ padding: 10px 0;
+ margin: 10px 0;
+ cursor: pointer;
+ border: 1px solid black;
+ border-radius: 4px;
+ color: black;
+ background-color: rgb(177, 206, 204.5);
+}
+.bookmark-dropdown-item:hover {
+ background-color: rgb(192.6, 215.8, 214.6);
+}
+.bookmark-dropdown-item::before {
+ content: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3C%2Fsvg%3E");
+ width: 24px;
+ height: 24px;
+ padding: 0 10px;
+}
+.bookmark-dropdown-item.selected {
+ background-color: #beb1ce;
+}
+.bookmark-dropdown-item.selected:hover {
+ background-color: rgb(203, 192.6, 215.8);
+}
+.bookmark-dropdown-item.selected::before {
+ content: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3Crect%20x%3D%225%22%20y%3D%225%22%20width%3D%2214%22%20height%3D%2214%22%20rx%3D%222%22%20stroke%3D%22none%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E");
+}
+
+.bookmarks-dropdown-header {
+ display: flex;
+ justify-content: space-between;
+}
+
+.bookmark-dropdown-items-container {
+ max-height: 300px;
+ overflow: scroll;
+}
diff --git a/data/static/css/theme-otomotone.css b/data/static/css/theme-otomotone.css
index b8e2fc8..11e3571 100644
--- a/data/static/css/theme-otomotone.css
+++ b/data/static/css/theme-otomotone.css
@@ -1005,7 +1005,6 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus, select:focus
border-collapse: collapse;
width: 100%;
margin: 10px 0;
- overflow: hidden;
}
.colorful-table tr th {
@@ -1183,7 +1182,6 @@ ul, ol {
box-sizing: border-box;
border: 1px solid black;
margin: 10px 5px;
- overflow: hidden;
}
.accordion.hidden {
@@ -1304,6 +1302,61 @@ footer {
border-bottom: 1px dashed;
}
+.bookmark-dropdown-inner {
+ position: relative;
+}
+
+.bookmarks-dropdown {
+ background-color: #9b649b;
+ border: 1px solid black;
+ border-radius: 4px;
+ box-shadow: 0 0 30px rgba(0, 0, 0, 0.25);
+ position: absolute;
+ right: 0;
+ min-width: 400px;
+ padding: 10px;
+ z-index: 100;
+}
+
+.bookmark-dropdown-item {
+ display: flex;
+ padding: 10px 0;
+ margin: 10px 0;
+ cursor: pointer;
+ border: 1px solid black;
+ border-radius: 4px;
+ color: #e6e6e6;
+ background-color: #3c283c;
+}
+.bookmark-dropdown-item:hover {
+ background-color: rgb(109.2, 72.8, 109.2);
+}
+.bookmark-dropdown-item::before {
+ content: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3C%2Fsvg%3E");
+ width: 24px;
+ height: 24px;
+ padding: 0 10px;
+}
+.bookmark-dropdown-item.selected {
+ background-color: #8a5584;
+}
+.bookmark-dropdown-item.selected:hover {
+ background-color: rgb(167.4843049327, 112.9156950673, 161.3067264574);
+}
+.bookmark-dropdown-item.selected::before {
+ content: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3Crect%20x%3D%225%22%20y%3D%225%22%20width%3D%2214%22%20height%3D%2214%22%20rx%3D%222%22%20stroke%3D%22none%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E");
+}
+
+.bookmarks-dropdown-header {
+ display: flex;
+ justify-content: space-between;
+}
+
+.bookmark-dropdown-items-container {
+ max-height: 300px;
+ overflow: scroll;
+}
+
#topnav {
margin-bottom: 10px;
border: 10px solid rgb(40, 40, 40);
diff --git a/data/static/css/theme-peachy.css b/data/static/css/theme-peachy.css
index 89da7f8..93136eb 100644
--- a/data/static/css/theme-peachy.css
+++ b/data/static/css/theme-peachy.css
@@ -1005,7 +1005,6 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus, select:focus
border-collapse: collapse;
width: 100%;
margin: 6px 0;
- overflow: hidden;
}
.colorful-table tr th {
@@ -1183,7 +1182,6 @@ ul, ol {
box-sizing: border-box;
border: 1px solid black;
margin: 6px 3px;
- overflow: hidden;
}
.accordion.hidden {
@@ -1304,6 +1302,61 @@ footer {
border-bottom: 1px dashed;
}
+.bookmark-dropdown-inner {
+ position: relative;
+}
+
+.bookmarks-dropdown {
+ background-color: #f27a5a;
+ border: 1px solid black;
+ border-radius: 16px;
+ box-shadow: 0 0 30px rgba(0, 0, 0, 0.25);
+ position: absolute;
+ right: 0;
+ min-width: 400px;
+ padding: 6px;
+ z-index: 100;
+}
+
+.bookmark-dropdown-item {
+ display: flex;
+ padding: 6px 0;
+ margin: 6px 0;
+ cursor: pointer;
+ border: 1px solid black;
+ border-radius: 16px;
+ color: black;
+ background-color: #f27a5a;
+}
+.bookmark-dropdown-item:hover {
+ background-color: rgb(244.6, 148.6, 123);
+}
+.bookmark-dropdown-item::before {
+ content: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3C%2Fsvg%3E");
+ width: 24px;
+ height: 24px;
+ padding: 0 6px;
+}
+.bookmark-dropdown-item.selected {
+ background-color: #b54444;
+}
+.bookmark-dropdown-item.selected:hover {
+ background-color: rgb(197.978313253, 103.221686747, 103.221686747);
+}
+.bookmark-dropdown-item.selected::before {
+ content: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3Crect%20x%3D%225%22%20y%3D%225%22%20width%3D%2214%22%20height%3D%2214%22%20rx%3D%222%22%20stroke%3D%22none%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E");
+}
+
+.bookmarks-dropdown-header {
+ display: flex;
+ justify-content: space-between;
+}
+
+.bookmark-dropdown-items-container {
+ max-height: 300px;
+ overflow: scroll;
+}
+
#topnav {
border-top-left-radius: 16px;
border-top-right-radius: 16px;
diff --git a/data/static/js/bitties/pyrom-bitty.js b/data/static/js/bitties/pyrom-bitty.js
new file mode 100644
index 0000000..6514c85
--- /dev/null
+++ b/data/static/js/bitties/pyrom-bitty.js
@@ -0,0 +1,64 @@
+const bookmarkMenuHrefTemplate = '/hyperapi/bookmarks-dropdown'
+
+export default class {
+ async showBookmarkMenu(ev, el) {
+ if ((ev.target.dataset.bookmarkId === el.dataset.bookmarkId) && el.childElementCount === 0) {
+ const bookmarkMenuHref = `${bookmarkMenuHrefTemplate}/${ev.target.dataset.bookmarkType}?id=${ev.target.dataset.conceptId}&require_reload=${el.dataset.requireReload}`;
+ const res = await this.api.getHTML(bookmarkMenuHref);
+ if (res.error) {
+ return;
+ }
+ const frag = res.value;
+ el.appendChild(frag);
+ const menu = el.childNodes[0];
+ const bRect = el.getBoundingClientRect()
+ if (bRect.left < window.innerWidth - bRect.right) {
+ menu.style.right = 'unset';
+ }
+ } else if (el.childElementCount > 0) {
+ el.removeChild(el.childNodes[0]);
+ }
+ }
+
+ selectBookmarkCollection(ev, el) {
+ const clicked = ev.target;
+
+ if (clicked === el) {
+ if (clicked.classList.contains('selected')) {
+ clicked.classList.remove('selected');
+ } else {
+ clicked.classList.add('selected');
+ }
+ } else {
+ el.classList.remove('selected');
+ }
+ }
+
+ async saveBookmarks(ev, el) {
+ const bookmarkHref = el.dataset.bookmarkEndpoint;
+ const collection = el.querySelector('.bookmark-dropdown-item.selected');
+ let data = {};
+ if (collection) {
+ data['operation'] = 'move';
+ data['collection_id'] = collection.dataset.collectionId;
+ data['memo'] = el.querySelector('.bookmark-memo-input').value;
+ } else {
+ data['operation'] = 'remove';
+ data['collection_id'] = el.dataset.originallyContainedIn;
+ }
+
+ const options = {
+ method: 'POST',
+ body: JSON.stringify(data),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ }
+ const requireReload = parseInt(el.dataset.requireReload) !== 0;
+ el.remove();
+ await fetch(bookmarkHref, options);
+ if (requireReload) {
+ window.location.reload();
+ }
+ }
+}
diff --git a/sass/_default.scss b/sass/_default.scss
index 4d52b9e..5069734 100644
--- a/sass/_default.scss
+++ b/sass/_default.scss
@@ -18,6 +18,14 @@ $MAIN_BG: color.scale($ACCENT_COLOR, $lightness: -10%, $saturation: -40%) !defau
$BUTTON_COLOR: color.adjust($ACCENT_COLOR, $hue: 90) !default;
$BUTTON_COLOR_2: color.adjust($ACCENT_COLOR, $hue: 180) !default;
+$BUTTON_COLOR_HOVER: color.scale($BUTTON_COLOR, $lightness: 20%) !default;
+$BUTTON_COLOR_ACTIVE: color.scale($BUTTON_COLOR, $lightness: -10%, $saturation: -70%) !default;
+$BUTTON_COLOR_DISABLED: color.scale($BUTTON_COLOR, $lightness: 30%, $saturation: -90%) !default;
+
+$BUTTON_COLOR_2_HOVER: color.scale($BUTTON_COLOR_2, $lightness: 20%) !default;
+$BUTTON_COLOR_2_ACTIVE: color.scale($BUTTON_COLOR_2, $lightness: -10%, $saturation: -70%) !default;
+$BUTTON_COLOR_2_DISABLED: color.scale($BUTTON_COLOR_2, $lightness: 30%, $saturation: -90%) !default;
+
$ACCORDION_COLOR: color.adjust($ACCENT_COLOR, $hue: 140, $lightness: -10%, $saturation: -15%) !default;
$DEFAULT_FONT_COLOR: black !default;
@@ -885,7 +893,7 @@ $colorful_table_margin: $MEDIUM_PADDING $ZERO_PADDING !default;
border-collapse: collapse;
width: 100%;
margin: $colorful_table_margin;
- overflow: hidden;
+ // overflow: hidden;
}
$colorful_table_th_color: $BUTTON_COLOR_2 !default;
@@ -1095,7 +1103,7 @@ $accordion_margin: $MEDIUM_PADDING $SMALL_PADDING !default;
box-sizing: border-box;
border: $accordion_border;
margin: $accordion_margin;
- overflow: hidden;
+ // overflow: hidden;
}
.accordion.hidden {
@@ -1221,3 +1229,79 @@ $babycode_guide_list_border: 1px dashed !default;
.babycode-guide-list {
border-bottom: $babycode_guide_list_border;
}
+
+.bookmark-dropdown-inner {
+ position: relative;
+}
+
+$bookmarks_dropdown_background_color: $ACCENT_COLOR !default;
+$bookmarks_dropdown_border_radius: $DEFAULT_BORDER_RADIUS !default;
+$bookmarks_dropdown_border: $button_border !default;
+$bookmarks_dropdown_shadow: 0 0 30px rgba(0, 0, 0, 0.25) !default;
+$bookmarks_dropdown_min_width: 400px !default;
+$bookmarks_dropdown_padding: $MEDIUM_PADDING !default;
+.bookmarks-dropdown {
+ background-color: $bookmarks_dropdown_background_color;
+ border: $bookmarks_dropdown_border;
+ border-radius: $bookmarks_dropdown_border_radius;
+ box-shadow: $bookmarks_dropdown_shadow;
+ position: absolute;
+ right: 0;
+ min-width: $bookmarks_dropdown_min_width;
+ padding: $bookmarks_dropdown_padding;
+ z-index: 100;
+}
+
+$bookmark_dropdown_item_padding: $MEDIUM_PADDING 0 !default;
+$bookmark_dropdown_item_margin: $MEDIUM_PADDING 0 !default;
+$bookmark_dropdown_item_font_color: $BUTTON_FONT_COLOR !default;
+$bookmark_dropdown_item_background: $BUTTON_COLOR !default;
+$bookmark_dropdown_item_background_hover: $BUTTON_COLOR_HOVER !default;
+$bookmark_dropdown_item_background_selected: $BUTTON_COLOR_2 !default;
+$bookmark_dropdown_item_background_selected_hover: $BUTTON_COLOR_2_HOVER !default;
+$bookmark_dropdown_item_icon_size: 24px !default;
+$bookmark_dropdown_item_icon_padding: 0 $MEDIUM_PADDING !default;
+.bookmark-dropdown-item {
+ display: flex;
+ padding: $bookmark_dropdown_item_padding;
+ margin: $bookmark_dropdown_item_margin;
+ cursor: pointer;
+ border: $button_border;
+ border-radius: $button_border_radius;
+ color: $bookmark_dropdown_item_font_color;
+
+ background-color: $bookmark_dropdown_item_background;
+ &:hover {
+ background-color: $bookmark_dropdown_item_background_hover;
+ }
+
+ &::before {
+ // TODO: un-inline this once the bitty bug is fixed
+ content: url('data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3C%2Fsvg%3E');
+ width: $bookmark_dropdown_item_icon_size;
+ height: $bookmark_dropdown_item_icon_size;
+ padding: $bookmark_dropdown_item_icon_padding;
+ }
+
+ &.selected {
+ background-color: $bookmark_dropdown_item_background_selected;
+ &:hover {
+ background-color: $bookmark_dropdown_item_background_selected_hover;
+ }
+
+ &::before{
+ content: url('data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20x%3D%221.5%22%20y%3D%221.5%22%20width%3D%2221%22%20height%3D%2221%22%20rx%3D%223%22%20stroke%3D%22currentColor%22%20stroke-width%3D%223%22%20fill%3D%22none%22%2F%3E%3Crect%20x%3D%225%22%20y%3D%225%22%20width%3D%2214%22%20height%3D%2214%22%20rx%3D%222%22%20stroke%3D%22none%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E');
+ }
+ }
+}
+
+.bookmarks-dropdown-header {
+ display: flex;
+ justify-content: space-between;
+}
+
+$bookmark_dropdown_items_container_max_height: 300px !default;
+.bookmark-dropdown-items-container {
+ max-height: $bookmark_dropdown_items_container_max_height;
+ overflow: scroll;
+}