deps: add font-awesome 6 support

This commit is contained in:
Aetherinox 2024-04-21 04:17:32 -07:00
parent beb4b8c35b
commit 39f0407593
No known key found for this signature in database
GPG Key ID: CB5C4C30CD0D4028
39 changed files with 157 additions and 103 deletions

View File

@ -202,7 +202,7 @@ async function checkContentRequestPermissions(request) {
try { try {
await alertWithTimeout({ await alertWithTimeout({
header: Locale.extensionConnectHeader, header: Locale.extensionConnectHeader,
icon: 'exchange-alt', icon: 'right-left',
buttons: [Alerts.buttons.allow, Alerts.buttons.deny], buttons: [Alerts.buttons.allow, Alerts.buttons.deny],
view: extensionConnectView, view: extensionConnectView,
wide: true, wide: true,
@ -370,6 +370,7 @@ const ProtocolHandlers = {
}, },
'change-public-keys'(request, connection) { 'change-public-keys'(request, connection) {
// eslint-disable-next-line prefer-const
let { publicKey, version, clientID: clientId } = request; let { publicKey, version, clientID: clientId } = request;
if (connectedClients.has(clientId)) { if (connectedClients.has(clientId)) {

View File

@ -71,7 +71,7 @@ const Alerts = {
this.alert({ this.alert({
header: Locale.notImplemented, header: Locale.notImplemented,
body: '', body: '',
icon: 'exclamation-triangle', icon: 'triangle-exclamation',
buttons: [this.buttons.ok], buttons: [this.buttons.ok],
esc: '', esc: '',
click: '', click: '',
@ -96,7 +96,7 @@ const Alerts = {
this.alert({ this.alert({
header: '', header: '',
body: '', body: '',
icon: 'exclamation-circle', icon: 'circle-exclamation',
buttons: [this.buttons.ok], buttons: [this.buttons.ok],
esc: '', esc: '',
click: '', click: '',

View File

@ -1,12 +1,12 @@
const IconMap = [ const IconMap = [
'key', 'key',
'globe', 'globe',
'exclamation-triangle', 'triangle-exclamation',
'server', 'server',
'thumbtack', 'thumbtack',
'comments', 'comments',
'puzzle-piece', 'puzzle-piece',
'edit', 'pen-to-square',
'plug', 'plug',
'address-card', 'address-card',
'paperclip', 'paperclip',
@ -19,47 +19,47 @@ const IconMap = [
'bullseye', 'bullseye',
'desktop', 'desktop',
'envelope', 'envelope',
'cog', 'gear',
'clipboard', 'clipboard',
'paper-plane', 'paper-plane',
'newspaper', 'newspaper',
'bolt', 'bolt',
'inbox', 'inbox',
'save', 'floppy-disk',
'hdd', 'hard-drive',
'dot-circle', 'circle-dot',
'user-lock', 'user-lock',
'terminal', 'terminal',
'print', 'print',
'project-diagram', 'diagram-project',
'flag-checkered', 'flag-checkered',
'wrench', 'wrench',
'laptop', 'laptop',
'archive', 'box-archive',
'credit-card', 'credit-card',
'windows', 'windows',
'clock', 'clock',
'search', 'magnifying-glass',
'flask', 'flask',
'gamepad', 'gamepad',
'trash', 'trash',
'sticky-note', 'note-sticky',
'ban', 'ban',
'question-circle', 'circle-question',
'cube', 'cube',
'folder-o', 'folder-o',
'folder-open-o', 'folder-open-o',
'database', 'database',
'unlock-alt', 'unlock-keyhole',
'lock', 'lock',
'check', 'check',
'pencil-alt', 'pencil',
'image', 'image',
'book', 'book',
'list-alt', 'rectangle-list',
'user-secret', 'user-secret',
'utensils', 'utensils',
'home', 'house',
'star', 'star',
'linux', 'linux',
'map-pin', 'map-pin',

View File

@ -48,7 +48,7 @@ function getIcon(ext) {
case 'log': case 'log':
case 'rtf': case 'rtf':
case 'pem': case 'pem':
return 'file-alt'; return 'file-lines';
case 'html': case 'html':
case 'htm': case 'htm':
case 'js': case 'js':
@ -89,7 +89,7 @@ function getIcon(ext) {
case 'ace': case 'ace':
case 'dmg': case 'dmg':
case 'jar': case 'jar':
return 'file-archive'; return 'file-zipper';
case 'doc': case 'doc':
case 'docx': case 'docx':
return 'file-word'; return 'file-word';

View File

@ -17,7 +17,7 @@ class MenuModel extends Model {
this.allItemsSection = new MenuSectionModel([ this.allItemsSection = new MenuSectionModel([
{ {
locTitle: 'menuAllItems', locTitle: 'menuAllItems',
icon: 'th-large', icon: 'table-cells-large',
active: true, active: true,
shortcut: Keys.DOM_VK_A, shortcut: Keys.DOM_VK_A,
filterKey: '*' filterKey: '*'
@ -43,7 +43,7 @@ class MenuModel extends Model {
this.trashSection = new MenuSectionModel([ this.trashSection = new MenuSectionModel([
{ {
locTitle: 'menuTrash', locTitle: 'menuTrash',
icon: 'trash-alt', icon: 'trash-can',
shortcut: Keys.DOM_VK_D, shortcut: Keys.DOM_VK_D,
filterKey: 'trash', filterKey: 'trash',
filterValue: true, filterValue: true,
@ -69,7 +69,7 @@ class MenuModel extends Model {
this.generalSection = new MenuSectionModel([ this.generalSection = new MenuSectionModel([
{ {
locTitle: 'menuSetGeneral', locTitle: 'menuSetGeneral',
icon: 'cog', icon: 'gear',
page: 'general', page: 'general',
section: 'top', section: 'top',
active: true active: true

View File

@ -5,7 +5,7 @@ const fileWatchers = {};
class StorageFile extends StorageBase { class StorageFile extends StorageBase {
name = 'file'; name = 'file';
icon = 'hdd'; icon = 'hard-drive';
enabled = !!Launcher; enabled = !!Launcher;
system = true; system = true;
backup = true; backup = true;

View File

@ -15,7 +15,7 @@ class StorageTeams extends StorageBase {
name = 'msteams'; name = 'msteams';
enabled = true; enabled = true;
uipos = 50; uipos = 50;
icon = 'user-friends'; icon = 'user-group';
_graphUrl = 'https://graph.microsoft.com/v1.0'; _graphUrl = 'https://graph.microsoft.com/v1.0';
_groupsUrl = `${this._graphUrl}/me/joinedTeams`; _groupsUrl = `${this._graphUrl}/me/joinedTeams`;

View File

@ -125,7 +125,7 @@ class DetailsIssuesView extends View {
Alerts.alert({ Alerts.alert({
header: Locale.detIssueCloseAlertHeader, header: Locale.detIssueCloseAlertHeader,
body: Locale.detIssueCloseAlertBody, body: Locale.detIssueCloseAlertBody,
icon: 'exclamation-triangle', icon: 'triangle-exclamation',
buttons: [ buttons: [
{ result: 'entry', title: Locale.detIssueCloseAlertEntry, silent: true }, { result: 'entry', title: Locale.detIssueCloseAlertEntry, silent: true },
{ result: 'settings', title: Locale.detIssueCloseAlertSettings, silent: true }, { result: 'settings', title: Locale.detIssueCloseAlertSettings, silent: true },

View File

@ -240,7 +240,7 @@ class DetailsView extends View {
if (fieldView.isHidden()) { if (fieldView.isHidden()) {
moreOptions.push({ moreOptions.push({
value: 'add:' + fieldView.model.name, value: 'add:' + fieldView.model.name,
icon: 'pencil-alt', icon: 'pencil',
text: Locale.detMenuAddField.replace('{}', fieldView.model.title) text: Locale.detMenuAddField.replace('{}', fieldView.model.title)
}); });
} }
@ -856,7 +856,7 @@ class DetailsView extends View {
Alerts.yesno({ Alerts.yesno({
header: Locale.detDelToTrash, header: Locale.detDelToTrash,
body: Locale.detDelToTrashBody, body: Locale.detDelToTrashBody,
icon: 'trash-alt', icon: 'trash-can',
success: doMove success: doMove
}); });
} else { } else {
@ -878,7 +878,7 @@ class DetailsView extends View {
header: Locale.detDelFromTrash, header: Locale.detDelFromTrash,
body: Locale.detDelFromTrashBody, body: Locale.detDelFromTrashBody,
hint: Locale.detDelFromTrashBodyHint, hint: Locale.detDelFromTrashBodyHint,
icon: 'minus-circle', icon: 'circle-minus',
success: () => { success: () => {
this.model.deleteFromTrash(); this.model.deleteFromTrash();
Events.emit('refresh'); Events.emit('refresh');

View File

@ -330,7 +330,7 @@ class FieldView extends View {
if (this.value) { if (this.value) {
actions.push({ name: 'copy', icon: 'copy' }); actions.push({ name: 'copy', icon: 'copy' });
} }
actions.push({ name: 'edit', icon: 'pencil-alt' }); actions.push({ name: 'edit', icon: 'pencil' });
if (this.value instanceof kdbxweb.ProtectedValue) { if (this.value instanceof kdbxweb.ProtectedValue) {
actions.push({ name: 'reveal', icon: 'eye' }); actions.push({ name: 'reveal', icon: 'eye' });
} }

View File

@ -40,64 +40,64 @@ class ListSearchView extends View {
this.sortOptions = [ this.sortOptions = [
{ {
value: 'title', value: 'title',
icon: 'sort-alpha-down', icon: 'arrow-down-a-z',
loc: () => loc: () =>
StringFormat.capFirst(Locale.title) + ' ' + this.addArrow(Locale.searchAZ) StringFormat.capFirst(Locale.title) + ' ' + this.addArrow(Locale.searchAZ)
}, },
{ {
value: '-title', value: '-title',
icon: 'sort-alpha-down-alt', icon: 'arrow-down-z-a',
loc: () => loc: () =>
StringFormat.capFirst(Locale.title) + ' ' + this.addArrow(Locale.searchZA) StringFormat.capFirst(Locale.title) + ' ' + this.addArrow(Locale.searchZA)
}, },
{ {
value: 'website', value: 'website',
icon: 'sort-alpha-down', icon: 'arrow-down-a-z',
loc: () => loc: () =>
StringFormat.capFirst(Locale.website) + ' ' + this.addArrow(Locale.searchAZ) StringFormat.capFirst(Locale.website) + ' ' + this.addArrow(Locale.searchAZ)
}, },
{ {
value: '-website', value: '-website',
icon: 'sort-alpha-down-alt', icon: 'arrow-down-z-a',
loc: () => loc: () =>
StringFormat.capFirst(Locale.website) + ' ' + this.addArrow(Locale.searchZA) StringFormat.capFirst(Locale.website) + ' ' + this.addArrow(Locale.searchZA)
}, },
{ {
value: 'user', value: 'user',
icon: 'sort-alpha-down', icon: 'arrow-down-a-z',
loc: () => StringFormat.capFirst(Locale.user) + ' ' + this.addArrow(Locale.searchAZ) loc: () => StringFormat.capFirst(Locale.user) + ' ' + this.addArrow(Locale.searchAZ)
}, },
{ {
value: '-user', value: '-user',
icon: 'sort-alpha-down-alt', icon: 'arrow-down-z-a',
loc: () => StringFormat.capFirst(Locale.user) + ' ' + this.addArrow(Locale.searchZA) loc: () => StringFormat.capFirst(Locale.user) + ' ' + this.addArrow(Locale.searchZA)
}, },
{ {
value: 'created', value: 'created',
icon: 'sort-numeric-down', icon: 'arrow-down-1-9',
loc: () => Locale.searchCreated + ' ' + this.addArrow(Locale.searchON) loc: () => Locale.searchCreated + ' ' + this.addArrow(Locale.searchON)
}, },
{ {
value: '-created', value: '-created',
icon: 'sort-numeric-down-alt', icon: 'arrow-down-9-1',
loc: () => Locale.searchCreated + ' ' + this.addArrow(Locale.searchNO) loc: () => Locale.searchCreated + ' ' + this.addArrow(Locale.searchNO)
}, },
{ {
value: 'updated', value: 'updated',
icon: 'sort-numeric-down', icon: 'arrow-down-1-9',
loc: () => Locale.searchUpdated + ' ' + this.addArrow(Locale.searchON) loc: () => Locale.searchUpdated + ' ' + this.addArrow(Locale.searchON)
}, },
{ {
value: '-updated', value: '-updated',
icon: 'sort-numeric-down-alt', icon: 'arrow-down-9-1',
loc: () => Locale.searchUpdated + ' ' + this.addArrow(Locale.searchNO) loc: () => Locale.searchUpdated + ' ' + this.addArrow(Locale.searchNO)
}, },
{ {
value: '-attachments', value: '-attachments',
icon: 'sort-amount-down', icon: 'arrow-down-wide-short',
loc: () => Locale.searchAttachments loc: () => Locale.searchAttachments
}, },
{ value: '-rank', icon: 'sort-amount-down', loc: () => Locale.searchRank } { value: '-rank', icon: 'arrow-down-wide-short', loc: () => Locale.searchRank }
]; ];
this.sortIcons = {}; this.sortIcons = {};
this.sortOptions.forEach((opt) => { this.sortOptions.forEach((opt) => {
@ -394,7 +394,7 @@ class ListSearchView extends View {
options.sort(Comparators.stringComparator('text', true)); options.sort(Comparators.stringComparator('text', true));
options.push({ options.push({
value: 'tmpl', value: 'tmpl',
icon: 'sticky-note-o', icon: 'note-sticky-o',
text: StringFormat.capFirst(Locale.template) text: StringFormat.capFirst(Locale.template)
}); });
return options; return options;

View File

@ -283,7 +283,7 @@ class ListView extends View {
createTemplate() { createTemplate() {
if (!this.model.settings.templateHelpShown) { if (!this.model.settings.templateHelpShown) {
Alerts.yesno({ Alerts.yesno({
icon: 'sticky-note-o', icon: 'note-sticky-o',
header: Locale.listAddTemplateHeader, header: Locale.listAddTemplateHeader,
body: body:
Locale.listAddTemplateBody1.replace('{}', '"+"') + Locale.listAddTemplateBody1.replace('{}', '"+"') +
@ -397,7 +397,7 @@ class ListView extends View {
const targetElRect = this.$el.find('.list__table-options')[0].getBoundingClientRect(); const targetElRect = this.$el.find('.list__table-options')[0].getBoundingClientRect();
const options = this.tableColumns.map((col) => ({ const options = this.tableColumns.map((col) => ({
value: col.val, value: col.val,
icon: col.enabled ? 'check-square-o' : 'square-o', icon: col.enabled ? 'square-check' : 'square-o',
text: StringFormat.capFirst(Locale[col.name]) text: StringFormat.capFirst(Locale[col.name])
})); }));
view.render({ view.render({
@ -420,7 +420,7 @@ class ListView extends View {
optionsDropdownSelect(e) { optionsDropdownSelect(e) {
const col = this.tableColumns.find((c) => c.val === e.item); const col = this.tableColumns.find((c) => c.val === e.item);
col.enabled = !col.enabled; col.enabled = !col.enabled;
e.el.find('i:first').toggleClass('fa-check-square-o fa-square-o'); e.el.find('i:first').toggleClass('fa-square-check fa-square-o');
this.render(); this.render();
this.saveTableColumnsEnabled(); this.saveTableColumnsEnabled();
} }

View File

@ -183,7 +183,7 @@ class MenuItemView extends View {
Alerts.yesno({ Alerts.yesno({
header: Locale.menuEmptyTrashAlert, header: Locale.menuEmptyTrashAlert,
body: Locale.menuEmptyTrashAlertBody, body: Locale.menuEmptyTrashAlertBody,
icon: 'minus-circle', icon: 'circle-minus',
success() { success() {
Events.emit('empty-trash'); Events.emit('empty-trash');
} }

View File

@ -165,7 +165,7 @@ class OpenView extends View {
getLastOpenFiles() { getLastOpenFiles() {
return this.model.fileInfos.map((fileInfo) => { return this.model.fileInfos.map((fileInfo) => {
let icon = 'file-alt'; let icon = 'file-lines';
const storage = Storage[fileInfo.storage]; const storage = Storage[fileInfo.storage];
if (storage && storage.icon) { if (storage && storage.icon) {
icon = storage.icon; icon = storage.icon;
@ -194,7 +194,7 @@ class OpenView extends View {
Alerts.alert({ Alerts.alert({
header: Locale.openLocalFile, header: Locale.openLocalFile,
body: Locale.openLocalFileBody, body: Locale.openLocalFileBody,
icon: 'file-alt', icon: 'file-lines',
buttons: [ buttons: [
{ result: 'skip', title: Locale.openLocalFileDontShow, error: true }, { result: 'skip', title: Locale.openLocalFileDontShow, error: true },
{ result: 'ok', title: Locale.alertOk } { result: 'ok', title: Locale.alertOk }
@ -852,7 +852,7 @@ class OpenView extends View {
Alerts.alert({ Alerts.alert({
header: Locale.openSelectFile, header: Locale.openSelectFile,
body: Locale.openSelectFileBody, body: Locale.openSelectFileBody,
icon: storage.icon || 'file-alt', icon: storage.icon || 'file-lines',
buttons: [{ result: '', title: Locale.alertCancel }], buttons: [{ result: '', title: Locale.alertCancel }],
esc: '', esc: '',
click: '', click: '',

View File

@ -128,7 +128,7 @@ class SettingsBrowserView extends View {
e.target.checked = false; e.target.checked = false;
Alerts.yesno({ Alerts.yesno({
icon: 'exclamation-triangle', icon: 'triangle-exclamation',
header: Locale.setBrowserExtensionKPXCWarnHeader.replace('{}', 'KeePassXC'), header: Locale.setBrowserExtensionKPXCWarnHeader.replace('{}', 'KeePassXC'),
body: body:
Locale.setBrowserExtensionKPXCWarnBody1.replace(/{}/g, 'KeePassXC') + Locale.setBrowserExtensionKPXCWarnBody1.replace(/{}/g, 'KeePassXC') +

View File

@ -337,7 +337,7 @@ class SettingsFileView extends View {
Alerts.alert({ Alerts.alert({
header: '', header: '',
body: '', body: '',
icon: storage.icon || 'file-alt', icon: storage.icon || 'file-lines',
buttons: [Alerts.buttons.ok, Alerts.buttons.cancel], buttons: [Alerts.buttons.ok, Alerts.buttons.cancel],
esc: '', esc: '',
opaque: true, opaque: true,

View File

@ -1,5 +1,5 @@
<div class="app"> <div class="app">
{{#if beta}}<div class="app__beta"><i class="fa fa-exclamation-triangle"></i> {{res 'appBeta'}}</div>{{/if}} {{#if beta}}<div class="app__beta"><i class="fa fa-triangle-exclamation"></i> {{res 'appBeta'}}</div>{{/if}}
{{#if customTitlebar}} {{#if customTitlebar}}
<div class="app__titlebar"></div> <div class="app__titlebar"></div>
{{else}} {{else}}

View File

@ -1,6 +1,6 @@
<div class="details__attachment-preview"> <div class="details__attachment-preview">
<div class="details__subview-close"> <div class="details__subview-close">
<i class="fa fa-chevron-left details__subview-close-pre"></i>{{res 'detHistoryReturn'}} <i class="fa fa-arrow-circle-left details__subview-close-post"></i> <i class="fa fa-chevron-left details__subview-close-pre"></i>{{res 'detHistoryReturn'}} <i class="fa fa-circle-arrow-left details__subview-close-post"></i>
</div> </div>
<div class="details__attachment-preview-data"></div> <div class="details__attachment-preview-data"></div>
<i class="fa details__attachment-preview-icon"></i> <i class="fa details__attachment-preview-icon"></i>

View File

@ -1,6 +1,6 @@
<div class="empty-block muted-color"> <div class="empty-block muted-color">
<h1 class="empty-block__title">{{res 'detGroupRestore'}}</h1> <h1 class="empty-block__title">{{res 'detGroupRestore'}}</h1>
<div class="empty-block__lower-btns"> <div class="empty-block__lower-btns">
<i class="details__buttons-trash-del fa fa-minus-circle"></i> <i class="details__buttons-trash-del fa fa-circle-minus"></i>
</div> </div>
</div> </div>

View File

@ -1,13 +1,13 @@
<div class="details__history"> <div class="details__history">
<div class="details__subview-close"> <div class="details__subview-close">
<i class="fa fa-chevron-left details__subview-close-pre"></i>{{res 'detHistoryReturn'}} <i class="fa fa-arrow-circle-left details__subview-close-post"></i> <i class="fa fa-chevron-left details__subview-close-pre"></i>{{res 'detHistoryReturn'}} <i class="fa fa-circle-arrow-left details__subview-close-post"></i>
</div> </div>
<div class="details__history-desc muted-color">{{res 'detHistoryClickPoint'}}</div> <div class="details__history-desc muted-color">{{res 'detHistoryClickPoint'}}</div>
<div class="details__history-top"> <div class="details__history-top">
<div class="details__history-timeline"> <div class="details__history-timeline">
<div class="details__history-timeline-axis"></div> <div class="details__history-timeline-axis"></div>
<div class="details__history-arrow-prev"><i class="fa fa-long-arrow-alt-left"></i></div> <div class="details__history-arrow-prev"><i class="fa fa-left-long"></i></div>
<div class="details__history-arrow-next"><i class="fa fa-long-arrow-alt-right"></i></div> <div class="details__history-arrow-next"><i class="fa fa-right-long"></i></div>
</div> </div>
</div> </div>
<div class="details__history-body"> <div class="details__history-body">

View File

@ -1,7 +1,7 @@
{{#if passwordIssue}} {{#if passwordIssue}}
<div class="details__issues {{#if fadeIn}}fade-in{{/if}}"> <div class="details__issues {{#if fadeIn}}fade-in{{/if}}">
<div class="details__issues-icon"> <div class="details__issues-icon">
<i class="fa fa-exclamation-triangle details__issues-icon-warning"></i> <i class="fa fa-triangle-exclamation details__issues-icon-warning"></i>
<i class="fa fa-spinner spin details__issues-icon-spin"></i> <i class="fa fa-spinner spin details__issues-icon-spin"></i>
</div> </div>
<div class="details__issues-body"> <div class="details__issues-body">
@ -20,7 +20,7 @@
{{/ifeq}} {{/ifeq}}
</div> </div>
<div class="details__issues-close-btn" title="{{res 'detIssuesHideTooltip'}}"> <div class="details__issues-close-btn" title="{{res 'detIssuesHideTooltip'}}">
<i class="fa fa-times-circle"></i> <i class="fa fa-circle-xmark"></i>
</div> </div>
</div> </div>
{{else}} {{else}}

View File

@ -47,9 +47,9 @@
{{#if showButtons}} {{#if showButtons}}
<div class="details__buttons"> <div class="details__buttons">
{{#if deleted~}} {{#if deleted~}}
<i class="details__buttons-trash-del fa fa-minus-circle" title="{{res 'detDelEntryPerm'}}" tip-placement="top"></i> <i class="details__buttons-trash-del fa fa-circle-minus" title="{{res 'detDelEntryPerm'}}" tip-placement="top"></i>
{{~else~}} {{~else~}}
<i class="details__buttons-trash fa fa-trash-alt" title="{{res 'detDelEntry'}}" tip-placement="top"></i> <i class="details__buttons-trash fa fa-trash-can" title="{{res 'detDelEntry'}}" tip-placement="top"></i>
{{~/if~}} {{~/if~}}
<div class="details__attachments"> <div class="details__attachments">
<input type="file" class="details__attachment-input-file hide-by-pos" multiple /> <input type="file" class="details__attachment-input-file hide-by-pos" multiple />

View File

@ -4,7 +4,7 @@
data-file-id="{{file.id}}" id="footer__db--{{file.id}}"> data-file-id="{{file.id}}" id="footer__db--{{file.id}}">
<i class="fa fa-{{#if file.active}}unlock{{else}}lock{{/if}}"></i> {{file.name}} <i class="fa fa-{{#if file.active}}unlock{{else}}lock{{/if}}"></i> {{file.name}}
{{#if file.syncing~}} {{#if file.syncing~}}
<i class="fa fa-sync-alt spin footer__db-sign"></i> <i class="fa fa-rotate spin footer__db-sign"></i>
{{~else if file.syncError~}} {{~else if file.syncError~}}
<i class="fa {{#if file.modified}}fa-circle{{else}}fa-circle-o{{/if}} footer__db-sign footer__db-sign--error" <i class="fa {{#if file.modified}}fa-circle{{else}}fa-circle-o{{/if}} footer__db-sign footer__db-sign--error"
title="{{res 'footerSyncError'}}: {{file.syncError}}"></i> title="{{res 'footerSyncError'}}: {{file.syncError}}"></i>
@ -21,9 +21,9 @@
{{#if updateAvailable}} {{#if updateAvailable}}
<i class="fa fa-bell footer__update-icon"></i> <i class="fa fa-bell footer__update-icon"></i>
{{else}} {{else}}
<i class="fa fa-cog"></i> <i class="fa fa-gear"></i>
{{/if}} {{/if}}
</div> </div>
<div class="footer__btn footer__btn-generate" title="{{res 'footerTitleGen'}}" tip-placement="top" id="footer__btn-generate"><i class="fa fa-bolt"></i></div> <div class="footer__btn footer__btn-generate" title="{{res 'footerTitleGen'}}" tip-placement="top" id="footer__btn-generate"><i class="fa fa-bolt"></i></div>
<div class="footer__btn footer__btn-lock" title="{{res 'footerTitleLock'}}" tip-placement="top-left" id="footer__btn-lock"><i class="fa fa-sign-out-alt"></i></div> <div class="footer__btn footer__btn-lock" title="{{res 'footerTitleLock'}}" tip-placement="top-left" id="footer__btn-lock"><i class="fa fa-right-from-bracket"></i></div>
</div> </div>

View File

@ -1,6 +1,6 @@
<div class="grp"> <div class="grp">
<div class="back-button"> <div class="back-button">
{{res 'retToApp'}} <i class="fa fa-arrow-circle-left back-button__post"></i> {{res 'retToApp'}} <i class="fa fa-circle-arrow-left back-button__post"></i>
</div> </div>
<div class="scroller"> <div class="scroller">
<div class="grp__content"> <div class="grp__content">
@ -43,7 +43,7 @@
<div class="scroller__bar-wrapper"><div class="scroller__bar"></div></div> <div class="scroller__bar-wrapper"><div class="scroller__bar"></div></div>
{{#unless readonly}} {{#unless readonly}}
<div class="grp__buttons"> <div class="grp__buttons">
<i class="grp__buttons-trash fa fa-trash-alt" title="{{res 'grpTrash'}}" tip-placement="right"></i> <i class="grp__buttons-trash fa fa-trash-can" title="{{res 'grpTrash'}}" tip-placement="right"></i>
</div> </div>
{{/unless}} {{/unless}}
</div> </div>

View File

@ -9,12 +9,12 @@
{{#if canDownloadFavicon}} {{#if canDownloadFavicon}}
<span class="icon-select__icon icon-select__icon-btn icon-select__icon-download" <span class="icon-select__icon icon-select__icon-btn icon-select__icon-download"
data-val="special" data-special="download" title="{{res 'iconFavTitle'}}"> data-val="special" data-special="download" title="{{res 'iconFavTitle'}}">
<i class="fa fa-cloud-download-alt"></i> <i class="fa fa-cloud-arrow-down"></i>
</span> </span>
{{/if}} {{/if}}
<span class="icon-select__icon icon-select__icon-btn icon-select__icon-select" <span class="icon-select__icon icon-select__icon-btn icon-select__icon-select"
data-val="special" data-special="select" title="{{res 'iconSelCustom'}}"> data-val="special" data-special="select" title="{{res 'iconSelCustom'}}">
<i class="fa fa-ellipsis-h"></i> <i class="fa fa-ellipsis"></i>
</span> </span>
</div> </div>
{{#if hasCustomIcons}} {{#if hasCustomIcons}}

View File

@ -1,7 +1,7 @@
<div class="import-csv"> <div class="import-csv">
<div class="import-csv__top"> <div class="import-csv__top">
<div class="back-button"> <div class="back-button">
{{res 'retToApp'}} <i class="fa fa-arrow-circle-left back-button__post"></i> {{res 'retToApp'}} <i class="fa fa-circle-arrow-left back-button__post"></i>
</div> </div>
<h1>{{res 'importCsvTitle'}}</h1> <h1>{{res 'importCsvTitle'}}</h1>
</div> </div>

View File

@ -6,18 +6,18 @@
<div class="list__search-field-wrap"> <div class="list__search-field-wrap">
<input type="text" class="list__search-field input-search" autocomplete="off" spellcheck="false"> <input type="text" class="list__search-field input-search" autocomplete="off" spellcheck="false">
<div class="list__search-icon-search" title="{{res 'searchAdvTitle'}}"> <div class="list__search-icon-search" title="{{res 'searchAdvTitle'}}">
<i class="fa fa-search"></i> <i class="fa fa-magnifying-glass"></i>
<i class="fa fa-caret-down"></i> <i class="fa fa-caret-down"></i>
</div> </div>
<div class="list__search-icon-clear"> <div class="list__search-icon-clear">
<i class="fa fa-times-circle"></i> <i class="fa fa-circle-xmark"></i>
</div> </div>
</div> </div>
<div class="list__search-btn-new {{#unless canCreate}}hide{{/unless}}" title="{{res 'searchAddNew'}}"> <div class="list__search-btn-new {{#unless canCreate}}hide{{/unless}}" title="{{res 'searchAddNew'}}">
<i class="fa fa-plus"></i> <i class="fa fa-plus"></i>
</div> </div>
<div class="list__search-btn-sort" title="{{res 'searchSort'}}"> <div class="list__search-btn-sort" title="{{res 'searchSort'}}">
<i class="fa fa-sort-alpha-down"></i> <i class="fa fa-arrow-down-a-z"></i>
</div> </div>
<div class="list__search-adv {{#unless advEnabled}}hide{{/unless}}"> <div class="list__search-adv {{#unless advEnabled}}hide{{/unless}}">
<div class="list__search-adv-text">{{res 'searchSearchIn'}}:</div> <div class="list__search-adv-text">{{res 'searchSearchIn'}}:</div>

View File

@ -4,7 +4,7 @@
{{~#if options.length}} menu__item--with-options {{/if~}} {{~#if options.length}} menu__item--with-options {{/if~}}
{{~#if cls}} {{cls}}{{/if~}} {{~#if cls}} {{cls}}{{/if~}}
"> ">
{{#if collapsible}}<i class="menu__item-collapse fa fa-ellipsis-v muted-color" title="{{res 'menuItemCollapsed'}}"></i>{{/if}} {{#if collapsible}}<i class="menu__item-collapse fa fa-ellipsis-vertical muted-color" title="{{res 'menuItemCollapsed'}}"></i>{{/if}}
<div class="menu__item-body" {{#if drag}}draggable="true"{{/if}}> <div class="menu__item-body" {{#if drag}}draggable="true"{{/if}}>
{{#if drag}}<div class="menu__item-drag-top"></div>{{/if}} {{#if drag}}<div class="menu__item-drag-top"></div>{{/if}}
{{#if customIcon~}} {{#if customIcon~}}
@ -22,8 +22,8 @@
{{/each}} {{/each}}
</div> </div>
{{/if}} {{/if}}
{{#if editable}}<i class="menu__item-edit fa fa-cog"></i>{{/if}} {{#if editable}}<i class="menu__item-edit fa fa-gear"></i>{{/if}}
{{#ifeq filterKey 'trash'}}<i class="menu__item-empty-trash fa fa-minus-circle" title="{{res 'menuEmptyTrash'}}" {{#ifeq filterKey 'trash'}}<i class="menu__item-empty-trash fa fa-circle-minus" title="{{res 'menuEmptyTrash'}}"
tip-placement="right"></i>{{/ifeq}} tip-placement="right"></i>{{/ifeq}}
</div> </div>
</div> </div>

View File

@ -3,7 +3,7 @@
<div class="open__message {{#unless unlockMessageRes}}hide{{/unless}}"> <div class="open__message {{#unless unlockMessageRes}}hide{{/unless}}">
<div class="open__message-content">{{#if unlockMessageRes}}{{res unlockMessageRes}}{{/if}}</div> <div class="open__message-content">{{#if unlockMessageRes}}{{res unlockMessageRes}}{{/if}}</div>
<div class="open__message-cancel-btn" title="{{res 'alertCancel'}}" tip-placement="left"> <div class="open__message-cancel-btn" title="{{res 'alertCancel'}}" tip-placement="left">
<i class="fa fa-times-circle open__message-cancel-btn-icon"></i> <i class="fa fa-circle-xmark open__message-cancel-btn-icon"></i>
</div> </div>
</div> </div>
<div class="open__icons"> <div class="open__icons">
@ -27,14 +27,14 @@
{{#if canOpenDemo}} {{#if canOpenDemo}}
{{#ifeq demoOpened false}} {{#ifeq demoOpened false}}
<div class="open__icon open__icon-demo" tabindex="4" id="open__icon-demo"> <div class="open__icon open__icon-demo" tabindex="4" id="open__icon-demo">
<i class="fa fa-magic open__icon-i"></i> <i class="fa fa-wand-magic-sparkles open__icon-i"></i>
<div class="open__icon-text">{{res 'openDemo'}}</div> <div class="open__icon-text">{{res 'openDemo'}}</div>
</div> </div>
{{/ifeq}} {{/ifeq}}
{{/if}} {{/if}}
{{#if showMore}} {{#if showMore}}
<div class="open__icon open__icon-more" tabindex="5" id="open__icon-more"> <div class="open__icon open__icon-more" tabindex="5" id="open__icon-more">
<i class="fa fa-ellipsis-h open__icon-i"></i> <i class="fa fa-ellipsis open__icon-i"></i>
<div class="open__icon-text">{{res 'openMore'}}</div> <div class="open__icon-text">{{res 'openMore'}}</div>
</div> </div>
{{/if}} {{/if}}
@ -56,7 +56,7 @@
{{#if canOpenDemo}} {{#if canOpenDemo}}
{{#if demoOpened}} {{#if demoOpened}}
<div class="open__icon open__icon-demo" tabindex="20" id="open__icon-demo"> <div class="open__icon open__icon-demo" tabindex="20" id="open__icon-demo">
<i class="fa fa-magic open__icon-i"></i> <i class="fa fa-wand-magic-sparkles open__icon-i"></i>
<div class="open__icon-text">{{res 'openDemo'}}</div> <div class="open__icon-text">{{res 'openDemo'}}</div>
</div> </div>
{{/if}} {{/if}}
@ -69,7 +69,7 @@
{{/if}} {{/if}}
{{#if canOpenSettings}} {{#if canOpenSettings}}
<div class="open__icon open__icon-settings" tabindex="22" id="open__icon-settings"> <div class="open__icon open__icon-settings" tabindex="22" id="open__icon-settings">
<i class="fa fa-cog open__icon-i"></i> <i class="fa fa-gear open__icon-i"></i>
<div class="open__icon-text">{{res 'settings'}}</div> <div class="open__icon-text">{{res 'settings'}}</div>
</div> </div>
{{/if}} {{/if}}
@ -81,13 +81,13 @@
<input type="password" name="password"> <input type="password" name="password">
</div> </div>
<div class="open__pass-warn-wrap"> <div class="open__pass-warn-wrap">
<div class="open__pass-warning muted-color invisible"><i class="fa fa-exclamation-triangle"></i> {{res 'openCaps'}}</div> <div class="open__pass-warning muted-color invisible"><i class="fa fa-triangle-exclamation"></i> {{res 'openCaps'}}</div>
</div> </div>
<div class="open__pass-field-wrap"> <div class="open__pass-field-wrap">
<input class="open__pass-input" name="password" type="password" size="30" autocomplete="new-password" maxlength="1024" <input class="open__pass-input" name="password" type="password" size="30" autocomplete="new-password" maxlength="1024"
placeholder="{{#if canOpen}}{{res 'openClickToOpen'}}{{/if}}" readonly tabindex="23" /> placeholder="{{#if canOpen}}{{res 'openClickToOpen'}}{{/if}}" readonly tabindex="23" />
<div class="open__pass-enter-btn" tabindex="24"> <div class="open__pass-enter-btn" tabindex="24">
<i class="fa fa-level-down-alt rotate-90 open__pass-enter-btn-icon-enter"></i> <i class="fa fa-turn-down rotate-90 open__pass-enter-btn-icon-enter"></i>
<i class="fa fa-fingerprint open__pass-enter-btn-icon-touch-id"></i> <i class="fa fa-fingerprint open__pass-enter-btn-icon-touch-id"></i>
</div> </div>
<div class="open__pass-opening-icon"><i class="fa fa-spinner spin"></i></div> <div class="open__pass-opening-icon"><i class="fa fa-spinner spin"></i></div>
@ -109,7 +109,7 @@
id="open__last-item--{{file.id}}"> id="open__last-item--{{file.id}}">
{{#if file.icon}}<i class="fa fa-{{file.icon}} open__last-item-icon"></i>{{/if}} {{#if file.icon}}<i class="fa fa-{{file.icon}} open__last-item-icon"></i>{{/if}}
<span class="open__last-item-text">{{file.name}}</span> <span class="open__last-item-text">{{file.name}}</span>
{{#if ../canRemoveLatest}}<i class="fa fa-times open__last-item-icon-del"></i>{{/if}} {{#if ../canRemoveLatest}}<i class="fa fa-x open__last-item-icon-del"></i>{{/if}}
</div> </div>
{{/each}} {{/each}}
</div> </div>

View File

@ -12,7 +12,7 @@
<td class="select-entry__item-url-cell">{{url}}</td> <td class="select-entry__item-url-cell">{{url}}</td>
{{#if itemOptions}} {{#if itemOptions}}
<td class="select-entry__item-options"> <td class="select-entry__item-options">
<i class="fa fa-ellipsis-h"></i> <i class="fa fa-ellipsis"></i>
</td> </td>
{{/if}} {{/if}}
</tr> </tr>

View File

@ -28,7 +28,7 @@
data-filter="{{filter.id}}" data-filter="{{filter.id}}"
data-active="{{filter.active}}" data-active="{{filter.active}}"
> >
<i class="fa {{#if filter.active}}fa-check-square-o{{else}}fa-square-o{{/if}} select-entry__filter-check"></i> <i class="fa {{#if filter.active}}fa-square-check{{else}}fa-square-o{{/if}} select-entry__filter-check"></i>
<i class="fa fa-filter select-entry__filter-icon"></i> <i class="fa fa-filter select-entry__filter-icon"></i>
<div class="select-entry__filter-text">{{filter.type}}{{#if filter.text}}: {{/if}}{{filter.text}}</div> <div class="select-entry__filter-text">{{filter.type}}{{#if filter.text}}: {{/if}}{{filter.text}}</div>
</div> </div>

View File

@ -29,7 +29,7 @@
class="settings__browser-extension-link icon-link" class="settings__browser-extension-link icon-link"
title="{{res 'setBrowserExtensionHelp'}}" title="{{res 'setBrowserExtensionHelp'}}"
> >
<i class="fa fa-info-circle"></i> <i class="fa fa-circle-info"></i>
</a> </a>
{{else}} {{else}}
{{#if setting.supported}} {{#if setting.supported}}
@ -41,7 +41,7 @@
data-extension="{{setting.alias}}" /> data-extension="{{setting.alias}}" />
<label for="check-enable-{{setting.alias}}-for-{{perBrowser.browser}}"></label> <label for="check-enable-{{setting.alias}}-for-{{perBrowser.browser}}"></label>
{{else}} {{else}}
<i class="fa fa-times muted-color" title="{{res 'setBrowserExtensionNotSupported'}}"></i> <i class="fa fa-x muted-color" title="{{res 'setBrowserExtensionNotSupported'}}"></i>
{{/if}} {{/if}}
{{#if setting.enabled}} {{#if setting.enabled}}
{{#if setting.helpUrl}} {{#if setting.helpUrl}}
@ -49,7 +49,7 @@
class="settings__browser-extension-link icon-link" class="settings__browser-extension-link icon-link"
title="{{res 'setBrowserExtensionHelp'}}" title="{{res 'setBrowserExtensionHelp'}}"
> >
<i class="fa fa-info-circle"></i> <i class="fa fa-circle-info"></i>
</a> </a>
{{/if}} {{/if}}
{{#if setting.installUrl}} {{#if setting.installUrl}}

View File

@ -26,7 +26,7 @@
<h2>{{res 'setFileSaveTo'}}</h2> <h2>{{res 'setFileSaveTo'}}</h2>
{{#ifneq storage 'file'}} {{#ifneq storage 'file'}}
<div class="settings__file-save-to settings__file-save-to-file"> <div class="settings__file-save-to settings__file-save-to-file">
<i class="fa fa-file-alt"></i>{{Res 'file'}} <i class="fa fa-file-lines"></i>{{Res 'file'}}
</div> </div>
{{/ifneq}} {{/ifneq}}
{{#each storageProviders as |prv|}} {{#each storageProviders as |prv|}}
@ -58,7 +58,7 @@
<h2>{{res 'settings'}}</h2> <h2>{{res 'settings'}}</h2>
<label for="settings__file-master-pass" class="settings__file-master-pass-label input-base">{{res 'setFilePass'}}: <label for="settings__file-master-pass" class="settings__file-master-pass-label input-base">{{res 'setFilePass'}}:
<span class="settings__file-master-pass-warning"> <span class="settings__file-master-pass-warning">
<i class="fa fa-exclamation-triangle"></i> <span id="settings__file-master-pass-warning-text">{{res 'setFilePassChange'}}</span> <i class="fa fa-triangle-exclamation"></i> <span id="settings__file-master-pass-warning-text">{{res 'setFilePassChange'}}</span>
</span> </span>
</label> </label>
<div class="hide"> <div class="hide">
@ -70,7 +70,7 @@
<div id="settings__file-confirm-master-pass-group"> <div id="settings__file-confirm-master-pass-group">
<label for="settings__file-confirm-master-pass" class="settings__file-master-pass-label input-base">{{res 'setFileConfirmPass'}}: <label for="settings__file-confirm-master-pass" class="settings__file-master-pass-label input-base">{{res 'setFileConfirmPass'}}:
<span class="settings__file-confirm-master-pass-warning"> <span class="settings__file-confirm-master-pass-warning">
<i class="fa fa-exclamation-triangle"></i> {{res 'setFilePassNotMatch'}} <i class="fa fa-triangle-exclamation"></i> {{res 'setFilePassNotMatch'}}
</span> </span>
</label> </label>
<input type="password" class="settings__input input-base" id="settings__file-confirm-master-pass" autocomplete="confirm-password" /> <input type="password" class="settings__input input-base" id="settings__file-confirm-master-pass" autocomplete="confirm-password" />

View File

@ -36,6 +36,7 @@
</div> </div>
{{/if}} {{/if}}
<br />
<h2 id="appearance">{{res 'setGenAppearance'}}</h2> <h2 id="appearance">{{res 'setGenAppearance'}}</h2>
{{#if locales}} {{#if locales}}
<div> <div>
@ -105,6 +106,7 @@
<label for="settings__general-colorful-icons">{{res 'setGenColorfulIcons'}}</label> <label for="settings__general-colorful-icons">{{res 'setGenColorfulIcons'}}</label>
</div> </div>
<br />
<h2 id="function">{{res 'setGenFunction'}}</h2> <h2 id="function">{{res 'setGenFunction'}}</h2>
{{#if canAutoSaveOnClose}} {{#if canAutoSaveOnClose}}
<div> <div>
@ -217,6 +219,7 @@
{{/if}} {{/if}}
{{/if}} {{/if}}
<br />
<h2 id="audit">{{res 'setGenAudit'}}</h2> <h2 id="audit">{{res 'setGenAudit'}}</h2>
<div> <div>
<input type="checkbox" class="settings__input input-base settings__general-audit-passwords" <input type="checkbox" class="settings__input input-base settings__general-audit-passwords"
@ -269,6 +272,7 @@
</select> </select>
</div> </div>
<br />
<h2 id="lock">{{res 'setGenLock'}}</h2> <h2 id="lock">{{res 'setGenLock'}}</h2>
<div> <div>
<label for="settings__general-idle-minutes">{{res 'setGenLockInactive'}}:</label> <label for="settings__general-idle-minutes">{{res 'setGenLockInactive'}}:</label>
@ -312,6 +316,7 @@
</div> </div>
{{/if}} {{/if}}
<br />
<h2 id="storage">{{res 'setGenStorage'}}</h2> <h2 id="storage">{{res 'setGenStorage'}}</h2>
<div> <div>
<input type="checkbox" class="settings__input input-base settings__general-disable-offline-storage" id="settings__general-disable-offline-storage" <input type="checkbox" class="settings__input input-base settings__general-disable-offline-storage" id="settings__general-disable-offline-storage"
@ -334,6 +339,7 @@
data-storage="{{prv.name}}">{{res 'setGenStorageLogout'}}</button>{{/if}} data-storage="{{prv.name}}">{{res 'setGenStorageLogout'}}</button>{{/if}}
{{/each}} {{/each}}
<br />
<h2 id="advanced">{{res 'advanced'}}</h2> <h2 id="advanced">{{res 'advanced'}}</h2>
<a class="settings__general-show-advanced">{{res 'setGenShowAdvanced'}}</a> <a class="settings__general-show-advanced">{{res 'setGenShowAdvanced'}}</a>
<div class="settings__general-advanced hide"> <div class="settings__general-advanced hide">

View File

@ -12,7 +12,7 @@
<div> <div>
<ul class="settings__plugins-plugin-files"> <ul class="settings__plugins-plugin-files">
{{#if plugin.manifest.resources.js}}<li class="settings__plugins-plugin-file"><i class="fa fa-code"></i> {{res 'setPlJs'}}</li>{{/if}} {{#if plugin.manifest.resources.js}}<li class="settings__plugins-plugin-file"><i class="fa fa-code"></i> {{res 'setPlJs'}}</li>{{/if}}
{{#if plugin.manifest.resources.css}}<li class="settings__plugins-plugin-file"><i class="fa fa-paint-brush"></i> {{res 'setPlCss'}}</li>{{/if}} {{#if plugin.manifest.resources.css}}<li class="settings__plugins-plugin-file"><i class="fa fa-paintbrush"></i> {{res 'setPlCss'}}</li>{{/if}}
{{#if plugin.manifest.resources.loc}}<li class="settings__plugins-plugin-file"><i class="fa fa-language"></i>&nbsp; {{#if plugin.manifest.resources.loc}}<li class="settings__plugins-plugin-file"><i class="fa fa-language"></i>&nbsp;
{{res 'setPlLoc'}}: {{plugin.manifest.locale.title}} {{#if ../hasUnicodeFlags}}{{#if plugin.manifest.locale}}{{#if plugin.manifest.locale.flag}}&nbsp;{{plugin.manifest.locale.flag}}{{/if}}{{/if}}{{/if}}</li> {{res 'setPlLoc'}}: {{plugin.manifest.locale.title}} {{#if ../hasUnicodeFlags}}{{#if plugin.manifest.locale}}{{#if plugin.manifest.locale.flag}}&nbsp;{{plugin.manifest.locale.flag}}{{/if}}{{/if}}{{/if}}</li>
{{/if}} {{/if}}
@ -123,7 +123,7 @@
<div class="settings__plugins-gallery-plugin-desc">{{plugin.manifest.description}}</div> <div class="settings__plugins-gallery-plugin-desc">{{plugin.manifest.description}}</div>
<ul class="settings__plugins-plugin-files"> <ul class="settings__plugins-plugin-files">
{{#if plugin.manifest.resources.js}}<li class="settings__plugins-plugin-file"><i class="fa fa-code"></i> {{res 'setPlJs'}}</li>{{/if}} {{#if plugin.manifest.resources.js}}<li class="settings__plugins-plugin-file"><i class="fa fa-code"></i> {{res 'setPlJs'}}</li>{{/if}}
{{#if plugin.manifest.resources.css}}<li class="settings__plugins-plugin-file"><i class="fa fa-paint-brush"></i> {{res 'setPlCss'}}</li>{{/if}} {{#if plugin.manifest.resources.css}}<li class="settings__plugins-plugin-file"><i class="fa fa-paintbrush"></i> {{res 'setPlCss'}}</li>{{/if}}
{{#if plugin.manifest.resources.loc}}<li class="settings__plugins-plugin-file"><i class="fa fa-language"></i> {{res 'setPlLoc'}}: {{plugin.manifest.locale.title}}</li>{{/if}} {{#if plugin.manifest.resources.loc}}<li class="settings__plugins-plugin-file"><i class="fa fa-language"></i> {{res 'setPlLoc'}}: {{plugin.manifest.locale.title}}</li>{{/if}}
</ul> </ul>
<div class="settings__plugins-gallery-plugin-author muted-color"> <div class="settings__plugins-gallery-plugin-author muted-color">

View File

@ -1,6 +1,6 @@
<div class="settings"> <div class="settings">
<div class="settings__back-button"> <div class="settings__back-button">
<i class="fa fa-chevron-left settings__back-button-pre"></i>{{res 'retToApp'}} <i class="fa fa-arrow-circle-left settings__back-button-post"></i> <i class="fa fa-chevron-left settings__back-button-pre"></i>{{res 'retToApp'}} <i class="fa fa-circle-arrow-left settings__back-button-post"></i>
</div> </div>
<div class="scroller"> <div class="scroller">
</div> </div>

View File

@ -15,7 +15,7 @@
{{#each files as |file|}} {{#each files as |file|}}
{{#unless file.dir}} {{#unless file.dir}}
<div class="open-list__file {{#unless file.kdbx}}open-list__file--another{{/unless}}" data-path="{{file.path}}"> <div class="open-list__file {{#unless file.kdbx}}open-list__file--another{{/unless}}" data-path="{{file.path}}">
<i class="open-list__file-icon fa fa-{{#if file.kdbx}}keeweb{{else}}file-alt-o{{/if}}"></i> <i class="open-list__file-icon fa fa-{{#if file.kdbx}}keeweb{{else}}file-lines-o{{/if}}"></i>
<span class="open-list__file-text">{{file.name}}</span> <span class="open-list__file-text">{{file.name}}</span>
</div> </div>
{{/unless}} {{/unless}}

View File

@ -1,6 +1,6 @@
<div class="tag"> <div class="tag">
<div class="back-button"> <div class="back-button">
{{res 'retToApp'}} <i class="fa fa-arrow-circle-left back-button__post"></i> {{res 'retToApp'}} <i class="fa fa-circle-arrow-left back-button__post"></i>
</div> </div>
<h1>{{res 'tagTitle'}}</h1> <h1>{{res 'tagTitle'}}</h1>
<div class="tag__field"> <div class="tag__field">
@ -10,6 +10,6 @@
</div> </div>
<div class="tag__space"></div> <div class="tag__space"></div>
<div class="tag__buttons"> <div class="tag__buttons">
<i class="tag__buttons-trash fa fa-trash-alt" title="{{res 'tagTrash'}}" tip-placement="right"></i> <i class="tag__buttons-trash fa fa-trash-can" title="{{res 'tagTrash'}}" tip-placement="right"></i>
</div> </div>
</div> </div>

View File

@ -19,6 +19,7 @@ for (const svgDir of svgDirs) {
.forEach((icon) => { .forEach((icon) => {
const svgIconPath = path.join(svgDir, icon); const svgIconPath = path.join(svgDir, icon);
const iconName = icon.substr(0, icon.length - 4) + suffix; const iconName = icon.substr(0, icon.length - 4) + suffix;
allIcons[iconName] = svgIconPath; allIcons[iconName] = svgIconPath;
}); });
} }
@ -36,13 +37,16 @@ module.exports = function makeFontAwesomeWoff2() {
if (err) { if (err) {
return callback(err); return callback(err);
} }
process.stdout.write('Building fontawesome.woff2... '); process.stdout.write('Building fontawesome.woff2... ');
const startTime = Date.now(); const startTime = Date.now();
try { try {
const { fontData, iconsCount } = await buildFont(this, scssSource); const { fontData, iconsCount } = await buildFont(this, scssSource);
const kb = (fontData.byteLength / 1024).toFixed(2); const kb = (fontData.byteLength / 1024).toFixed(2);
const time = Date.now() - startTime; const time = Date.now() - startTime;
process.stdout.write(`ok: ${time}ms, ${iconsCount} icons, ${kb} KiB\n`); process.stdout.write(`ok: ${time}ms, ${iconsCount} icons, ${kb} KiB\n`);
const fontCss = fontData.toString('base64'); const fontCss = fontData.toString('base64');
callback(null, `module.exports = "data:font/woff2;base64,${fontCss}"`); callback(null, `module.exports = "data:font/woff2;base64,${fontCss}"`);
} catch (ex) { } catch (ex) {
@ -52,23 +56,62 @@ module.exports = function makeFontAwesomeWoff2() {
}); });
}; };
/*
helper function for testing charCode to unicode conversion.
utilized in app\styles\base\_icon-font.scss to automatically assign unicode to each
font-awesome character in buildFont()
@usage: toUnicode(charCode)
charcode 61597
Unicode: \uF09D
*/
// eslint-disable-next-line no-unused-vars
function toUnicode(charCode) {
return String.fromCharCode(charCode)
.split('')
.map((code, index, array) => {
const unicode = code.charCodeAt(0).toString(16).toUpperCase();
if (unicode.length > 2) {
return '\\u' + unicode;
}
return code;
})
.join('');
}
/*
converts charCode into symbol
*/
// eslint-disable-next-line no-unused-vars
function toSymbol(charCode) {
return String.fromCharCode(parseInt(charCode, 16));
}
function buildFont(loader, scssSource) { function buildFont(loader, scssSource) {
const includedIcons = {}; const includedIcons = {};
const includedIconList = [...scssSource.matchAll(/\n\$fa-var-([\w-]+):/g)].map( const includedIconList = [...scssSource.matchAll(/\n\$fa-var-([\w-]+):/g)].map(([, name]) => {
([, name]) => name // console.log(`name: ${name}`);
); return name;
});
for (const iconName of includedIconList) { for (const iconName of includedIconList) {
if (includedIcons[iconName]) { if (includedIcons[iconName]) {
throw new Error(`Duplicate icon: $fa-var-${iconName}`); throw new Error(`Duplicate icon: $fa-var-${iconName}`);
} }
if (!allIcons[iconName]) { if (!allIcons[iconName]) {
throw new Error(`Icon not found: "${iconName}"`); throw new Error(`Icon not found: "${iconName}"`);
} }
includedIcons[iconName] = true; includedIcons[iconName] = true;
} }
const fontStream = new SVGIcons2SVGFontStream({ const fontStream = new SVGIcons2SVGFontStream({
fontName: 'Font Awesome 5 Free', fontName: 'Font Awesome 6 Free',
round: 10e12, round: 10e12,
log() {} log() {}
}); });
@ -85,7 +128,9 @@ function buildFont(loader, scssSource) {
const glyph = fs.createReadStream(svgIconPath); const glyph = fs.createReadStream(svgIconPath);
glyph.metadata = { name: iconName, unicode: [String.fromCharCode(charCode)] }; glyph.metadata = { name: iconName, unicode: [String.fromCharCode(charCode)] };
// console.log(JSON.stringify(glyph, null, 4));
// console.log(toUnicode(charCode));
// console.log(toSymbol(charCode));
fontStream.write(glyph); fontStream.write(glyph);
} }
fontStream.end(); fontStream.end();
@ -97,6 +142,8 @@ function buildFont(loader, scssSource) {
data = Buffer.from(svg2ttf(data.toString('utf8')).buffer); data = Buffer.from(svg2ttf(data.toString('utf8')).buffer);
data = Buffer.from(await wawoff2.compress(data)); data = Buffer.from(await wawoff2.compress(data));
// debug to print all icons
// console.log(includedIconList);
resolve({ fontData: data, iconsCount: includedIconList.length }); resolve({ fontData: data, iconsCount: includedIconList.length });
} catch (ex) { } catch (ex) {
reject(ex); reject(ex);