Feature #23980 » 0001-Replace-icon-images-with-inline-SVG-icons.patch
| app/controllers/application_controller.rb | ||
|---|---|---|
| 28 | 28 |
include Redmine::Hook::Helper |
| 29 | 29 |
include RoutesHelper |
| 30 | 30 |
include AvatarsHelper |
| 31 |
include IconsHelper |
|
| 31 | 32 | |
| 32 | 33 |
helper :routes |
| 33 | 34 |
helper :avatars |
| 35 |
helper :icons |
|
| 34 | 36 | |
| 35 | 37 |
class_attribute :accept_api_auth_actions |
| 36 | 38 |
class_attribute :accept_rss_auth_actions |
| app/helpers/application_helper.rb | ||
|---|---|---|
| 126 | 126 |
# * :download - Force download (default: false) |
| 127 | 127 |
def link_to_attachment(attachment, options={})
|
| 128 | 128 |
text = options.delete(:text) || attachment.filename |
| 129 |
icon = 'paperclip' |
|
| 130 |
icon_only = false |
|
| 131 | ||
| 129 | 132 |
if options.delete(:download) |
| 130 | 133 |
route_method = :download_named_attachment_url |
| 131 | 134 |
options[:filename] = attachment.filename |
| 135 |
icon = 'download' |
|
| 136 |
icon_only = true |
|
| 132 | 137 |
else |
| 133 | 138 |
route_method = :attachment_url |
| 134 | 139 |
# make sure we don't have an extraneous :filename in the options |
| ... | ... | |
| 137 | 142 |
html_options = options.slice!(:only_path, :filename) |
| 138 | 143 |
options[:only_path] = true unless options.key?(:only_path) |
| 139 | 144 |
url = send(route_method, attachment, options) |
| 140 |
link_to text, url, html_options
|
|
| 145 |
link_to labeled_icon(text, icon, icon_only: icon_only, size: 12), url, html_options
|
|
| 141 | 146 |
end |
| 142 | 147 | |
| 143 | 148 |
# Generates a link to a SCM revision |
| ... | ... | |
| 797 | 802 |
content = capture(&block) |
| 798 | 803 |
if content.present? |
| 799 | 804 |
trigger = |
| 800 |
content_tag('span', l(:button_actions), :class => 'icon-only icon-actions',
|
|
| 805 |
content_tag('span', labeled_icon(l(:button_actions), 'ellipsis-h', icon_only: true), :class => 'icon icon-actions icon-svg',
|
|
| 801 | 806 |
:title => l(:button_actions)) |
| 802 | 807 |
trigger = content_tag('span', trigger, :class => 'drdn-trigger')
|
| 803 | 808 |
content = content_tag('div', content, :class => 'drdn-items')
|
| ... | ... | |
| 1832 | 1837 | |
| 1833 | 1838 |
def copy_object_url_link(url) |
| 1834 | 1839 |
link_to_function( |
| 1835 |
l(:button_copy_link), 'copyTextToClipboard(this);',
|
|
| 1836 |
class: 'icon icon-copy-link', |
|
| 1840 |
labeled_icon(l(:button_copy_link), 'link'), 'copyTextToClipboard(this);',
|
|
| 1841 |
class: 'icon icon-copy-link icon-svg',
|
|
| 1837 | 1842 |
data: {'clipboard-text' => url}
|
| 1838 | 1843 |
) |
| 1839 | 1844 |
end |
| app/helpers/icons_helper.rb | ||
|---|---|---|
| 1 |
# frozen_string_literal: true |
|
| 2 | ||
| 3 |
module IconsHelper |
|
| 4 |
DEFAULT_ICON_SIZE = 14 |
|
| 5 |
DEFAULT_ICON_PATH = 'public/svgs' |
|
| 6 | ||
| 7 |
def labeled_icon(label, icon_name = nil, size: DEFAULT_ICON_SIZE, css_class: nil, icon_only: false, path: DEFAULT_ICON_PATH) |
|
| 8 |
css_classes = [] |
|
| 9 |
css_classes << "s#{size}" if size
|
|
| 10 |
css_classes << "#{css_class}" unless css_class.blank?
|
|
| 11 | ||
| 12 |
svg = svg_file(icon_name, css_classes, path) |
|
| 13 | ||
| 14 |
if icon_only |
|
| 15 |
svg |
|
| 16 |
else |
|
| 17 |
svg + label |
|
| 18 |
end |
|
| 19 |
end |
|
| 20 | ||
| 21 |
private |
|
| 22 | ||
| 23 |
def svg_file(icon, css_class, path) |
|
| 24 |
file_path = "#{Rails.root}/#{path}/#{icon}.svg"
|
|
| 25 | ||
| 26 |
if File.exists?(file_path) |
|
| 27 |
# cache { File.read(file_path).html_safe }
|
|
| 28 |
file = File.read(file_path) |
|
| 29 | ||
| 30 |
doc = Nokogiri::HTML::DocumentFragment.parse file |
|
| 31 |
svg = doc.at_css 'svg' |
|
| 32 |
svg["class"] = css_class.join(' ')
|
|
| 33 |
else |
|
| 34 |
doc = "<!-- SVG #{icon} not found -->"
|
|
| 35 |
end |
|
| 36 | ||
| 37 |
raw doc |
|
| 38 |
end |
|
| 39 |
end |
|
| app/helpers/journals_helper.rb | ||
|---|---|---|
| 34 | 34 |
dropbown_links << copy_object_url_link(issue_url(issue, anchor: "note-#{indice}", only_path: false))
|
| 35 | 35 |
if journal.notes.present? |
| 36 | 36 |
if options[:reply_links] |
| 37 |
links << link_to(l(:button_quote),
|
|
| 37 |
links << link_to(labeled_icon(l(:button_quote), 'quote-left', icon_only: true),
|
|
| 38 | 38 |
quoted_issue_path(issue, :journal_id => journal, :journal_indice => indice), |
| 39 | 39 |
:remote => true, |
| 40 | 40 |
:method => 'post', |
| 41 | 41 |
:title => l(:button_quote), |
| 42 |
:class => 'icon-only icon-comment' |
|
| 42 |
:class => 'icon-only icon-comment icon-svg'
|
|
| 43 | 43 |
) |
| 44 | 44 |
end |
| 45 | 45 |
if journal.editable_by?(User.current) |
| 46 |
links << link_to(l(:button_edit),
|
|
| 46 |
links << link_to(labeled_icon(l(:button_edit), 'pen-alt', icon_only: true),
|
|
| 47 | 47 |
edit_journal_path(journal), |
| 48 | 48 |
:remote => true, |
| 49 | 49 |
:method => 'get', |
| 50 | 50 |
:title => l(:button_edit), |
| 51 |
:class => 'icon-only icon-edit' |
|
| 51 |
:class => 'icon-only icon-edit icon-svg'
|
|
| 52 | 52 |
) |
| 53 |
dropbown_links << link_to(l(:button_delete),
|
|
| 53 |
dropbown_links << link_to(labeled_icon(l(:button_delete), 'trash-alt'),
|
|
| 54 | 54 |
journal_path(journal, :journal => {:notes => ""}),
|
| 55 | 55 |
:remote => true, |
| 56 | 56 |
:method => 'put', :data => {:confirm => l(:text_are_you_sure)},
|
| 57 |
:class => 'icon icon-del' |
|
| 57 |
:class => 'icon icon-del icon-svg'
|
|
| 58 | 58 |
) |
| 59 | 59 |
end |
| 60 | 60 |
end |
| app/helpers/watchers_helper.rb | ||
|---|---|---|
| 26 | 26 |
return '' unless objects.any? |
| 27 | 27 | |
| 28 | 28 |
watched = Watcher.any_watched?(objects, user) |
| 29 |
css = [watcher_css(objects), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ')
|
|
| 29 |
css = [watcher_css(objects), watched ? 'icon icon-fav' : 'icon icon-fav-off icon-svg'].join(' ')
|
|
| 30 | 30 |
text = watched ? l(:button_unwatch) : l(:button_watch) |
| 31 | 31 |
url = watch_path( |
| 32 | 32 |
:object_type => objects.first.class.to_s.underscore, |
| 33 | 33 |
:object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) |
| 34 | 34 |
) |
| 35 | 35 |
method = watched ? 'delete' : 'post' |
| 36 |
icon = watched ? 'star' : 'star-off' |
|
| 36 | 37 | |
| 37 |
link_to text, url, :remote => true, :method => method, :class => css
|
|
| 38 |
link_to labeled_icon(text, icon), url, :remote => true, :method => method, :class => css
|
|
| 38 | 39 |
end |
| 39 | 40 | |
| 40 | 41 |
# Returns the css class used to identify watch links for a given +object+ |
| app/views/attachments/_links.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="attachments"> |
| 2 | 2 |
<div class="contextual"> |
| 3 |
<%= link_to(l(:label_edit_attachments),
|
|
| 3 |
<%= link_to(labeled_icon(l(:label_edit_attachments), 'pen-alt', icon_only: true),
|
|
| 4 | 4 |
container_attachments_edit_path(container), |
| 5 | 5 |
:title => l(:label_edit_attachments), |
| 6 |
:class => 'icon-only icon-edit' |
|
| 6 |
:class => 'icon-only icon-edit icon-svg'
|
|
| 7 | 7 |
) if options[:editable] %> |
| 8 |
<%= link_to(l(:label_download_all_attachments),
|
|
| 8 |
<%= link_to(labeled_icon(l(:label_download_all_attachments), 'download', icon_only: true),
|
|
| 9 | 9 |
container_attachments_download_path(container), |
| 10 | 10 |
:title => l(:label_download_all_attachments), |
| 11 |
:class => 'icon-only icon-download' |
|
| 11 |
:class => 'icon-only icon-download icon-svg'
|
|
| 12 | 12 |
) if attachments.size > 1 %> |
| 13 | 13 |
</div> |
| 14 | 14 |
<table> |
| 15 | 15 |
<% for attachment in attachments %> |
| 16 | 16 |
<tr> |
| 17 | 17 |
<td> |
| 18 |
<%= link_to_attachment attachment, class: 'icon icon-attachment' -%> |
|
| 18 |
<%= link_to_attachment attachment, class: 'icon icon-attachment icon-svg' -%>
|
|
| 19 | 19 |
<span class="size">(<%= number_to_human_size attachment.filesize %>)</span> |
| 20 |
<%= link_to_attachment attachment, class: 'icon-only icon-download', title: l(:button_download), download: true -%> |
|
| 20 |
<%= link_to_attachment attachment, class: 'icon-only icon-download icon-svg', title: l(:button_download), download: true -%>
|
|
| 21 | 21 |
</td> |
| 22 | 22 |
<td><%= attachment.description unless attachment.description.blank? %></td> |
| 23 | 23 |
<td> |
| ... | ... | |
| 27 | 27 |
</td> |
| 28 | 28 |
<td> |
| 29 | 29 |
<% if options[:deletable] %> |
| 30 |
<%= link_to l(:button_delete), attachment_path(attachment),
|
|
| 30 |
<%= link_to labeled_icon(l(:button_delete), 'trash-alt', icon_only: true, size: 12), attachment_path(attachment),
|
|
| 31 | 31 |
:data => {:confirm => l(:text_are_you_sure)},
|
| 32 | 32 |
:method => :delete, |
| 33 |
:class => 'delete icon-only icon-del', |
|
| 33 |
:class => 'delete icon-only icon-del icon-svg',
|
|
| 34 | 34 |
:title => l(:button_delete) %> |
| 35 | 35 |
<% end %> |
| 36 | 36 |
</td> |
| app/views/issues/_action_menu.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="contextual"> |
| 2 |
<%= link_to l(:button_edit), edit_issue_path(@issue),
|
|
| 2 |
<%= link_to labeled_icon(l(:button_edit), 'pen-alt'), edit_issue_path(@issue),
|
|
| 3 | 3 |
:onclick => 'showAndScrollTo("update", "issue_notes"); return false;',
|
| 4 |
:class => 'icon icon-edit', :accesskey => accesskey(:edit) if @issue.editable? %> |
|
| 5 |
<%= link_to l(:button_log_time), new_issue_time_entry_path(@issue),
|
|
| 6 |
:class => 'icon icon-time-add' if User.current.allowed_to?(:log_time, @project) %> |
|
| 4 |
:class => 'icon icon-edit icon-svg', :accesskey => accesskey(:edit) if @issue.editable? %>
|
|
| 5 |
<%= link_to labeled_icon(l(:button_log_time), 'time-add'), new_issue_time_entry_path(@issue),
|
|
| 6 |
:class => 'icon icon-time-add icon-svg' if User.current.allowed_to?(:log_time, @project) %>
|
|
| 7 | 7 |
<%= watcher_link(@issue, User.current) %> |
| 8 |
<%= link_to l(:button_copy), project_copy_issue_path(@project, @issue),
|
|
| 9 |
:class => 'icon icon-copy' if User.current.allowed_to?(:copy_issues, @project) && Issue.allowed_target_projects.any? %> |
|
| 8 |
<%= link_to labeled_icon(l(:button_copy), 'copy'), project_copy_issue_path(@project, @issue),
|
|
| 9 |
:class => 'icon icon-copy icon-svg' if User.current.allowed_to?(:copy_issues, @project) && Issue.allowed_target_projects.any? %>
|
|
| 10 | 10 |
<%= actions_dropdown do %> |
| 11 | 11 |
<%= copy_object_url_link(issue_url(@issue, only_path: false)) %> |
| 12 |
<%= link_to l(:button_delete), issue_path(@issue),
|
|
| 12 |
<%= link_to labeled_icon(l(:button_delete), 'trash-alt'), issue_path(@issue),
|
|
| 13 | 13 |
:data => {:confirm => issues_destroy_confirmation_message(@issue)},
|
| 14 |
:method => :delete, :class => 'icon icon-del' if @issue.deletable? %> |
|
| 14 |
:method => :delete, :class => 'icon icon-del icon-svg' if @issue.deletable? %>
|
|
| 15 | 15 |
<% end %> |
| 16 | 16 |
</div> |
| app/views/issues/index.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="contextual"> |
| 2 | 2 |
<% if User.current.allowed_to?(:add_issues, @project, :global => true) && (@project.nil? || Issue.allowed_target_trackers(@project).any?) %> |
| 3 |
<%= link_to l(:label_issue_new), _new_project_issue_path(@project), :class => 'icon icon-add new-issue' %>
|
|
| 3 |
<%= link_to labeled_icon(l(:label_issue_new), 'plus-circle'), _new_project_issue_path(@project), :class => 'icon icon-svg icon-add new-issue' %>
|
|
| 4 | 4 |
<% end %> |
| 5 | 5 |
<%= actions_dropdown do %> |
| 6 | 6 |
<% if @project %> |
| app/views/issues/show.html.erb | ||
|---|---|---|
| 83 | 83 |
<hr /> |
| 84 | 84 |
<div class="description"> |
| 85 | 85 |
<div class="contextual"> |
| 86 |
<%= link_to l(:button_quote), quoted_issue_path(@issue), :remote => true, :method => 'post', :class => 'icon icon-comment' if @issue.notes_addable? %>
|
|
| 86 |
<%= link_to labeled_icon(l(:button_quote), 'quote-left'), quoted_issue_path(@issue), :remote => true, :method => 'post', :class => 'icon icon-comment icon-svg' if @issue.notes_addable? %>
|
|
| 87 | 87 |
</div> |
| 88 | 88 | |
| 89 | 89 |
<p><strong><%=l(:field_description)%></strong></p> |
| public/stylesheets/application.css | ||
|---|---|---|
| 223 | 223 | |
| 224 | 224 |
.contextual .drdn-content {top:18px;}
|
| 225 | 225 |
.contextual .drdn-items {padding:2px; min-width: 160px;}
|
| 226 |
.contextual .drdn-items>a {padding: 5px 8px;}
|
|
| 227 |
.contextual .drdn-items>a.icon {padding-left: 24px; background-position-x: 4px;}
|
|
| 226 |
.contextual .drdn-items>a {display: flex; padding: 5px 8px;}
|
|
| 227 |
.contextual .drdn-items>a.icon:not(.icon-svg) {padding-left: 24px; background-position-x: 4px;}
|
|
| 228 | 228 |
.contextual .drdn-items>a:hover {color:#2A5685; border:1px solid #628db6; background-color:#eef5fd; border-radius:3px;}
|
| 229 | 229 | |
| 230 | 230 |
#project-jump.drdn {width:200px;display:inline-block;}
|
| ... | ... | |
| 464 | 464 |
width: .6em; height: .6em; |
| 465 | 465 |
} |
| 466 | 466 |
.contextual {float:right; white-space: nowrap; line-height:1.4em;margin:5px 0px; padding-left: 10px; font-size:0.9em;}
|
| 467 |
.contextual .icon {padding-top: 2px; padding-bottom: 3px;}
|
|
| 467 |
.contextual .icon:not(.icon-svg) {padding-top: 2px; padding-bottom: 3px;}
|
|
| 468 | 468 |
.contextual input, .contextual select {font-size:0.9em;}
|
| 469 | 469 |
.message .contextual { margin-top: 0; }
|
| 470 | 470 | |
| ... | ... | |
| 1497 | 1497 |
white-space: pre-wrap; |
| 1498 | 1498 |
} |
| 1499 | 1499 | |
| 1500 |
/***** SVGs ******/ |
|
| 1501 |
.s16 {
|
|
| 1502 |
width: 16px; |
|
| 1503 |
height: 16px; |
|
| 1504 |
} |
|
| 1505 | ||
| 1506 |
.s14 {
|
|
| 1507 |
width: 14px; |
|
| 1508 |
height: 14px; |
|
| 1509 |
} |
|
| 1510 | ||
| 1511 |
.s12 {
|
|
| 1512 |
width: 12px; |
|
| 1513 |
height: 12px; |
|
| 1514 |
} |
|
| 1515 | ||
| 1500 | 1516 |
/***** Icons *****/ |
| 1501 |
.icon {
|
|
| 1517 |
.icon:not(.icon-svg) {
|
|
| 1502 | 1518 |
background-position: 0% 50%; |
| 1503 | 1519 |
background-repeat: no-repeat; |
| 1504 | 1520 |
padding-left: 20px; |
| 1505 | 1521 |
} |
| 1506 |
.icon-only {
|
|
| 1507 |
background-position: 0% 50%; |
|
| 1508 |
background-repeat: no-repeat; |
|
| 1509 |
padding-left: 16px; |
|
| 1510 |
display: inline-block; |
|
| 1511 |
width: 0; |
|
| 1512 |
height: 16px; |
|
| 1513 |
overflow: hidden; |
|
| 1514 |
padding-top: 0; |
|
| 1515 |
padding-bottom: 0; |
|
| 1516 |
font-size: 8px; |
|
| 1517 |
vertical-align: middle; |
|
| 1522 |
.icon.icon-svg {
|
|
| 1523 |
display: inline-flex; |
|
| 1518 | 1524 |
} |
| 1519 |
.icon-only::after {
|
|
| 1520 |
content: "\a0"; |
|
| 1525 | ||
| 1526 |
a svg, .icon svg {
|
|
| 1527 |
fill: #169; |
|
| 1528 |
margin-right: 4px; |
|
| 1521 | 1529 |
} |
| 1522 | 1530 | |
| 1523 |
.icon-add { background-image: url(../images/add.png); }
|
|
| 1524 |
.icon-edit { background-image: url(../images/edit.png); }
|
|
| 1525 |
.icon-copy { background-image: url(../images/copy.png); }
|
|
| 1531 | ||
| 1532 |
/*.icon-fav svg { fill: #fc8c12; }*/
|
|
| 1533 | ||
| 1534 |
.icon-add:not(.icon-svg) { background-image: url(../images/add.png); }
|
|
| 1535 |
.icon-edit:not(.icon-svg) { background-image: url(../images/edit.png); }
|
|
| 1536 |
.icon-copy:not(.icon-svg) { background-image: url(../images/copy.png); }
|
|
| 1526 | 1537 |
.icon-duplicate { background-image: url(../images/duplicate.png); }
|
| 1527 |
.icon-del { background-image: url(../images/delete.png); }
|
|
| 1538 |
.icon-del:not(.icon-svg) { background-image: url(../images/delete.png); }
|
|
| 1528 | 1539 |
.icon-move { background-image: url(../images/move.png); }
|
| 1529 | 1540 |
.icon-save { background-image: url(../images/save.png); }
|
| 1530 |
.icon-download { background-image: url(../images/download.png); }
|
|
| 1541 |
.icon-download:not(.icon-svg) { background-image: url(../images/download.png); }
|
|
| 1531 | 1542 |
.icon-cancel { background-image: url(../images/cancel.png); }
|
| 1532 | 1543 |
.icon-multiple { background-image: url(../images/table_multiple.png); }
|
| 1533 | 1544 |
.icon-folder { background-image: url(../images/folder.png); }
|
| ... | ... | |
| 1536 | 1547 |
.icon-user { background-image: url(../images/user.png); }
|
| 1537 | 1548 |
.icon-project, .icon-projects { background-image: url(../images/projects.png); }
|
| 1538 | 1549 |
.icon-help { background-image: url(../images/help.png); }
|
| 1539 |
.icon-attachment { background-image: url(../images/attachment.png); }
|
|
| 1550 |
.icon-attachment:not(.icon-svg) { background-image: url(../images/attachment.png); }
|
|
| 1540 | 1551 |
.icon-history { background-image: url(../images/history.png); }
|
| 1541 | 1552 |
.icon-time-entry, .icon-time { background-image: url(../images/time.png); }
|
| 1542 |
.icon-time-add { background-image: url(../images/time_add.png); }
|
|
| 1553 |
.icon-time-add:not(.icon-svg) { background-image: url(../images/time_add.png); }
|
|
| 1543 | 1554 |
.icon-stats { background-image: url(../images/stats.png); }
|
| 1544 | 1555 |
.icon-warning { background-image: url(../images/warning.png); }
|
| 1545 | 1556 |
.icon-error { background-image: url(../images/exclamation.png); }
|
| 1546 |
.icon-fav { background-image: url(../images/fav.png); }
|
|
| 1547 |
.icon-fav-off { background-image: url(../images/fav_off.png); }
|
|
| 1557 |
.icon-fav:not(.icon-svg) { background-image: url(../images/fav.png); }
|
|
| 1558 |
.icon-fav-off:not(.icon-svg) { background-image: url(../images/fav_off.png); }
|
|
| 1548 | 1559 |
.icon-reload { background-image: url(../images/reload.png); }
|
| 1549 | 1560 |
.icon-lock, .icon-locked { background-image: url(../images/locked.png); }
|
| 1550 | 1561 |
.icon-unlock { background-image: url(../images/unlock.png); }
|
| 1551 | 1562 |
.icon-checked { background-image: url(../images/toggle_check.png); }
|
| 1552 | 1563 |
.icon-report { background-image: url(../images/report.png); }
|
| 1553 |
.icon-comment, .icon-comments { background-image: url(../images/comment.png); }
|
|
| 1564 |
.icon-comment:not(.icon-svg), .icon-comments { background-image: url(../images/comment.png); }
|
|
| 1554 | 1565 |
.icon-summary { background-image: url(../images/lightning.png); }
|
| 1555 | 1566 |
.icon-server-authentication { background-image: url(../images/server_key.png); }
|
| 1556 | 1567 |
.icon-issue { background-image: url(../images/ticket.png); }
|
| ... | ... | |
| 1586 | 1597 |
.icon-project { background-image: url(../images/projects.png); }
|
| 1587 | 1598 |
.icon-add-bullet { background-image: url(../images/bullet_add.png); }
|
| 1588 | 1599 |
.icon-shared { background-image: url(../images/link.png); }
|
| 1589 |
.icon-actions { background-image: url(../images/3_bullets.png); }
|
|
| 1600 |
.icon-actions:not(.icon-svg) { background-image: url(../images/3_bullets.png); }
|
|
| 1590 | 1601 |
.icon-sort-handle { background-image: url(../images/reorder.png); }
|
| 1591 | 1602 |
.icon-expended { background-image: url(../images/arrow_down.png); }
|
| 1592 | 1603 |
.icon-collapsed { background-image: url(../images/arrow_right.png); }
|
| ... | ... | |
| 1618 | 1629 |
.icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
|
| 1619 | 1630 |
.icon-file.application-zip { background-image: url(../images/files/zip.png); }
|
| 1620 | 1631 |
.icon-file.application-gzip { background-image: url(../images/files/zip.png); }
|
| 1621 |
.icon-copy-link { background-image: url(../images/copy_link.png); }
|
|
| 1632 |
.icon-copy-link:not(.icon-svg) { background-image: url(../images/copy_link.png); }
|
|
| 1622 | 1633 | |
| 1623 | 1634 |
.sort-handle.ajax-loading { background-image: url(../images/loading.gif); }
|
| 1624 | 1635 |
tr.ui-sortable-helper { border:1px solid #e4e4e4; }
|
| public/svgs/copy.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"/></svg> |
|
| public/svgs/download.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"/></svg> |
|
| public/svgs/ellipsis-h.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z"/></svg> |
|
| public/svgs/link.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></svg> |
|
| public/svgs/paperclip.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M43.246 466.142c-58.43-60.289-57.341-157.511 1.386-217.581L254.392 34c44.316-45.332 116.351-45.336 160.671 0 43.89 44.894 43.943 117.329 0 162.276L232.214 383.128c-29.855 30.537-78.633 30.111-107.982-.998-28.275-29.97-27.368-77.473 1.452-106.953l143.743-146.835c6.182-6.314 16.312-6.422 22.626-.241l22.861 22.379c6.315 6.182 6.422 16.312.241 22.626L171.427 319.927c-4.932 5.045-5.236 13.428-.648 18.292 4.372 4.634 11.245 4.711 15.688.165l182.849-186.851c19.613-20.062 19.613-52.725-.011-72.798-19.189-19.627-49.957-19.637-69.154 0L90.39 293.295c-34.763 35.56-35.299 93.12-1.191 128.313 34.01 35.093 88.985 35.137 123.058.286l172.06-175.999c6.177-6.319 16.307-6.433 22.626-.256l22.877 22.364c6.319 6.177 6.434 16.307.256 22.626l-172.06 175.998c-59.576 60.938-155.943 60.216-214.77-.485z"/></svg> |
|
| public/svgs/pen-alt.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z"/></svg> |
|
| public/svgs/plus-circle.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z"/></svg> |
|
| public/svgs/quote-left.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z"/></svg> |
|
| public/svgs/star-off.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M528.1 171.5L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6zM388.6 312.3l23.7 138.4L288 385.4l-124.3 65.3 23.7-138.4-100.6-98 139-20.2 62.2-126 62.2 126 139 20.2-100.6 98z"/></svg> |
|
| public/svgs/star.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z"/></svg> |
|
| public/svgs/time-add.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z"/></svg> |
|
| public/svgs/trash-alt.svg | ||
|---|---|---|
| 1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z"/></svg> |
|