🔀 Merge pull request #319 from Lissy93/FIX/ui-editor-improvments

[FIX] UI Bug Fixes for Interactive Editor + Style Refactor
Fixes #301
Fixes #310 
Fixes #311 
Fixes #312
This commit is contained in:
Alicia Sykes 2021-11-06 22:54:36 +00:00 committed by GitHub
commit 30530cb65b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 518 additions and 254 deletions

14
.github/.lycheeexclude vendored Normal file
View File

@ -0,0 +1,14 @@
# Ignore list, for automated broken link checking
https://fonts.gstatic.com/**
https://metager.org/meta/**
https://developers.cloudflare.com/**
http://localhost**
https://localhost**
http://192.168**
https://192.168**
file:///github/**
http://[dashy-location]**
https://[dashy-location]**
**.local/**

View File

@ -1,5 +1,11 @@
# Changelog
## 💄 1.9.1 - Editor and Theming Fixes and Improvements [PR #319](https://github.com/Lissy93/dashy/pull/319)
- Bug fixes for interactive editor: #310, #311, #312
- Adds option to modify text font through the UI
- Adds two new themes: One Dark and Adventure
- Theming stylesheet refactor, better inheritance
## 🐳 1.9.0 - Alpha of Dashy-Lite Docker Container [PR #306](https://github.com/Lissy93/dashy/pull/306)
- Create an Alpine-based container, that serves the built app up with plain NGINX, instead of Node.
- This is much lighter, but doesn't currently support any of the server-side actions (like status-checks, and writing changes to disk)

142
.github/pr-badge.yml vendored
View File

@ -1,77 +1,6 @@
# Config file for pull-request-badge. See: https://pullrequestbadge.com/ by @stefanbuck
# Dynamically inserts status badges into PR description, based on certain conditions
# Checks if the required sections are missing
- label: Missing
message: Category
color: '#f25265'
when: $payload.pull_request.body.includes('Category') === false
- label: Missing
message: Overview
color: '#f25265'
when: $payload.pull_request.body.includes('Overview') === false
- label: Missing
message: Quality Checklist
color: '#f25265'
when: $payload.pull_request.body.includes('Code Quality Checklist') === false
- label: Description
message: Incomplete
color: '#f25265'
when: $payload.pull_request.body.length < 25
- label: Missing
message: Label
color: '#f25265'
when: $labels.length == 0
# Show note when task list has unfinished items
- label: Notice
message: Unchecked Tasks
when: $payload.pull_request.body.includes('- [ ] ')
color: '#f25265'
# Show badge indicating PR status
- label: Status
message: ✏️ Draft
when: $isDraft
color: '#ffa933'
- label: Status
message: 🧱 Work in Progress
when: $payload.pull_request.title.includes('WIP')
color: '#29e3f4'
- label: Status
message: ✅ Ready
color: '#3ef963'
when: $labels.includes('🔀 Ready for Merge')
# Add size label based on very large or tiny PRs
- label: PR Size
message: Extra Large
color: '#f9833e'
when: '$additions > 1000'
- label: PR Size
message: Large
color: '#f4b546'
when: '$additions > 500 && $additions < 1000'
- label: PR Size
message: Medium
color: '#f3ff59'
when: '$additions > 10 && $additions < 500'
- label: PR Size
message: Quick
color: '#3eef8b'
when: '$additions < 10'
# Show PR number, to destination and from destination
- label: '#$prNumber'
message: '$payload.pull_request.user.login /$payload.pull_request.head.ref → $payload.repository.full_name'
color: '#ab5afc'
url: 'https://github.com/$slug/tree/$branchName'
# Show total code added minus deleted
- label: New Code
message: 'Commits: $payload.pull_request.commits | Files Changed: $payload.pull_request.changed_files | Additions: $payload.pull_request.additions-$payload.pull_request.deletions'
color: '#dddd00'
# Show submitting user's username and profile link
- label: 💕 Submitted by
message: $payload.pull_request.user.login
@ -125,6 +54,77 @@
color: '#39b0fd'
when: $labels.includes('🌐 Language')
# Add size label based on very large or tiny PRs
- label: PR Size
message: Extra Large
color: '#f9833e'
when: '$additions > 1000'
- label: PR Size
message: Large
color: '#f4b546'
when: '$additions > 500 && $additions < 1000'
- label: PR Size
message: Medium
color: '#f3ff59'
when: '$additions > 10 && $additions < 500'
- label: PR Size
message: Quick
color: '#3eef8b'
when: '$additions < 10'
# Show badge indicating PR status
- label: Status
message: ✏️ Draft
when: $isDraft
color: '#ffa933'
- label: Status
message: 🧱 Work in Progress
when: $payload.pull_request.title.includes('WIP')
color: '#29e3f4'
- label: Status
message: ✅ Ready
color: '#3ef963'
when: $labels.includes('🔀 Ready for Merge')
# Show PR number, to destination and from destination
- label: '#$prNumber'
message: '$payload.pull_request.user.login /$payload.pull_request.head.ref → $payload.repository.full_name'
color: '#ab5afc'
url: 'https://github.com/$slug/tree/$branchName'
# Show total code added minus deleted
- label: New Code
message: 'Commits: $payload.pull_request.commits | Files Changed: $payload.pull_request.changed_files | Additions: $payload.pull_request.additions-$payload.pull_request.deletions'
color: '#dddd00'
# Checks if the required sections are missing
- label: Missing
message: Category
color: '#f25265'
when: $payload.pull_request.body.includes('Category') === false
- label: Missing
message: Overview
color: '#f25265'
when: $payload.pull_request.body.includes('Overview') === false
- label: Missing
message: Quality Checklist
color: '#f25265'
when: $payload.pull_request.body.includes('Code Quality Checklist') === false
- label: Description
message: Incomplete
color: '#f25265'
when: $payload.pull_request.body.length < 25
- label: Missing
message: Label
color: '#f25265'
when: $labels.length == 0
# Show note when task list has unfinished items
- label: Notice
message: Unchecked Tasks
when: $payload.pull_request.body.includes('- [ ] ')
color: '#f25265'
# Show warning, when certain tags are applied
- label: Warning
message: ⛔ Do Not Merge

View File

@ -11,10 +11,15 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Load Excludes
run: |
LYCHEE_EXCLUDE=$(sed -e :a -e 'N;s/\n/ /;ta' .github/.lycheeexclude)
echo "LYCHEE_EXCLUDE=$LYCHEE_EXCLUDE" >> $GITHUB_ENV
- name: Check for Broken Links
uses: lycheeverse/lychee-action@v1.0.8
with:
args: --verbose -a 200,302,304,429 --no-progress **/*.md **/*.html
args: --verbose -a 200,302,304,429 --exclude ${{ env.LYCHEE_EXCLUDE }} --exclude-mail --no-progress **/*.md
env:
GITHUB_TOKEN: ${{secrets.BOT_GITHUB_TOKEN}}
LYCHEE_OUT: .github/broken-link-report.md

