[matrix] Add sans-serif font toggle to settings modal
* Add sans serif font toggle * remove unnecessary boolean comparison from setFont Co-authored-by: slice <ryaneft@gmail.com> * Update checkbox title Co-authored-by: slice <ryaneft@gmail.com> * General cleanup of settings system * Apply overflow hidden to modal Co-authored-by: slice <ryaneft@gmail.com>
This commit is contained in:
		
							
								
								
									
										38
									
								
								docs/_static/custom.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								docs/_static/custom.js
									
									
									
									
										vendored
									
									
								
							@@ -3,7 +3,7 @@
 | 
				
			|||||||
let activeModal = null;
 | 
					let activeModal = null;
 | 
				
			||||||
let activeLink = null;
 | 
					let activeLink = null;
 | 
				
			||||||
let bottomHeightThreshold, sections;
 | 
					let bottomHeightThreshold, sections;
 | 
				
			||||||
let settings;
 | 
					let settingsModal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function closeModal(modal) {
 | 
					function closeModal(modal) {
 | 
				
			||||||
  activeModal = null;
 | 
					  activeModal = null;
 | 
				
			||||||
@@ -19,10 +19,29 @@ function openModal(modal) {
 | 
				
			|||||||
  modal.style.removeProperty('display');
 | 
					  modal.style.removeProperty('display');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function updateSetting(element) {
 | 
				
			||||||
 | 
					  localStorage.setItem(element.name, element.checked);
 | 
				
			||||||
 | 
					  if (element.name in settings) {
 | 
				
			||||||
 | 
					    settings[element.name](element.checked);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getBodyClassToggle(className) {
 | 
				
			||||||
 | 
					  function toggleBodyClass(add) {
 | 
				
			||||||
 | 
					    document.body.classList.toggle(className, add);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return toggleBodyClass;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const settings = {
 | 
				
			||||||
 | 
					  useSansFont: getBodyClassToggle('sans')
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
document.addEventListener('DOMContentLoaded', () => {
 | 
					document.addEventListener('DOMContentLoaded', () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bottomHeightThreshold = document.documentElement.scrollHeight - 30;
 | 
					  bottomHeightThreshold = document.documentElement.scrollHeight - 30;
 | 
				
			||||||
  sections = document.querySelectorAll('div.section');
 | 
					  sections = document.querySelectorAll('div.section');
 | 
				
			||||||
  settings = document.querySelector('div#settings.modal')
 | 
					  settingsModal = document.querySelector('div#settings.modal')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const tables = document.querySelectorAll('.py-attribute-table[data-move-to-id]');
 | 
					  const tables = document.querySelectorAll('.py-attribute-table[data-move-to-id]');
 | 
				
			||||||
  tables.forEach(table => {
 | 
					  tables.forEach(table => {
 | 
				
			||||||
@@ -31,6 +50,21 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
				
			|||||||
    // insert ourselves after the element
 | 
					    // insert ourselves after the element
 | 
				
			||||||
    parent.insertBefore(table, element.nextSibling);
 | 
					    parent.insertBefore(table, element.nextSibling);
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Object.entries(settings).forEach(([name, setter]) => {
 | 
				
			||||||
 | 
					    let value = JSON.parse(localStorage.getItem(name));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      setter(value);
 | 
				
			||||||
 | 
					      let element = document.querySelector(`input[name=${name}]`);
 | 
				
			||||||
 | 
					      if (element) {
 | 
				
			||||||
 | 
					        element.checked = value === true;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      console.error(`Failed to apply setting "${name}" With value:`, value);
 | 
				
			||||||
 | 
					      console.error(error);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
window.addEventListener('scroll', () => {
 | 
					window.addEventListener('scroll', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										53
									
								
								docs/_static/style.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								docs/_static/style.css
									
									
									
									
										vendored
									
									
								
							@@ -15,6 +15,10 @@ body {
 | 
				
			|||||||
  padding: 0;
 | 
					  padding: 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body.sans {
 | 
				
			||||||
 | 
					  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
p {
 | 
					p {
 | 
				
			||||||
  margin-bottom: 8px;
 | 
					  margin-bottom: 8px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -63,7 +67,7 @@ div.modal {
 | 
				
			|||||||
  top: 0;
 | 
					  top: 0;
 | 
				
			||||||
  width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
  height: 100%;
 | 
					  height: 100%;
 | 
				
			||||||
  overflow: auto;
 | 
					  overflow: hidden;
 | 
				
			||||||
  background-color: rgba(0,0,0,0.4);
 | 
					  background-color: rgba(0,0,0,0.4);
 | 
				
			||||||
  cursor: pointer;
 | 
					  cursor: pointer;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -93,6 +97,53 @@ div.modal-content > span.close:focus {
 | 
				
			|||||||
  color: #444;
 | 
					  color: #444;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label.toggle {
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  float: right;
 | 
				
			||||||
 | 
					  width: 42px;
 | 
				
			||||||
 | 
					  height: 24px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label.toggle input {
 | 
				
			||||||
 | 
					  opacity: 0;
 | 
				
			||||||
 | 
					  width: 0;
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					span.toggle-slider {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					  top: 0;
 | 
				
			||||||
 | 
					  left: 0;
 | 
				
			||||||
 | 
					  right: 0;
 | 
				
			||||||
 | 
					  bottom: 0;
 | 
				
			||||||
 | 
					  background-color: #ccc;
 | 
				
			||||||
 | 
					  border-radius: 12px;
 | 
				
			||||||
 | 
					  transition: .4s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					span.toggle-slider:before {
 | 
				
			||||||
 | 
					  content: "";
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  left: 3px;
 | 
				
			||||||
 | 
					  top: 3px;
 | 
				
			||||||
 | 
					  width: 18px;
 | 
				
			||||||
 | 
					  height: 18px;
 | 
				
			||||||
 | 
					  border-radius: 50%;
 | 
				
			||||||
 | 
					  transition: .4s;
 | 
				
			||||||
 | 
					  background-color: #fff;
 | 
				
			||||||
 | 
					  box-shadow: 0px 2px 4px rgba(0,0,0,0.54);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label.toggle input:checked + span.toggle-slider {
 | 
				
			||||||
 | 
					  background-color: #2591c4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label.toggle input:checked + span.toggle-slider:before {
 | 
				
			||||||
 | 
					  transform: translateX(18px);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
div.related {
 | 
					div.related {
 | 
				
			||||||
  padding: 10px 10px;
 | 
					  padding: 10px 10px;
 | 
				
			||||||
  width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								docs/_templates/layout.html
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								docs/_templates/layout.html
									
									
									
									
										vendored
									
									
								
							@@ -13,7 +13,7 @@
 | 
				
			|||||||
{%- block rootrellink %}
 | 
					{%- block rootrellink %}
 | 
				
			||||||
  {# Perhaps override the relbar() macro to place this on the right side of the link list? #}
 | 
					  {# Perhaps override the relbar() macro to place this on the right side of the link list? #}
 | 
				
			||||||
  <li class="right"{% if not rellinks %} style="margin-right: 10px"{% endif %}>
 | 
					  <li class="right"{% if not rellinks %} style="margin-right: 10px"{% endif %}>
 | 
				
			||||||
    <a href="javascript:;" title="settings" accesskey="S" onclick="openModal(settings);">settings</a>{{ reldelim2 }}</li>
 | 
					    <a title="settings" accesskey="S" onclick="openModal(settingsModal);">settings</a>{{ reldelim2 }}</li>
 | 
				
			||||||
  {{ super() }}
 | 
					  {{ super() }}
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,11 +25,20 @@
 | 
				
			|||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{%- block content %}
 | 
					{%- block content %}
 | 
				
			||||||
  <div id="settings" class="modal" style="display: none;" onclick="if (event.target == this){ closeModal(settings); }">
 | 
					  <div id="settings" class="modal" style="display: none;" onclick="if (event.target == this){ closeModal(settingsModal); }">
 | 
				
			||||||
    <div class="modal-content">
 | 
					    <div class="modal-content">
 | 
				
			||||||
      <span class="close" onclick="closeModal(settings);" title="Close">×</span>
 | 
					      <span class="close" onclick="closeModal(settingsModal);" title="Close">×</span>
 | 
				
			||||||
      <h1>Settings</h1>
 | 
					      <h1>Settings</h1>
 | 
				
			||||||
      <!-- TODO: ADD OPTIONS HERE -->
 | 
					
 | 
				
			||||||
 | 
					      <div class='setting'>
 | 
				
			||||||
 | 
					        <h3>Use a sans-serif font:
 | 
				
			||||||
 | 
					          <label class="toggle" title="Use a sans serif font? Your system font will be used, falling back to `sans-serif`.">
 | 
				
			||||||
 | 
					            <input type="checkbox" name="useSansFont" onclick="updateSetting(this);">
 | 
				
			||||||
 | 
					            <span class="toggle-slider"></span>
 | 
				
			||||||
 | 
					          </label>
 | 
				
			||||||
 | 
					        </h3>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
  {{ super() }}
 | 
					  {{ super() }}
 | 
				
			||||||
@@ -55,4 +64,4 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    </script>
 | 
					    </script>
 | 
				
			||||||
  {%- endif %}
 | 
					  {%- endif %}
 | 
				
			||||||
{%- endblock %}
 | 
					{%- endblock %}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user