Refactoring of files and more svg tidy up

This commit is contained in:
Pax1601 2023-05-22 17:39:33 +02:00
parent 32cb147a02
commit a2664dc676
65 changed files with 1241 additions and 158 deletions

View File

@ -5,7 +5,7 @@
"version": "v0.2.1-alpha",
"private": true,
"scripts": {
"copy": "copy .\\node_modules\\leaflet\\dist\\leaflet.css .\\public\\stylesheets\\leaflet.css",
"copy": "copy .\\node_modules\\leaflet\\dist\\leaflet.css .\\public\\stylesheets\\leaflet\\leaflet.css & copy .\\node_modules\\@iconfu\\svg-inject\\dist\\svg-inject.js .\\public\\javascripts\\svg-inject.js",
"start": "npm run copy & concurrently --kill-others \"npm run watch\" \"nodemon ./bin/www\"",
"watch": "watchify .\\src\\index.ts --debug -o .\\public\\javascripts\\bundle.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ]"
},

View File

@ -0,0 +1,697 @@
/**
* SVGInject - Version 1.2.3
* A tiny, intuitive, robust, caching solution for injecting SVG files inline into the DOM.
*
* https://github.com/iconfu/svg-inject
*
* Copyright (c) 2018 INCORS, the creators of iconfu.com
* @license MIT License - https://github.com/iconfu/svg-inject/blob/master/LICENSE
*/
(function(window, document) {
// constants for better minification
var _CREATE_ELEMENT_ = 'createElement';
var _GET_ELEMENTS_BY_TAG_NAME_ = 'getElementsByTagName';
var _LENGTH_ = 'length';
var _STYLE_ = 'style';
var _TITLE_ = 'title';
var _UNDEFINED_ = 'undefined';
var _SET_ATTRIBUTE_ = 'setAttribute';
var _GET_ATTRIBUTE_ = 'getAttribute';
var NULL = null;
// constants
var __SVGINJECT = '__svgInject';
var ID_SUFFIX = '--inject-';
var ID_SUFFIX_REGEX = new RegExp(ID_SUFFIX + '\\d+', "g");
var LOAD_FAIL = 'LOAD_FAIL';
var SVG_NOT_SUPPORTED = 'SVG_NOT_SUPPORTED';
var SVG_INVALID = 'SVG_INVALID';
var ATTRIBUTE_EXCLUSION_NAMES = ['src', 'alt', 'onload', 'onerror'];
var A_ELEMENT = document[_CREATE_ELEMENT_]('a');
var IS_SVG_SUPPORTED = typeof SVGRect != _UNDEFINED_;
var DEFAULT_OPTIONS = {
useCache: true,
copyAttributes: true,
makeIdsUnique: true
};
// Map of IRI referenceable tag names to properties that can reference them. This is defined in
// https://www.w3.org/TR/SVG11/linking.html#processingIRI
var IRI_TAG_PROPERTIES_MAP = {
clipPath: ['clip-path'],
'color-profile': NULL,
cursor: NULL,
filter: NULL,
linearGradient: ['fill', 'stroke'],
marker: ['marker', 'marker-end', 'marker-mid', 'marker-start'],
mask: NULL,
pattern: ['fill', 'stroke'],
radialGradient: ['fill', 'stroke']
};
var INJECTED = 1;
var FAIL = 2;
var uniqueIdCounter = 1;
var xmlSerializer;
var domParser;
// creates an SVG document from an SVG string
function svgStringToSvgDoc(svgStr) {
domParser = domParser || new DOMParser();
return domParser.parseFromString(svgStr, 'text/xml');
}
// searializes an SVG element to an SVG string
function svgElemToSvgString(svgElement) {
xmlSerializer = xmlSerializer || new XMLSerializer();
return xmlSerializer.serializeToString(svgElement);
}
// Returns the absolute url for the specified url
function getAbsoluteUrl(url) {
A_ELEMENT.href = url;
return A_ELEMENT.href;
}
// Load svg with an XHR request
function loadSvg(url, callback, errorCallback) {
if (url) {
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
if (req.readyState == 4) {
// readyState is DONE
var status = req.status;
if (status == 200) {
// request status is OK
callback(req.responseXML, req.responseText.trim());
} else if (status >= 400) {
// request status is error (4xx or 5xx)
errorCallback();
} else if (status == 0) {
// request status 0 can indicate a failed cross-domain call
errorCallback();
}
}
};
req.open('GET', url, true);
req.send();
}
}
// Copy attributes from img element to svg element
function copyAttributes(imgElem, svgElem) {
var attribute;
var attributeName;
var attributeValue;
var attributes = imgElem.attributes;
for (var i = 0; i < attributes[_LENGTH_]; i++) {
attribute = attributes[i];
attributeName = attribute.name;
// Only copy attributes not explicitly excluded from copying
if (ATTRIBUTE_EXCLUSION_NAMES.indexOf(attributeName) == -1) {
attributeValue = attribute.value;
// If img attribute is "title", insert a title element into SVG element
if (attributeName == _TITLE_) {
var titleElem;
var firstElementChild = svgElem.firstElementChild;
if (firstElementChild && firstElementChild.localName.toLowerCase() == _TITLE_) {
// If the SVG element's first child is a title element, keep it as the title element
titleElem = firstElementChild;
} else {
// If the SVG element's first child element is not a title element, create a new title
// ele,emt and set it as the first child
titleElem = document[_CREATE_ELEMENT_ + 'NS']('http://www.w3.org/2000/svg', _TITLE_);
svgElem.insertBefore(titleElem, firstElementChild);
}
// Set new title content
titleElem.textContent = attributeValue;
} else {
// Set img attribute to svg element
svgElem[_SET_ATTRIBUTE_](attributeName, attributeValue);
}
}
}
}
// This function appends a suffix to IDs of referenced elements in the <defs> in order to to avoid ID collision
// between multiple injected SVGs. The suffix has the form "--inject-X", where X is a running number which is
// incremented with each injection. References to the IDs are adjusted accordingly.
// We assume tha all IDs within the injected SVG are unique, therefore the same suffix can be used for all IDs of one
// injected SVG.
// If the onlyReferenced argument is set to true, only those IDs will be made unique that are referenced from within the SVG
function makeIdsUnique(svgElem, onlyReferenced) {
var idSuffix = ID_SUFFIX + uniqueIdCounter++;
// Regular expression for functional notations of an IRI references. This will find occurences in the form
// url(#anyId) or url("#anyId") (for Internet Explorer) and capture the referenced ID
var funcIriRegex = /url\("?#([a-zA-Z][\w:.-]*)"?\)/g;
// Get all elements with an ID. The SVG spec recommends to put referenced elements inside <defs> elements, but
// this is not a requirement, therefore we have to search for IDs in the whole SVG.
var idElements = svgElem.querySelectorAll('[id]');
var idElem;
// An object containing referenced IDs as keys is used if only referenced IDs should be uniquified.
// If this object does not exist, all IDs will be uniquified.
var referencedIds = onlyReferenced ? [] : NULL;
var tagName;
var iriTagNames = {};
var iriProperties = [];
var changed = false;
var i, j;
if (idElements[_LENGTH_]) {
// Make all IDs unique by adding the ID suffix and collect all encountered tag names
// that are IRI referenceable from properities.
for (i = 0; i < idElements[_LENGTH_]; i++) {
tagName = idElements[i].localName; // Use non-namespaced tag name
// Make ID unique if tag name is IRI referenceable
if (tagName in IRI_TAG_PROPERTIES_MAP) {
iriTagNames[tagName] = 1;
}
}
// Get all properties that are mapped to the found IRI referenceable tags
for (tagName in iriTagNames) {
(IRI_TAG_PROPERTIES_MAP[tagName] || [tagName]).forEach(function (mappedProperty) {
// Add mapped properties to array of iri referencing properties.
// Use linear search here because the number of possible entries is very small (maximum 11)
if (iriProperties.indexOf(mappedProperty) < 0) {
iriProperties.push(mappedProperty);
}
});
}
if (iriProperties[_LENGTH_]) {
// Add "style" to properties, because it may contain references in the form 'style="fill:url(#myFill)"'
iriProperties.push(_STYLE_);
}
// Run through all elements of the SVG and replace IDs in references.
// To get all descending elements, getElementsByTagName('*') seems to perform faster than querySelectorAll('*').
// Since svgElem.getElementsByTagName('*') does not return the svg element itself, we have to handle it separately.
var descElements = svgElem[_GET_ELEMENTS_BY_TAG_NAME_]('*');
var element = svgElem;
var propertyName;
var value;
var newValue;
for (i = -1; element != NULL;) {
if (element.localName == _STYLE_) {
// If element is a style element, replace IDs in all occurences of "url(#anyId)" in text content
value = element.textContent;
newValue = value && value.replace(funcIriRegex, function(match, id) {
if (referencedIds) {
referencedIds[id] = 1;
}
return 'url(#' + id + idSuffix + ')';
});
if (newValue !== value) {
element.textContent = newValue;
}
} else if (element.hasAttributes()) {
// Run through all property names for which IDs were found
for (j = 0; j < iriProperties[_LENGTH_]; j++) {
propertyName = iriProperties[j];
value = element[_GET_ATTRIBUTE_](propertyName);
newValue = value && value.replace(funcIriRegex, function(match, id) {
if (referencedIds) {
referencedIds[id] = 1;
}
return 'url(#' + id + idSuffix + ')';
});
if (newValue !== value) {
element[_SET_ATTRIBUTE_](propertyName, newValue);
}
}
// Replace IDs in xlink:ref and href attributes
['xlink:href', 'href'].forEach(function(refAttrName) {
var iri = element[_GET_ATTRIBUTE_](refAttrName);
if (/^\s*#/.test(iri)) { // Check if iri is non-null and internal reference
iri = iri.trim();
element[_SET_ATTRIBUTE_](refAttrName, iri + idSuffix);
if (referencedIds) {
// Add ID to referenced IDs
referencedIds[iri.substring(1)] = 1;
}
}
});
}
element = descElements[++i];
}
for (i = 0; i < idElements[_LENGTH_]; i++) {
idElem = idElements[i];
// If set of referenced IDs exists, make only referenced IDs unique,
// otherwise make all IDs unique.
if (!referencedIds || referencedIds[idElem.id]) {
// Add suffix to element's ID
idElem.id += idSuffix;
changed = true;
}
}
}
// return true if SVG element has changed
return changed;
}
// For cached SVGs the IDs are made unique by simply replacing the already inserted unique IDs with a
// higher ID counter. This is much more performant than a call to makeIdsUnique().
function makeIdsUniqueCached(svgString) {
return svgString.replace(ID_SUFFIX_REGEX, ID_SUFFIX + uniqueIdCounter++);
}
// Inject SVG by replacing the img element with the SVG element in the DOM
function inject(imgElem, svgElem, absUrl, options) {
if (svgElem) {
svgElem[_SET_ATTRIBUTE_]('data-inject-url', absUrl);
var parentNode = imgElem.parentNode;
if (parentNode) {
if (options.copyAttributes) {
copyAttributes(imgElem, svgElem);
}
// Invoke beforeInject hook if set
var beforeInject = options.beforeInject;
var injectElem = (beforeInject && beforeInject(imgElem, svgElem)) || svgElem;
// Replace img element with new element. This is the actual injection.
parentNode.replaceChild(injectElem, imgElem);
// Mark img element as injected
imgElem[__SVGINJECT] = INJECTED;
removeOnLoadAttribute(imgElem);
// Invoke afterInject hook if set
var afterInject = options.afterInject;
if (afterInject) {
afterInject(imgElem, injectElem);
}
}
} else {
svgInvalid(imgElem, options);
}
}
// Merges any number of options objects into a new object
function mergeOptions() {
var mergedOptions = {};
var args = arguments;
// Iterate over all specified options objects and add all properties to the new options object
for (var i = 0; i < args[_LENGTH_]; i++) {
var argument = args[i];
for (var key in argument) {
if (argument.hasOwnProperty(key)) {
mergedOptions[key] = argument[key];
}
}
}
return mergedOptions;
}
// Adds the specified CSS to the document's <head> element
function addStyleToHead(css) {
var head = document[_GET_ELEMENTS_BY_TAG_NAME_]('head')[0];
if (head) {
var style = document[_CREATE_ELEMENT_](_STYLE_);
style.type = 'text/css';
style.appendChild(document.createTextNode(css));
head.appendChild(style);
}
}
// Builds an SVG element from the specified SVG string
function buildSvgElement(svgStr, verify) {
if (verify) {
var svgDoc;
try {
// Parse the SVG string with DOMParser
svgDoc = svgStringToSvgDoc(svgStr);
} catch(e) {
return NULL;
}
if (svgDoc[_GET_ELEMENTS_BY_TAG_NAME_]('parsererror')[_LENGTH_]) {
// DOMParser does not throw an exception, but instead puts parsererror tags in the document
return NULL;
}
return svgDoc.documentElement;
} else {
var div = document.createElement('div');
div.innerHTML = svgStr;
return div.firstElementChild;
}
}
function removeOnLoadAttribute(imgElem) {
// Remove the onload attribute. Should only be used to remove the unstyled image flash protection and
// make the element visible, not for removing the event listener.
imgElem.removeAttribute('onload');
}
function errorMessage(msg) {
console.error('SVGInject: ' + msg);
}
function fail(imgElem, status, options) {
imgElem[__SVGINJECT] = FAIL;
if (options.onFail) {
options.onFail(imgElem, status);
} else {
errorMessage(status);
}
}
function svgInvalid(imgElem, options) {
removeOnLoadAttribute(imgElem);
fail(imgElem, SVG_INVALID, options);
}
function svgNotSupported(imgElem, options) {
removeOnLoadAttribute(imgElem);
fail(imgElem, SVG_NOT_SUPPORTED, options);
}
function loadFail(imgElem, options) {
fail(imgElem, LOAD_FAIL, options);
}
function removeEventListeners(imgElem) {
imgElem.onload = NULL;
imgElem.onerror = NULL;
}
function imgNotSet(msg) {
errorMessage('no img element');
}
function createSVGInject(globalName, options) {
var defaultOptions = mergeOptions(DEFAULT_OPTIONS, options);
var svgLoadCache = {};
if (IS_SVG_SUPPORTED) {
// If the browser supports SVG, add a small stylesheet that hides the <img> elements until
// injection is finished. This avoids showing the unstyled SVGs before style is applied.
addStyleToHead('img[onload^="' + globalName + '("]{visibility:hidden;}');
}
/**
* SVGInject
*
* Injects the SVG specified in the `src` attribute of the specified `img` element or array of `img`
* elements. Returns a Promise object which resolves if all passed in `img` elements have either been
* injected or failed to inject (Only if a global Promise object is available like in all modern browsers
* or through a polyfill).
*
* Options:
* useCache: If set to `true` the SVG will be cached using the absolute URL. Default value is `true`.
* copyAttributes: If set to `true` the attributes will be copied from `img` to `svg`. Dfault value
* is `true`.
* makeIdsUnique: If set to `true` the ID of elements in the `<defs>` element that can be references by
* property values (for example 'clipPath') are made unique by appending "--inject-X", where X is a
* running number which increases with each injection. This is done to avoid duplicate IDs in the DOM.
* beforeLoad: Hook before SVG is loaded. The `img` element is passed as a parameter. If the hook returns
* a string it is used as the URL instead of the `img` element's `src` attribute.
* afterLoad: Hook after SVG is loaded. The loaded `svg` element and `svg` string are passed as a
* parameters. If caching is active this hook will only get called once for injected SVGs with the
* same absolute path. Changes to the `svg` element in this hook will be applied to all injected SVGs
* with the same absolute path. It's also possible to return an `svg` string or `svg` element which
* will then be used for the injection.
* beforeInject: Hook before SVG is injected. The `img` and `svg` elements are passed as parameters. If
* any html element is returned it gets injected instead of applying the default SVG injection.
* afterInject: Hook after SVG is injected. The `img` and `svg` elements are passed as parameters.
* onAllFinish: Hook after all `img` elements passed to an SVGInject() call have either been injected or
* failed to inject.
* onFail: Hook after injection fails. The `img` element and a `status` string are passed as an parameter.
* The `status` can be either `'SVG_NOT_SUPPORTED'` (the browser does not support SVG),
* `'SVG_INVALID'` (the SVG is not in a valid format) or `'LOAD_FAILED'` (loading of the SVG failed).
*
* @param {HTMLImageElement} img - an img element or an array of img elements
* @param {Object} [options] - optional parameter with [options](#options) for this injection.
*/
function SVGInject(img, options) {
options = mergeOptions(defaultOptions, options);
var run = function(resolve) {
var allFinish = function() {
var onAllFinish = options.onAllFinish;
if (onAllFinish) {
onAllFinish();
}
resolve && resolve();
};
if (img && typeof img[_LENGTH_] != _UNDEFINED_) {
// an array like structure of img elements
var injectIndex = 0;
var injectCount = img[_LENGTH_];
if (injectCount == 0) {
allFinish();
} else {
var finish = function() {
if (++injectIndex == injectCount) {
allFinish();
}
};
for (var i = 0; i < injectCount; i++) {
SVGInjectElement(img[i], options, finish);
}
}
} else {
// only one img element
SVGInjectElement(img, options, allFinish);
}
};
// return a Promise object if globally available
return typeof Promise == _UNDEFINED_ ? run() : new Promise(run);
}
// Injects a single svg element. Options must be already merged with the default options.
function SVGInjectElement(imgElem, options, callback) {
if (imgElem) {
var svgInjectAttributeValue = imgElem[__SVGINJECT];
if (!svgInjectAttributeValue) {
removeEventListeners(imgElem);
if (!IS_SVG_SUPPORTED) {
svgNotSupported(imgElem, options);
callback();
return;
}
// Invoke beforeLoad hook if set. If the beforeLoad returns a value use it as the src for the load
// URL path. Else use the imgElem's src attribute value.
var beforeLoad = options.beforeLoad;
var src = (beforeLoad && beforeLoad(imgElem)) || imgElem[_GET_ATTRIBUTE_]('src');
if (!src) {
// If no image src attribute is set do no injection. This can only be reached by using javascript
// because if no src attribute is set the onload and onerror events do not get called
if (src === '') {
loadFail(imgElem, options);
}
callback();
return;
}
// set array so later calls can register callbacks
var onFinishCallbacks = [];
imgElem[__SVGINJECT] = onFinishCallbacks;
var onFinish = function() {
callback();
onFinishCallbacks.forEach(function(onFinishCallback) {
onFinishCallback();
});
};
var absUrl = getAbsoluteUrl(src);
var useCacheOption = options.useCache;
var makeIdsUniqueOption = options.makeIdsUnique;
var setSvgLoadCacheValue = function(val) {
if (useCacheOption) {
svgLoadCache[absUrl].forEach(function(svgLoad) {
svgLoad(val);
});
svgLoadCache[absUrl] = val;
}
};
if (useCacheOption) {
var svgLoad = svgLoadCache[absUrl];
var handleLoadValue = function(loadValue) {
if (loadValue === LOAD_FAIL) {
loadFail(imgElem, options);
} else if (loadValue === SVG_INVALID) {
svgInvalid(imgElem, options);
} else {
var hasUniqueIds = loadValue[0];
var svgString = loadValue[1];
var uniqueIdsSvgString = loadValue[2];
var svgElem;
if (makeIdsUniqueOption) {
if (hasUniqueIds === NULL) {
// IDs for the SVG string have not been made unique before. This may happen if previous
// injection of a cached SVG have been run with the option makedIdsUnique set to false
svgElem = buildSvgElement(svgString, false);
hasUniqueIds = makeIdsUnique(svgElem, false);
loadValue[0] = hasUniqueIds;
loadValue[2] = hasUniqueIds && svgElemToSvgString(svgElem);
} else if (hasUniqueIds) {
// Make IDs unique for already cached SVGs with better performance
svgString = makeIdsUniqueCached(uniqueIdsSvgString);
}
}
svgElem = svgElem || buildSvgElement(svgString, false);
inject(imgElem, svgElem, absUrl, options);
}
onFinish();
};
if (typeof svgLoad != _UNDEFINED_) {
// Value for url exists in cache
if (svgLoad.isCallbackQueue) {
// Same url has been cached, but value has not been loaded yet, so add to callbacks
svgLoad.push(handleLoadValue);
} else {
handleLoadValue(svgLoad);
}
return;
} else {
var svgLoad = [];
// set property isCallbackQueue to Array to differentiate from array with cached loaded values
svgLoad.isCallbackQueue = true;
svgLoadCache[absUrl] = svgLoad;
}
}
// Load the SVG because it is not cached or caching is disabled
loadSvg(absUrl, function(svgXml, svgString) {
// Use the XML from the XHR request if it is an instance of Document. Otherwise
// (for example of IE9), create the svg document from the svg string.
var svgElem = svgXml instanceof Document ? svgXml.documentElement : buildSvgElement(svgString, true);
var afterLoad = options.afterLoad;
if (afterLoad) {
// Invoke afterLoad hook which may modify the SVG element. After load may also return a new
// svg element or svg string
var svgElemOrSvgString = afterLoad(svgElem, svgString) || svgElem;
if (svgElemOrSvgString) {
// Update svgElem and svgString because of modifications to the SVG element or SVG string in
// the afterLoad hook, so the modified SVG is also used for all later cached injections
var isString = typeof svgElemOrSvgString == 'string';
svgString = isString ? svgElemOrSvgString : svgElemToSvgString(svgElem);
svgElem = isString ? buildSvgElement(svgElemOrSvgString, true) : svgElemOrSvgString;
}
}
if (svgElem instanceof SVGElement) {
var hasUniqueIds = NULL;
if (makeIdsUniqueOption) {
hasUniqueIds = makeIdsUnique(svgElem, false);
}
if (useCacheOption) {
var uniqueIdsSvgString = hasUniqueIds && svgElemToSvgString(svgElem);
// set an array with three entries to the load cache
setSvgLoadCacheValue([hasUniqueIds, svgString, uniqueIdsSvgString]);
}
inject(imgElem, svgElem, absUrl, options);
} else {
svgInvalid(imgElem, options);
setSvgLoadCacheValue(SVG_INVALID);
}
onFinish();
}, function() {
loadFail(imgElem, options);
setSvgLoadCacheValue(LOAD_FAIL);
onFinish();
});
} else {
if (Array.isArray(svgInjectAttributeValue)) {
// svgInjectAttributeValue is an array. Injection is not complete so register callback
svgInjectAttributeValue.push(callback);
} else {
callback();
}
}
} else {
imgNotSet();
}
}
/**
* Sets the default [options](#options) for SVGInject.
*
* @param {Object} [options] - default [options](#options) for an injection.
*/
SVGInject.setOptions = function(options) {
defaultOptions = mergeOptions(defaultOptions, options);
};
// Create a new instance of SVGInject
SVGInject.create = createSVGInject;
/**
* Used in onerror Event of an `<img>` element to handle cases when the loading the original src fails
* (for example if file is not found or if the browser does not support SVG). This triggers a call to the
* options onFail hook if available. The optional second parameter will be set as the new src attribute
* for the img element.
*
* @param {HTMLImageElement} img - an img element
* @param {String} [fallbackSrc] - optional parameter fallback src
*/
SVGInject.err = function(img, fallbackSrc) {
if (img) {
if (img[__SVGINJECT] != FAIL) {
removeEventListeners(img);
if (!IS_SVG_SUPPORTED) {
svgNotSupported(img, defaultOptions);
} else {
removeOnLoadAttribute(img);
loadFail(img, defaultOptions);
}
if (fallbackSrc) {
removeOnLoadAttribute(img);
img.src = fallbackSrc;
}
}
} else {
imgNotSet();
}
};
window[globalName] = SVGInject;
return SVGInject;
}
var SVGInjectInstance = createSVGInject('SVGInject');
if (typeof module == 'object' && typeof module.exports == 'object') {
module.exports = SVGInjectInstance;
}
})(window, document);

