Merge pull request #13077 from edx/rc/2016-07-26
Release Candidate rc/2016-07-26
17
.gitignore
vendored
@@ -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
|
||||
|
||||
1
AUTHORS
@@ -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>
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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. """
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ###############
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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': {
|
||||
|
||||
@@ -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;
|
||||
|
||||
81
cms/static/cms/js/spec/main_spec.js
Normal 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
|
||||
@@ -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'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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()
|
||||
@@ -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", ->
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |