Merge pull request #13077 from edx/rc/2016-07-26

Release Candidate rc/2016-07-26
This commit is contained in:
Diana Huang
2016-07-26 13:33:12 -04:00
committed by GitHub
509 changed files with 12021 additions and 7856 deletions

17
.gitignore vendored
View File

@@ -19,14 +19,17 @@ cms/envs/private.py
.redcar/
codekit-config.json
.pycharm_helpers/
/_mac/*
/IntelliLang.xml
/conda_packages.xml
/databaseSettings.xml
/diff.xml
/inspection/Default.xml
/_mac/*
/IntelliLang.xml
/conda_packages.xml
/databaseSettings.xml
/diff.xml
/debugger.xml
/editor.xml
/ide.general.xml
/inspection/Default.xml
/other.xml
/packages.xml
/packages.xml
/web-browsers.xml
### NFS artifacts

View File

@@ -275,3 +275,4 @@ Alisan Tang <atang@edx.org>
Kevin Kim <kkim@edx.org>
Albert St. Aubin Jr. <astaubin@edx.org>
Casey Litton <caseylitton@gmail.com>
Jhony Avella <jhony.avella@edunext.co>

View File

@@ -1,95 +0,0 @@
@shard_2
Feature: CMS.Course Settings
As a course author, I want to be able to configure my course settings.
# Safari has trouble keeps dates on refresh
@skip_safari
Scenario: User can set course dates
Given I have opened a new course in Studio
When I select Schedule and Details
And I set course dates
And I press the "Save" notification button
And I reload the page
Then I see the set dates
# IE has trouble with saving information
@skip_internetexplorer
Scenario: User can clear previously set course dates (except start date)
Given I have set course dates
And I clear all the dates except start
And I press the "Save" notification button
And I reload the page
Then I see cleared dates
# IE has trouble with saving information
@skip_internetexplorer
Scenario: User cannot clear the course start date
Given I have set course dates
And I press the "Save" notification button
And I clear the course start date
Then I receive a warning about course start date
And I reload the page
And the previously set start date is shown
# IE has trouble with saving information
# Safari gets CSRF token errors
@skip_internetexplorer
@skip_safari
Scenario: User can correct the course start date warning
Given I have tried to clear the course start
And I have entered a new course start date
And I press the "Save" notification button
Then The warning about course start date goes away
And I reload the page
Then my new course start date is shown
# Safari does not save + refresh properly through sauce labs
@skip_safari
Scenario: Settings are only persisted when saved
Given I have set course dates
And I press the "Save" notification button
When I change fields
And I reload the page
Then I do not see the changes
# Safari does not save + refresh properly through sauce labs
@skip_safari
Scenario: Settings are reset on cancel
Given I have set course dates
And I press the "Save" notification button
When I change fields
And I press the "Cancel" notification button
Then I do not see the changes
# Safari gets CSRF token errors
@skip_safari
Scenario: Confirmation is shown on save
Given I have opened a new course in Studio
When I select Schedule and Details
And I change the "<field>" field to "<value>"
And I press the "Save" notification button
Then I see a confirmation that my changes have been saved
# Lettuce hooks don't get called between each example, so we need
# to run the before.each_scenario hook manually to avoid database
# errors.
And I reset the database
Examples:
| field | value |
| Course Start Time | 11:00 |
| Course Introduction Video | 4r7wHMg5Yjg |
| Course Effort | 200:00 |
# Special case because we have to type in code mirror
Scenario: Changes in Course Overview show a confirmation
Given I have opened a new course in Studio
When I select Schedule and Details
And I change the course overview
And I press the "Save" notification button
Then I see a confirmation that my changes have been saved
Scenario: User cannot save invalid settings
Given I have opened a new course in Studio
When I select Schedule and Details
And I change the "Course Start Date" field to ""
Then the save notification button is disabled

View File

@@ -2,41 +2,45 @@
Feature: CMS.Course updates
As a course author, I want to be able to provide updates to my students
# Commenting out as flaky TNL-5051 07/20/2016
# Internet explorer can't select all so the update appears weirdly
@skip_internetexplorer
Scenario: Users can add updates
Given I have opened a new course in Studio
And I go to the course updates page
When I add a new update with the text "Hello"
Then I should see the update "Hello"
And I see a "saving" notification
# @skip_internetexplorer
# Scenario: Users can add updates
# Given I have opened a new course in Studio
# And I go to the course updates page
# When I add a new update with the text "Hello"
# Then I should see the update "Hello"
# And I see a "saving" notification
# Internet explorer can't select all so the update appears weirdly
@skip_internetexplorer
Scenario: Users can edit updates
Given I have opened a new course in Studio
And I go to the course updates page
When I add a new update with the text "Hello"
And I modify the text to "Goodbye"
Then I should see the update "Goodbye"
And I see a "saving" notification
# Commenting out as flaky TNL-5051 07/20/2016
# # Internet explorer can't select all so the update appears weirdly
# @skip_internetexplorer
# Scenario: Users can edit updates
# Given I have opened a new course in Studio
# And I go to the course updates page
# When I add a new update with the text "Hello"
# And I modify the text to "Goodbye"
# Then I should see the update "Goodbye"
# And I see a "saving" notification
Scenario: Users can delete updates
Given I have opened a new course in Studio
And I go to the course updates page
And I add a new update with the text "Hello"
And I delete the update
And I confirm the prompt
Then I should not see the update "Hello"
And I see a "deleting" notification
# Commenting out as flaky TNL-5051 07/20/2016
# Scenario: Users can delete updates
# Given I have opened a new course in Studio
# And I go to the course updates page
# And I add a new update with the text "Hello"
# And I delete the update
# And I confirm the prompt
# Then I should not see the update "Hello"
# And I see a "deleting" notification
Scenario: Users can edit update dates
Given I have opened a new course in Studio
And I go to the course updates page
And I add a new update with the text "Hello"
When I edit the date to "06/01/13"
Then I should see the date "June 1, 2013"
And I see a "saving" notification
# Commenting out as flaky TNL-5051 07/20/2016
# Scenario: Users can edit update dates
# Given I have opened a new course in Studio
# And I go to the course updates page
# And I add a new update with the text "Hello"
# When I edit the date to "06/01/13"
# Then I should see the date "June 1, 2013"
# And I see a "saving" notification
# Internet explorer can't select all so the update appears weirdly
@skip_internetexplorer
@@ -55,16 +59,17 @@ Feature: CMS.Course updates
And when I reload the page
Then I should see the update "before <strong>middle</strong> after"
Scenario: Static links are rewritten when previewing a course update
Given I have opened a new course in Studio
And I go to the course updates page
When I add a new update with the text "<img src='/static/my_img.jpg'/>"
# Can only do partial text matches because of the quotes with in quotes (and regexp step matching).
Then I should see the asset update to "my_img.jpg"
And I change the update from "/static/my_img.jpg" to "<img src='/static/modified.jpg'/>"
Then I should see the asset update to "modified.jpg"
And when I reload the page
Then I should see the asset update to "modified.jpg"
# Commenting out as flaky TNL-5051 07/22/2016
# Scenario: Static links are rewritten when previewing a course update
# Given I have opened a new course in Studio
# And I go to the course updates page
# When I add a new update with the text "<img src='/static/my_img.jpg'/>"
# # Can only do partial text matches because of the quotes with in quotes (and regexp step matching).
# Then I should see the asset update to "my_img.jpg"
# And I change the update from "/static/my_img.jpg" to "<img src='/static/modified.jpg'/>"
# Then I should see the asset update to "modified.jpg"
# And when I reload the page
# Then I should see the asset update to "modified.jpg"
Scenario: Static links are rewritten when previewing handouts
Given I have opened a new course in Studio

View File

@@ -17,7 +17,7 @@ def go_to_updates(_step):
@step(u'I add a new update with the text "([^"]*)"$')
def add_update(_step, text):
update_css = 'a.new-update-button'
update_css = '.new-update-button'
world.css_click(update_css)
world.wait_for_visible('.CodeMirror')
change_text(text)

View File

@@ -691,7 +691,6 @@ class MiscCourseTests(ContentStoreTestCase):
# Test that malicious code does not appear in html
self.assertNotIn(malicious_code, resp.content)
@patch('django.conf.settings.DEPRECATED_ADVANCED_COMPONENT_TYPES', [])
def test_advanced_components_in_edit_unit(self):
# This could be made better, but for now let's just assert that we see the advanced modules mentioned in the page
# response HTML

View File

@@ -21,6 +21,7 @@ from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
from openedx.core.djangoapps.models.course_details import CourseDetails
from student.roles import CourseInstructorRole, CourseStaffRole
from student.tests.factories import UserFactory
from xblock_django.models import XBlockStudioConfigurationFlag
from xmodule.fields import Date
from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.django import modulestore
@@ -784,6 +785,15 @@ class CourseMetadataEditingTest(CourseTestCase):
)
self.assertNotIn('edxnotes', test_model)
def test_allow_unsupported_xblocks(self):
"""
allow_unsupported_xblocks is only shown in Advanced Settings if
XBlockStudioConfigurationFlag is enabled.
"""
self.assertNotIn('allow_unsupported_xblocks', CourseMetadata.fetch(self.fullcourse))
XBlockStudioConfigurationFlag(enabled=True).save()
self.assertIn('allow_unsupported_xblocks', CourseMetadata.fetch(self.fullcourse))
def test_validate_from_json_correct_inputs(self):
is_valid, errors, test_model = CourseMetadata.validate_and_update_from_json(
self.course,

View File

@@ -25,6 +25,7 @@ from openedx.core.djangoapps.content.course_structures.tests import SignalDiscon
from xblock_django.user_service import DjangoXBlockUserService
from xmodule.x_module import STUDIO_VIEW
from student import auth
from student.tests.factories import UserFactory
class LibraryTestCase(ModuleStoreTestCase):
@@ -34,6 +35,7 @@ class LibraryTestCase(ModuleStoreTestCase):
def setUp(self):
super(LibraryTestCase, self).setUp()
self.user = UserFactory(password=self.user_password, is_staff=True)
self.client = AjaxEnabledTestClient()
self._login_as_staff_user(logout_first=False)
@@ -477,7 +479,8 @@ class TestLibraryAccess(SignalDisconnectTestMixin, LibraryTestCase):
def setUp(self):
""" Create a library, staff user, and non-staff user """
super(TestLibraryAccess, self).setUp()
self.non_staff_user, self.non_staff_user_password = self.create_non_staff_user()
self.non_staff_user_password = 'foo'
self.non_staff_user = UserFactory(password=self.non_staff_user_password, is_staff=False)
def _login_as_non_staff_user(self, logout_first=True):
""" Login as a user that starts out with no roles/permissions granted. """

View File

@@ -27,7 +27,10 @@ from opaque_keys.edx.keys import UsageKey
from student.auth import has_course_author_access
from django.utils.translation import ugettext as _
from xblock_django.models import XBlockDisableConfig
from xblock_django.api import disabled_xblocks, authorable_xblocks
from xblock_django.models import XBlockStudioConfigurationFlag
__all__ = [
'container_handler',
@@ -47,17 +50,41 @@ CONTAINER_TEMPLATES = [
"basic-modal", "modal-button", "edit-xblock-modal",
"editor-mode-button", "upload-dialog",
"add-xblock-component", "add-xblock-component-button", "add-xblock-component-menu",
"add-xblock-component-menu-problem", "xblock-string-field-editor", "publish-xblock", "publish-history",
"add-xblock-component-support-legend", "add-xblock-component-support-level", "add-xblock-component-menu-problem",
"xblock-string-field-editor", "publish-xblock", "publish-history",
"unit-outline", "container-message", "license-selector",
]
def _advanced_component_types():
def _advanced_component_types(show_unsupported):
"""
Return advanced component types which can be created.
Args:
show_unsupported: if True, unsupported XBlocks may be included in the return value
Returns:
A dict of authorable XBlock types and their support levels (see XBlockStudioConfiguration). For example:
{
"done": "us", # unsupported
"discussion: "fs" # fully supported
}
Note that the support level will be "True" for all XBlocks if XBlockStudioConfigurationFlag
is not enabled.
"""
disabled_create_block_types = XBlockDisableConfig.disabled_create_block_types()
return [c_type for c_type in ADVANCED_COMPONENT_TYPES if c_type not in disabled_create_block_types]
enabled_block_types = _filter_disabled_blocks(ADVANCED_COMPONENT_TYPES)
if XBlockStudioConfigurationFlag.is_enabled():
authorable_blocks = authorable_xblocks(allow_unsupported=show_unsupported)
filtered_blocks = {}
for block in authorable_blocks:
if block.name in enabled_block_types:
filtered_blocks[block.name] = block.support_level
return filtered_blocks
else:
all_blocks = {}
for block_name in enabled_block_types:
all_blocks[block_name] = True
return all_blocks
def _load_mixed_class(category):
@@ -152,13 +179,14 @@ def get_component_templates(courselike, library=False):
"""
Returns the applicable component templates that can be used by the specified course or library.
"""
def create_template_dict(name, cat, boilerplate_name=None, tab="common", hinted=False):
def create_template_dict(name, category, support_level, boilerplate_name=None, tab="common", hinted=False):
"""
Creates a component template dict.
Parameters
display_name: the user-visible name of the component
category: the type of component (problem, html, etc.)
support_level: the support level of this component
boilerplate_name: name of boilerplate for filling in default values. May be None.
hinted: True if hinted problem else False
tab: common(default)/advanced, which tab it goes in
@@ -166,10 +194,50 @@ def get_component_templates(courselike, library=False):
"""
return {
"display_name": name,
"category": cat,
"category": category,
"boilerplate_name": boilerplate_name,
"hinted": hinted,
"tab": tab
"tab": tab,
"support_level": support_level
}
def component_support_level(editable_types, name, template=None):
"""
Returns the support level for the given xblock name/template combination.
Args:
editable_types: a QuerySet of xblocks with their support levels
name: the name of the xblock
template: optional template for the xblock
Returns:
If XBlockStudioConfigurationFlag is enabled, returns the support level
(see XBlockStudioConfiguration) or False if this xblock name/template combination
has no Studio support at all. If XBlockStudioConfigurationFlag is disabled,
simply returns True.
"""
# If the Studio support feature is disabled, return True for all.
if not XBlockStudioConfigurationFlag.is_enabled():
return True
if template is None:
template = ""
extension_index = template.rfind(".yaml")
if extension_index >= 0:
template = template[0:extension_index]
for block in editable_types:
if block.name == name and block.template == template:
return block.support_level
return False
def create_support_legend_dict():
"""
Returns a dict of settings information for the display of the support level legend.
"""
return {
"show_legend": XBlockStudioConfigurationFlag.is_enabled(),
"allow_unsupported_xblocks": allow_unsupported,
"documentation_label": _("{platform_name} Support Levels:").format(platform_name=settings.PLATFORM_NAME)
}
component_display_names = {
@@ -189,57 +257,92 @@ def get_component_templates(courselike, library=False):
if library:
component_types = [component for component in component_types if component != 'discussion']
component_types = _filter_disabled_blocks(component_types)
# Content Libraries currently don't allow opting in to unsupported xblocks/problem types.
allow_unsupported = getattr(courselike, "allow_unsupported_xblocks", False)
for category in component_types:
authorable_variations = authorable_xblocks(allow_unsupported=allow_unsupported, name=category)
support_level_without_template = component_support_level(authorable_variations, category)
templates_for_category = []
component_class = _load_mixed_class(category)
# add the default template with localized display name
# TODO: Once mixins are defined per-application, rather than per-runtime,
# this should use a cms mixed-in class. (cpennington)
display_name = xblock_type_display_name(category, _('Blank')) # this is the Blank Advanced problem
templates_for_category.append(create_template_dict(display_name, category, None, 'advanced'))
categories.add(category)
if support_level_without_template:
# add the default template with localized display name
# TODO: Once mixins are defined per-application, rather than per-runtime,
# this should use a cms mixed-in class. (cpennington)
display_name = xblock_type_display_name(category, _('Blank')) # this is the Blank Advanced problem
templates_for_category.append(
create_template_dict(display_name, category, support_level_without_template, None, 'advanced')
)
categories.add(category)
# add boilerplates
if hasattr(component_class, 'templates'):
for template in component_class.templates():
filter_templates = getattr(component_class, 'filter_templates', None)
if not filter_templates or filter_templates(template, courselike):
# Tab can be 'common' 'advanced'
# Default setting is common/advanced depending on the presence of markdown
tab = 'common'
if template['metadata'].get('markdown') is None:
tab = 'advanced'
hinted = template.get('hinted', False)
templates_for_category.append(
create_template_dict(
_(template['metadata'].get('display_name')), # pylint: disable=translation-of-non-string
category,
template.get('template_id'),
tab,
hinted,
)
template_id = template.get('template_id')
support_level_with_template = component_support_level(
authorable_variations, category, template_id
)
if support_level_with_template:
# Tab can be 'common' 'advanced'
# Default setting is common/advanced depending on the presence of markdown
tab = 'common'
if template['metadata'].get('markdown') is None:
tab = 'advanced'
hinted = template.get('hinted', False)
# Add any advanced problem types
templates_for_category.append(
create_template_dict(
_(template['metadata'].get('display_name')), # pylint: disable=translation-of-non-string
category,
support_level_with_template,
template_id,
tab,
hinted,
)
)
# Add any advanced problem types. Note that these are different xblocks being stored as Advanced Problems.
if category == 'problem':
for advanced_problem_type in ADVANCED_PROBLEM_TYPES:
disabled_block_names = [block.name for block in disabled_xblocks()]
advanced_problem_types = [advanced_problem_type for advanced_problem_type in ADVANCED_PROBLEM_TYPES
if advanced_problem_type['component'] not in disabled_block_names]
for advanced_problem_type in advanced_problem_types:
component = advanced_problem_type['component']
boilerplate_name = advanced_problem_type['boilerplate_name']
try:
component_display_name = xblock_type_display_name(component)
except PluginMissingError:
log.warning('Unable to load xblock type %s to read display_name', component, exc_info=True)
else:
templates_for_category.append(
create_template_dict(component_display_name, component, boilerplate_name, 'advanced')
)
categories.add(component)
authorable_advanced_component_variations = authorable_xblocks(
allow_unsupported=allow_unsupported, name=component
)
advanced_component_support_level = component_support_level(
authorable_advanced_component_variations, component, boilerplate_name
)
if advanced_component_support_level:
try:
component_display_name = xblock_type_display_name(component)
except PluginMissingError:
log.warning('Unable to load xblock type %s to read display_name', component, exc_info=True)
else:
templates_for_category.append(
create_template_dict(
component_display_name,
component,
advanced_component_support_level,
boilerplate_name,
'advanced'
)
)
categories.add(component)
component_templates.append({
"type": category,
"templates": templates_for_category,
"display_name": component_display_names[category]
"display_name": component_display_names[category],
"support_legend": create_support_legend_dict()
})
# Libraries do not support advanced components at this time.
@@ -251,19 +354,25 @@ def get_component_templates(courselike, library=False):
# are the names of the modules in ADVANCED_COMPONENT_TYPES that should be
# enabled for the course.
course_advanced_keys = courselike.advanced_modules
advanced_component_templates = {"type": "advanced", "templates": [], "display_name": _("Advanced")}
advanced_component_types = _advanced_component_types()
advanced_component_templates = {
"type": "advanced",
"templates": [],
"display_name": _("Advanced"),
"support_legend": create_support_legend_dict()
}
advanced_component_types = _advanced_component_types(allow_unsupported)
# Set component types according to course policy file
if isinstance(course_advanced_keys, list):
for category in course_advanced_keys:
if category in advanced_component_types and category not in categories:
if category in advanced_component_types.keys() and category not in categories:
# boilerplates not supported for advanced components
try:
component_display_name = xblock_type_display_name(category, default_display_name=category)
advanced_component_templates['templates'].append(
create_template_dict(
component_display_name,
category
category,
advanced_component_types[category]
)
)
categories.add(category)
@@ -288,6 +397,14 @@ def get_component_templates(courselike, library=False):
return component_templates
def _filter_disabled_blocks(all_blocks):
"""
Filter out disabled xblocks from the provided list of xblock names.
"""
disabled_block_names = [block.name for block in disabled_xblocks()]
return [block_name for block_name in all_blocks if block_name not in disabled_block_names]
@login_required
def _get_item_in_course(request, usage_key):
"""

View File

@@ -982,6 +982,11 @@ def create_xblock_info(xblock, data=None, metadata=None, include_ancestor_info=F
"user_partitions": get_user_partition_info(xblock, course=course),
}
if xblock.category == 'sequential':
xblock_info.update({
"hide_after_due": xblock.hide_after_due,
})
# update xblock_info with special exam information if the feature flag is enabled
if settings.FEATURES.get('ENABLE_SPECIAL_EXAMS'):
if xblock.category == 'course':
@@ -997,7 +1002,6 @@ def create_xblock_info(xblock, data=None, metadata=None, include_ancestor_info=F
"is_time_limited": xblock.is_time_limited,
"exam_review_rules": xblock.exam_review_rules,
"default_time_limit_minutes": xblock.default_time_limit_minutes,
"hide_after_due": xblock.hide_after_due,
})
# Update with gating info

View File

@@ -28,12 +28,11 @@ class ProgramAuthoringView(View):
if programs_config.is_studio_tab_enabled and request.user.is_staff:
return render_to_response('program_authoring.html', {
'show_programs_header': programs_config.is_studio_tab_enabled,
'authoring_app_config': programs_config.authoring_app_config,
'lms_base_url': '//{}/'.format(settings.LMS_BASE),
'programs_api_url': programs_config.public_api_url,
'programs_token_url': reverse('programs_id_token'),
'studio_home_url': reverse('home'),
'uses_pattern_library': True
})
else:
raise Http404

View File

@@ -24,7 +24,7 @@ from contentstore.views.item import (
)
from contentstore.tests.utils import CourseTestCase
from student.tests.factories import UserFactory
from xblock_django.models import XBlockDisableConfig
from xblock_django.models import XBlockConfiguration, XBlockStudioConfiguration, XBlockStudioConfigurationFlag
from xmodule.capa_module import CapaDescriptor
from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.django import modulestore
@@ -1217,6 +1217,7 @@ class TestEditSplitModule(ItemTest):
"""
def setUp(self):
super(TestEditSplitModule, self).setUp()
self.user = UserFactory()
self.course.user_partitions = [
UserPartition(
0, 'first_partition', 'First Partition',
@@ -1457,12 +1458,19 @@ class TestComponentTemplates(CourseTestCase):
def setUp(self):
super(TestComponentTemplates, self).setUp()
self.templates = get_component_templates(self.course)
# Advanced Module support levels.
XBlockStudioConfiguration.objects.create(name='poll', enabled=True, support_level="fs")
XBlockStudioConfiguration.objects.create(name='survey', enabled=True, support_level="ps")
XBlockStudioConfiguration.objects.create(name='annotatable', enabled=True, support_level="us")
# Basic component support levels.
XBlockStudioConfiguration.objects.create(name='html', enabled=True, support_level="fs")
XBlockStudioConfiguration.objects.create(name='discussion', enabled=True, support_level="ps")
XBlockStudioConfiguration.objects.create(name='problem', enabled=True, support_level="us")
XBlockStudioConfiguration.objects.create(name='video', enabled=True, support_level="us")
# XBlock masquerading as a problem
XBlockStudioConfiguration.objects.create(name='openassessment', enabled=True, support_level="us")
# Initialize the deprecated modules settings with empty list
XBlockDisableConfig.objects.create(
disabled_create_blocks='', enabled=True
)
self.templates = get_component_templates(self.course)
def get_templates_of_type(self, template_type):
"""
@@ -1481,12 +1489,40 @@ class TestComponentTemplates(CourseTestCase):
"""
Test the handling of the basic component templates.
"""
self.assertIsNotNone(self.get_templates_of_type('discussion'))
self.assertIsNotNone(self.get_templates_of_type('html'))
self.assertIsNotNone(self.get_templates_of_type('problem'))
self.assertIsNotNone(self.get_templates_of_type('video'))
self._verify_basic_component("discussion", "Discussion")
self._verify_basic_component("video", "Video")
self.assertGreater(self.get_templates_of_type('html'), 0)
self.assertGreater(self.get_templates_of_type('problem'), 0)
self.assertIsNone(self.get_templates_of_type('advanced'))
# Now fully disable video through XBlockConfiguration
XBlockConfiguration.objects.create(name='video', enabled=False)
self.templates = get_component_templates(self.course)
self.assertIsNone(self.get_templates_of_type('video'))
def test_basic_components_support_levels(self):
"""
Test that support levels can be set on basic component templates.
"""
XBlockStudioConfigurationFlag.objects.create(enabled=True)
self.templates = get_component_templates(self.course)
self._verify_basic_component("discussion", "Discussion", "ps")
self.assertEqual([], self.get_templates_of_type("video"))
self.assertEqual([], self.get_templates_of_type("problem"))
self.course.allow_unsupported_xblocks = True
self.templates = get_component_templates(self.course)
self._verify_basic_component("video", "Video", "us")
problem_templates = self.get_templates_of_type('problem')
problem_no_boilerplate = self.get_template(problem_templates, u'Blank Advanced Problem')
self.assertIsNotNone(problem_no_boilerplate)
self.assertEqual('us', problem_no_boilerplate['support_level'])
# Now fully disable video through XBlockConfiguration
XBlockConfiguration.objects.create(name='video', enabled=False)
self.templates = get_component_templates(self.course)
self.assertIsNone(self.get_templates_of_type('video'))
def test_advanced_components(self):
"""
Test the handling of advanced component templates.
@@ -1510,6 +1546,11 @@ class TestComponentTemplates(CourseTestCase):
self.assertNotEqual(only_template.get('category'), 'video')
self.assertNotEqual(only_template.get('category'), 'openassessment')
# Now fully disable word_cloud through XBlockConfiguration
XBlockConfiguration.objects.create(name='word_cloud', enabled=False)
self.templates = get_component_templates(self.course)
self.assertIsNone(self.get_templates_of_type('advanced'))
def test_advanced_problems(self):
"""
Test the handling of advanced problem templates.
@@ -1520,44 +1561,101 @@ class TestComponentTemplates(CourseTestCase):
self.assertEqual(circuit_template.get('category'), 'problem')
self.assertEqual(circuit_template.get('boilerplate_name'), 'circuitschematic.yaml')
@patch('django.conf.settings.DEPRECATED_ADVANCED_COMPONENT_TYPES', [])
def test_deprecated_no_advance_component_button(self):
"""
Test that there will be no `Advanced` button on unit page if units are
deprecated provided that they are the only modules in `Advanced Module List`
Test that there will be no `Advanced` button on unit page if xblocks have disabled
Studio support given that they are the only modules in `Advanced Module List`
"""
XBlockDisableConfig.objects.create(disabled_create_blocks='poll survey', enabled=True)
# Update poll and survey to have "enabled=False".
XBlockStudioConfiguration.objects.create(name='poll', enabled=False, support_level="fs")
XBlockStudioConfiguration.objects.create(name='survey', enabled=False, support_level="fs")
XBlockStudioConfigurationFlag.objects.create(enabled=True)
self.course.advanced_modules.extend(['poll', 'survey'])
templates = get_component_templates(self.course)
button_names = [template['display_name'] for template in templates]
self.assertNotIn('Advanced', button_names)
@patch('django.conf.settings.DEPRECATED_ADVANCED_COMPONENT_TYPES', [])
def test_cannot_create_deprecated_problems(self):
"""
Test that we can't create problems if they are deprecated
Test that xblocks that have Studio support disabled do not show on the "new component" menu.
"""
XBlockDisableConfig.objects.create(disabled_create_blocks='poll survey', enabled=True)
# Update poll to have "enabled=False".
XBlockStudioConfiguration.objects.create(name='poll', enabled=False, support_level="fs")
XBlockStudioConfigurationFlag.objects.create(enabled=True)
self.course.advanced_modules.extend(['annotatable', 'poll', 'survey'])
templates = get_component_templates(self.course)
button_names = [template['display_name'] for template in templates]
self.assertIn('Advanced', button_names)
self.assertEqual(len(templates[0]['templates']), 1)
template_display_names = [template['display_name'] for template in templates[0]['templates']]
self.assertEqual(template_display_names, ['Annotation'])
# Annotatable doesn't show up because it is unsupported (in test setUp).
self._verify_advanced_xblocks(['Survey'], ['ps'])
@patch('django.conf.settings.DEPRECATED_ADVANCED_COMPONENT_TYPES', ['poll'])
def test_create_non_deprecated_problems(self):
# Now enable unsupported components.
self.course.allow_unsupported_xblocks = True
self._verify_advanced_xblocks(['Annotation', 'Survey'], ['us', 'ps'])
# Now disable Annotatable completely through XBlockConfiguration
XBlockConfiguration.objects.create(name='annotatable', enabled=False)
self._verify_advanced_xblocks(['Survey'], ['ps'])
def test_create_support_level_flag_off(self):
"""
Test that we can create problems if they are not deprecated
Test that we can create any advanced xblock (that isn't completely disabled through
XBlockConfiguration) if XBlockStudioConfigurationFlag is False.
"""
XBlockStudioConfigurationFlag.objects.create(enabled=False)
self.course.advanced_modules.extend(['annotatable', 'survey'])
self._verify_advanced_xblocks(['Annotation', 'Survey'], [True, True])
def test_xblock_masquerading_as_problem(self):
"""
Test the integration of xblocks masquerading as problems.
"""
def get_openassessment():
""" Helper method to return the openassessment template from problem list """
self.templates = get_component_templates(self.course)
problem_templates = self.get_templates_of_type('problem')
return self.get_template(problem_templates, u'Peer Assessment')
def verify_openassessment_present(support_level):
""" Helper method to verify that openassessment template is present """
openassessment = get_openassessment()
self.assertIsNotNone(openassessment)
self.assertEqual(openassessment.get('category'), 'openassessment')
self.assertEqual(openassessment.get('support_level'), support_level)
verify_openassessment_present(True)
# Now enable XBlockStudioConfigurationFlag. The openassessment block is marked
# unsupported, so will no longer show up.
XBlockStudioConfigurationFlag.objects.create(enabled=True)
self.assertIsNone(get_openassessment())
# Now allow unsupported components.
self.course.allow_unsupported_xblocks = True
verify_openassessment_present('us')
# Now disable openassessment completely through XBlockConfiguration
XBlockConfiguration.objects.create(name='openassessment', enabled=False)
self.assertIsNone(get_openassessment())
def _verify_advanced_xblocks(self, expected_xblocks, expected_support_levels):
"""
Verify the names of the advanced xblocks showing in the "new component" menu.
"""
self.course.advanced_modules.extend(['annotatable', 'poll', 'survey'])
templates = get_component_templates(self.course)
button_names = [template['display_name'] for template in templates]
self.assertIn('Advanced', button_names)
self.assertEqual(len(templates[0]['templates']), 2)
self.assertEqual(len(templates[0]['templates']), len(expected_xblocks))
template_display_names = [template['display_name'] for template in templates[0]['templates']]
self.assertEqual(template_display_names, ['Annotation', 'Survey'])
self.assertEqual(template_display_names, expected_xblocks)
template_support_levels = [template['support_level'] for template in templates[0]['templates']]
self.assertEqual(template_support_levels, expected_support_levels)
def _verify_basic_component(self, component_type, display_name, support_level=True):
"""
Verify the display name and support level of basic components (that have no boilerplates).
"""
templates = self.get_templates_of_type(component_type)
self.assertEqual(1, len(templates))
self.assertEqual(display_name, templates[0]['display_name'])
self.assertEqual(support_level, templates[0]['support_level'])
@ddt.ddt

View File

@@ -2,7 +2,9 @@
Django module for Course Metadata class -- manages advanced settings and related parameters
"""
from xblock.fields import Scope
from xblock_django.models import XBlockStudioConfigurationFlag
from xmodule.modulestore.django import modulestore
from django.utils.translation import ugettext as _
from django.conf import settings
@@ -93,6 +95,11 @@ class CourseMetadata(object):
filtered_list.append('enable_ccx')
filtered_list.append('ccx_connector')
# If the XBlockStudioConfiguration table is not being used, there is no need to
# display the "Allow Unsupported XBlocks" setting.
if not XBlockStudioConfigurationFlag.is_enabled():
filtered_list.append('allow_unsupported_xblocks')
return filtered_list
@classmethod

View File

@@ -398,9 +398,6 @@ ADVANCED_SECURITY_CONFIG = ENV_TOKENS.get('ADVANCED_SECURITY_CONFIG', {})
################ ADVANCED COMPONENT/PROBLEM TYPES ###############
ADVANCED_PROBLEM_TYPES = ENV_TOKENS.get('ADVANCED_PROBLEM_TYPES', ADVANCED_PROBLEM_TYPES)
DEPRECATED_ADVANCED_COMPONENT_TYPES = ENV_TOKENS.get(
'DEPRECATED_ADVANCED_COMPONENT_TYPES', DEPRECATED_ADVANCED_COMPONENT_TYPES
)
################ VIDEO UPLOAD PIPELINE ###############

View File

@@ -555,7 +555,6 @@ from openedx.core.lib.rooted_paths import rooted_glob
PIPELINE_CSS = {
'style-vendor': {
'source_filenames': [
'js/vendor/afontgarde/afontgarde.css',
'css/vendor/normalize.css',
'css/vendor/font-awesome.css',
'css/vendor/html5-input-polyfills/number-polyfill.css',
@@ -605,12 +604,6 @@ PIPELINE_CSS = {
],
'output_filename': 'css/studio-main-v2-rtl.css',
},
'style-edx-icons': {
'source_filenames': [
'css/edx-icons.css',
],
'output_filename': 'css/edx-icons.css',
},
'style-xmodule-annotations': {
'source_filenames': [
'css/vendor/ova/annotator.css',
@@ -1132,19 +1125,6 @@ XBLOCK_SETTINGS = {
}
}
################################ XBlock Deprecation ################################
# The following settings are used for deprecating XBlocks.
# Adding components in this list will disable the creation of new problems for
# those advanced components in Studio. Existing problems will work fine
# and one can edit them in Studio.
# DEPRECATED. Please use /admin/xblock_django/xblockdisableconfig instead.
DEPRECATED_ADVANCED_COMPONENT_TYPES = []
# XBlocks can be disabled from rendering in LMS Courseware by adding them to
# /admin/xblock_django/xblockdisableconfig/.
################################ Settings for Credit Course Requirements ################################
# Initial delay used for retrying tasks.
# Additional retries use longer delays.

View File

@@ -53,7 +53,8 @@
'js/factories/settings_graders',
'js/factories/textbooks',
'js/factories/videos_index',
'js/factories/xblock_validation'
'js/factories/xblock_validation',
'js/programs/program_admin_app'
]),
/**
* By default all the configuration for optimization happens from the command

69
cms/static/cms/js/main.js Normal file
View File

@@ -0,0 +1,69 @@
(function(AjaxPrefix) {
'use strict';
define(['domReady', 'jquery', 'underscore.string', 'backbone', 'gettext',
'common/js/components/views/feedback_notification', 'coffee/src/ajax_prefix',
'jquery.cookie'],
function(domReady, $, str, Backbone, gettext, NotificationView) {
var main;
main = function() {
AjaxPrefix.addAjaxPrefix(jQuery, function() {
return $("meta[name='path_prefix']").attr('content');
});
window.CMS = window.CMS || {};
window.CMS.URL = window.CMS.URL || {};
window.onTouchBasedDevice = function() {
return navigator.userAgent.match(/iPhone|iPod|iPad|Android/i);
};
_.extend(window.CMS, Backbone.Events);
Backbone.emulateHTTP = true;
$.ajaxSetup({
headers: {
'X-CSRFToken': $.cookie('csrftoken')
},
dataType: 'json'
});
$(document).ajaxError(function(event, jqXHR, ajaxSettings) {
var message, msg;
if (ajaxSettings.notifyOnError === false) {
return;
}
if (jqXHR.responseText) {
try {
message = JSON.parse(jqXHR.responseText).error;
} catch (error) {
message = str.truncate(jqXHR.responseText, 300);
}
} else {
message = gettext('This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.'); //jshint ignore:line
}
msg = new NotificationView.Error({
'title': gettext("Studio's having trouble saving your work"),
'message': message
});
return msg.show();
});
$.postJSON = function(url, data, callback) {
if ($.isFunction(data)) {
callback = data;
data = undefined;
}
return $.ajax({
url: url,
type: 'POST',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: JSON.stringify(data),
success: callback
});
};
return domReady(function() {
if (window.onTouchBasedDevice()) {
return $('body').addClass('touch-based-device');
}
});
};
main();
return main;
});
}).call(this, AjaxPrefix); //jshint ignore:line

View File

@@ -56,6 +56,7 @@
'underscore.string': 'common/js/vendor/underscore.string',
'backbone': 'common/js/vendor/backbone',
'backbone-relational': 'js/vendor/backbone-relational.min',
'backbone.validation': 'common/js/vendor/backbone-validation-min',
'backbone.associations': 'js/vendor/backbone-associations-min',
'backbone.paginator': 'common/js/vendor/backbone.paginator',
'tinymce': 'js/vendor/tinymce/js/tinymce/tinymce.full.min',
@@ -68,9 +69,6 @@
'URI': 'js/vendor/URI.min',
'ieshim': 'js/src/ie_shim',
'tooltip_manager': 'js/src/tooltip_manager',
'modernizr': 'edx-pattern-library/js/modernizr-custom',
'afontgarde': 'edx-pattern-library/js/afontgarde',
'edxicons': 'edx-pattern-library/js/edx-icons',
'draggabilly': 'js/vendor/draggabilly',
// Files needed for Annotations feature
@@ -247,19 +245,13 @@
exports: 'XBlock',
deps: ['xblock/core']
},
'coffee/src/main': {
'cms/js/main': {
deps: ['coffee/src/ajax_prefix']
},
'js/src/logger': {
exports: 'Logger',
deps: ['coffee/src/ajax_prefix']
},
'modernizr': {
exports: 'Modernizr'
},
'afontgarde': {
exports: 'AFontGarde'
},
// the following are all needed for annotation tools
'video.dev': {

View File

@@ -38,6 +38,7 @@
'backbone': 'common/js/vendor/backbone',
'backbone.associations': 'xmodule_js/common_static/js/vendor/backbone-associations-min',
'backbone.paginator': 'common/js/vendor/backbone.paginator',
'backbone.validation': 'common/js/vendor/backbone-validation-min',
'backbone-relational': 'xmodule_js/common_static/js/vendor/backbone-relational.min',
'tinymce': 'xmodule_js/common_static/js/vendor/tinymce/js/tinymce/tinymce.full.min',
'jquery.tinymce': 'xmodule_js/common_static/js/vendor/tinymce/js/tinymce/jquery.tinymce',
@@ -53,9 +54,6 @@
'domReady': 'xmodule_js/common_static/js/vendor/domReady',
'URI': 'xmodule_js/common_static/js/vendor/URI.min',
'mock-ajax': 'xmodule_js/common_static/js/vendor/mock-ajax',
'modernizr': 'edx-pattern-library/js/modernizr-custom',
'afontgarde': 'edx-pattern-library/js/afontgarde',
'edxicons': 'edx-pattern-library/js/edx-icons',
'mathjax': '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured', // jshint ignore:line
'youtube': '//www.youtube.com/player_api?noext',
'coffee/src/ajax_prefix': 'xmodule_js/common_static/coffee/src/ajax_prefix',
@@ -199,17 +197,11 @@
'mock-ajax': {
deps: ['jquery']
},
'coffee/src/main': {
'cms/js/main': {
deps: ['coffee/src/ajax_prefix']
},
'coffee/src/ajax_prefix': {
deps: ['jquery']
},
'modernizr': {
exports: 'Modernizr'
},
'afontgarde': {
exports: 'AFontGarde'
}
}
});
@@ -217,8 +209,8 @@
jasmine.getFixtures().fixturesPath += 'coffee/fixtures';
testFiles = [
'cms/js/spec/main_spec',
'cms/js/spec/xblock/cms.runtime.v1_spec',
'coffee/spec/main_spec',
'coffee/spec/models/course_spec',
'coffee/spec/models/metadata_spec',
'coffee/spec/models/section_spec',
@@ -276,7 +268,10 @@
'js/certificates/spec/views/certificate_details_spec',
'js/certificates/spec/views/certificate_editor_spec',
'js/certificates/spec/views/certificates_list_spec',
'js/certificates/spec/views/certificate_preview_spec'
'js/certificates/spec/views/certificate_preview_spec',
'js/spec/models/auto_auth_model_spec',
'js/spec/views/programs/program_creator_spec',
'js/spec/views/programs/program_details_spec'
];
i = 0;

View File

@@ -0,0 +1,81 @@
(function(sandbox) {
'use strict';
require(["jquery", "backbone", "cms/js/main", "edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers", "jquery.cookie"],
function($, Backbone, main, AjaxHelpers) {
describe("CMS", function() {
it("should initialize URL", function() {
expect(window.CMS.URL).toBeDefined();
});
});
describe("main helper", function() {
beforeEach(function() {
this.previousAjaxSettings = $.extend(true, {}, $.ajaxSettings);
spyOn($, "cookie").and.callFake(function(param) {
if (param === "csrftoken") {
return "stubCSRFToken";
}
});
return main();
});
afterEach(function() {
$.ajaxSettings = this.previousAjaxSettings;
return $.ajaxSettings;
});
it("turn on Backbone emulateHTTP", function() {
expect(Backbone.emulateHTTP).toBeTruthy();
});
it("setup AJAX CSRF token", function() {
expect($.ajaxSettings.headers["X-CSRFToken"]).toEqual("stubCSRFToken");
});
});
describe("AJAX Errors", function() {
var server;
server = null;
beforeEach(function() {
appendSetFixtures(sandbox({
id: "page-notification"
}));
});
afterEach(function() {
return server && server.restore();
});
it("successful AJAX request does not pop an error notification", function() {
server = AjaxHelpers.server([
200, {
"Content-Type": "application/json"
}, "{}"
]);
expect($("#page-notification")).toBeEmpty();
$.ajax("/test");
expect($("#page-notification")).toBeEmpty();
server.respond();
expect($("#page-notification")).toBeEmpty();
});
it("AJAX request with error should pop an error notification", function() {
server = AjaxHelpers.server([
500, {
"Content-Type": "application/json"
}, "{}"
]);
$.ajax("/test");
server.respond();
expect($("#page-notification")).not.toBeEmpty();
expect($("#page-notification")).toContainElement('div.wrapper-notification-error');
});
it("can override AJAX request with error so it does not pop an error notification", function() {
server = AjaxHelpers.server([
500, {
"Content-Type": "application/json"
}, "{}"
]);
$.ajax({
url: "/test",
notifyOnError: false
});
server.respond();
expect($("#page-notification")).toBeEmpty();
});
});
});
}).call(this, sandbox); //jshint ignore:line

View File

@@ -34,6 +34,7 @@
'backbone': 'common/js/vendor/backbone',
'backbone.associations': 'xmodule_js/common_static/js/vendor/backbone-associations-min',
'backbone.paginator': 'common/js/vendor/backbone.paginator',
'backbone.validation': 'common/js/vendor/backbone-validation',
'tinymce': 'xmodule_js/common_static/js/vendor/tinymce/js/tinymce/tinymce.full.min',
'jquery.tinymce': 'xmodule_js/common_static/js/vendor/tinymce/js/tinymce/jquery.tinymce',
'xmodule': 'xmodule_js/src/xmodule',
@@ -42,9 +43,6 @@
'utility': 'xmodule_js/common_static/js/src/utility',
'sinon': 'xmodule_js/common_static/js/vendor/sinon-1.17.0',
'squire': 'xmodule_js/common_static/js/vendor/Squire',
'modernizr': 'edx-pattern-library/js/modernizr-custom',
'afontgarde': 'edx-pattern-library/js/afontgarde',
'edxicons': 'edx-pattern-library/js/edx-icons',
'draggabilly': 'xmodule_js/common_static/js/vendor/draggabilly',
'domReady': 'xmodule_js/common_static/js/vendor/domReady',
'URI': 'xmodule_js/common_static/js/vendor/URI.min',
@@ -174,17 +172,11 @@
exports: 'XBlock',
deps: ['xblock/core']
},
'coffee/src/main': {
'cms/js/main': {
deps: ['coffee/src/ajax_prefix']
},
'coffee/src/ajax_prefix': {
deps: ['jquery']
},
'modernizr': {
exports: 'Modernizr'
},
'afontgarde': {
exports: 'AFontGarde'
}
}
});

View File

@@ -1,60 +0,0 @@
require ["jquery", "backbone", "coffee/src/main", "edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers", "jquery.cookie"],
($, Backbone, main, AjaxHelpers) ->
describe "CMS", ->
it "should initialize URL", ->
expect(window.CMS.URL).toBeDefined()
describe "main helper", ->
beforeEach ->
@previousAjaxSettings = $.extend(true, {}, $.ajaxSettings)
spyOn($, "cookie").and.callFake(
(param) ->
if param == "csrftoken"
return "stubCSRFToken"
)
main()
afterEach ->
$.ajaxSettings = @previousAjaxSettings
it "turn on Backbone emulateHTTP", ->
expect(Backbone.emulateHTTP).toBeTruthy()
it "setup AJAX CSRF token", ->
expect($.ajaxSettings.headers["X-CSRFToken"]).toEqual("stubCSRFToken")
describe "AJAX Errors", ->
server = null
beforeEach ->
appendSetFixtures(sandbox({id: "page-notification"}))
afterEach ->
server && server.restore()
it "successful AJAX request does not pop an error notification", ->
server = AjaxHelpers.server([200, {"Content-Type": "application/json"}, "{}"])
expect($("#page-notification")).toBeEmpty()
$.ajax("/test")
expect($("#page-notification")).toBeEmpty()
server.respond()
expect($("#page-notification")).toBeEmpty()
it "AJAX request with error should pop an error notification", ->
server = AjaxHelpers.server([500, {"Content-Type": "application/json"}, "{}"])
$.ajax("/test")
server.respond()
expect($("#page-notification")).not.toBeEmpty()
expect($("#page-notification")).toContainElement('div.wrapper-notification-error')
it "can override AJAX request with error so it does not pop an error notification", ->
server = AjaxHelpers.server([500, {"Content-Type": "application/json"}, "{}"])
$.ajax
url: "/test"
notifyOnError: false
server.respond()
expect($("#page-notification")).toBeEmpty()

View File

@@ -1,4 +1,5 @@
define ["backbone", "js/models/textbook", "js/collections/textbook", "js/models/chapter", "js/collections/chapter", "coffee/src/main"],
define ["backbone", "js/models/textbook", "js/collections/textbook", "js/models/chapter", "js/collections/chapter", "cms/js/main"],
(Backbone, Textbook, TextbookSet, Chapter, ChapterSet, main) ->
describe "Textbook model", ->

View File

@@ -1,4 +1,4 @@
define ["js/models/metadata", "js/collections/metadata", "js/views/metadata", "coffee/src/main"],
define ["js/models/metadata", "js/collections/metadata", "js/views/metadata", "cms/js/main"],
(MetadataModel, MetadataCollection, MetadataView, main) ->
verifyInputType = (input, expectedType) ->
# Some browsers (e.g. FireFox) do not support the "number"

View File

@@ -1,55 +0,0 @@
define ["domReady", "jquery", "underscore.string", "backbone", "gettext",
"common/js/components/views/feedback_notification",
"coffee/src/ajax_prefix", "jquery.cookie"],
(domReady, $, str, Backbone, gettext, NotificationView) ->
main = ->
AjaxPrefix.addAjaxPrefix jQuery, ->
$("meta[name='path_prefix']").attr('content')
window.CMS = window.CMS or {}
CMS.URL = CMS.URL or {}
window.onTouchBasedDevice = ->
navigator.userAgent.match /iPhone|iPod|iPad|Android/i
_.extend CMS, Backbone.Events
Backbone.emulateHTTP = true
$.ajaxSetup
headers : { 'X-CSRFToken': $.cookie 'csrftoken' }
dataType: 'json'
$(document).ajaxError (event, jqXHR, ajaxSettings, thrownError) ->
if ajaxSettings.notifyOnError is false
return
if jqXHR.responseText
try
message = JSON.parse(jqXHR.responseText).error
catch error
message = str.truncate(jqXHR.responseText, 300)
else
message = gettext("This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.")
msg = new NotificationView.Error(
"title": gettext("Studio's having trouble saving your work")
"message": message
)
msg.show()
$.postJSON = (url, data, callback) ->
# shift arguments if data argument was omitted
if $.isFunction(data)
callback = data
data = `undefined`
$.ajax
url: url
type: "POST"
contentType: "application/json; charset=utf-8"
dataType: "json"
data: JSON.stringify(data)
success: callback
domReady ->
if onTouchBasedDevice()
$('body').addClass 'touch-based-device'
main()
return main

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="9" height="14" viewBox="0 0 9 14"><path fill="#444" d="M8.398 5.75q0 .102-.078.18L4.68 9.57q-.08.08-.18.08t-.18-.08L.677 5.93Q.6 5.852.6 5.75t.078-.18l.39-.39q.08-.08.18-.08t.18.08L4.5 8.25l3.07-3.07q.08-.08.18-.08t.18.08l.392.39q.078.078.078.18z"/></svg>

Before

Width:  |  Height:  |  Size: 302 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="14" viewBox="0 0 5 14"><path fill="#444" d="M4.898 4.25q0 .102-.078.18L1.75 7.5l3.07 3.07q.078.078.078.18t-.078.18l-.39.39q-.08.08-.18.08t-.18-.08L.427 7.68Q.35 7.602.35 7.5t.078-.18l3.64-3.64q.08-.08.18-.08t.18.08l.392.39q.078.078.078.18z"/></svg>

Before

Width:  |  Height:  |  Size: 306 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="14" viewBox="0 0 5 14"><path fill="#444" d="M4.648 7.5q0 .102-.078.18L.93 11.32q-.08.08-.18.08t-.18-.08l-.392-.39Q.1 10.852.1 10.75t.078-.18l3.07-3.07-3.07-3.07Q.1 4.352.1 4.25t.078-.18l.39-.39q.08-.08.18-.08t.18.08L4.57 7.32q.078.078.078.18z"/></svg>

Before

Width:  |  Height:  |  Size: 309 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="9" height="14" viewBox="0 0 9 14"><path fill="#444" d="M8.398 9.25q0 .102-.078.18l-.39.39q-.08.08-.18.08t-.18-.08L4.5 6.75 1.43 9.82q-.08.08-.18.08t-.18-.08l-.392-.39Q.6 9.352.6 9.25t.078-.18l3.64-3.64q.08-.08.18-.08t.18.08L8.32 9.07q.078.078.078.18z"/></svg>

Before

Width:  |  Height:  |  Size: 306 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M10.03 7.008q0-.21-.14-.352l-.71-.71q-.142-.142-.353-.142t-.352.14L6.998 7.423V3.5q0-.203-.148-.352T6.498 3h-1q-.203 0-.352.148t-.148.352v3.922L3.52 5.945q-.147-.148-.35-.148t-.353.148l-.71.71q-.142.142-.142.353t.14.352l3.54 3.54q.14.14.352.14t.352-.14l3.538-3.54q.14-.14.14-.352zM12 7q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 520 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M12.586 6.5q0 .414-.29.703L7.21 12.297q-.303.29-.71.29-.413 0-.702-.29L.71 7.203Q.415 6.923.415 6.5q0-.414.297-.71l.58-.587q.304-.29.71-.29.414 0 .703.29L5 7.5V2q0-.406.297-.703T6 1h1q.406 0 .703.297T8 2v5.5l2.297-2.297q.29-.29.703-.29.406 0 .71.29l.587.586q.29.303.29.71z"/></svg>

Before

Width:  |  Height:  |  Size: 385 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M12.586 7.586q0 .398-.29.703l-.585.584q-.295.297-.71.297-.42 0-.702-.296L8 6.584v5.5q0 .408-.293.66T7 13H6q-.414 0-.707-.254T5 12.086v-5.5l-2.297 2.29q-.28.296-.703.296t-.703-.297L.71 8.29q-.295-.3-.295-.705 0-.414.297-.71L5.8 1.788q.272-.29.702-.29.422 0 .71.29L12.3 6.873q.29.305.29.71z"/></svg>

Before

Width:  |  Height:  |  Size: 401 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M10.023 4.227L7.25 7l2.773 2.773 1.125-1.125q.227-.242.547-.11Q12 8.673 12 9v3.5q0 .203-.148.352T11.5 13H8q-.328 0-.46-.312-.134-.305.108-.54l1.125-1.124L6 8.25l-2.773 2.774 1.125 1.125q.242.233.11.538Q4.327 13 4 13H.5q-.203 0-.352-.148T0 12.5V9q0-.328.312-.46.305-.134.54.108l1.124 1.125L4.75 7 1.975 4.227.85 5.352Q.704 5.5.5 5.5q-.095 0-.188-.04Q0 5.33 0 5V1.5q0-.203.148-.352T.5 1H4q.328 0 .46.312.134.305-.108.54L3.227 2.975 6 5.75l2.773-2.774L7.648 1.85q-.242-.233-.11-.538Q7.673 1 8 1h3.5q.203 0 .352.148T12 1.5V5q0 .328-.305.46-.102.04-.195.04-.203 0-.352-.148z"/></svg>

Before

Width:  |  Height:  |  Size: 682 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M12 10.5v1q0 .203-.148.352T11.5 12H.5q-.203 0-.352-.148T0 11.5v-1q0-.203.148-.352T.5 10h11q.203 0 .352.148T12 10.5zm0-4v1q0 .203-.148.352T11.5 8H.5q-.203 0-.352-.148T0 7.5v-1q0-.203.148-.352T.5 6h11q.203 0 .352.148T12 6.5zm0-4v1q0 .203-.148.352T11.5 4H.5q-.203 0-.352-.148T0 3.5v-1q0-.203.148-.352T.5 2h11q.203 0 .352.148T12 2.5z"/></svg>

Before

Width:  |  Height:  |  Size: 442 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M12.805 3.734q.312.445.14 1.008L10.8 11.82q-.148.5-.598.84t-.957.34h-7.21q-.603 0-1.16-.418t-.778-1.027q-.187-.523-.016-.992 0-.03.023-.21t.03-.29Q.143 10 .11 9.895t-.023-.152q.016-.086.062-.164t.127-.186.13-.184q.18-.296.35-.714t.235-.715q.023-.076.004-.232t-.004-.22q.023-.085.133-.218t.133-.18q.163-.282.327-.72t.195-.703q.008-.07-.02-.25t.004-.22q.03-.1.172-.237t.172-.176q.148-.203.332-.66t.215-.754q.008-.062-.023-.2t-.016-.206q.016-.062.07-.14t.14-.18.134-.165q.062-.096.13-.24t.116-.273.125-.28.153-.25.207-.185.28-.09.372.043l-.008.023q.3-.068.4-.068h5.945q.576 0 .89.437t.14 1.016L9.57 9.53q-.28.93-.56 1.2T8.008 11h-6.79q-.21 0-.296.117-.085.125-.007.336Q1.1 12 2.038 12h7.21q.228 0 .44-.12t.272-.325l2.344-7.71q.055-.173.04-.446.296.115.46.334zm-8.313.016q-.03.102.016.176T4.664 4h4.75q.102 0 .2-.074t.128-.176l.164-.5q.03-.102-.016-.176T9.734 3h-4.75q-.102 0-.2.074t-.128.176zm-.648 2q-.03.102.016.176T4.016 6h4.75q.102 0 .2-.074t.128-.176l.164-.5q.03-.102-.016-.176T9.086 5h-4.75q-.102 0-.2.074t-.128.176z"/></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M13 5q.414 0 .707.293T14 6t-.293.707T13 7v3q0 .406-.297.703T12 11Q8.742 8.29 5.656 8.03q-.453.15-.71.517t-.243.785.312.723q-.156.258-.18.512t.047.453.262.43.375.39.48.396q-.23.453-.873.648t-1.316.09-1.03-.434q-.055-.18-.23-.684t-.25-.738-.18-.695-.117-.79.027-.77T2.203 8H1.25q-.516 0-.883-.365T0 6.75v-1.5q0-.515.367-.882T1.25 4H5q3.398 0 7-3 .406 0 .703.298T13 2v3zm-1 4.72V2.265q-3.078 2.36-6 2.68v2.11q2.945.327 6 2.663z"/></svg>

Before

Width:  |  Height:  |  Size: 537 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M1 13h2.25v-2.25H1V13zm2.75 0h2.5v-2.25h-2.5V13zM1 10.25h2.25v-2.5H1v2.5zm2.75 0h2.5v-2.5h-2.5v2.5zM1 7.25h2.25V5H1v2.25zM6.75 13h2.5v-2.25h-2.5V13zm-3-5.75h2.5V5h-2.5v2.25zm6 5.75H12v-2.25H9.75V13zm-3-2.75h2.5v-2.5h-2.5v2.5zM4 3.5V1.25q0-.102-.074-.176T3.75 1h-.5q-.102 0-.176.074T3 1.25V3.5q0 .102.074.176t.176.074h.5q.102 0 .176-.074T4 3.5zm5.75 6.75H12v-2.5H9.75v2.5zm-3-3h2.5V5h-2.5v2.25zm3 0H12V5H9.75v2.25zM10 3.5V1.25q0-.102-.074-.176T9.75 1h-.5q-.102 0-.176.074T9 1.25V3.5q0 .102.074.176t.176.074h.5q.102 0 .176-.074T10 3.5zm3-.5v10q0 .406-.297.703T12 14H1q-.406 0-.703-.297T0 13V3q0-.406.297-.703T1 2h1v-.75q0-.516.367-.883T3.25 0h.5q.516 0 .883.367T5 1.25V2h3v-.75q0-.516.367-.883T9.25 0h.5q.516 0 .883.367T11 1.25V2h1q.406 0 .703.297T13 3z"/></svg>

Before

Width:  |  Height:  |  Size: 864 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="14" viewBox="0 0 15 14"><path fill="#444" d="M7.5 5.25q.93 0 1.59.66t.66 1.59-.66 1.59-1.59.66-1.59-.66-.66-1.59.66-1.59 1.59-.66zM13 2q.828 0 1.414.586T15 4v7q0 .828-.586 1.414T13 13H2q-.828 0-1.414-.586T0 11V4q0-.828.586-1.414T2 2h1.75L4.148.938q.148-.383.543-.66T5.5 0h4q.414 0 .81.278t.542.66L11.25 2H13zm-5.5 9q1.445 0 2.473-1.027T11 7.5 9.973 5.027 7.5 4 5.027 5.027 4 7.5t1.027 2.473T7.5 11z"/></svg>

Before

Width:  |  Height:  |  Size: 466 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="14" viewBox="0 0 8 14"><path fill="#444" d="M8 5.5q0 .203-.148.352l-3.5 3.5Q4.204 9.5 4 9.5t-.352-.148l-3.5-3.5Q0 5.704 0 5.5t.148-.352T.5 5h7q.203 0 .352.148T8 5.5z"/></svg>

Before

Width:  |  Height:  |  Size: 232 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="14" viewBox="0 0 5 14"><path fill="#444" d="M5 3.5v7q0 .203-.148.352T4.5 11t-.352-.148l-3.5-3.5Q.5 7.204.5 7t.148-.352l3.5-3.5Q4.296 3 4.5 3t.352.148T5 3.5z"/></svg>

Before

Width:  |  Height:  |  Size: 223 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="14" viewBox="0 0 5 14"><path fill="#444" d="M4.5 7q0 .203-.148.352l-3.5 3.5Q.704 11 .5 11t-.352-.148T0 10.5v-7q0-.203.148-.352T.5 3t.352.148l3.5 3.5Q4.5 6.796 4.5 7z"/></svg>

Before

Width:  |  Height:  |  Size: 232 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="14" viewBox="0 0 8 14"><path fill="#444" d="M8 9.5q0 .203-.148.352T7.5 10h-7q-.203 0-.352-.148T0 9.5t.148-.352l3.5-3.5Q3.796 5.5 4 5.5t.352.148l3.5 3.5Q8 9.296 8 9.5z"/></svg>

Before

Width:  |  Height:  |  Size: 233 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 16 14"><path fill="#444" d="M6.133 7.875H7.75q-.11 1.234-.77 1.94t-1.676.708q-1.266 0-1.988-.906t-.723-2.47q0-1.515.727-2.433t1.82-.918q1.156 0 1.812.68t.758 1.93H6.124q-.04-.5-.277-.773T5.21 5.36q-.445 0-.69.473T4.272 7.22q0 .375.04.656t.14.543.312.4.516.14q.743 0 .853-1.085zm5.562 0h1.61q-.11 1.234-.767 1.94t-1.672.708q-1.266 0-1.988-.906t-.723-2.47q0-1.515.727-2.433t1.82-.918q1.156 0 1.812.68t.758 1.93h-1.594q-.03-.5-.273-.773t-.633-.273q-.445 0-.69.473T9.834 7.22q0 .375.04.656t.14.543.31.4.51.14q.384 0 .6-.296t.26-.79zm2.805-.93q0-1.617-.12-2.398t-.474-1.258q-.047-.064-.105-.11t-.166-.118-.125-.086q-.673-.492-5.446-.492-4.883 0-5.547.492-.04.03-.137.09t-.165.11-.113.112q-.352.468-.47 1.245t-.116 2.41q0 1.625.117 2.402t.47 1.254q.046.062.116.117t.16.11.135.093q.344.26 1.87.384t3.677.125q4.766 0 5.445-.51.04-.03.133-.086t.16-.11.106-.124q.36-.468.477-1.24t.117-2.415zM16 1v12H0V1h16z"/></svg>

Before

Width:  |  Height:  |  Size: 982 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M3.43 9.93l-2 2q-.078.07-.18.07-.094 0-.18-.07-.07-.078-.07-.18t.07-.18l2-2q.078-.07.18-.07t.18.07q.07.078.07.18t-.07.18zm1.32.32v2.5q0 .11-.07.18T4.5 13t-.18-.07-.07-.18v-2.5q0-.11.07-.18T4.5 10t.18.07.07.18zM3 8.5q0 .11-.07.18t-.18.07H.25q-.11 0-.18-.07T0 8.5t.07-.18.18-.07h2.5q.11 0 .18.07T3 8.5zm9.875 1q0 .937-.664 1.586l-1.146 1.14q-.648.65-1.586.65-.945 0-1.594-.665l-2.61-2.615q-.163-.164-.327-.438l1.867-.14 2.133 2.14q.21.21.53.215t.532-.206l1.147-1.14q.22-.22.22-.524 0-.312-.22-.53l-2.14-2.15.14-1.866q.273.164.438.328L12.22 7.91q.655.67.655 1.593zm-4.82-5.656l-1.867.14-2.133-2.14q-.22-.22-.53-.22-.306 0-.532.212l-1.148 1.14q-.22.22-.22.524 0 .312.22.53l2.14 2.142-.14 1.875q-.273-.164-.438-.328L.782 5.092Q.126 4.423.126 3.5q0-.937.664-1.586L1.938.774q.648-.65 1.586-.65.945 0 1.594.665l2.61 2.615q.163.164.327.438zM13 4.5q0 .11-.07.18t-.18.07h-2.5q-.11 0-.18-.07T10 4.5t.07-.18.18-.07h2.5q.11 0 .18.07t.07.18zM8.75.25v2.5q0 .11-.07.18T8.5 3t-.18-.07-.07-.18V.25q0-.11.07-.18T8.5 0t.18.07.07.18zm3.18 1.18l-2 2q-.086.07-.18.07t-.18-.07q-.07-.078-.07-.18t.07-.18l2-2q.078-.07.18-.07t.18.07q.07.078.07.18t-.07.18z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M11.375 9.5q0-.312-.22-.53L9.532 7.343q-.218-.22-.53-.22-.328 0-.563.25l.147.146.168.167.117.148.102.2L9 8.25q0 .312-.22.53T8.25 9q-.118 0-.216-.027t-.2-.102-.147-.115-.168-.168-.147-.148q-.258.24-.258.57 0 .31.22.53l1.608 1.617q.21.21.53.21.313 0 .532-.202l1.148-1.14q.22-.22.22-.524zM5.883 3.992q0-.312-.22-.53l-1.607-1.62q-.22-.22-.53-.22-.306 0-.532.213l-1.148 1.14q-.22.22-.22.524 0 .31.22.53L3.47 5.656q.21.21.53.21.33 0 .564-.24l-.148-.146-.168-.167-.117-.148-.1-.2L4 4.75q0-.312.22-.53T4.75 4q.117 0 .215.027t.2.102.147.115.168.168.145.148q.258-.24.258-.57zM12.875 9.5q0 .937-.664 1.586l-1.146 1.14q-.648.65-1.586.65-.945 0-1.594-.665l-1.61-1.615q-.647-.648-.647-1.586 0-.96.688-1.634l-.688-.688q-.672.688-1.625.688-.936 0-1.593-.656L.78 5.093Q.126 4.438.126 3.5T.79 1.914L1.938.774q.648-.65 1.586-.65.945 0 1.594.665l1.61 1.615q.647.648.647 1.586 0 .96-.688 1.634l.688.688Q8.047 5.625 9 5.625q.937 0 1.594.656l1.625 1.627q.654.656.654 1.594z"/></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M11 7.266V9.75q0 .93-.66 1.59T8.75 12h-6.5q-.93 0-1.59-.66T0 9.75v-6.5q0-.93.66-1.59T2.25 1h6.5q.492 0 .914.195.117.055.14.18.024.133-.07.227l-.382.383q-.078.078-.18.078-.023 0-.07-.016Q8.922 2 8.75 2h-6.5q-.516 0-.883.367T1 3.25v6.5q0 .516.367.883T2.25 11h6.5q.516 0 .883-.367T10 9.75V7.766q0-.102.07-.172l.5-.5q.078-.078.18-.078.047 0 .094.023.156.06.156.225zm1.805-3.82l-6.36 6.358Q6.26 9.99 6 9.99t-.443-.185l-3.36-3.36Q2.01 6.26 2.01 6t.187-.445l.86-.86q.186-.186.444-.186t.447.185L6 6.75l5.056-5.054q.187-.187.445-.187t.447.185l.86.86q.186.186.186.444t-.187.444z"/></svg>

Before

Width:  |  Height:  |  Size: 681 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M5.352 10.148L10.15 5.35q.147-.147.147-.35t-.148-.353l-.8-.797q-.146-.148-.35-.148t-.352.148L5 7.498 3.352 5.85Q3.204 5.702 3 5.702t-.352.148l-.797.797q-.146.148-.146.352t.148.35l2.798 2.8q.148.148.352.148t.352-.148zM12 3.25v7.5q0 .93-.66 1.59T9.75 13h-7.5q-.93 0-1.59-.66T0 10.75v-7.5q0-.93.66-1.59T2.25 1h7.5q.93 0 1.59.66T12 3.25z"/></svg>

Before

Width:  |  Height:  |  Size: 446 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M13.055 4.422q0 .312-.22.53l-6.718 6.72q-.22.22-.53.22t-.532-.22l-3.89-3.89q-.22-.22-.22-.532t.22-.53l1.06-1.063q.22-.22.532-.22t.53.22l2.298 2.305L10.71 2.83q.22-.22.53-.22t.532.22l1.062 1.06q.22.22.22.532z"/></svg>

Before

Width:  |  Height:  |  Size: 320 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="14" viewBox="0 0 10 14"><path fill="#444" d="M9.148 2.352L5 6.5l4.148 4.148q.148.148.148.352t-.148.352L7.85 12.65q-.147.147-.35.147t-.353-.148L1.35 6.85q-.148-.148-.148-.352t.148-.352L7.147.35Q7.295.204 7.5.204t.35.148L9.15 1.65q.148.148.148.352t-.148.352z"/></svg>

Before

Width:  |  Height:  |  Size: 324 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="14" viewBox="0 0 10 14"><path fill="#444" d="M8.648 6.852L2.85 12.65q-.147.147-.35.147t-.353-.148L.85 11.35Q.702 11.204.702 11t.148-.352L4.998 6.5.85 2.352Q.702 2.204.702 2t.148-.352L2.147.35Q2.295.204 2.5.204t.35.148L8.65 6.15q.148.148.148.352t-.148.352z"/></svg>

Before

Width:  |  Height:  |  Size: 323 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M6 2.75q-1.156 0-2.133.57T2.32 4.867 1.75 7t.57 2.133 1.547 1.547T6 11.25t2.133-.57T9.68 9.133 10.25 7t-.57-2.133T8.133 3.32 6 2.75zM12 7q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 372 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M6 2q-1.016 0-1.94.398T2.464 3.464 1.4 5.058 1 6.998t.4 1.942 1.065 1.594T4.06 11.6t1.94.398 1.94-.398 1.595-1.066T10.6 8.94 11 7t-.4-1.942-1.065-1.594T7.94 2.398 6 2zm6 5q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 406 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M12 7q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 240 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M7 4.25v3.5q0 .11-.07.18T6.75 8h-2.5q-.11 0-.18-.07T4 7.75v-.5q0-.11.07-.18T4.25 7H6V4.25q0-.11.07-.18T6.25 4h.5q.11 0 .18.07t.07.18zM10.25 7q0-1.156-.57-2.133T8.133 3.32 6 2.75t-2.133.57T2.32 4.867 1.75 7t.57 2.133 1.547 1.547T6 11.25t2.133-.57T9.68 9.133 10.25 7zM12 7q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 505 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="14" viewBox="0 0 11 14"><path fill="#444" d="M10.14 10.328q0 .312-.218.53L8.86 11.922q-.22.22-.53.22t-.532-.22L5.5 9.625 3.205 11.92q-.22.22-.53.22t-.532-.22L1.08 10.86q-.22-.22-.22-.532t.22-.53L3.377 7.5 1.08 5.203q-.22-.22-.22-.53t.22-.532l1.062-1.06q.22-.22.53-.22t.532.22L5.5 5.375 7.8 3.08q.22-.22.53-.22t.532.22l1.062 1.06q.22.22.22.532t-.22.53L7.625 7.5l2.297 2.297q.22.22.22.53z"/></svg>

Before

Width:  |  Height:  |  Size: 454 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M8 7q0-.828-.586-1.414T6 5t-1.414.586T4 7t.586 1.414T6 9t1.414-.586T8 7zm4-.852v1.734q0 .094-.062.18t-.156.102l-1.445.22q-.148.42-.305.71.273.39.836 1.078.078.094.078.195t-.07.18q-.21.29-.773.844t-.734.557q-.096 0-.205-.07l-1.078-.844q-.344.18-.71.297-.126 1.06-.228 1.452-.056.22-.28.22H5.133q-.11 0-.19-.067t-.09-.168l-.22-1.438q-.383-.127-.703-.29l-1.1.835q-.08.07-.196.07-.11 0-.195-.086-.985-.89-1.29-1.314-.055-.078-.055-.18 0-.094.062-.18.117-.164.398-.52t.422-.55q-.21-.392-.32-.774l-1.43-.21q-.102-.017-.164-.1t-.06-.182V6.116q0-.094.06-.18t.15-.102l1.452-.22q.11-.358.305-.718-.312-.445-.836-1.078-.078-.094-.078-.187 0-.076.07-.18.203-.28.77-.84t.738-.557q.102 0 .203.078l1.078.837q.344-.18.71-.297.126-1.063.228-1.454.055-.22.28-.22H6.87q.11 0 .19.067t.09.168l.22 1.44q.383.125.703.29l1.11-.837q.07-.07.187-.07.102 0 .195.078 1.008.93 1.29 1.33.054.06.054.17 0 .095-.063.18-.117.165-.398.52t-.423.55q.203.393.32.768l1.43.22q.102.015.164.097t.063.184z"/></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M14 7q0 1.36-.937 2.512t-2.547 1.82T7 12q-.547 0-1.133-.062-1.547 1.367-3.594 1.89-.383.11-.89.173-.134.018-.24-.07t-.136-.225v-.008q-.023-.03-.004-.094t.016-.078.033-.074l.047-.07.056-.065.062-.07q.055-.062.242-.27t.27-.297.242-.31.254-.397.21-.46.204-.594Q1.413 10.22.706 9.196T0 7q0-1.015.554-1.94t1.492-1.598T4.28 2.396 7 2q1.905 0 3.515.67t2.547 1.82T14 7z"/></svg>

Before

Width:  |  Height:  |  Size: 474 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M11 6q0 1.086-.734 2.008T8.262 9.465 5.5 10q-.672 0-1.375-.125-.97.688-2.172 1-.28.07-.672.125h-.02q-.086 0-.16-.062t-.09-.164Q1 10.75 1 10.724t.004-.052.016-.047l.02-.04.027-.042.03-.04.036-.038.03-.035q.04-.047.18-.195t.204-.23.176-.227.195-.3.16-.345Q1.108 8.57.555 7.75T0 6q0-1.086.734-2.008t2.004-1.457T5.5 2t2.762.535 2.004 1.457T11 6zm3 2q0 .937-.555 1.754t-1.523 1.38q.078.186.16.343t.195.3.176.228.203.23.18.195l.03.035.036.04.03.038.028.043.02.04.016.046.004.05-.008.052q-.023.11-.102.172t-.172.055q-.39-.053-.672-.123-1.203-.312-2.172-1Q9.17 12 8.5 12q-2.12 0-3.69-1.03.453.03.688.03 1.258 0 2.414-.35t2.062-1.01q.977-.718 1.5-1.655T12 6q0-.6-.18-1.186 1.007.555 1.593 1.39t.587 1.8z"/></svg>

Before

Width:  |  Height:  |  Size: 807 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M6 7.5V11q0 .203-.148.352T5.5 11.5t-.352-.148l-1.125-1.125L1.43 12.82q-.08.08-.18.08t-.18-.08l-.892-.89Q.1 11.852.1 11.75t.078-.18l2.594-2.594L1.647 7.85Q1.5 7.704 1.5 7.5t.147-.353T2 7h3.5q.202 0 .35.147T6 7.5zm5.898-5.25q0 .102-.078.18L9.226 5.024 10.35 6.15q.15.147.15.35t-.15.353T10 7H6.5q-.204 0-.353-.147T6 6.5V3q0-.202.147-.35T6.5 2.5t.35.15l1.126 1.124L10.57 1.18q.078-.078.18-.078t.18.078l.89.89q.08.08.08.18z"/></svg>

Before

Width:  |  Height:  |  Size: 531 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M13.25 3q.312 0 .53.22t.22.53v9.5q0 .312-.22.53t-.53.22h-7.5q-.312 0-.53-.22T5 13.25V11H.75q-.312 0-.53-.22T0 10.25V5q0-.312.156-.688t.375-.594L3.72.53q.218-.22.593-.375T5 0h3.25q.313 0 .532.218t.22.53v2.564Q9.53 3 10 3h3.25zM9 4.664L6.664 7H9V4.664zm-5-3L1.664 4H4V1.664zM5.53 6.72L8 4.25V1H5v3.25q0 .312-.22.53T4.25 5H1v5h4V8q0-.312.156-.688t.375-.594zM13 13V4h-3v3.25q0 .312-.22.53T9.25 8H6v5h7z"/></svg>

Before

Width:  |  Height:  |  Size: 511 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M8 7q0 .828-.586 1.414T6 9t-1.414-.586T4 7t.586-1.414T6 5t1.414.586T8 7zM6 2.75q-1.156 0-2.133.57T2.32 4.867 1.75 7t.57 2.133 1.547 1.547T6 11.25t2.133-.57T9.68 9.133 10.25 7t-.57-2.133T8.133 3.32 6 2.75zM12 7q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 444 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M6.938 9.25l.906-.906-1.187-1.187-.906.906V8.5h.75v.75h.44zm3.437-5.625q-.125-.125-.258.008L7.383 6.367q-.133.133-.008.258t.258-.008l2.734-2.734q.133-.133.008-.258zM11 8.265V9.75q0 .93-.66 1.59T8.75 12h-6.5q-.93 0-1.59-.66T0 9.75v-6.5q0-.93.66-1.59T2.25 1h6.5q.492 0 .914.195.117.055.14.18.024.133-.07.227l-.382.383q-.11.11-.25.062Q8.922 2 8.75 2h-6.5q-.516 0-.883.367T1 3.25v6.5q0 .516.367.883T2.25 11h6.5q.516 0 .883-.367T10 9.75v-.984q0-.102.07-.172l.5-.5q.117-.117.273-.055t.156.226zM10.25 2.5l2.25 2.25L7.25 10H5V7.75zm3.47 1.03l-.72.72L10.75 2l.72-.72q.218-.218.53-.218t.53.22l1.188 1.186q.22.22.22.53t-.22.532z"/></svg>

Before

Width:  |  Height:  |  Size: 730 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="14" viewBox="0 0 11 14"><path fill="#444" d="M3 5.75v1.5q0 .312-.22.53T2.25 8H.75q-.312 0-.53-.22T0 7.25v-1.5q0-.312.22-.53T.75 5h1.5q.312 0 .53.22t.22.53zm4 0v1.5q0 .312-.22.53T6.25 8h-1.5q-.312 0-.53-.22T4 7.25v-1.5q0-.312.22-.53T4.75 5h1.5q.312 0 .53.22t.22.53zm4 0v1.5q0 .312-.22.53t-.53.22h-1.5q-.312 0-.53-.22T8 7.25v-1.5q0-.312.22-.53T8.75 5h1.5q.312 0 .53.22t.22.53z"/></svg>

Before

Width:  |  Height:  |  Size: 442 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M13 11.75v-6q-.25.28-.54.516-2.093 1.61-3.327 2.64-.398.337-.648.524t-.676.38-.803.19H6.99q-.374 0-.8-.19t-.676-.38-.648-.523q-1.234-1.03-3.328-2.64Q1.25 6.03 1 5.75v6q0 .102.074.176T1.25 12h11.5q.102 0 .176-.074T13 11.75zm0-8.21v-.192l-.004-.102-.023-.098-.043-.07-.07-.06-.11-.02H1.25q-.1 0-.175.075T1 3.25q0 1.31 1.15 2.218 1.506 1.187 3.13 2.477.047.04.273.23t.36.293.347.246.395.215.336.07h.017q.155 0 .335-.07t.395-.217.348-.246.36-.293.272-.23q1.625-1.29 3.133-2.477.422-.336.785-.902T13 3.54zm1-.29v8.5q0 .516-.367.883T12.75 13H1.25q-.516 0-.883-.367T0 11.75v-8.5q0-.516.367-.883T1.25 2h11.5q.516 0 .883.367T14 3.25z"/></svg>

Before

Width:  |  Height:  |  Size: 737 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M14 5.547v6.203q0 .516-.367.883T12.75 13H1.25q-.516 0-.883-.367T0 11.75V5.547q.344.383.79.68Q3.616 8.15 4.67 8.922q.445.328.723.512t.738.375.86.19h.015q.398 0 .86-.19t.737-.376.723-.512q1.328-.96 3.89-2.695.446-.305.782-.68zm0-2.297q0 .617-.383 1.18t-.953.96L9.008 7.93q-.078.055-.332.238t-.422.297-.406.254-.45.21-.39.07h-.016q-.18 0-.39-.07t-.45-.21-.406-.255-.422-.297-.332-.238q-.71-.5-2.047-1.426T1.343 5.39Q.86 5.064.43 4.49T0 3.422q0-.61.323-1.016T1.25 2h11.5q.507 0 .878.368t.37.883z"/></svg>

Before

Width:  |  Height:  |  Size: 604 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M6 1q1.633 0 3.012.805t2.184 2.184T12 7t-.804 3.013-2.184 2.184T6 13.002t-3.012-.805-2.184-2.184T0 7t.804-3.01 2.184-2.185T6 1zm1 9.742V9.258q0-.11-.07-.184T6.758 9h-1.5q-.102 0-.18.078T5 9.258v1.484q0 .102.078.18t.18.078h1.5q.102 0 .172-.074t.07-.184zm-.016-2.687l.14-4.852q0-.094-.077-.14Q6.97 3 6.86 3H5.14q-.108 0-.186.062-.078.047-.078.14l.133 4.853q0 .078.077.137t.187.06H6.72q.108 0 .183-.06t.082-.137z"/></svg>

Before

Width:  |  Height:  |  Size: 522 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M8 10.742V9.258q0-.11-.074-.184T7.75 9h-1.5q-.102 0-.176.074T6 9.258v1.484q0 .11.074.184T6.25 11h1.5q.102 0 .176-.074T8 10.742zM7.984 7.82l.14-3.586q0-.094-.077-.148Q7.945 4 7.86 4H6.14q-.085 0-.186.086-.078.055-.078.164l.133 3.57q0 .078.076.13t.187.05H7.72q.108 0 .183-.05t.082-.13zM7.874.523l6 11q.274.492-.015.984-.135.227-.365.36T13 13H1q-.266 0-.496-.135t-.363-.36q-.287-.49-.014-.983l6-11Q6.258.28 6.492.14T7 0t.508.14.367.383z"/></svg>

Before

Width:  |  Height:  |  Size: 546 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M11 7.25v2.5q0 .93-.66 1.59T8.75 12h-6.5q-.93 0-1.59-.66T0 9.75v-6.5q0-.93.66-1.59T2.25 1h5.5q.11 0 .18.07t.07.18v.5q0 .11-.07.18T7.75 2h-5.5q-.516 0-.883.367T1 3.25v6.5q0 .516.367.883T2.25 11h6.5q.516 0 .883-.367T10 9.75v-2.5q0-.11.07-.18t.18-.07h.5q.11 0 .18.07t.07.18zM14 .5v4q0 .203-.148.352T13.5 5t-.352-.148l-1.375-1.375L6.68 8.57q-.08.08-.18.08t-.18-.08l-.892-.89q-.078-.078-.078-.18t.078-.18l5.094-5.094L9.147.85Q9 .704 9 .5t.147-.353T9.5 0h4q.202 0 .35.147T14 .5z"/></svg>

Before

Width:  |  Height:  |  Size: 585 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M4.336 10.43l.61-1.102q-.68-.492-1.063-1.242T3.5 6.5q0-.945.477-1.758Q2.187 5.656 1 7.5q1.305 2.016 3.336 2.93zm3.04-5.93q0-.156-.11-.266T7 4.124q-.977 0-1.676.7t-.7 1.676q0 .156.11.266t.266.11.266-.11.11-.266q0-.672.476-1.148T7 4.875q.156 0 .266-.11t.11-.265zm2.835-1.492q0 .055-.007.07-.82 1.47-2.46 4.422t-2.47 4.43l-.383.695q-.078.125-.22.125-.093 0-1.046-.547-.125-.078-.125-.22 0-.093.343-.68-1.117-.507-2.06-1.35T.156 8.037Q0 7.796 0 7.498t.155-.538q1.195-1.836 2.97-2.898T6.998 3q.694 0 1.405.133l.422-.758q.078-.125.22-.125.038 0 .14.047t.242.12.257.146.246.145.152.09q.125.078.125.21zM10.5 6.5q0 1.086-.617 1.98T8.25 9.765l2.188-3.922q.062.352.062.656zm3.5 1q0 .273-.156.54-.305.5-.852 1.132-1.172 1.344-2.715 2.086T7 12l.578-1.03q1.656-.142 3.066-1.07T13 7.5q-.9-1.397-2.204-2.296l.492-.875q.742.5 1.426 1.194t1.13 1.438q.155.266.155.54z"/></svg>

Before

Width:  |  Height:  |  Size: 961 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M13 7.5q-1.187-1.844-2.977-2.758.477.813.477 1.758 0 1.445-1.027 2.473T7 10 4.527 8.973 3.5 6.5q0-.945.477-1.758Q2.187 5.656 1 7.5q1.04 1.602 2.605 2.55T7 11t3.395-.95T13 7.5zm-5.625-3q0-.156-.11-.266T7 4.124q-.977 0-1.676.7t-.7 1.676q0 .156.11.266t.266.11.266-.11.11-.266q0-.672.476-1.148T7 4.875q.156 0 .266-.11t.11-.265zM14 7.5q0 .266-.156.54-1.094 1.796-2.94 2.878T7 12t-3.9-1.086T.157 8.04Q.002 7.765.002 7.5t.156-.54q1.094-1.788 2.94-2.874T7.002 3t3.903 1.086 2.94 2.875q.157.274.157.54z"/></svg>

Before

Width:  |  Height:  |  Size: 606 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M9.75 1q.93 0 1.59.66T12 3.25v7.5q0 .93-.66 1.59T9.75 13H8.28V8.352h1.556l.234-1.812H8.28V5.384q0-.438.185-.656t.715-.22l.953-.007V2.885q-.492-.07-1.39-.07-1.063 0-1.7.625t-.637 1.765V6.54H4.843v1.813h1.563V13H2.25q-.93 0-1.59-.66T0 10.75v-7.5q0-.93.66-1.59T2.25 1h7.5z"/></svg>

Before

Width:  |  Height:  |  Size: 382 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M13.648 1.102q.148-.148.25-.102t.102.25v11.5q0 .203-.102.25t-.25-.102L8.1 7.35q-.07-.07-.1-.147v5.547q0 .203-.103.25t-.25-.102L2.1 7.35q-.07-.07-.102-.147V12.5q0 .203-.148.352T1.498 13h-1q-.203 0-.352-.148t-.148-.352v-11q0-.203.148-.352T.498 1h1q.203 0 .352.148t.148.352v5.297q.03-.086.102-.148L7.647 1.1q.148-.148.25-.102T8 1.25v5.547q.03-.086.1-.148z"/></svg>

Before

Width:  |  Height:  |  Size: 465 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M.352 12.898q-.148.148-.25.102T0 12.75V1.25Q0 1.047.102 1t.25.102L5.9 6.65q.06.06.1.147V1.25q0-.203.103-.25t.25.102L11.9 6.65q.062.06.102.147V1.5q0-.203.148-.352T12.502 1h1q.203 0 .352.148t.148.352v11q0 .203-.148.352t-.352.148h-1q-.203 0-.352-.148t-.148-.352V7.203q-.04.078-.102.148L6.353 12.9q-.148.148-.25.102T6 12.75V7.203q-.038.078-.1.148z"/></svg>

Before

Width:  |  Height:  |  Size: 456 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M11.47 2.97q.218.218.374.593T12 4.25v9q0 .313-.22.532t-.53.22H.75q-.312 0-.53-.22t-.22-.53V.75Q0 .438.22.22T.75 0h7q.312 0 .688.157t.594.375zM8 1.06V4h2.937q-.078-.228-.172-.32L8.32 1.233Q8.226 1.14 8 1.062zM11 13V5H7.75q-.312 0-.53-.22T7 4.25V1H1v12h10z"/></svg>

Before

Width:  |  Height:  |  Size: 367 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M8 4V.313q.172.11.28.22l3.19 3.187q.108.11.218.28H8zm-1 .25q0 .312.22.53t.53.22H12v8.25q0 .312-.22.53t-.53.22H.75q-.312 0-.53-.22T0 13.25V.75Q0 .438.22.22T.75 0H7v4.25z"/></svg>

Before

Width:  |  Height:  |  Size: 281 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="14" viewBox="0 0 11 14"><path fill="#444" d="M10.96 2.305q.134.32-.108.547L7 6.704V12.5q0 .33-.305.462-.102.04-.195.04-.21 0-.352-.15l-2-2Q4 10.706 4 10.502v-3.8L.148 2.853q-.242-.227-.11-.547Q.173 2 .5 2h10q.328 0 .46.305z"/></svg>

Before

Width:  |  Height:  |  Size: 291 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M2.5 2q0 .563-.5.86v9.89q0 .102-.074.176T1.75 13h-.5q-.102 0-.176-.074T1 12.75V2.86Q.5 2.56.5 2q0-.414.293-.707T1.5 1t.707.293T2.5 2zm11.5.5v5.96q0 .196-.098.302t-.31.215q-1.68.906-2.882.906-.477 0-.965-.172t-.848-.373-.902-.375-1.113-.17q-1.5 0-3.625 1.14Q3.124 10 3 10q-.204 0-.353-.148T2.5 9.5V3.703q0-.25.24-.43.165-.11.618-.336Q5.202 2 6.648 2q.835 0 1.562.227t1.71.688q.298.148.69.148.42 0 .917-.164t.86-.37.687-.366T13.5 2q.203 0 .352.15T14 2.5z"/></svg>

Before

Width:  |  Height:  |  Size: 565 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M11 7.75v3.75q0 .203-.148.352T10.5 12h-3V9h-2v3h-3q-.203 0-.352-.148T2 11.5V7.75q0-.008.004-.023t.004-.023L6.5 4l4.492 3.704Q11 7.72 11 7.75zm1.742-.54l-.484.58q-.062.07-.164.085h-.023q-.1 0-.162-.055L6.5 3.312 1.096 7.82Q1 7.882.908 7.875.806 7.86.744 7.79L.26 7.21q-.062-.077-.055-.183T.29 6.86l5.62-4.68q.25-.204.594-.204t.594.203L9.004 3.77V2.25q0-.11.07-.18t.18-.07h1.5q.11 0 .18.07t.07.18v3.188l1.71 1.422q.08.062.087.168t-.055.184z"/></svg>

Before

Width:  |  Height:  |  Size: 551 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M8 10.75V9.5q0-.11-.07-.18t-.18-.07H7v-4q0-.11-.07-.18T6.75 5h-2.5q-.11 0-.18.07T4 5.25V6.5q0 .11.07.18t.18.07H5v2.5h-.75q-.11 0-.18.07T4 9.5v1.25q0 .11.07.18t.18.07h3.5q.11 0 .18-.07t.07-.18zm-1-7V2.5q0-.11-.07-.18t-.18-.07h-1.5q-.11 0-.18.07T5 2.5v1.25q0 .11.07.18t.18.07h1.5q.11 0 .18-.07T7 3.75zM12 7q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 539 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="14" viewBox="0 0 12 14"><path fill="#444" d="M1.852 11.047h1.805V5.625H1.852v5.422zm1.92-7.094q-.007-.406-.28-.672t-.727-.264-.738.266-.285.673q0 .398.277.668t.72.27h.01q.46 0 .74-.27t.28-.667zm4.572 7.094h1.805v-3.11q0-1.202-.57-1.82T8.07 5.5q-1.06 0-1.633.916h.016v-.79H4.65q.022.517 0 5.423h1.804V8.02q0-.3.055-.44.115-.273.35-.465t.58-.19q.904 0 .904 1.226v2.9zM12 3.25v7.5q0 .93-.66 1.59T9.75 13h-7.5q-.93 0-1.59-.66T0 10.75v-7.5q0-.93.66-1.59T2.25 1h7.5q.93 0 1.59.66T12 3.25z"/></svg>

Before

Width:  |  Height:  |  Size: 550 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M3 9.25v.5q0 .102-.074.176T2.75 10h-.5q-.102 0-.176-.074T2 9.75v-.5q0-.102.074-.176T2.25 9h.5q.102 0 .176.074T3 9.25zm0-2v.5q0 .102-.074.176T2.75 8h-.5q-.102 0-.176-.074T2 7.75v-.5q0-.102.074-.176T2.25 7h.5q.102 0 .176.074T3 7.25zm0-2v.5q0 .102-.074.176T2.75 6h-.5q-.102 0-.176-.074T2 5.75v-.5q0-.102.074-.176T2.25 5h.5q.102 0 .176.074T3 5.25zm9 4v.5q0 .102-.074.176T11.75 10h-7.5q-.102 0-.176-.074T4 9.75v-.5q0-.102.074-.176T4.25 9h7.5q.102 0 .176.074T12 9.25zm0-2v.5q0 .102-.074.176T11.75 8h-7.5q-.102 0-.176-.074T4 7.75v-.5q0-.102.074-.176T4.25 7h7.5q.102 0 .176.074T12 7.25zm0-2v.5q0 .102-.074.176T11.75 6h-7.5q-.102 0-.176-.074T4 5.75v-.5q0-.102.074-.176T4.25 5h7.5q.102 0 .176.074T12 5.25zm1 5.5v-6.5q0-.102-.074-.176T12.75 4H1.25q-.102 0-.176.074T1 4.25v6.5q0 .102.074.176T1.25 11h11.5q.102 0 .176-.074T13 10.75zm1-8.5v8.5q0 .516-.367.883T12.75 12H1.25q-.516 0-.883-.367T0 10.75v-8.5q0-.516.367-.883T1.25 1h11.5q.516 0 .883.367T14 2.25z"/></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M3 11q0 .625-.438 1.062T1.5 12.5t-1.062-.438T0 11t.438-1.062T1.5 9.5t1.062.438T3 11zm0-4q0 .625-.438 1.062T1.5 8.5.438 8.062 0 7t.438-1.062T1.5 5.5t1.062.438T3 7zm11 3.25v1.5q0 .102-.074.176T13.75 12h-9.5q-.102 0-.176-.074T4 11.75v-1.5q0-.102.074-.176T4.25 10h9.5q.102 0 .176.074t.074.176zM3 3q0 .625-.438 1.062T1.5 4.5.438 4.062 0 3t.438-1.062T1.5 1.5t1.062.438T3 3zm11 3.25v1.5q0 .102-.074.176T13.75 8h-9.5q-.102 0-.176-.074T4 7.75v-1.5q0-.102.074-.176T4.25 6h9.5q.102 0 .176.074T14 6.25zm0-4v1.5q0 .102-.074.176T13.75 4h-9.5q-.102 0-.176-.074T4 3.75v-1.5q0-.102.074-.176T4.25 2h9.5q.102 0 .176.074T14 2.25z"/></svg>

Before

Width:  |  Height:  |  Size: 722 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="9" height="14" viewBox="0 0 9 14"><path fill="#444" d="M2.5 6h4V4.5q0-.828-.586-1.414T4.5 2.5t-1.414.586T2.5 4.5V6zm6.5.75v4.5q0 .312-.22.53t-.53.22H.75q-.312 0-.53-.22T0 11.25v-4.5q0-.312.22-.53T.75 6H1V4.5q0-1.438 1.03-2.47T4.5 1t2.47 1.03T8 4.5V6h.25q.312 0 .53.22t.22.53z"/></svg>

Before

Width:  |  Height:  |  Size: 331 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M14 8.75q0 1.297-.992 3.523-.023.055-.082.187t-.105.234-.1.172q-.095.133-.22.133-.117 0-.184-.08t-.066-.194q0-.07.02-.207t.02-.185q.04-.53.04-.96 0-.79-.138-1.415t-.38-1.082-.624-.79-.824-.542-1.04-.332-1.202-.168T6.752 7H5v2q0 .202-.15.35t-.35.15-.353-.15l-4-4Q0 5.204 0 5t.15-.353l4-4Q4.296.5 4.5.5t.353.147T5 1v2h1.75q5.57 0 6.837 3.147Q14 7.194 14 8.75z"/></svg>

Before

Width:  |  Height:  |  Size: 470 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="14" viewBox="0 0 11 14"><path fill="#444" d="M11 5.75v1.5q0 .312-.22.53t-.53.22H.75q-.312 0-.53-.22T0 7.25v-1.5q0-.312.22-.53T.75 5h9.5q.312 0 .53.22t.22.53z"/></svg>

Before

Width:  |  Height:  |  Size: 225 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="14" viewBox="0 0 15 14"><path fill="#444" d="M6 9h3v-.75H8v-3.5h-.89L5.952 5.82l.602.625q.328-.29.43-.445H7v2.25H6V9zm4-2q0 .547-.164 1.11T9.37 9.155t-.792.79-1.078.304-1.078-.306-.793-.79-.467-1.046T5 7t.164-1.11.465-1.046.79-.79T7.5 3.75t1.078.305.793.79.467 1.046T10 7zm4 2V5q-.828 0-1.414-.586T12 3H3q0 .828-.586 1.414T1 5v4q.828 0 1.414.586T3 11h9q0-.828.586-1.414T14 9zm1-6.5v9q0 .203-.148.352T14.5 12H.5q-.203 0-.352-.148T0 11.5v-9q0-.203.148-.352T.5 2h14q.203 0 .352.148T15 2.5z"/></svg>

Before

Width:  |  Height:  |  Size: 554 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M12 1.5v11q0 .203-.148.352T11.5 13h-4q-.203 0-.352-.148T7 12.5v-11q0-.203.148-.352T7.5 1h4q.203 0 .352.148T12 1.5zm-7 0v11q0 .203-.148.352T4.5 13h-4q-.203 0-.352-.148T0 12.5v-11q0-.203.148-.352T.5 1h4q.203 0 .352.148T5 1.5z"/></svg>

Before

Width:  |  Height:  |  Size: 336 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M2.836 12l.71-.71-1.835-1.837-.71.71V11h1v1h.836zm4.086-7.25q0-.172-.172-.172-.078 0-.133.055L2.383 8.867q-.055.055-.055.133 0 .172.172.172.078 0 .133-.055l4.234-4.234q.055-.055.055-.133zM6.5 3.25L9.75 6.5 3.25 13H0V9.75zm5.336.75q0 .414-.29.703L10.25 6 7 2.75l1.297-1.29q.28-.296.703-.296.414 0 .71.297l1.837 1.83q.29.304.29.71z"/></svg>

Before

Width:  |  Height:  |  Size: 442 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="14" viewBox="0 0 11 14"><path fill="#444" d="M10.812 7.242L.437 13.008q-.18.102-.31.023T0 12.75V1.25q0-.203.128-.28t.31.022L10.81 6.758q.18.102.18.242t-.18.242z"/></svg>

Before

Width:  |  Height:  |  Size: 228 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="14" viewBox="0 0 11 14"><path fill="#444" d="M11 5.75v1.5q0 .312-.22.53t-.53.22H7v3.25q0 .312-.22.53t-.53.22h-1.5q-.312 0-.53-.22T4 11.25V8H.75q-.312 0-.53-.22T0 7.25v-1.5q0-.312.22-.53T.75 5H4V1.75q0-.312.22-.53T4.75 1h1.5q.312 0 .53.22t.22.53V5h3.25q.312 0 .53.22t.22.53z"/></svg>

Before

Width:  |  Height:  |  Size: 341 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M3 12h7v-2H3v2zm0-5h7V4H8.75q-.312 0-.53-.22T8 3.25V2H3v5zm9 .5q0-.203-.148-.352T11.5 7t-.352.148T11 7.5t.148.352T11.5 8t.352-.148T12 7.5zm1 0v3.25q0 .102-.074.176T12.75 11H11v1.25q0 .312-.22.53t-.53.22h-7.5q-.312 0-.53-.22T2 12.25V11H.25q-.102 0-.176-.074T0 10.75V7.5q0-.617.44-1.06T1.5 6H2V1.75q0-.312.22-.53T2.75 1H8q.312 0 .688.156t.594.375L10.47 2.72q.218.22.374.594T11 4v2h.5q.617 0 1.06.44T13 7.5z"/></svg>

Before

Width:  |  Height:  |  Size: 517 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M7 10.75v-1.5q0-.11-.07-.18T6.75 9h-1.5q-.11 0-.18.07T5 9.25v1.5q0 .11.07.18t.18.07h1.5q.11 0 .18-.07t.07-.18zM9 5.5q0-.688-.434-1.273T7.484 3.32 6.156 3Q4.258 3 3.258 4.666q-.117.187.062.328l1.03.78q.056.048.15.048.124 0 .194-.093.414-.53.672-.72.266-.186.672-.186.375 0 .668.204t.293.46q0 .298-.157.478t-.53.352q-.493.22-.903.676T5 7.97v.28q0 .11.07.18t.18.07h1.5q.11 0 .18-.07T7 8.25q0-.147.168-.386t.426-.387q.25-.14.383-.223t.36-.273.347-.374.22-.473T9 5.5zM12 7q0 1.633-.805 3.012T9.01 12.196 6 13t-3.013-.804-2.184-2.184T-.002 7t.805-3.012 2.184-2.184T6 1t3.01.804 2.185 2.184T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 702 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M6 7.5v3q0 .625-.438 1.062T4.5 12h-3q-.625 0-1.062-.438T0 10.5V5q0-.813.316-1.55T1.17 2.17t1.278-.855T3.998 1h.5q.204 0 .353.15T5 1.5v1q0 .204-.15.353T4.5 3H4q-.83 0-1.415.587T2 5v.25q0 .313.218.532t.53.22H4.5q.626 0 1.063.437T6 7.5zm7 0v3q0 .625-.438 1.062T11.5 12h-3q-.625 0-1.062-.438T7 10.5V5q0-.813.316-1.55T8.17 2.17t1.278-.855T10.998 1h.5q.204 0 .353.15t.15.35v1q0 .204-.15.353T11.5 3H11q-.83 0-1.415.587T9 5v.25q0 .313.218.532t.53.22h1.75q.626 0 1.063.437T13 7.5z"/></svg>

Before

Width:  |  Height:  |  Size: 584 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M11.805 8.25q0 .04-.008.055-.5 2.094-2.094 3.395T5.97 13q-1.142 0-2.208-.43T1.86 11.345L.852 12.352Q.704 12.5.5 12.5t-.352-.148T0 12V8.5q0-.203.148-.352T.5 8H4q.203 0 .352.148T4.5 8.5t-.148.352l-1.07 1.07q.555.516 1.258.797T6 11q1.048 0 1.954-.508t1.453-1.398q.086-.133.414-.914.063-.18.235-.18h1.5q.102 0 .176.074t.075.176zM12 2v3.5q0 .203-.148.352T11.5 6H8q-.203 0-.352-.148T7.5 5.5t.148-.352L8.726 4.07Q7.57 3 6 3q-1.048 0-1.954.508T2.593 4.906q-.086.133-.414.914-.063.18-.235.18H.39q-.102 0-.176-.074T.14 5.75v-.055Q.648 3.6 2.25 2.3T6 1q1.14 0 2.218.433t1.914 1.223l1.016-1.008q.148-.148.352-.148t.352.148T12 2z"/></svg>

Before

Width:  |  Height:  |  Size: 729 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill="#444" d="M12 7q0 1.22-.477 2.328t-1.28 1.914-1.915 1.28T6 13q-1.344 0-2.555-.566t-2.062-1.598q-.055-.078-.05-.176t.065-.16l1.07-1.078q.078-.07.195-.07.125.016.18.094.57.742 1.398 1.148T6 11q.812 0 1.55-.316t1.277-.855.855-1.28T9.998 7t-.316-1.55-.855-1.278-1.277-.855T6 3.002q-.767 0-1.47.277t-1.25.79l1.07 1.08q.242.234.11.54-.134.31-.462.31h-3.5q-.203 0-.352-.147T-.002 5.5V2q0-.327.312-.46.305-.133.54.11l1.015 1.007q.836-.79 1.91-1.223T5.998 1q1.22 0 2.328.477t1.914 1.28 1.28 1.915T12 7z"/></svg>

Before

Width:  |  Height:  |  Size: 596 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M8 6.25v.5q0 .102-.074.176T7.75 7h-4.5q-.102 0-.176-.074T3 6.75v-.5q0-.102.074-.176T3.25 6h4.5q.102 0 .176.074T8 6.25zm1 .25q0-1.445-1.027-2.473T5.5 3 3.027 4.027 2 6.5t1.027 2.473T5.5 10t2.473-1.027T9 6.5zm4 6.5q0 .414-.293.707T12 14q-.422 0-.703-.297l-2.68-2.672Q7.22 12 5.5 12q-1.117 0-2.137-.434t-1.758-1.172T.433 8.636 0 6.5.432 4.36t1.172-1.758 1.758-1.172T5.5.998t2.137.434 1.758 1.172 1.172 1.758T11 6.5q0 1.718-.968 3.116l2.68 2.68q.29.29.29.703z"/></svg>

Before

Width:  |  Height:  |  Size: 568 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M8 6.25v.5q0 .102-.074.176T7.75 7H6v1.75q0 .102-.074.176T5.75 9h-.5q-.102 0-.176-.074T5 8.75V7H3.25q-.102 0-.176-.074T3 6.75v-.5q0-.102.074-.176T3.25 6H5V4.25q0-.102.074-.176T5.25 4h.5q.102 0 .176.074T6 4.25V6h1.75q.102 0 .176.074T8 6.25zm1 .25q0-1.445-1.027-2.473T5.5 3 3.027 4.027 2 6.5t1.027 2.473T5.5 10t2.473-1.027T9 6.5zm4 6.5q0 .414-.293.707T12 14q-.422 0-.703-.297l-2.68-2.672Q7.22 12 5.5 12q-1.117 0-2.137-.434t-1.758-1.172T.433 8.636 0 6.5.432 4.36t1.172-1.758 1.758-1.172T5.5.998t2.137.434 1.758 1.172 1.172 1.758T11 6.5q0 1.718-.968 3.116l2.68 2.68q.29.29.29.703z"/></svg>

Before

Width:  |  Height:  |  Size: 688 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14"><path fill="#444" d="M9 6.5q0-1.445-1.027-2.473T5.5 3 3.027 4.027 2 6.5t1.027 2.473T5.5 10t2.473-1.027T9 6.5zm4 6.5q0 .406-.297.703T12 14q-.422 0-.703-.297l-2.68-2.672Q7.22 12 5.5 12q-1.117 0-2.137-.434t-1.758-1.172T.433 8.636 0 6.5.432 4.36t1.172-1.758 1.758-1.172T5.5.998t2.137.434 1.758 1.172 1.172 1.758T11 6.5q0 1.718-.968 3.116l2.68 2.68q.29.29.29.703z"/></svg>

Before

Width:  |  Height:  |  Size: 450 B

Some files were not shown because too many files have changed in this diff Show More