View File

@ -67,23 +67,23 @@
}
/*** Basic colours ***/
[data-coalition="blue"] .unit-marker>svg>.background {
fill: var(--primary-blue);
[data-coalition="blue"] .unit-marker svg>*:first-child {
fill: var(--unit-background-blue);
}
[data-coalition="red"] .unit-marker>svg>.background {
fill: var(--primary-red);
[data-coalition="red"] .unit-marker svg>*:first-child {
fill: var(--unit-background-red);
}
[data-coalition="neutral"] .unit-marker>svg>.background {
fill: var(--primary-neutral);
[data-coalition="neutral"] .unit-marker svg>*:first-child {
fill: var(--unit-background-neutral);
}
[data-is-selected] .unit-marker>svg>.background {
[data-is-selected] .unit-marker svg>*:first-child {
fill: white;
}
[data-is-highlighted] .unit-marker>svg>.background {
[data-is-highlighted] .unit-marker svg>*:first-child {
stroke: white;
}

View File

@ -1,14 +1,15 @@
@import url("layout.css");
@import url("airbase.css");
@import url("atc.css");
@import url("connectionstatuspanel.css");
@import url("contextmenus.css");
@import url("mouseinfopanel.css");
@import url("/stylesheets/units.css");
@import url("unitdatatable.css");
@import url("unitcontrolpanel.css");
@import url("unitinfopanel.css");
@import url("popup.css");
@import url("layout/layout.css");
@import url("atc/atc.css");
@import url("atc/unitdatatable.css");
@import url("aic/aic.css");
@import url("panels/connectionstatus.css");
@import url("panels/mouseinfo.css");
@import url("panels/unitcontrol.css");
@import url("panels/unitinfo.css");
@import url("other/contextmenus.css");
@import url("other/popup.css");
@import url("markers/airbase.css");
@import url("markers/units.css");
* {
-moz-box-sizing: border-box;
@ -593,22 +594,28 @@ nav.ol-panel> :last-child {
#unit-visibility-control button svg {
pointer-events: none;
height: 16px;
width: 16px;
}
#unit-visibility-control button svg .background {
fill: white;
#unit-visibility-control button {
background-color: white;
border: 1px solid transparent;
}
#unit-visibility-control button.off svg .foreground {
fill: var(--background-steel);
#unit-visibility-control button.off {
background-color: transparent;
border: 1px solid white;
}
#unit-visibility-control button.off svg .background {
fill: none;
#unit-visibility-control button.off svg * {
fill: white !important;
stroke: white !important;
}
#unit-visibility-control button.off svg .foreground {
fill: white;
#unit-visibility-control button svg * {
fill: var(--background-steel) !important;
stroke: var(--background-steel) !important;
}
#atc-navbar-control {

View File

@ -37,7 +37,7 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path class="foreground"
<path
d="m 7.5000002,0 c 0.498,0 0.9375,0.4395 0.9375,0.9375 V 1.2598 C 11.1621,1.6699 13.3301,3.8379002 13.7402,6.5625002 h 0.3223 c 0.498,0 0.9375,0.4395 0.9375,0.9375 0,0.5273 -0.4395,0.9375 -0.9375,0.9375 H 13.7402 C 13.3301,11.1914 11.1621,13.3594 8.4375002,13.7695 v 0.293 c 0,0.5273 -0.4395,0.9375 -0.9375,0.9375 -0.5273,0 -0.9375,-0.4102 -0.9375,-0.9375 v -0.293 C 3.8086002,13.3594 1.6406,11.1914 1.2305,8.4375002 h -0.293 c -0.5273,0 -0.9375,-0.4102 -0.9375,-0.9375 0,-0.498 0.4102,-0.9375 0.9375,-0.9375 h 0.293 C 1.6406,3.8379002 3.8086002,1.6699 6.5625002,1.2598 V 0.9375 c 0,-0.498 0.4102,-0.9375 0.9375,-0.9375 z m -4.3652,8.4375002 c 0.3515,1.7284998 1.6992,3.0761998 3.4277,3.4276998 V 11.25 c 0,-0.498 0.4102,-0.9375 0.9375,-0.9375 0.498,0 0.9375,0.4395 0.9375,0.9375 v 0.6152 C 10.1367,11.5137 11.4844,10.166 11.8359,8.4375002 H 11.25 c -0.5273,0 -0.9375,-0.4102 -0.9375,-0.9375 0,-0.498 0.4102,-0.9375 0.9375,-0.9375 h 0.5859 c -0.3515,-1.6992 -1.6992,-3.0469 -3.3983998,-3.3984 v 0.5859 c 0,0.5273 -0.4395,0.9375 -0.9375,0.9375 -0.5273,0 -0.9375,-0.4102 -0.9375,-0.9375 v -0.5859 c -1.7285,0.3515 -3.0762,1.6992 -3.4277,3.3984 h 0.6152 c 0.498,0 0.9375,0.4395 0.9375,0.9375 0,0.5273 -0.4395,0.9375 -0.9375,0.9375 z m 4.3652,0 c -0.5273,0 -0.9375,-0.4102 -0.9375,-0.9375 0,-0.498 0.4102,-0.9375 0.9375,-0.9375 0.498,0 0.9375,0.4395 0.9375,0.9375 0,0.5273 -0.4395,0.9375 -0.9375,0.9375 z"
fill="#5ca7ff"
id="path2" />

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -36,7 +36,7 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path class="foreground"
<path
d="m 10.796771,3.75 c 0,1.31836 -0.7618,2.46094 -1.8750496,3.13476 v 0.61525 c 0,0.5273 -0.43945,0.9375 -0.9375,0.9375 h -2.8125 c -0.52734,0 -0.9375,-0.4102 -0.9375,-0.9375 V 6.88476 c -1.14258,-0.67382 -1.875,-1.8164 -1.875,-3.13476 0,-2.05078 1.875,-3.75 4.21875,-3.75 2.31445,0 4.2187996,1.69922 4.2187996,3.75 z M 4.9373514,5.15625 c 0.49804,0 0.9375,-0.41016 0.9375,-0.9375 0,-0.49805 -0.43946,-0.9375 -0.9375,-0.9375 -0.52735,0 -0.9375,0.43945 -0.9375,0.9375 0,0.52734 0.41015,0.9375 0.9375,0.9375 z m 4.21872,-0.9375 c 0,-0.49805 -0.43943,-0.9375 -0.93748,-0.9375 -0.52734,0 -0.9375,0.43945 -0.9375,0.9375 0,0.52734 0.41016,0.9375 0.9375,0.9375 0.49805,0 0.93748,-0.41016 0.93748,-0.9375 z M 0.10336144,8.02731 c 0.23438,-0.4687 0.79102,-0.6445 1.25976996,-0.4101 l 5.21484,2.6074 5.1854996,-2.6074 c 0.4688,-0.2344 1.0254,-0.0586 1.2598,0.4101 0.2344,0.4688 0.0586,1.0254 -0.4101,1.2598 l -3.9551196,1.9629 3.9551196,1.9922 c 0.4687,0.2344 0.6445,0.791 0.4101,1.2597 -0.2344,0.4688 -0.791,0.6446 -1.2598,0.4102 l -5.1854996,-2.6074 -5.21484,2.6074 c -0.46874996,0.2344 -1.02538996,0.0586 -1.25976996,-0.4102 -0.234374,-0.4687 -0.058593,-1.0253 0.41016,-1.2597 L 4.4685914,11.25001 0.51352144,9.28711 c -0.468753,-0.2344 -0.644534,-0.791 -0.41016,-1.2598 z"
fill="#5ca7ff"
id="path2" />

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -36,7 +36,7 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path class="foreground"
<path
d="m 9.103975,1.603975 c 0.3809,-0.3515 0.3809,-0.9668 0,-1.3183 -0.3515,-0.3809 -0.9668,-0.3809 -1.3183,0 l -3.0762,3.0761 -3.1055,-3.0761 c -0.3515,-0.3809 -0.9668,-0.3809 -1.3183,0 -0.3809,0.3515 -0.3809,0.9668 0,1.3183 l 3.0761,3.0762 -3.0761,3.1055 c -0.3809,0.3515 -0.3809,0.9668 0,1.3183 0.3515,0.3809 0.9668,0.3809 1.3183,0 l 3.1055,-3.0761 3.0762,3.0761 c 0.3515,0.3809 0.9668,0.3809 1.3183,0 0.3809,-0.3515 0.3809,-0.9668 0,-1.3183 l -3.0761,-3.1055 z"
fill="#5ca7ff"
id="path2" />

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -36,7 +36,7 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path class="foreground"
<path
d="m 7.0324294,0 c 0.1172,0 0.2637,0.0293 0.3809,0.0879 l 5.5077996,2.3437 c 0.6445,0.293 1.1425,0.9082 1.1425,1.67 -0.0292,2.9296 -1.2304,8.2324 -6.2694996,10.664 -0.498,0.2344 -1.0547,0.2344 -1.5527,0 -5.0391,-2.4316 -6.24020004,-7.7344 -6.24020004,-10.664 -0.0293,-0.7618 0.4687,-1.377 1.11320004,-1.67 l 5.5078,-2.3437 C 6.7394294,0.0293 6.8859294,0 7.0324294,0 Z m 0,1.9629 V 13.0371 C 11.075429,11.0742 12.159429,6.7676 12.188629,4.1602 Z"
fill="#5ca7ff"
id="path2" />

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -36,25 +36,25 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg12" />
<path class="foreground"
<path
d="m 0.02182384,14.515426 c -0.0453,0.1119 -0.01864,0.2398 0.06662,0.325 0.08526,0.0853 0.21314,0.1119 0.32505,0.0666 l 1.95830996,-0.7833 c 0.15188,-0.0613 0.2891,-0.1505 0.405,-0.2664 l 1.02578,-1.0258 3.03735,0.7993 -0.2504,0.2504 c -0.1772,0.1772 -0.1772,0.4623 0,0.6395 0.1772,0.1772 0.4623,0.1772 0.6394,0 l 0.7461,-0.746 0.4263,-0.4263 0.3197,-0.3198 c 0.1772,-0.1771 0.1772,-0.4622 0,-0.6394 -0.1772,-0.1772 -0.4623,-0.1772 -0.6395,0 l -0.1065,0.1066 -1.9184,-1.9184 0.4356,-0.4356 1.4628,0.0959 c 0.0866,0.0066 0.1718,-0.0253 0.2331,-0.0866 l 0.2132,-0.2130999 c 0.1172,-0.1173 0.1172,-0.3091 0,-0.4263 l -1.2789,-1.2789 -0.8526,0.8526 c -0.1173,0.1172 -0.3091,0.1172 -0.4263,0 -0.1173,-0.1173 -0.1173,-0.3091 0,-0.4263 l 0.8526,-0.8526 -1.2789,-1.2789 c -0.1173,-0.1173 -0.3091,-0.1173 -0.4263,0 l -0.2132,0.2131 c -0.0613,0.0613 -0.0933,0.1465 -0.0866,0.2331 l 0.0959,1.4628 -0.4356,0.4356 -1.91834,-1.9183 0.10657,-0.1066 c 0.17717,-0.1772 0.17717,-0.4623 0,-0.6395 -0.17717,-0.1771 -0.46228,-0.1771 -0.63945,0 l -0.31972,0.3198 -0.4263,0.4263 -0.74602996,0.746 c -0.17717,0.1772 -0.17717,0.4623 0,0.6394 0.17717,0.1772 0.46228,0.1772 0.63944996,0 l 0.25041,-0.2504 0.79936,3.0373999 -1.02578,1.0258 c -0.11590996,0.1159 -0.20516996,0.2531 -0.26644996,0.405 z"
fill="#5ca7ff"
id="path2" />
<path class="foreground"
<path
d="m 9.0916338,5.3111261 c 2.5638002,-2.3307 8.3905002,-6.43275 11.1873002,-4.19528 3.4961,2.79688 4.1953,9.0895799 -2.7968,16.7808799"
stroke="#5ca7ff"
stroke-linecap="round"
stroke-dasharray="2, 2"
id="path4" />
<path class="foreground"
<path
d="m 14.783034,12.805026 -0.1001,0.8985 0.9106,-0.2539 0.0806,0.6152 -0.8301,0.0586 0.5444,0.7251 -0.5542,0.2954 -0.3808,-0.7642 -0.3345,0.7593 -0.5762,-0.2905 0.5396,-0.7251 -0.8252,-0.0635 0.0952,-0.6103 0.8911,0.2539 -0.1001,-0.8985 z"
fill="#5ca7ff"
id="path6" />
<path class="foreground"
<path
d="m 13.384534,7.2113261 -0.1001,0.8984 0.9107,-0.2539 0.0805,0.6152 -0.83,0.0586 0.5444,0.7251 -0.5542,0.2954 -0.3809,-0.7641 -0.3344,0.7593 -0.5762,-0.2906 0.5395,-0.7251 -0.8252,-0.0634 0.0953,-0.6104 0.8911,0.2539 -0.1001,-0.8984 z"
fill="#5ca7ff"
id="path8" />
<path class="foreground"
<path
d="m 18.977834,7.2113261 -0.1001,0.8984 0.9106,-0.2539 0.0806,0.6152 -0.8301,0.0586 0.5445,0.7251 -0.5542,0.2954 -0.3809,-0.7641 -0.3345,0.7593 -0.5761,-0.2906 0.5395,-0.7251 -0.8252,-0.0634 0.0952,-0.6104 0.8911,0.2539 -0.1001,-0.8984 z"
fill="#5ca7ff"
id="path10" />

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -36,7 +36,7 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg12" />
<path class="foreground"
<path
d="m 0.02182384,14.515426 c -0.0453,0.1119 -0.01864,0.2398 0.06662,0.325 0.08526,0.0853 0.21314,0.1119 0.32505,0.0666 l 1.95830996,-0.7833 c 0.15188,-0.0613 0.2891,-0.1505 0.405,-0.2664 l 1.02578,-1.0258 3.03735,0.7993 -0.2504,0.2504 c -0.1772,0.1772 -0.1772,0.4623 0,0.6395 0.1772,0.1772 0.4623,0.1772 0.6394,0 l 0.7461,-0.746 0.4263,-0.4263 0.3197,-0.3198 c 0.1772,-0.1771 0.1772,-0.4622 0,-0.6394 -0.1772,-0.1772 -0.4623,-0.1772 -0.6395,0 l -0.1065,0.1066 -1.9184,-1.9184 0.4356,-0.4356 1.4628,0.0959 c 0.0866,0.0066 0.1718,-0.0253 0.2331,-0.0866 l 0.2132,-0.2130999 c 0.1172,-0.1173 0.1172,-0.3091 0,-0.4263 l -1.2789,-1.2789 -0.8526,0.8526 c -0.1173,0.1172 -0.3091,0.1172 -0.4263,0 -0.1173,-0.1173 -0.1173,-0.3091 0,-0.4263 l 0.8526,-0.8526 -1.2789,-1.2789 c -0.1173,-0.1173 -0.3091,-0.1173 -0.4263,0 l -0.2132,0.2131 c -0.0613,0.0613 -0.0933,0.1465 -0.0866,0.2331 l 0.0959,1.4628 -0.4356,0.4356 -1.91834,-1.9183 0.10657,-0.1066 c 0.17717,-0.1772 0.17717,-0.4623 0,-0.6395 -0.17717,-0.1771 -0.46228,-0.1771 -0.63945,0 l -0.31972,0.3198 -0.4263,0.4263 -0.74602996,0.746 c -0.17717,0.1772 -0.17717,0.4623 0,0.6394 0.17717,0.1772 0.46228,0.1772 0.63944996,0 l 0.25041,-0.2504 0.79936,3.0373999 -1.02578,1.0258 c -0.11590996,0.1159 -0.20516996,0.2531 -0.26644996,0.405 z"
fill="#5ca7ff"
id="path2" />

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -36,7 +36,7 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path class="foreground"
<path
d="m 9.103975,1.603975 c 0.3809,-0.3515 0.3809,-0.9668 0,-1.3183 -0.3515,-0.3809 -0.9668,-0.3809 -1.3183,0 l -3.0762,3.0761 -3.1055,-3.0761 c -0.3515,-0.3809 -0.9668,-0.3809 -1.3183,0 -0.3809,0.3515 -0.3809,0.9668 0,1.3183 l 3.0761,3.0762 -3.0761,3.1055 c -0.3809,0.3515 -0.3809,0.9668 0,1.3183 0.3515,0.3809 0.9668,0.3809 1.3183,0 l 3.1055,-3.0761 3.0762,3.0761 c 0.3515,0.3809 0.9668,0.3809 1.3183,0 0.3809,-0.3515 0.3809,-0.9668 0,-1.3183 l -3.0761,-3.1055 z"
fill="#5ca7ff"
id="path2" />

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -36,28 +36,28 @@
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg14" />
<path class="foreground"
<path
d="M 0.1977,6.4546 C 0.07745,6.5055 0,6.6237 0,6.7542 0,6.8846 0.07745,7.0028 0.1977,7.0538 l 2.09719,0.8987 c 0.16304,0.0694 0.33629,0.106 0.51361,0.106 h 1.5693 l 1.712,2.9349 H 5.7067 c -0.2711,0 -0.4892,0.2181 -0.4892,0.4891 0,0.2711 0.2181,0.4892 0.4892,0.4892 H 6.848 7.5002 7.9893 c 0.2711,0 0.4892,-0.2181 0.4892,-0.4892 0,-0.271 -0.2181,-0.4891 -0.4892,-0.4891 H 7.8263 V 8.0585 h 0.6664 l 1.0456,1.1923 c 0.0611,0.0713 0.1508,0.1121 0.2445,0.1121 h 0.3261 c 0.1794,0 0.3261,-0.1467 0.3261,-0.3261 V 7.0802 H 9.1306 c -0.1793,0 -0.326,-0.1467 -0.326,-0.326 0,-0.1794 0.1467,-0.3261 0.326,-0.3261 H 10.435 V 4.4715 c 0,-0.1794 -0.1467,-0.3261 -0.3261,-0.3261 H 9.7828 c -0.0937,0 -0.1834,0.0407 -0.2445,0.112 L 8.4927,5.4498 H 7.8263 V 2.5149 h 0.163 c 0.2711,0 0.4892,-0.2181 0.4892,-0.4891 0,-0.2711 -0.2181,-0.4892 -0.4892,-0.4892 H 7.5002 6.848 5.7067 c -0.2711,0 -0.4892,0.2181 -0.4892,0.4892 0,0.271 0.2181,0.4891 0.4892,0.4891 H 6.0898 L 4.3778,5.4498 H 2.8085 c -0.17732,0 -0.35057,0.0367 -0.51361,0.106 z"
fill="#5ca7ff"
id="path2" />
<path class="foreground"
<path
d="M 12.8398,6.5498 H 23.2749"
stroke="#5ca7ff"
stroke-dasharray="2, 2"
id="path4" />
<path class="foreground"
<path
d="m 16.4116,9 -0.1,0.8984 0.9106,-0.2539 0.0806,0.6152 -0.8301,0.0586 0.5444,0.7251 -0.5542,0.2955 L 16.0821,10.5747 15.7476,11.334 15.1714,11.0434 15.711,10.3183 14.8858,10.2549 14.981,9.6445 15.8721,9.8984 15.772,9 Z"
fill="#5ca7ff"
id="path6" />
<path class="foreground"
<path
d="m 21.4116,10.6582 -0.1,0.8984 0.9106,-0.2539 0.0806,0.6153 -0.8301,0.0585 0.5444,0.7251 -0.5542,0.2955 -0.3808,-0.7642 -0.3345,0.7593 -0.5762,-0.2906 0.5396,-0.7251 -0.8252,-0.0634 0.0952,-0.6104 0.8911,0.2539 -0.1001,-0.8984 z"
fill="#5ca7ff"
id="path8" />
<path class="foreground"
<path
d="m 21.4116,0 -0.1,0.8984 0.9106,-0.2539 0.0806,0.6152 -0.8301,0.0586 0.5444,0.7251 L 21.4629,2.3389 21.0821,1.5747 20.7476,2.334 20.1714,2.0434 20.711,1.3183 19.8858,1.2549 19.981,0.6445 20.8721,0.8984 20.772,0 Z"
fill="#5ca7ff"
id="path10" />
<path class="foreground"
<path
d="m 16.4116,1.6582 -0.1,0.8984 0.9106,-0.2539 0.0806,0.6153 -0.8301,0.0585 0.5444,0.7251 L 16.4629,3.9971 16.0821,3.2329 15.7476,3.9922 15.1714,3.7016 15.711,2.9765 14.8858,2.9131 14.981,2.3027 15.8721,2.5566 15.772,1.6582 Z"
fill="#5ca7ff"
id="path12" />

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="21.327999"
height="21.327999"
fill="none"
version="1.1"
viewBox="0 0 21.327999 21.327999"
id="svg7226"
sodipodi:docname="airbase.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs7230" />
<sodipodi:namedview
id="namedview7228"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="26.15625"
inkscape:cx="10.666667"
inkscape:cy="10.666667"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg7226" />
<metadata
id="metadata7218">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<path
d="m 10.664,18.4362 c 4.2922,0 7.7717,-3.4796 7.7717,-7.7717 0,-4.2921 -3.4796,-7.7717 -7.7717,-7.7717 -4.2921,0 -7.7717,3.4796 -7.7717,7.7717 0,4.2921 3.4796,7.7717 7.7717,7.7717 z m 0,2.8918 c 5.8893,0 10.664,-4.7742 10.664,-10.664 C 21.328,4.7742 16.5538,0 10.664,0 4.7742,0 0,4.7742 0,10.664 0,16.5538 4.7742,21.328 10.664,21.328 Z"
clip-rule="evenodd"
fill="#ffffff"
fill-rule="evenodd"
stroke-width="0"
style="fill:#000000"
id="path7220" />
<line
x1="7.796"
x2="13.187"
y1="6.8541994"
y2="14.231199"
stroke="#247BE2"
stroke-linecap="square"
style="fill:none;stroke:#000000"
id="line7222" />
<line
x1="14.397999"
x2="7.8680005"
y1="11.885201"
y2="11.450199"
stroke="#247BE2"
stroke-linecap="square"
style="fill:none;stroke:#000000"
id="line7224" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,5 +1,41 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect class="background" x="0.5" y="0.5" width="31" height="31" rx="7.5" fill="white"/>
<path class="foreground" d="M21.3047 14C22.2344 14 23.875 14.793 23.875 15.75C23.875 16.7344 22.2344 17.5 21.3047 17.5H18.1055L15.3711 22.3125C15.207 22.5859 14.9062 22.75 14.6055 22.75H13.0742C12.7734 22.75 12.5547 22.4766 12.6367 22.2031L13.9766 17.5H11.1875L9.98438 19.0859C9.90234 19.1953 9.79297 19.25 9.65625 19.25H8.50781C8.28906 19.25 8.125 19.0859 8.125 18.8672C8.125 18.8398 8.125 18.8125 8.125 18.7852L9 15.75L8.125 12.7422C8.125 12.7148 8.125 12.6875 8.125 12.6328C8.125 12.4414 8.28906 12.25 8.50781 12.25H9.65625C9.79297 12.25 9.90234 12.332 9.98438 12.4414L11.1875 14H13.9766L12.6367 9.32422C12.5547 9.05078 12.7734 8.75 13.0742 8.75H14.6055C14.9062 8.75 15.207 8.94141 15.3711 9.21484L18.1055 14H21.3047Z" fill="#202831"/>
<rect x="0.5" y="0.5" width="31" height="31" rx="7.5" stroke="white"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="15.75"
height="14"
viewBox="0 0 15.75 14"
fill="none"
version="1.1"
id="svg7234"
sodipodi:docname="aircraft.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs7238" />
<sodipodi:namedview
id="namedview7236"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="26.15625"
inkscape:cx="7.8757467"
inkscape:cy="7.2640382"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg7234" />
<path
stroke-width="0"
d="m 13.1797,5.25 c 0.9297,0 2.5703,0.793 2.5703,1.75 0,0.9844 -1.6406,1.75 -2.5703,1.75 H 9.9805 L 7.2461,13.5625 C 7.082,13.8359 6.7812,14 6.4805,14 H 4.9492 C 4.6484,14 4.4297,13.7266 4.5117,13.4531 L 5.8516,8.75 H 3.0625 L 1.85938,10.3359 C 1.77734,10.4453 1.66797,10.5 1.53125,10.5 H 0.38281 C 0.16406,10.5 0,10.3359 0,10.1172 0,10.0898 0,10.0625 0,10.0352 L 0.875,7 0,3.9922 C 0,3.9648 0,3.9375 0,3.8828 0,3.6914 0.16406,3.5 0.38281,3.5 h 1.14844 c 0.13672,0 0.24609,0.082 0.32813,0.1914 L 3.0625,5.25 H 5.8516 L 4.5117,0.57422 C 4.4297,0.30078 4.6484,0 4.9492,0 H 6.4805 C 6.7812,0 7.082,0.19141 7.2461,0.46484 L 9.9805,5.25 Z"
fill="#202831"
id="path7232" />
</svg>

Before

Width:  |  Height:  |  Size: 1001 B

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg6"
version="1.1"
fill="none"
viewBox="0 0 12.952619 10.362093"
height="10.362093"
width="12.952619"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
stroke-width="0"
fill="black"
id="path3711"
d="m 6.4763089,0 c 0.358221,0 0.6476303,0.2894099 0.6476303,0.6476303 v 1.2952618 h 2.428616 c 0.8054918,0 1.4571708,0.6516785 1.4571708,1.4571695 v 5.5048619 c 0,0.805491 -0.651679,1.4571685 -1.4571708,1.4571685 H 3.4000627 c -0.8054909,0 -1.4571694,-0.6516775 -1.4571694,-1.4571685 V 3.4000616 c 0,-0.805491 0.6516785,-1.4571695 1.4571694,-1.4571695 H 5.8286776 V 0.6476303 C 5.8286776,0.2894099 6.1180887,0 6.4763089,0 Z M 4.2096006,7.7715699 c -0.1780979,0 -0.3238152,0.145716 -0.3238152,0.3238146 0,0.178099 0.1457173,0.323817 0.3238152,0.323817 h 0.6476303 c 0.1780991,0 0.3238164,-0.145718 0.3238164,-0.323817 0,-0.1780986 -0.1457173,-0.3238146 -0.3238164,-0.3238146 z m 1.9428933,0 c -0.178099,0 -0.3238163,0.145716 -0.3238163,0.3238146 0,0.178099 0.1457173,0.323817 0.3238163,0.323817 h 0.64763 c 0.178099,0 0.3238153,-0.145718 0.3238153,-0.323817 0,-0.1780986 -0.1457163,-0.3238146 -0.3238153,-0.3238146 z m 1.9428923,0 c -0.178098,0 -0.323815,0.145716 -0.323815,0.3238146 0,0.178099 0.145717,0.323817 0.323815,0.323817 h 0.647631 c 0.178098,0 0.323816,-0.145718 0.323816,-0.323817 0,-0.1780986 -0.145718,-0.3238146 -0.323816,-0.3238146 z M 5.3429549,5.1810458 a 0.8095391,0.8095391 0 1 0 -1.6190782,0 0.8095391,0.8095391 0 1 0 1.6190782,0 z m 3.0762473,0.809538 a 0.80953865,0.80953865 0 1 0 0,-1.6190771 0.80953865,0.80953865 0 1 0 0,1.6190771 z M 0.9714467,4.5334156 h 0.323815 V 8.4192015 H 0.9714467 C 0.4351272,8.4192015 0,7.9840739 0,7.4477529 V 5.504861 C 0,4.9685428 0.4351272,4.5334156 0.9714467,4.5334156 Z m 11.0097253,0 c 0.536319,0 0.971446,0.4351272 0.971446,0.9714454 v 1.9428919 c 0,0.536321 -0.435127,0.9714486 -0.971446,0.9714486 H 11.657355 V 4.5334156 Z" />
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="human.svg"
id="svg6"
version="1.1"
fill="none"
viewBox="0 0 12.14064 10.677204"
height="10.677204"
width="12.14064">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-left="0"
fit-margin-top="0"
inkscape:document-rotation="0"
inkscape:current-layer="svg6"
inkscape:window-maximized="1"
inkscape:window-y="-8"
inkscape:window-x="1912"
inkscape:window-height="1017"
inkscape:window-width="1920"
inkscape:cy="3.5052403"
inkscape:cx="-1.3921341"
inkscape:zoom="27.733334"
showgrid="false"
inkscape:pagecheckerboard="0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="namedview8" />
<path
sodipodi:nodetypes="ccccccc"
id="path1359"
d="M 1.2277422,10.677204 C 0.50620893,10.667383 0.04230013,10.430984 0.00390353,9.8358148 -0.07761857,7.3028212 1.1300144,6.7967364 2.4770775,6.2662917 l 6.6154506,-0.012246 c 2.4502799,0.2890709 3.0477749,1.846629 3.0477749,3.4797821 0.0127,0.3604432 -0.331282,0.9019572 -1.478805,0.9433762 z"
stroke-width="0"
style="stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
fill="black" />
<path
fill="black"
id="path916"
stroke-width="0"
d="m 5.9808108,5.7908995 c 1.6415273,0 2.9733343,-1.2969197 2.9733343,-2.8954494 C 8.9541451,1.2969203 7.6223381,0 5.9808108,0 4.3392825,0 3.0074758,1.2969203 3.0074758,2.8954501 c 0,1.5985297 1.3318067,2.8954494 2.973335,2.8954494 z M 8.6237741,6.4343342 H 7.4860601 C 7.0276691,6.6394281 6.5176619,6.7560505 5.9808108,6.7560505 5.4439597,6.7560505 4.9360143,6.6394281 4.475561,6.4343342 H 3.3378464 c -1.4598251,0 -2.64296517,1.152148 -2.64296517,2.5737386 v 0.321716 c 0,0.532843 0.44393577,0.9651492 0.99111197,0.9651492 h 8.5896338 c 0.547177,0 0.991112,-0.4323062 0.991112,-0.9651492 v -0.321716 c 0,-1.4215906 -1.18314,-2.5737386 -2.6429649,-2.5737386 z" />
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,5 +1,41 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect class="background" x="0.5" y="0.5" width="31" height="31" rx="7.5" fill="white"/>
<path class="foreground" d="M13.375 9.625C13.375 9.16016 13.7578 8.75 14.25 8.75H17.75C18.2148 8.75 18.625 9.16016 18.625 9.625V10.5H19.9375C20.6484 10.5 21.25 11.1016 21.25 11.8125V15.3125L22.4531 15.7227C23.082 15.9414 23.2461 16.7617 22.7539 17.1992L19.9922 19.7422C19.5547 19.9883 19.0625 20.1523 18.625 20.1523C18.0781 20.1523 17.5039 19.9336 16.9844 19.6055C16.3828 19.168 15.5898 19.168 14.9883 19.6055C14.5234 19.9062 13.9492 20.1523 13.3477 20.1523C12.9102 20.1523 12.418 19.9883 11.9805 19.7422L9.21875 17.1992C8.72656 16.7617 8.89062 15.9414 9.51953 15.7227L10.75 15.3125V11.8125C10.75 11.1016 11.3242 10.5 12.0625 10.5H13.375V9.625ZM12.5 14.7383L15.4258 13.7539C15.7812 13.6445 16.1914 13.6445 16.5469 13.7539L19.5 14.7383V12.25H12.5V14.7383ZM16.4922 20.2891C17.1211 20.7266 17.8594 21 18.625 21C19.3359 21 20.1289 20.7266 20.7305 20.2891C21.0586 20.0703 21.4961 20.0977 21.7969 20.3438C22.207 20.6719 22.6992 20.918 23.1914 21.0273C23.6562 21.1367 23.957 21.6016 23.8477 22.0938C23.7383 22.5586 23.2461 22.8594 22.7812 22.75C22.125 22.5859 21.5508 22.2852 21.1953 22.0664C20.4023 22.4766 19.5273 22.75 18.625 22.75C17.75 22.75 16.957 22.5039 16.4102 22.2578C16.2461 22.1758 16.1094 22.0938 16 22.0391C15.8633 22.0938 15.7266 22.1758 15.5625 22.2578C15.0156 22.5039 14.2227 22.75 13.375 22.75C12.4727 22.75 11.5703 22.4766 10.7773 22.0664C10.4219 22.2852 9.84766 22.5859 9.19141 22.75C8.72656 22.8594 8.23438 22.5586 8.125 22.0938C8.01562 21.6289 8.31641 21.1367 8.78125 21.0273C9.27344 20.918 9.79297 20.6719 10.1758 20.3438C10.4766 20.0977 10.9141 20.0703 11.2422 20.2891C11.8438 20.7266 12.6367 21 13.375 21C14.1133 21 14.8789 20.7266 15.4805 20.2891C15.7812 20.0703 16.1914 20.0703 16.4922 20.2891Z" fill="#181E25"/>
<rect x="0.5" y="0.5" width="31" height="31" rx="7.5" stroke="white"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="15.767666"
height="14.022505"
viewBox="0 0 15.767666 14.022505"
fill="none"
version="1.1"
id="svg7279"
sodipodi:docname="navyunit.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs7283" />
<sodipodi:namedview
id="namedview7281"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="26.15625"
inkscape:cx="7.9139785"
inkscape:cy="7.2640382"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg7279" />
<path
stroke-width="0"
d="m 5.2724978,0.875 c 0,-0.46484 0.3828,-0.875 0.875,-0.875 h 3.5 C 10.112298,0 10.522498,0.41016 10.522498,0.875 V 1.75 h 1.3125 c 0.7109,0 1.3125,0.6016 1.3125,1.3125 v 3.5 l 1.2031,0.4102 c 0.6289,0.2187 0.793,1.039 0.3008,1.4765 l -2.7617,2.543 c -0.4375,0.2461 -0.9297,0.4101 -1.3672,0.4101 -0.5469002,0 -1.1211002,-0.2187 -1.6406002,-0.5468 -0.6016,-0.4375 -1.3946,-0.4375 -1.9961,0 -0.4649,0.3007 -1.0391,0.5468 -1.6406,0.5468 -0.4375,0 -0.9297,-0.164 -1.3672,-0.4101 l -2.76175,-2.543 C 0.62405778,8.0117 0.78811778,7.1914 1.4170278,6.9727 l 1.23047,-0.4102 v -3.5 c 0,-0.7109 0.5742,-1.3125 1.3125,-1.3125 h 1.3125 z m -0.875,5.1133 2.9258,-0.9844 c 0.3554,-0.1094 0.7656,-0.1094 1.1211,0 L 11.397498,5.9883 V 3.5 H 4.3974978 Z m 3.9922,5.5508 c 0.6289,0.4375 1.3672,0.7109 2.1328002,0.7109 0.7109,0 1.5039,-0.2734 2.1055,-0.7109 0.3281,-0.2188 0.7656,-0.1914 1.0664,0.0547 0.4101,0.3281 0.9023,0.5742 1.3945,0.6835 0.4648,0.1094 0.7656,0.5743 0.6563,1.0665 -0.1094,0.4648 -0.6016,0.7656 -1.0665,0.6562 -0.6562,-0.1641 -1.2304,-0.4648 -1.5859,-0.6836 -0.793,0.4102 -1.668,0.6836 -2.5703,0.6836 -0.8750002,0 -1.6680002,-0.2461 -2.2148002,-0.4922 -0.1641,-0.082 -0.3008,-0.164 -0.4102,-0.2187 -0.1367,0.0547 -0.2734,0.1367 -0.4375,0.2187 -0.5469,0.2461 -1.3398,0.4922 -2.1875,0.4922 -0.9023,0 -1.8047,-0.2734 -2.5977,-0.6836 -0.3554,0.2188 -0.92964,0.5195 -1.58589,0.6836 -0.46485002,0.1094 -0.95703002,-0.1914 -1.06641002,-0.6562 -0.10938,-0.4649 0.19141,-0.9571 0.65625,-1.0665 0.49219002,-0.1093 1.01172002,-0.3554 1.39455002,-0.6835 0.3008,-0.2461 0.7383,-0.2735 1.0664,-0.0547 0.6016,0.4375 1.3945,0.7109 2.1328,0.7109 0.7383,0 1.5039,-0.2734 2.1055,-0.7109 0.3007,-0.2188 0.7109,-0.2188 1.0117,0 z"
fill="#181e25"
id="path7277" />
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,5 +0,0 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect class="background" x="0.5" y="0.5" width="31" height="31" rx="7.5" fill="white"/>
<path class="foreground" d="M13.375 15.75C13.375 14.3008 14.5234 13.125 16 13.125C17.4492 13.125 18.625 14.3008 18.625 15.75C18.625 17.1992 17.4492 18.375 16 18.375C14.5234 18.375 13.375 17.1992 13.375 15.75ZM23 15.75C23 19.6328 19.8555 22.75 16 22.75C12.1172 22.75 9 19.6328 9 15.75C9 11.8945 12.1172 8.75 16 8.75C19.8555 8.75 23 11.8945 23 15.75ZM16 10.0625C12.8555 10.0625 10.3125 12.6328 10.3125 15.75C10.3125 18.8945 12.8555 21.4375 16 21.4375C19.1172 21.4375 21.6875 18.8945 21.6875 15.75C21.6875 12.6328 19.1172 10.0625 16 10.0625Z" fill="#181E25"/>
<rect x="0.5" y="0.5" width="31" height="31" rx="7.5" stroke="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 819 B

View File

@ -1,4 +1,4 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="background" d="M40.4002 7.2002H9.6002C8.27471 7.2002 7.2002 8.27472 7.2002 9.6002V40.4002C7.2002 41.7257 8.27472 42.8002 9.6002 42.8002H40.4002C41.7257 42.8002 42.8002 41.7257 42.8002 40.4002V9.6002C42.8002 8.27471 41.7257 7.2002 40.4002 7.2002Z" fill="white" stroke="none" stroke-width="2"/>
<path d="M40.4002 7.2002H9.6002C8.27471 7.2002 7.2002 8.27472 7.2002 9.6002V40.4002C7.2002 41.7257 8.27472 42.8002 9.6002 42.8002H40.4002C41.7257 42.8002 42.8002 41.7257 42.8002 40.4002V9.6002C42.8002 8.27471 41.7257 7.2002 40.4002 7.2002Z" fill="white" stroke="none" stroke-width="2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.0002 11.0002V39.0002H39.0002V11.0002H11.0002ZM9.6002 8.2002C8.827 8.2002 8.2002 8.827 8.2002 9.6002V40.4002C8.2002 41.1734 8.827 41.8002 9.6002 41.8002H40.4002C41.1734 41.8002 41.8002 41.1734 41.8002 40.4002V9.6002C41.8002 8.827 41.1734 8.2002 40.4002 8.2002H9.6002Z" fill="#2F2F2F"/>
</svg>

Before

Width:  |  Height:  |  Size: 747 B

After

Width:  |  Height:  |  Size: 729 B

View File

@ -1,3 +1,3 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="background" d="M22.86 33.5C19.8652 26 20.293 15 24.9991 12C29.7052 15.5 29.7052 27 27.1382 33.5C27.1382 33.5 28.7905 34.0138 29.2774 35C29.7783 36.0148 29.2774 38 29.2774 38H20.721C20.721 38 20.2237 36.0172 20.721 35C21.2771 33.8627 22.86 33.5 22.86 33.5Z" fill="#5CA7FF" stroke="#082E44" stroke-width="2"/>
<path d="M22.86 33.5C19.8652 26 20.293 15 24.9991 12C29.7052 15.5 29.7052 27 27.1382 33.5C27.1382 33.5 28.7905 34.0138 29.2774 35C29.7783 36.0148 29.2774 38 29.2774 38H20.721C20.721 38 20.2237 36.0172 20.721 35C21.2771 33.8627 22.86 33.5 22.86 33.5Z" fill="#5CA7FF" stroke="#082E44" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 424 B

After

Width:  |  Height:  |  Size: 406 B

View File

@ -1,3 +1,3 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="background" d="M20.7546 32.9417L10.7926 21.4726C10.766 21.4422 10.7451 21.4146 10.7294 21.3927C10.6864 21.3359 10.6551 21.2862 10.6496 21.2774C10.6494 21.277 10.6492 21.2767 10.649 21.2765C10.6489 21.2763 10.6488 21.2762 10.6488 21.2761L10.6357 21.2566C10.6236 21.2383 10.5957 21.1955 10.567 21.1402L20.7546 32.9417ZM20.7546 32.9417L20.5986 33.0198L20.5985 33.0199C19.7404 33.4496 19.3015 34.5403 19.9212 35.4506L19.9212 35.4507C20.2929 35.9965 20.9084 36.241 21.4658 36.241C21.5582 36.241 21.6516 36.2344 21.7451 36.221V36.7369V39.6546C21.7451 40.7392 22.7148 41.3666 23.5755 41.3666C24.0881 41.3666 24.6393 41.1441 25.0014 40.7351C25.3635 41.1441 25.9147 41.3666 26.4272 41.3666C27.288 41.3666 28.2577 40.7392 28.2577 39.6546V36.737V36.2389C28.2891 36.2404 28.3205 36.2412 28.3517 36.2412C28.9092 36.2412 29.5249 35.9965 29.8964 35.4507C30.5166 34.5399 30.0765 33.4495 29.2191 33.0201L29.2189 33.02L29.1921 33.0066L39.2121 21.4705L39.2121 21.4705C39.5428 21.0898 39.6715 20.6073 39.5996 20.1442C39.4332 13.5757 32.7259 8.63379 24.9939 8.63379C17.168 8.63379 10.3813 13.6997 10.3813 20.3893C10.3813 20.4323 10.3841 20.4691 10.387 20.4971C10.3925 20.5678 10.4021 20.6255 10.4041 20.6369L10.4074 20.6602C10.4109 20.684 10.4188 20.7356 10.4349 20.7975L10.4353 20.7989C10.4513 20.8602 10.4694 20.9092 10.4793 20.9352C10.4841 20.9478 10.4886 20.9591 10.4908 20.9645L10.4911 20.9652L10.4931 20.9703C10.4938 20.9721 10.4937 20.9718 10.4935 20.9713L10.4937 20.9719C10.4937 20.9719 10.4941 20.9729 10.4965 20.9793L10.4966 20.9796C10.4987 20.9853 10.5031 20.9972 10.5083 21.0105C10.5189 21.0373 10.538 21.0843 10.5663 21.1389L20.7546 32.9417ZM33.9441 22.1013L30.4581 26.1148L31.622 22.1013H33.9441ZM23.8679 27.9387L22.1749 22.1013H27.8282L26.1353 27.9387C25.7808 27.8045 25.3961 27.7329 25.0016 27.7329C24.607 27.7329 24.2223 27.8045 23.8679 27.9387ZM19.545 26.115L16.0587 22.1013H18.381L19.545 26.115ZM10.6466 21.2727L10.6485 21.2756L10.6466 21.2727L10.6466 21.2727Z" fill="#3BB9FF" stroke="#082E44" stroke-width="2" stroke-linejoin="round"/>
<path d="M20.7546 32.9417L10.7926 21.4726C10.766 21.4422 10.7451 21.4146 10.7294 21.3927C10.6864 21.3359 10.6551 21.2862 10.6496 21.2774C10.6494 21.277 10.6492 21.2767 10.649 21.2765C10.6489 21.2763 10.6488 21.2762 10.6488 21.2761L10.6357 21.2566C10.6236 21.2383 10.5957 21.1955 10.567 21.1402L20.7546 32.9417ZM20.7546 32.9417L20.5986 33.0198L20.5985 33.0199C19.7404 33.4496 19.3015 34.5403 19.9212 35.4506L19.9212 35.4507C20.2929 35.9965 20.9084 36.241 21.4658 36.241C21.5582 36.241 21.6516 36.2344 21.7451 36.221V36.7369V39.6546C21.7451 40.7392 22.7148 41.3666 23.5755 41.3666C24.0881 41.3666 24.6393 41.1441 25.0014 40.7351C25.3635 41.1441 25.9147 41.3666 26.4272 41.3666C27.288 41.3666 28.2577 40.7392 28.2577 39.6546V36.737V36.2389C28.2891 36.2404 28.3205 36.2412 28.3517 36.2412C28.9092 36.2412 29.5249 35.9965 29.8964 35.4507C30.5166 34.5399 30.0765 33.4495 29.2191 33.0201L29.2189 33.02L29.1921 33.0066L39.2121 21.4705L39.2121 21.4705C39.5428 21.0898 39.6715 20.6073 39.5996 20.1442C39.4332 13.5757 32.7259 8.63379 24.9939 8.63379C17.168 8.63379 10.3813 13.6997 10.3813 20.3893C10.3813 20.4323 10.3841 20.4691 10.387 20.4971C10.3925 20.5678 10.4021 20.6255 10.4041 20.6369L10.4074 20.6602C10.4109 20.684 10.4188 20.7356 10.4349 20.7975L10.4353 20.7989C10.4513 20.8602 10.4694 20.9092 10.4793 20.9352C10.4841 20.9478 10.4886 20.9591 10.4908 20.9645L10.4911 20.9652L10.4931 20.9703C10.4938 20.9721 10.4937 20.9718 10.4935 20.9713L10.4937 20.9719C10.4937 20.9719 10.4941 20.9729 10.4965 20.9793L10.4966 20.9796C10.4987 20.9853 10.5031 20.9972 10.5083 21.0105C10.5189 21.0373 10.538 21.0843 10.5663 21.1389L20.7546 32.9417ZM33.9441 22.1013L30.4581 26.1148L31.622 22.1013H33.9441ZM23.8679 27.9387L22.1749 22.1013H27.8282L26.1353 27.9387C25.7808 27.8045 25.3961 27.7329 25.0016 27.7329C24.607 27.7329 24.2223 27.8045 23.8679 27.9387ZM19.545 26.115L16.0587 22.1013H18.381L19.545 26.115ZM10.6466 21.2727L10.6485 21.2756L10.6466 21.2727L10.6466 21.2727Z" fill="#3BB9FF" stroke="#082E44" stroke-width="2" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1,5 +1,5 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect class="background" x="25" y="2.37241" width="32" height="32" rx="1.1" transform="rotate(45 25 2.37241)" fill="white" stroke="none" stroke-width="2"/>
<rect x="25" y="2.37241" width="32" height="32" rx="1.1" transform="rotate(45 25 2.37241)" fill="white" stroke="none" stroke-width="2"/>
<rect x="25" y="5.20083" width="28" height="28" transform="rotate(45 25 5.20083)" fill="none" stroke="#082E44" stroke-width="2"/>
<circle cx="24.7866" cy="24.7866" r="9" stroke="#082E44" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 465 B

After

Width:  |  Height:  |  Size: 447 B

View File

@ -1,4 +1,4 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="background" d="M45.7733 41.3423L25.9481 7.63951C25.5228 6.91648 24.4772 6.91646 24.0519 7.63951L4.22671 41.3423C3.79536 42.0756 4.32409 43 5.17484 43H44.8252C45.6759 43 46.2046 42.0756 45.7733 41.3423Z" fill="#3BB9FF" stroke="white" stroke-width="2"/>
<path d="M45.7733 41.3423L25.9481 7.63951C25.5228 6.91648 24.4772 6.91646 24.0519 7.63951L4.22671 41.3423C3.79536 42.0756 4.32409 43 5.17484 43H44.8252C45.6759 43 46.2046 42.0756 45.7733 41.3423Z" fill="#3BB9FF" stroke="white" stroke-width="2"/>
<path d="M6.74842 41L25 9.97231L43.2516 41H6.74842Z" fill="none" stroke="#082E44" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 469 B

After

Width:  |  Height:  |  Size: 451 B

View File

@ -1,5 +1,5 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="background" d="M24.9348 9.40703C26.097 9.40703 27.0422 10.3496 27.0422 11.507L27.0422 40.5929L22.8274 40.5929L22.8274 11.507C22.8274 10.3496 23.7726 9.40703 24.9348 9.40703Z" fill="#3BB9FF" stroke="#082E44" stroke-width="1.4"/>
<path d="M24.9348 9.40703C26.097 9.40703 27.0422 10.3496 27.0422 11.507L27.0422 40.5929L22.8274 40.5929L22.8274 11.507C22.8274 10.3496 23.7726 9.40703 24.9348 9.40703Z" fill="#3BB9FF" stroke="#082E44" stroke-width="1.4"/>
<path d="M23.2503 30.5137L23.2503 36.5758L18.0003 33.5448L23.2503 30.5137Z" fill="#082E44"/>
<path d="M23.2503 30.5137L23.2503 36.5758L18.0003 33.5448L23.2503 30.5137Z" fill="#082E44"/>
<path d="M26.7503 30.5137L32.0003 33.5448L26.7503 36.5758L26.7503 30.5137Z" fill="#082E44"/>

Before

Width:  |  Height:  |  Size: 716 B

After

Width:  |  Height:  |  Size: 698 B

View File

@ -1,5 +1,5 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="background" d="M6.32755 18.2328L6.32753 18.2328C5.8934 18.8371 5.93517 19.6562 6.4176 20.2133L6.41763 20.2133L23.8957 40.3947C24.5337 41.1314 25.6766 41.1314 26.3146 40.3947L43.5823 20.4562L43.5824 20.4562C44.065 19.8989 44.1066 19.0796 43.6722 18.4752C39.7848 13.0674 33.7515 9 24.8299 9C16.0514 9 10.1304 12.9391 6.32755 18.2328Z" fill="white" stroke="none" stroke-width="3"/>
<path d="M6.32755 18.2328L6.32753 18.2328C5.8934 18.8371 5.93517 19.6562 6.4176 20.2133L6.41763 20.2133L23.8957 40.3947C24.5337 41.1314 25.6766 41.1314 26.3146 40.3947L43.5823 20.4562L43.5824 20.4562C44.065 19.8989 44.1066 19.0796 43.6722 18.4752C39.7848 13.0674 33.7515 9 24.8299 9C16.0514 9 10.1304 12.9391 6.32755 18.2328Z" fill="white" stroke="none" stroke-width="3"/>
<path d="M24.8299 10.5C16.5441 10.5 11.0471 14.1999 7.5 19.1719L25.1052 39.5L42.5 19.4147C38.8627 14.3209 33.25 10.5 24.8299 10.5Z" fill="none" stroke="#082E44" stroke-width="2"/>
<path d="M16.5 30.5C16.5 30.5 19.2321 25.4999 25 25.5C30.7679 25.5001 33.5 30.5 33.5 30.5" stroke="#082E44" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 802 B

After

Width:  |  Height:  |  Size: 784 B

View File

@ -1,5 +1,5 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="background" d="M25.6237 37.5L45.4 37.5C46.2569 37.5 47.0043 36.8097 46.9997 35.8937C46.9781 31.5861 45.6287 24.9412 41.3969 19.8087C37.9283 15.6018 32.5887 12.5 24.7613 12.5C17.0596 12.5 11.8182 15.5038 8.4233 19.6249C4.16289 24.7968 2.92903 31.5698 3.00314 35.9289C3.01844 36.8304 3.75884 37.5 4.60263 37.5L24.3811 37.5L25.0024 38.1213L25.6237 37.5Z" fill="white" stroke="white" stroke-width="3"/>
<path d="M25.6237 37.5L45.4 37.5C46.2569 37.5 47.0043 36.8097 46.9997 35.8937C46.9781 31.5861 45.6287 24.9412 41.3969 19.8087C37.9283 15.6018 32.5887 12.5 24.7613 12.5C17.0596 12.5 11.8182 15.5038 8.4233 19.6249C4.16289 24.7968 2.92903 31.5698 3.00314 35.9289C3.01844 36.8304 3.75884 37.5 4.60263 37.5L24.3811 37.5L25.0024 38.1213L25.6237 37.5Z" fill="white" stroke="white" stroke-width="3"/>
<path d="M45.5 36L25.0024 36L4.5048 36C4.41436 31.8747 5.58559 25.4289 9.58105 20.5787C12.6882 16.8068 17.5033 14 24.7613 14C32.1369 14 37.0534 16.8986 40.2395 20.7629C44.2204 25.5911 45.5 31.9268 45.5 36Z" fill="none"/>
<path d="M25.0024 36L45.5 36C45.5 31.9268 44.2204 25.5911 40.2395 20.7629M25.0024 36L4.5048 36C4.41436 31.8747 5.58559 25.4289 9.58105 20.5787M25.0024 36L9.58105 20.5787M25.0024 36L40.2395 20.7629M9.58105 20.5787C12.6882 16.8068 17.5033 14 24.7613 14C32.1369 14 37.0534 16.8986 40.2395 20.7629" stroke="#082E44" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -5,16 +5,19 @@
--primary-neutral: #949ba7;
--secondary-neutral-outline: #111111;
--secondary-neutral-text: #111111;
--unit-background-neutral: #CFD9E8;
/*** Coalition: blue ***/
--primary-blue: #247be2;
--secondary-blue-outline: #082e44;
--secondary-blue-text: #017DC1;
--unit-background-blue: #3BB9FF;
/*** Coalition: red ***/
--primary-red: #ff5858;
--secondary-red-outline: #262222;
--secondary-red-text: #D42121;
--unit-background-red: #FF5858;
/*** UI Colours **/
--accent-green: #8bff63;

View File

@ -1,4 +1,4 @@
import { ToggleableFeature } from "../toggleablefeature";
import { ToggleableFeature } from "../features/toggleablefeature";
import { AICFormation_Azimuth } from "./aicformation/azimuth";
import { AICFormation_Range } from "./aicformation/range";
import { AICFormation_Single } from "./aicformation/single";

View File

@ -1,6 +1,6 @@
import { getUnitsManager } from "..";
import { Panel } from "../panels/panel";
import { Unit } from "./unit";
import { Unit } from "../units/unit";
export class UnitDataTable extends Panel {
constructor(id: string) {

View File

@ -7,17 +7,15 @@ import { UnitControlPanel } from "./panels/unitcontrolpanel";
import { MouseInfoPanel } from "./panels/mouseinfopanel";
import { AIC } from "./aic/aic";
import { ATC } from "./atc/atc";
import { FeatureSwitches } from "./featureswitches";
import { FeatureSwitches } from "./features/featureswitches";
import { LogPanel } from "./panels/logpanel";
import { getConfig, getPaused, setAddress, setCredentials, setPaused, startUpdate, toggleDemoEnabled } from "./server/server";
import { UnitDataTable } from "./units/unitdatatable";
import { UnitDataTable } from "./atc/unitdatatable";
import { keyEventWasInInput } from "./other/utils";
import { Popup } from "./popups/popup";
import { Dropdown } from "./controls/dropdown";
import { HotgroupPanel } from "./panels/hotgrouppanel";
import "@iconfu/svg-inject";
var map: Map;
var unitsManager: UnitsManager;

View File

@ -32,6 +32,8 @@ var destinationPreviewIcon = new L.DivIcon({
className: "ol-destination-preview"
})
const visibilityControls: string[] = ["human", "dcs", "aircraft", "groundunit-sam", "groundunit-other", "navyunit", "airbase"];
export class ClickableMiniMap extends MiniMap {
constructor(layer: L.TileLayer | L.LayerGroup, options?: MiniMapOptions) {
super(layer, options);
@ -69,6 +71,7 @@ export class Map extends L.Map {
#airbaseContextMenu: AirbaseContextMenu = new AirbaseContextMenu("airbase-contextmenu");
#mapSourceDropdown: Dropdown;
#optionButtons: { [key: string]: HTMLButtonElement[] } = {}
constructor(ID: string) {
/* Init the leaflet map */
@ -130,6 +133,15 @@ export class Map extends L.Map {
this.panBy(new L.Point( ((this.#panLeft? -1: 0) + (this.#panRight? 1: 0)) * this.#deafultPanDelta,
((this.#panUp? -1: 0) + (this.#panDown? 1: 0)) * this.#deafultPanDelta));
}, 20);
/* Option buttons */
this.#optionButtons["visibility"] = visibilityControls.map((option: string, index: number) => {
return this.#createOptionButton(option, `visibility/${option.toLowerCase()}.svg`, "", (e: any) => {
getUnitsManager().setHiddenType(option, (e?.currentTarget as HTMLElement)?.classList.contains("off"));
(e?.currentTarget as HTMLElement)?.classList.toggle("off");
});
});
document.querySelector("#unit-visibility-control")?.append(...this.#optionButtons["visibility"]);
}
setLayer(layerName: string) {
@ -535,4 +547,13 @@ export class Map extends L.Map {
this.#destinationPreviewMarkers[idx].setLatLng(!e.originalEvent.shiftKey? latlng: this.getMouseCoordinates());
})
}
#createOptionButton(value: string, url: string, title: string, callback: EventListenerOrEventListenerObject) {
var button = document.createElement("button");
button.title = title;
button.value = value;
button.innerHTML = `<img src="/resources/theme/images/buttons/${url}" onload="SVGInject(this)" />`
button.addEventListener("click", callback);
return button;
}
}

View File

@ -287,9 +287,15 @@ export class Unit extends Marker {
/********************** Visibility *************************/
updateVisibility() {
this.setHidden(document.body.getAttribute(`data-hide-${this.getMissionData().coalition}`) != null ||
document.body.getAttribute(`data-hide-${this.getMarkerCategory()}`) != null ||
!this.getBaseData().alive)
var hidden = false;
const hiddenUnits = getUnitsManager().getHiddenTypes();
if (this.getMissionData().flags.Human && hiddenUnits.includes("human"))
hidden = true;
else if (this.getBaseData().AI == false && hiddenUnits.includes("dcs"))
hidden = true;
else if (hiddenUnits.includes(this.getMarkerCategory()))
hidden = true;
this.setHidden(document.body.getAttribute(`data-hide-${this.getMissionData().coalition}`) != null || hidden || !this.getBaseData().alive);
}
setHidden(hidden: boolean) {
@ -739,7 +745,7 @@ export class GroundUnit extends Unit {
getMarkerHTML() {
var role = groundUnitsDatabase.getByName(this.getBaseData().name)?.loadouts[0].roles[0];
return `<div class="unit" data-object="unit-${this.getMarkerCategory()}" data-coalition="${this.getMissionData().coalition}">
<div class="unit-marker"><img src="/resources/theme/images/units/groundunit-${this.getMarkerCategory()}.svg" onload="SVGInject(this)"/></div>
<div class="unit-marker"><img src="/resources/theme/images/units/${this.getMarkerCategory()}.svg" onload="SVGInject(this)"/></div>
<div class="unit-short-label">${role?.substring(0, 1)?.toUpperCase() || ""}</div>
<div class="unit-hotgroup">
<div class="unit-hotgroup-id"></div>
@ -750,7 +756,7 @@ export class GroundUnit extends Unit {
getMarkerCategory() {
// TODO this is very messy
var role = groundUnitsDatabase.getByName(this.getBaseData().name)?.loadouts[0].roles[0];
var markerCategory = (role === "SAM") ? "sam" : "other";
var markerCategory = (role === "SAM") ? "groundunit-sam" : "groundunit-other";
return markerCategory;
}
}

View File

@ -10,6 +10,7 @@ export class UnitsManager {
#copiedUnits: Unit[];
#selectionEventDisabled: boolean = false;
#pasteDisabled: boolean = false;
#hiddenTypes: string[] = [];
constructor() {
this.#units = {};
@ -87,6 +88,23 @@ export class UnitsManager {
});
}
setHiddenType(key: string, value: boolean)
{
if (value)
{
if (this.#hiddenTypes.includes(key))
delete this.#hiddenTypes[this.#hiddenTypes.indexOf(key)];
}
else
this.#hiddenTypes.push(key);
Object.values(this.getUnits()).forEach((unit: Unit) => unit.updateVisibility());
}
getHiddenTypes()
{
return this.#hiddenTypes;
}
selectUnit(ID: number, deselectAllUnits: boolean = true) {
if (deselectAllUnits)
this.getSelectedUnits().filter((unit: Unit) => unit.ID !== ID).forEach((unit: Unit) => unit.setSelected(false));

View File

@ -1,10 +1,10 @@
<%- include('atc/board.ejs', {
<%- include('board.ejs', {
"boardId": "strip-board-tower",
"boardType": "tower",
"headers": [ "Flight", "a. Alt", "alt", "a. Speed", "Speed" ]
}) %>
<%- include('atc/board.ejs', {
<%- include('board.ejs', {
"boardId": "strip-board-ground",
"boardType": "ground",
"headers": [ "Flight", "Status", "T/O Time", "TTG" ]

View File

@ -2,47 +2,39 @@
<head>
<title>Olympus client</title>
<link rel="stylesheet" type="text/css" href="/resources/theme/theme.css" />
<link rel="stylesheet" type="text/css" href="/stylesheets/olympus.css" />
<link rel="stylesheet" href="stylesheets/leaflet.css">
<link rel="stylesheet" type="text/css" href="stylesheets/olympus.css" />
<link rel="stylesheet" type="text/css" href="stylesheets/leaflet/leaflet.css">
<link rel="stylesheet" type="text/css" href="/resources/theme/theme.css" /> <!-- Theme specifc css, autorouted to point to active theme -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;600;700;800&display=swap" rel="stylesheet">
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-Z4L2TC3YX0"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-Z4L2TC3YX0');
</script>
<script src="javascripts/svg-inject.js"></script>
</head>
<body>
<div id="map-container"></div>
<%- include('aic.ejs') %>
<%- include('atc.ejs') %>
<%- include('contextmenus.ejs') %>
<%- include('unitcontrolpanel.ejs') %>
<%- include('unitinfopanel.ejs') %>
<%- include('mouseinfopanel.ejs') %>
<%- include('navbar.ejs') %>
<%- include('connectionstatuspanel.ejs') %>
<%- include('dialogs.ejs') %>
<%- include('unitdatatable.ejs') %>
<%- include('popups.ejs') %>
<%- include('hotgrouppanel.ejs') %>
<%- include('aic/aic.ejs') %>
<div id="gray-out"></div>
<%- include('atc/atc.ejs') %>
<%- include('atc/unitdatatable.ejs') %>
<%- include('panels/unitcontrol.ejs') %>
<%- include('panels/unitinfo.ejs') %>
<%- include('panels/mouseinfo.ejs') %>
<%- include('panels/connectionstatus.ejs') %>
<%- include('panels/hotgroup.ejs') %>
<%- include('panels/navbar.ejs') %>
<%- include('other/dialogs.ejs') %>
<%- include('other/popups.ejs') %>
<%- include('other/contextmenus.ejs') %>
<div id="gray-out"></div> <!-- Used to provide grayout effect of the background when login prompt is visible -->
<% /* %>
<%- include('log.ejs') %>
<% */ %>
<script src="javascripts/bundle.js"></script>
</body>

View File

@ -30,26 +30,7 @@
</div>
<div id="unit-visibility-control" class="ol-group">
<button title="Toggle aircrafts' visibility"
data-on-click="toggleUnitVisibility" data-on-click-params='{ "category": "aircraft" }'>
<img src="/resources/theme/images/buttons/visibility/aircraft.svg" onload="SVGInject(this)" />
</button>
<button title="Toggle ground units' visibility"
data-on-click="toggleUnitVisibility" data-on-click-params='{ "category": "groundunit" }'>
<img src="/resources/theme/images/buttons/visibility/groundunit-other.svg" onload="SVGInject(this)" />
</button>
<button title="Toggle SAMs' visibility" data-on-click="toggleUnitVisibility"
data-on-click-params='{ "category": "sam" }'>
<img src="/resources/theme/images/buttons/visibility/groundunit-sam.svg" onload="SVGInject(this)" />
</button>
<button title="Toggle threat rings' visibility"
data-on-click="toggleUnitVisibility" data-on-click-params='{ "category": "threat" }'>
<img src="/resources/theme/images/buttons/visibility/threatring.svg" onload="SVGInject(this)" />
</button>
<button title="Toggle navy units' visibility"
data-on-click="toggleUnitVisibility" data-on-click-params='{ "category": "navyunit" }'>
<img src="/resources/theme/images/buttons/visibility/navyunit.svg" onload="SVGInject(this)" />
</button>
<!-- Here the available visibility controls will be listed -->
</div>
<div id="coalition-visibility-control" class="ol-group ol-group-button-toggle">