View File

@ -65,7 +65,7 @@ If the status is always returning an error, despite the service being online, th
If your service requires requests to include any authorization in the headers, then use the `statusCheckHeaders` property, as described above.
If you are still having issues, it may be because your target application is blocking requests from Dashy's IP. This is a [CORS error](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS), and can be fixed by setting the headers on your target app, to include:
```
Access-Control-Allow-Origin: https://location-of-dashy/
Access-Control-Allow-Origin: https://[dashy-location]/
Vary: Origin
```
If the URL you are checking is not using HTTPS, then you may need to disable the rejection of insecure requests. This can be done by setting `statusCheckAllowInsecure` to true for a given item.

View File

@ -1,8 +1,9 @@
{
"name": "Dashy",
"version": "1.9.0",
"version": "1.9.1",
"license": "MIT",
"main": "server",
"author": "Alicia Sykes <alicia@omg.lol> (https://aliciasykes.com)",
"scripts": {
"start": "node server",
"dev": "vue-cli-service serve",

View File

@ -101,6 +101,7 @@
"export-button": "Export Custom Variables",
"reset-button": "Reset Styles for",
"show-all-button": "Show All Variables",
"change-fonts-button": "Change Fonts",
"save-button": "Save",
"cancel-button": "Cancel",
"saved-toast": "{theme} Updated Successfully",

View File

@ -152,6 +152,7 @@ export default {
}
InfoHandler('Config has succesfully been saved in browser storage', 'Config Update');
this.showToast(this.$t('config-editor.success-msg-local'), true);
this.$store.commit(StoreKeys.SET_EDIT_MODE, false);
},
writeToDisk() {
// 1. Convert JSON into YAML
@ -211,7 +212,7 @@ div.edit-mode-bottom-banner {
/* Main sections */
.edit-banner-section {
padding: 0.5rem;
height: 100%;
height: 90%;
/* Section sub-titles */
p.section-sub-title {
margin: 0;
@ -234,7 +235,7 @@ div.edit-mode-bottom-banner {
grid-template-columns: repeat(2, 1fr);
button {
margin: 0.25rem;
height: fit-content;
height: stretch;
}
p.section-sub-title {
grid-column-start: span 2;

View File

@ -1,13 +1,13 @@
<template>
<div
:class="`collapsable ${checkSpanNum(cols, 'col')} ${checkSpanNum(rows, 'row')}`"
:class="`collapsable ${rowColSpanClass} ${collapseClass}`"
:style="`${color ? 'background: '+color : ''}; ${sanitizeCustomStyles(customStyles)};`"
>
<input
:id="sectionKey"
class="toggle"
type="checkbox"
:checked="getCollapseState()"
:checked="isExpanded"
@change="collapseChanged"
tabIndex="-1"
>
@ -56,6 +56,19 @@ export default {
if (this.isEditMode) return undefined;
return `collapsible-${this.uniqueKey}`;
},
collapseClass() {
return !this.isExpanded ? ' is-collapsed' : 'is-open';
},
rowColSpanClass() {
const { rows, cols, checkSpanNum } = this;
return `${checkSpanNum(cols, 'col')} ${checkSpanNum(rows, 'row')}`;
},
},
data: () => ({
isExpanded: false,
}),
mounted() {
this.isExpanded = this.getCollapseState();
},
methods: {
/* Check that row & column span is valid, and not over the max */
@ -69,29 +82,28 @@ export default {
sanitizeCustomStyles(userCss) {
return userCss ? userCss.replace(/[^a-zA-Z0-9- :;.]/g, '') : '';
},
/* If not already done, then add object structure to local storage */
/* Returns local storage collapse state data, and if not yet set then initialized is */
initialiseStorage() {
const storageKey = localStorageKeys.COLLAPSE_STATE;
/* Initialize function will create and set a blank object to storage */
const initStorage = () => localStorage.setItem(
localStorageKeys.COLLAPSE_STATE, JSON.stringify({}),
);
if (!localStorage[localStorageKeys.COLLAPSE_STATE]) initStorage(); // Initialise if not set
try { // Check storage is valid JSON, and has not been corrupted
JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);
} catch {
const initStorage = () => localStorage.setItem(storageKey, JSON.stringify({}));
// If not yet set, then call initialize
if (!localStorage[storageKey]) {
initStorage();
return {};
}
return JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);
// Otherwise, return value of local storage
return JSON.parse(localStorage[storageKey]);
},
/* If not specified by user, get last state from local storage */
/* If specified by user, return conf collapse state, otherwise check local storage */
getCollapseState() {
if (this.collapsed !== undefined) return !this.collapsed;
const collapseStateObject = this.initialiseStorage();
let collapseState = !this.collapsed;
if (this.collapsed !== undefined) return !this.collapsed; // Check users config
const collapseStateObject = this.initialiseStorage(); // Check local storage
if (collapseStateObject[this.uniqueKey] !== undefined) {
collapseState = collapseStateObject[this.uniqueKey];
return collapseStateObject[this.uniqueKey];
}
return collapseState;
// Nothing specified, return Open
return true;
},
/* When section collapsed, update local storage, to remember for next time */
setCollapseState(id, newState) {
@ -104,9 +116,10 @@ export default {
},
/* Called when collapse state changes, trigger local storage update if needed */
collapseChanged(whatChanged) {
this.isExpanded = whatChanged.srcElement.checked;
if (this.collapseState === undefined) { // Only run, if user hasn't manually set prop
this.initialiseStorage();
this.setCollapseState(this.uniqueKey.toString(), whatChanged.srcElement.checked);
this.setCollapseState(this.uniqueKey.toString(), this.isExpanded);
}
},
openEditModal() {

View File

@ -5,7 +5,7 @@
@contextmenu.prevent
:href="hyperLinkHref"
:target="anchorTarget"
:class="`item ${!icon? 'short': ''} size-${itemSize} ${isAddNew ? 'add-new' : ''}`"
:class="`item ${makeClassList}`"
v-tooltip="getTooltipOptions()"
rel="noopener noreferrer" tabindex="0"
:id="`link-${id}`"
@ -30,8 +30,10 @@
:statusSuccess="statusResponse ? statusResponse.successStatus : undefined"
:statusText="statusResponse ? statusResponse.message : undefined"
/>
<!-- Edit icon (displayed only when in edit mode) -->
<EditModeIcon v-if="isEditMode" class="edit-mode-item" @click="openItemSettings()" />
</a>
<!-- Right-click context menu -->
<ContextMenu
:show="contextMenuOpen && !isAddNew"
v-click-outside="closeContextMenu"
@ -43,6 +45,7 @@
@openMoveItemMenu="openMoveItemMenu"
@openDeleteItem="openDeleteItem"
/>
<!-- Edit and move item menu modals -->
<MoveItemTo v-if="isEditMode" :itemId="id" />
<EditItem v-if="editMenuOpen" :itemId="id"
@closeEditMenu="closeEditMenu"
@ -114,6 +117,14 @@ export default {
accumulatedTarget() {
return this.target || this.appConfig.defaultOpeningMethod || defaultOpeningMethod;
},
/* Based on item props, adjust class names */
makeClassList() {
const {
icon, itemSize, isAddNew, isEditMode,
} = this;
return `size-${itemSize} ${!icon ? 'short' : ''} `
+ `${isAddNew ? 'add-new' : ''} ${isEditMode ? 'is-edit-mode' : ''}`;
},
/* Convert config target value, into HTML anchor target attribute */
anchorTarget() {
if (this.isEditMode) return '_self';
@ -353,10 +364,10 @@ export default {
box-shadow: var(--item-hover-shadow);
background: var(--item-background-hover);
color: var(--item-text-color-hover);
position: relative;
.tile-title span.text {
white-space: pre-wrap;
}
// position: relative;
// .tile-title span.text {
// white-space: pre-wrap;
// }
}
&:focus {
outline: 2px solid var(--primary);
@ -521,13 +532,18 @@ export default {
}
}
/* Adjust positioning of status indicator, when in edit mode */
a.item.is-edit-mode {
&.size-medium .status-indicator { top: 1rem; }
&.size-small .status-indicator { right: 1rem; }
&.size-large .status-indicator { top: 1.5rem; }
}
</style>
<!-- An un-scoped style tag, since tooltip is outside this DOM tree -->
<style lang="scss">
.disabled-link {
pointer-events: none;
}
</style>

View File

@ -64,8 +64,7 @@ export default {
outline: none;
border: none;
border-radius: var(--curve-factor);
-webkit-box-shadow: 1px 1px 2px #232323;
box-shadow: 1px 1px 2px #232323;
box-shadow: var(--nav-link-shadow);
color: var(--nav-link-text-color);
background: var(--nav-link-background-color);
border: 1px solid var(--nav-link-border-color);
@ -74,6 +73,7 @@ export default {
color: var(--nav-link-text-color-hover);
background: var(--nav-link-background-color-hover);
border: 1px solid var(--nav-link-border-color-hover);
box-shadow: var(--nav-link-shadow-hover);
}
}
}

View File

@ -27,22 +27,25 @@
</v-swatches>
<input v-else
:id="`color-input-${colorName}`"
:value="customColors[colorName]"
class="misc-input"
v-model="customColors[colorName]"
:class="`misc-input ${isTextual(colorName, customColors[colorName]) ? 'long-input' : ''}`"
@input="setVariable(colorName, customColors[colorName])"
/>
</div> <!-- End of color list -->
</div>
<!-- More options: Export, Reset, Show all -->
<p @click="showFontVariables" class="action-text-btn show-all-vars-btn">
{{ $t('theme-maker.change-fonts-button') }}
</p>
<p @click="findAllVariableNames" class="action-text-btn show-all-vars-btn">
{{ $t('theme-maker.show-all-button') }}
</p>
<p @click="exportToClipboard" class="action-text-btn">
{{ $t('theme-maker.export-button') }}
</p>
<p @click="resetAndSave" class="action-text-btn">
{{ $t('theme-maker.reset-button') }} '{{ themeToEdit }}'
</p>
<p @click="findAllVariableNames" class="action-text-btn show-all-vars-btn">
{{ $t('theme-maker.show-all-button') }}
</p>
<!-- Save and cancel buttons -->
<div class="action-buttons">
<Button :click="saveChanges">
@ -138,6 +141,13 @@ export default {
});
return data;
},
/* Adds font variables to list */
showFontVariables() {
const currentVariables = this.customColors;
const fonts = ['font-headings', 'font-body', 'font-monospace'];
const fontVariables = this.makeInitialData(fonts);
this.customColors = { ...currentVariables, ...fontVariables };
},
/* Find all available CSS variables for the current applied theme */
findAllVariableNames() {
const availableVariables = Array.from(document.styleSheets)
@ -146,7 +156,7 @@ export default {
((acc, sheet) => ([
...acc,
...Array.from(sheet.cssRules).reduce(
(def, rule) => (rule.selectorText === ':root'
(def, rule) => (rule.selectorText === ':root' || rule.selectorText === 'html'
? [...def, ...Array.from(rule.style).filter(name => name.startsWith('--'))] : def),
[],
),
@ -159,13 +169,25 @@ export default {
/* Returns a complmenting text color for the palete input foreground */
/* White if the color is dark, otherwise black */
getForegroundColor(colorHex) {
/* Converts a 3-digit hex code to a 6-digit hex code (e.g. #f01 --> #ff0011) */
const threeToSix = (hex) => {
let digit = hex;
digit = digit.split('').map((item) => (item === '#' ? item : item + item)).join('');
return digit;
};
/* Converts hex code to RGB (e.g. #ff0011 --> rgb(255,0,0) ) */
const hexToRgb = (hex) => {
const colorParts = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
let hexCode = hex.slice(0, 7);
if (hex.startsWith('#') && hex.length === 4) hexCode = threeToSix(hexCode);
const colorParts = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexCode);
if (!colorParts || colorParts.length < 3) return 'black';
const parse = (index) => parseInt(colorParts[index], 16);
return colorParts ? { r: parse(1), g: parse(2), b: parse(3) } : null;
};
/* Given an RGB value, return the lightness ratio */
const getLightness = (rgb) => (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
if (!colorHex.startsWith('#')) return 'white'; // Not a hex, do nothing
// Convert hex to RGB obj, get lightness, and return opposing color
return getLightness(hexToRgb(colorHex.trim())) < 100 ? 'white' : 'black';
},
/* The contents of the style attribute, to set background and text color of swatch */
@ -179,6 +201,7 @@ export default {
// If value is a dimension, then it aint a color
if ((/rem|px|%/.exec(variableValue))) return false;
const nonColorVariables = [ // Known non-color variables
'--font-headings', '--font-body', '--font-monospace',
'--curve-factor', '--curve-factor-navbar', '--curve-factor-small',
'--dimming-factor', '--scroll-bar-width', '--header-height', '--footer-height',
'--item-group-padding', '--item-shadow', '--item-hover-shadow:', '--item-icon-transform',
@ -189,6 +212,10 @@ export default {
if (nonColorVariables.includes(`--${variableName}`)) return false;
return true; // It must be a color, we'll use the color picker
},
/* Determine if a given key is that of a known font variable, or has a long value */
isTextual(varName, varValue) {
return varName.startsWith('font-') || (varValue && varValue.length > 12);
},
},
};
</script>
@ -202,7 +229,7 @@ div.theme-configurator-wrapper {
right: 1rem;
width: 16rem;
min-height: 12rem;
max-height: 28rem;
max-height: 32rem;
padding: 0.5rem;
z-index: 5;
overflow-y: visible;
@ -218,7 +245,7 @@ div.theme-configurator-wrapper {
}
div.color-row-container {
max-height: 16rem;
max-height: 20rem;
overflow-y: visible;
@extend .scroll-bar;
div.color-row {
@ -250,6 +277,15 @@ div.theme-configurator-wrapper {
box-shadow: inset 0 0 4px 4px #00000080;
outline: none;
}
&.long-input {
cursor: text;
font-style: italic;
font-weight: 200;
padding: 0.5rem 0.2rem;
font-size: 0.75rem;
width: 9rem;
&:hover { box-shadow: none; }
}
}
}

View File

@ -42,6 +42,8 @@
--nav-link-background-color-hover: #607d8b33;
--nav-link-border-color: transparent;
--nav-link-border-color-hover: var(--primary);
--nav-link-shadow: 1px 1px 2px #232323;
--nav-link-shadow-hover: 1px 1px 2px #232323;
// Link items and sections
--item-text-color: var(--primary);
--item-text-color-hover: var(--item-text-color);

View File

@ -1,12 +1,12 @@
html[data-theme='callisto'] {
--primary: #00CCB4;
--background: #141b33;
--background-darker: #060913;
--item-group-background: #0b1021;
--item-background: #141b33;
--item-background-hover: #060913;
--item-background: var(--background);
--item-background-hover: var(--background-darker);
--item-hover-shadow: 0 1px 3px #00ccb4b3, 0 1px 2px #00ccb4bf;
--primary: #00CCB4;
--font-body: 'Inconsolata', 'Georgia', sans-serif;
--font-headings: 'PTMono', 'Courier New', monospace;
}
@ -16,7 +16,7 @@ html[data-theme='thebe'] {
--background-darker: #060913;
--item-group-background: #0b1021;
--item-background: #141b33;
--item-background-hover: #060913;
--item-background-hover: var(--background-darker);
--item-hover-shadow: 0 1px 3px #9660ecb3, 0 1px 2px #9660ecbf;
--primary: #b187f5;
--item-group-outer-background: #9660EC
@ -26,17 +26,17 @@ html[data-theme='thebe'] {
html[data-theme='dracula'] {
--font-headings: 'Allerta Stencil', sans-serif;
--primary: #7a8cc5;
--primary: #98ace9;
--background: #44475a;
--background-darker: #282a36;
--item-group-background: #282a36;
--item-group-background: var(--background-darker);
--item-background: none;
--item-background-hover: #191b22;
--item-shadow: none;
--item-hover-shadow: none;
--settings-text-color: #98ace9;
--config-settings-color: #98ace9;
--item-group-outer-background: #282a36;
--settings-text-color: var(--primary);
--config-settings-color: var(--primary);
--item-group-outer-background: var(--background-darker);
.item { border: 1px solid var(--primary); }
.collapsable:nth-child(1n) label { color: #8be9fd; }
.collapsable:nth-child(2n) label { color: #50fa7b; }
@ -47,45 +47,48 @@ html[data-theme='dracula'] {
html[data-theme='bee'] {
--primary: #c3eb5c;
--background: #0b1021;
--item-background: #1c2636;
--item-group-background: #0b1021;
--nav-link-background-color: #0b1021;
--item-group-background: var(--background);
--nav-link-background-color: var(--background);
--font-headings: 'Sniglet', cursive;
}
html[data-theme='raspberry-jam'] {
--primary: #eb2d6c;
--background: #0b1021;
--item-background: #1c2636;
--item-group-background: #0b1021;
--nav-link-background-color: #0b1021;
--config-code-background: #0b1021;
--config-code-color: #eb2d6c;
--item-group-background: var(--background);
--nav-link-background-color: var(--background);
--config-code-background: #1c1e24;
--config-code-color: var(--primary);
--font-headings: 'Sniglet', cursive;
}
html[data-theme='tiger'] {
--primary: #f58233;
--background: #0b1021;
--item-background: #1c2636;
--item-group-background: #0b1021;
--nav-link-background-color: #0b1021;
--item-group-background: var(--background);
--nav-link-background-color: var(--background);
--font-headings: 'Sniglet', cursive;
}
html[data-theme='matrix-red'] {
--background: #000;
--background-darker: #000;
--primary: red;
--outline-color: red;
--curve-factor: 0px;
--background: var(--black);
--background-darker: var(--black);
--primary: #f00;
--outline-color: var(--primary);
--curve-factor: 0;
--font-body: 'Cutive Mono', monospace;
--font-headings: 'VT323', monospace;
}
html[data-theme='matrix'] {
--background: #000;
--background-darker: #000;
--background: var(--black);
--background-darker: var(--black);
--primary: #2bca2b;
--outline-color: #2bca2b;
--outline-color: var(--primary);
--curve-factor: 0px;
--font-body: 'Cutive Mono', monospace;
--font-headings: 'VT323', monospace;
@ -133,33 +136,34 @@ html[data-theme='blue-purple'] {
}
html[data-theme='hacker-girl'] {
--background: #000;
--background-darker: #000;
--background: var(--black);
--background-darker: var(--black);
--primary: #e435f1;
--outline-color: #e435f1;
--outline-color: var(--primary);
--curve-factor: 0px;
--font-body: 'Cutive Mono', monospace;
--font-headings: 'VT323', monospace;
}
html[data-theme='high-contrast-light'] {
--background: #fff;
--background-darker: #fff;
--item-group-background: #fff;
--item-background: #fff;
--primary: #000;
--outline-color: #000;
--primary: var(--black);
--background: var(--white);
--background-darker: var(--white);
--item-group-background: var(--background-darker);
--item-background: var(--background);
--outline-color: var(--primary);
--curve-factor: 0px;
--config-code-color: #000;
--config-code-color: var(--primary);
--font-headings: 'PTMono', 'Courier New', monospace;
}
html[data-theme='high-contrast-dark'] {
--background: #000;
--background-darker: #000;
--item-group-background: #000;
--primary: #fff;
--outline-color: #fff;
--primary: var(--white);
--background: var(--black);
--background-darker: var(--black);
--item-group-background: var(--background-darker);
--item-background: var(--background);
--outline-color: var(--primary);
--curve-factor: 0px;
--font-headings: 'PTMono', 'Courier New', monospace;
}
@ -191,42 +195,42 @@ html[data-theme='nord-frost'] {
html[data-theme='material-original'] {
--font-body: 'Roboto', serif;
--primary: #29B6F6;
--settings-text-color: #01579b;
--background: #f1f1f1;
--background-darker: #01579B;
--item-group-heading-text-color: #01579B;
--settings-text-color: var(--background-darker);
--item-group-heading-text-color: var(--background-darker);
--item-group-shadow: none;
--item-group-outer-background: none;
--item-group-background: none;
--item-background: #fff;
--item-background-hover: #fff;
--settings-background: #29B6F6;
--search-container-background: #29B6F6;
--item-background: var(--white);
--item-background-hover: var(--white);
--settings-background: var(--primary);
--search-container-background: var(--primary);
--curve-factor: 2px;
--curve-factor-navbar: 0;
--item-group-padding: 5px 0 0;
--item-text-color: #01579B;
--item-text-color: var(--background-darker);
--item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d;
--item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a;
--item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65);
--item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2);
--settings-container-shadow: 0 1px 3px #0000005e, 0 1px 2px #00000085;
--welcome-popup-background: #01579b;
--welcome-popup-background: var(--background-darker);
--welcome-popup-text-color: #ffffff;
--config-code-color: #000;
--item-group-heading-text-color-hover: #01579b;
--config-settings-background: #01579b;
--config-settings-color: #fff;
--interactive-editor-background: #01579b;
--interactive-editor-color: #fff;
--interactive-editor-background-darker: #29B6F6;
--heading-text-color: #fff;
--config-code-color: var(--black);
--item-group-heading-text-color-hover: var(--background-darker);
--config-settings-background: var(--background-darker);
--config-settings-color: var(--white);
--interactive-editor-background: var(--background-darker);
--interactive-editor-color: var(--white);
--interactive-editor-background-darker: var(--primary);
--heading-text-color: var(--white);
--status-check-tooltip-background: #f2f2f2;
--status-check-tooltip-color: #01579b;
--status-check-tooltip-color: var(--background-darker);
--description-tooltip-background: #f2f2f2;
--description-tooltip-color: #01579b;
--login-form-background: #fff;
--about-page-accent: #000;
--description-tooltip-color: var(--background-darker);
--login-form-background: var(--white);
--about-page-accent: var(--black);
--about-page-color: var(--background-darker);
--about-page-background: var(--background);
--context-menu-background: var(--white);
@ -293,14 +297,15 @@ html[data-theme='colorful'] {
--font-headings: 'Podkova', monospace;
--primary: #e8eae1;
--background: #0b1021;
--item-background: #05070e;
--item-background-hover: #0b1021;
--background-darker: #05070e;
--item-background: var(--background-darker);
--item-background-hover: var(--background);
--item-group-background: transparent;
--item-group-outer-background: #05070e;
--item-group-heading-text-color: #e8eae1;
--item-group-heading-text-color-hover: #fff;
--item-hover-shadow: 1px 4px 6px #000000;
--nav-link-background-color: #141826;
--item-group-outer-background: var(--background-darker);
--item-group-heading-text-color: var(--primary);
--item-group-heading-text-color-hover: var(--primary);
--item-hover-shadow: 1px 4px 6px var(--black);
--nav-link-background-color: var(--background);
.item-wrapper:nth-child(1n) { .item { color: #eb5cad; border: 1px solid #eb5cad; } }
.item-wrapper:nth-child(2n) { .item { color: #985ceb; border: 1px solid #985ceb; } }
.item-wrapper:nth-child(3n) { .item { color: #5c90eb; border: 1px solid #5c90eb; } }
@ -313,12 +318,12 @@ html[data-theme='colorful'] {
opacity: 0.85;
outline: none;
background: currentColor;
span.text, p.description { color: #05070e; }
span.text, p.description { color: var(--background-darker); }
i.fas, i.fab, i.far, i.fal, i.fad {
filter: drop-shadow(1px 3px 2px var(--transparent-50));
color: #05070e;
color: var(--background-darker);
}
svg path { fill: #05070e; }
svg path { fill: var(--background-darker); }
}
h1, h2, h3, h4 {
font-weight: normal;
@ -505,35 +510,35 @@ html[data-theme='material'] {
--item-group-outer-background: none;
--item-group-shadow: none;
--item-group-background: none;
--item-background: #fff;
--item-background-hover: #fff;
--item-background: var(--white);
--item-background-hover: var(--white);
--item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d;
--item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a;
--item-text-color: #363636;
--item-group-heading-text-color-hover: #363636;
--item-text-color: var(--primary);
--item-group-heading-text-color-hover: var(--primary);
--item-icon-transform-hover: none;
--nav-link-background-color: #0c4eba;
--nav-link-text-color: #fff;
--nav-link-text-color: var(--white);
--nav-link-border-color: #0c4eba;
--settings-text-color: #363636;
--config-code-color: #363636;
--settings-text-color: var(--primary);
--config-code-color: var(--primary);
--config-settings-background: #f5f5f5;
--config-settings-color: #473f3f;
--interactive-editor-color: #473f3f;
--interactive-editor-background: #f5f5f5;
--interactive-editor-background-darker: #fff;
--heading-text-color: #fff;
--interactive-editor-background-darker: var(--white);
--heading-text-color: var(--white);
--curve-factor: 3px;
--curve-factor-navbar: 8px;
--search-container-background: #4285f4;
--welcome-popup-text-color: #f5f5f5;
--footer-text-color: #f5f5f5cc;
// --login-form-background-secondary: #f5f5f5cc;
--context-menu-background: #fff;
--context-menu-background: var(--white);
--context-menu-secondary-color: #f5f5f5;
--transparent-white-50: #00000080;
--status-check-tooltip-background: #fff;
--description-tooltip-background: #fff;
--status-check-tooltip-background: var(--white);
--description-tooltip-background: var(--white);
--description-tooltip-color: #473f3f;
--side-bar-background-lighter: #0c4eba;
--side-bar-item-background: #f5f5f5;
@ -543,10 +548,10 @@ html[data-theme='material'] {
--minimal-view-settings-color: var(--primary);
--minimal-view-section-heading-color: var(--primary);
--minimal-view-section-heading-background: #f6f6f6;
--minimal-view-search-background: #fff;
--minimal-view-search-background: var(--white);
--minimal-view-search-color: var(--primary);
--minimal-view-group-color: var(--primary);
--minimal-view-group-background: #fff;
--minimal-view-group-background: var(--white);
.minimal-section-inner.selected, div.minimal-section-heading {
border: none;
@ -568,17 +573,17 @@ html[data-theme='material'] {
header {
background: #4285f4;
color: #fff;
color: var(--white);
.page-titles span.subtitle {
text-shadow: none;
}
}
footer {
opacity: 1;
color: #fff;
color: var(--white);
}
section.filter-container form label {
color: #fff;
color: var(--white);
}
.prism-editor-wrapper {
background: #f5f5f5;
@ -682,28 +687,28 @@ html[data-theme='minimal-light'] {
--item-background-hover: #f2f2f2;
--item-shadow: none;
--item-hover-shadow: none;
--item-text-color: #101931;
--item-group-heading-text-color-hover: #101931;
--settings-text-color: #101931;
--config-code-color: #101931;
--item-text-color: var(--background-darker);
--item-group-heading-text-color-hover: var(--background-darker);
--settings-text-color: var(--background-darker);
--config-code-color: var(--background-darker);
--nav-link-background-color: none;
--search-container-background: #fff;
--search-container-background: var(--white);
--curve-factor: 4px;
--curve-factor-navbar: 8px;
--status-check-tooltip-background: #f2f2f2;
--status-check-tooltip-color: #000;
--status-check-tooltip-color: var(--black);
--description-tooltip-background: #f2f2f2;
--description-tooltip-color: #000;
--login-form-color: #101931;
--description-tooltip-color: var(--black);
--login-form-color: var(--background-darker);
--about-page-background: var(--background);
--about-page-color: var(--background-darker);
--context-menu-color: var(--background-darker);
--context-menu-secondary-color: var(--primary);
section.filter-container {
background: #fff;
background: var(--white);
border-bottom: 1px dashed #00000038;
input#filter-tiles {
border: 1px solid #101931;
border: 1px solid var(--background-darker);
}
}
}
@ -716,18 +721,18 @@ html[data-theme='minimal-dark'] {
--item-group-shadow: none;
--item-group-background: none;
--item-background: none;
--item-background-hover: #090b0e;
--item-background-hover: var(--background-darker);
--item-shadow: none;
--item-hover-shadow: none;
--item-text-color: #fff;
--item-group-heading-text-color-hover: #fff;
--settings-text-color: #fff;
--config-code-color: #fff;
--item-text-color: var(--white);
--item-group-heading-text-color-hover: var(--white);
--settings-text-color: var(--white);
--config-code-color: var(--white);
--nav-link-background-color: none;
--search-container-background: #14171e;
--search-container-background: var(--background);
--curve-factor: 4px;
--curve-factor-navbar: 8px;
--item-group-heading-text-color: #fff;
--item-group-heading-text-color: var(--white);
--item-group-heading-text-color-hover: #ffffffbf;
--about-page-background: var(--background);
--about-page-color: var(--primary);
@ -740,7 +745,7 @@ html[data-theme='minimal-dark'] {
background: #14171e;
border-bottom: 1px dashed #ffffff38;
input#filter-tiles {
border: 1px solid #fff;
border: 1px solid var(--white);
}
}
@ -752,29 +757,26 @@ html[data-theme='minimal-dark'] {
html[data-theme='vaporware'] {
--primary: #09bfe6;
--background: #100e2c;
--background-darker: #6c27ea;
--background-darker: linear-gradient(0deg, rgba(108,39,234,1) 0%, rgba(132,76,235,1) 80%);
--settings-text-color: #6c27ea;
--background-darker: #7b2af1;
--settings-text-color: #8d51fc;
--item-group-outer-background: #096de6;
--item-group-outer-background: var(--primary);
--item-group-background: #190e2c;
--item-group-heading-text-color: #190e2c;
--item-group-heading-text-color-hover: #5118b9;
--item-group-background: var(--background);
--item-group-heading-text-color: var(--background);
--item-group-heading-text-color-hover: var(--background-darker);
--item-text-color: var(--primary);
--item-background: #1a174d;
--item-background-hover: #2b2670;
--item-background-hover: var(--background);;
--footer-text-color: var(--white);
--item-shadow: none;
--curve-factor: 2px;
--curve-factor-navbar: 6px;
--login-form-color: #09bfe6;
--config-settings-background: #100e2c;
--status-check-tooltip-background: #100e2c;
--description-tooltip-background: #100e2c;
.home {
background: linear-gradient(180deg, rgba(16,14,44,1) 10%, rgba(27,24,79,1) 40%, rgba(16,14,44,1) 100%);
}
--login-form-color: var(--primary);
--config-settings-background: var(--background);
--status-check-tooltip-background: var(--background);
--description-tooltip-background: var(--background);
--heading-text-color: var(--background);
--search-label-color: var(--background);
div.item-group-container {
gap: 0.3rem;
@ -819,29 +821,33 @@ html[data-theme='vaporware'] {
background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg');
background-size: cover;
}
// body {
// background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg');
// background-size: cover;
// div.home, div.options-outer, div.options-container, section.filter-container {
// background: none;
// }
// }
body {
background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg');
background-size: cover;
background-repeat:no-repeat;
background-position: center center;
// Remove background from certain components
div.home, div.options-outer, div.options-container, section.filter-container,
section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn {
background: none;
}
}
}
html[data-theme='glow'], html[data-theme=glow-colorful] {
--primary: #5c6da9;
--background: #f6f6f6;
--background-darker: #fff;
--background-darker: var(--white);
--curve-factor: 12px;
--item-group-background: #fff;
--item-group-outer-background: #fff;
--item-background: #fff;
--item-group-background: var(--white);
--item-group-outer-background: var(--white);
--item-background: var(--white);
--font-headings: 'Sniglet', cursive;
--item-group-heading-text-color: #5c6da9;
--item-group-heading-text-color-hover: #5c6da9;
--item-group-heading-text-color: var(--primary);
--item-group-heading-text-color-hover: var(--primary);
--item-group-shadow: 0 5px 16px 0 #9f72ff33;
--item-background-hover: #fff;
--item-background-hover: var(--white);
--item-shadow: 0 1px 5px 0 #8656ef80;
--item-hover-shadow: 0 1px 8px 0 #8656efa6;
--item-icon-transform: drop-shadow(1px 2px 3px var(--transparent-50)) saturate(0.95);
@ -883,7 +889,7 @@ html[data-theme='glow'], html[data-theme=glow-colorful] {
--item-group-shadow: 0 5px 16px 0 #9f72ff33;
--item-group-heading-text-color: #8656ef;
--item-group-heading-text-color-hover: #783cfb;
--item-background-hover: #fff;
--item-background-hover: var(--white);
--item-shadow: 0 1px 5px 0 #8656ef80;
--item-hover-shadow: 0 1px 8px 0 #8656efa6;
--item-icon-transform: drop-shadow(1px 2px 3px #8656ef80) saturate(0.95);
@ -894,7 +900,7 @@ html[data-theme='glow'], html[data-theme=glow-colorful] {
--item-group-shadow: 0 5px 16px 0 #728cff33;
--item-group-heading-text-color: #d356ef;
--item-group-heading-text-color-hover: #d73bf9;
--item-background-hover: #fff;
--item-background-hover: var(--white);
--item-shadow: 0 1px 5px 0 #d356ef80;
--item-hover-shadow: 0 1px 8px 0 #d356efa6;
--item-icon-transform: drop-shadow(1px 2px 3px #d356ef80) saturate(0.95);
@ -905,7 +911,7 @@ html[data-theme='glow'], html[data-theme=glow-colorful] {
--item-group-shadow: 0 5px 16px 0 #728cff33;
--item-group-heading-text-color: #56ddef;
--item-group-heading-text-color-hover: #3cdefb;
--item-background-hover: #fff;
--item-background-hover: var(--white);
--item-shadow: 0 1px 5px 0 #56ddef80;
--item-hover-shadow: 0 1px 8px 0 #56ddefa6;
--item-icon-transform: drop-shadow(1px 2px 3px #56ddef80) saturate(0.95);
@ -986,7 +992,7 @@ html[data-theme="dashy-docs"] {
--background: #202020;
--background-darker: #121212;
--item-group-background: none;
--item-group-outer-background: #121212;
--item-group-outer-background: var(--background-darker);
--item-group-heading-text-color: var(--background);
--item-group-heading-text-color-hover: var(--background);
--item-background: var(--background);
@ -1112,6 +1118,160 @@ html[data-theme="dashy-docs"] {
}
}
html[data-theme="adventure"] {
// Main colors
--primary: #ffffffe6;
--background: #0b1021;
--background-darker: #181c3a;
// Typography
--font-headings: 'Podkova', 'Roboto', serif;
--font-body: 'Roboto', serif;
// Items
--item-background: #181c3a80;
--item-background-hover: #181c3a99;
--item-shadow: 1px 1px 2px #130f23;
--item-hover-shadow: 2px 2px 4px #130f23;
// Sections
--item-group-heading-text-color: var(--white);
--item-group-heading-text-color-hover: var(--primary);
--item-group-shadow: none;
--item-group-background: none;
--item-group-outer-background: none;
// Background Image
body {
background: url('https://i.ibb.co/wdqSsGh/adventure-bg.jpg');
background-size: cover;
}
// Remove background from certain components
div.home, div.options-outer, div.options-container, section.filter-container,
section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn {
background: none;
}
// Style overides
label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; }
.content-inner { border-top: 1px dashed var(--primary); }
a.item.size-large:hover { border-left: 3px solid var(--white); }
.item.size-large .tile-title p.description { height: 3rem; }
.is-collapsed {
background: var(--item-background);
box-shadow: var(--item-shadow);
&:hover {
background: var(--item-background-hover);
box-shadow: var(--item-hover-shadow);
}
}
}
html[data-theme="color-block"] {
// Main colors
--primary: #E94560;
--background: #16213E;
--background-darker: #0e172b;
// Typography
--font-headings: 'Podkova', 'Roboto', serif;
--font-body: 'Roboto', serif;
// Items
--item-background: #1b294c;
--item-background-hover: var(--item-background);
--item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
--item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black);
// Sections
--item-group-heading-text-color: var(--white);
--item-group-heading-text-color-hover: var(--primary);
--item-group-shadow: none;
--item-group-background: none;
--item-group-outer-background: none;
// Nav Links
--nav-link-background-color: var(--background);
--nav-link-background-color-hover: var(--background);
--nav-link-border-color: transparent;
--nav-link-border-color-hover: transparent;
--nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
--nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black);
// Misc
--curve-factor: 4px;
--curve-factor-navbar: 8px;
// Style overrides
label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; }
.content-inner { border-top: 1px dashed var(--primary); }
.item.size-large .tile-title p.description { height: 3rem; }
.item, .nav-outer nav .nav-item { border-radius: 0; }
.item.size-large { margin: 0.5rem; }
// Show outline when collapsed
.is-collapsed {
background: var(--item-background);
box-shadow: var(--item-shadow);
&:hover {
background: var(--item-background-hover);
box-shadow: var(--item-hover-shadow);
}
}
}
html[data-theme="one-dark"] {
// Main colors
--primary: #c5cad3;
--background: #282c33;
--background-darker: #1c1f23;
// Typography
--font-headings: 'Podkova', 'Roboto', serif;
--font-body: 'Roboto', serif;
// Items
--item-background: var(--background-darker);
--item-background-hover: var(--item-background);
--item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
--item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black);
// Sections
--item-group-heading-text-color: var(--white);
--item-group-heading-text-color-hover: var(--primary);
--item-group-shadow: none;
--item-group-background: none;
--item-group-outer-background: none;
// Nav Links
--nav-link-background-color: var(--background);
--nav-link-background-color-hover: var(--background);
--nav-link-border-color: transparent;
--nav-link-border-color-hover: transparent;
--nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
--nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black);
// Misc
--curve-factor: 4px;
--curve-factor-navbar: 6px;
// Style overrides
label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; }
.content-inner { border-top: 1px dashed var(--primary); }
.item.size-large .tile-title p.description { height: 3rem; }
.item, .nav-outer nav .nav-item { border-radius: 0; }
.item.size-large { margin: 0.5rem; }
// Show outline when collapsed
.is-collapsed {
background: var(--item-background);
box-shadow: var(--item-shadow);
&:hover {
background: var(--item-background-hover);
box-shadow: var(--item-hover-shadow);
}
}
// Colored Item Accents
.item-wrapper:nth-child(1n) { --current: #e06b74; }
.item-wrapper:nth-child(2n) { --current: #98c379; }
.item-wrapper:nth-child(3n) { --current: #e5c07a; }
.item-wrapper:nth-child(4n) { --current: #62aeef; }
.item-wrapper:nth-child(5n) { --current: #c678dd; }
.item-wrapper:nth-child(6n) { --current: #55b6c2; }
.item-wrapper .item {
color: var(--current);
box-shadow: -3px 0px 0px var(--current), 1px 1px 3px #000000e6;
&:hover {
box-shadow: -5px 0px 0px var(--current), 2px 2px 3px #000000e6;
}
}
}
html[data-theme="oblivion-blue"] {
--primary: #82a5f3;
}

View File

@ -50,17 +50,20 @@ module.exports = {
'oblivion',
'material',
'material-dark',
'dracula',
'colorful',
'dashy-docs',
'colorful',
'one-dark',
'dracula',
'adventure',
'nord-frost',
'nord',
'minimal-dark',
'minimal-light',
'nord',
'nord-frost',
'thebe',
'cyberpunk',
'matrix',
'matrix-red',
'color-block',
'glow',
'raspberry-jam',
'bee',

View File

@ -23,6 +23,7 @@
:class="`item-group-container `
+ `orientation-${layout} `
+ `item-size-${itemSizeBound} `
+ (isEditMode ? 'edit-mode ' : '')
+ (singleSectionView ? 'single-section-view ' : '')
+ (this.colCount ? `col-count-${this.colCount} ` : '')"
>
@ -350,6 +351,11 @@ export default {
/* Hide when search term returns nothing */
.no-results { display: none; }
/* Additional spacing when in edit mode */
&.edit-mode {
margin-bottom: 12rem;
}
/* When in single-section view mode */
&.single-section-view {
display: block;